xai-org/x-algorithm · error · SemanticCheckFailure

There is no scope

Error message

There is no scope

What it means

currentScopeId() requires at least one active compiler scope; when the scope list is empty there is no lexical scope to attribute nodes to, so a SemanticCheckFailure is thrown. Scopes are pushed/popped as functions, lambdas, and blocks are compiled.

Source

Thrown at botmaker/src/java/com/twitter/botmaker/compiler/CompilerContext.java:224

  void addMacro(String funcName) {
    curExpandedMacros.add(funcName);
  }

  void removeMacro(String funcName) {
    curExpandedMacros.remove(funcName);
  }

  boolean containsMacro(String funcName) {
    return curExpandedMacros.contains(funcName);
  }

  public void clearMacros() {
    curExpandedMacros.clear();
  }

  long currentScopeId() throws SemanticCheckFailure {
    if (scopeList.isEmpty()) {
      throw new SemanticCheckFailure("There is no scope");
    }
    if (enableContextScope) {
      return currentScope().getId();
    } else {
      return ASTNode.CacheLevel.ConstantContextScope.scope;
    }
  }

  private CompilerScope currentScope() throws SemanticCheckFailure {
    if (scopeList.isEmpty()) {
      throw new SemanticCheckFailure("There is no scope");
    }
    return scopeList.getFirst();
  }

  CompilerScope addScope() throws SemanticCheckFailure {
    CompilerScope scope =
        new CompilerScope(NEXT_CONTEXT_ID.getAndIncrement(), currentScope());

View on GitHub (pinned to 24c60942c5)

Solutions

  1. Ensure node construction happens inside compile() of CompilerContext, which pushes a scope
  2. Push a scope with addScope()/try-with-resources before requesting scope ids
  3. Audit custom CompilerUnit implementations for node creation outside compilation

Example fix

// before
long id = ctx.currentScopeId(); // no scope pushed
// after
try (CompilerScope s = ctx.addScope()) { long id = ctx.currentScopeId(); }
Defensive patterns

Strategy: try-catch

Try / catch

catch (SemanticCheckFailure e) { if ("There is no scope".equals(e.getMessage())) { /* API misuse: ensure node construction happens inside compile() */ } }

Prevention

When it happens

Trigger: Calling compile-time helpers (e.g. toAny, parameter, forEachNode, result, conditionParameter) from a context where no scope was pushed, e.g. compiling a node before entering a function/lambda body or after the scope stack was popped by an error path.

Common situations: Custom CompilerUnit implementations that build nodes outside a proper compile() invocation; misuse of the compiler API where addScope() was never called; early error paths that unwind scopes.

Related errors


AI-assisted analysis of xai-org/x-algorithm@24c60942c5 (2026-08-28). Data as JSON: /api/errors/f41b52f973ae45cd. Report an issue: GitHub.