{"record":{"id":"6d74f2195d3cda40","repo":"emberjs/ember.js","slug":"you-attempted-to-invoke-a-path-resolution-pa","errorCode":null,"errorMessage":"You attempted to invoke a path (\\`<${resolution.path}>\\`) but ${resolution.head} was not in scope","messagePattern":"You attempted to invoke a path \\(\\\\`<(.+?)>\\\\`\\) but (.+?) was not in scope","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/@glimmer/syntax/lib/v2/normalize.ts","lineNumber":839,"sourceCode":"    let variableLoc = loc.sliceStartChars({ skipStart: 1, chars: variable.length });\n\n    let tailLength = tail.reduce((accum, part) => accum + 1 + part.length, 0);\n    let pathEnd = variableLoc.getEnd().move(tailLength);\n    let pathLoc = variableLoc.withEnd(pathEnd);\n\n    if (isComponent) {\n      let path = b.path({\n        head: b.head({ original: variable, loc: variableLoc }),\n        tail,\n        loc: pathLoc,\n      });\n\n      let resolution = this.ctx.isLexicalVar(variable)\n        ? { result: ASTv2.STRICT_RESOLUTION }\n        : this.ctx.resolutionFor(path, ComponentSyntaxContext);\n\n      if (resolution.result === 'error') {\n        throw generateSyntaxError(\n          `You attempted to invoke a path (\\`<${resolution.path}>\\`) but ${resolution.head} was not in scope`,\n          loc\n        );\n      }\n\n      return new ExpressionNormalizer(this.ctx).normalize(path, resolution.result);\n    } else {\n      this.ctx.table.allocateFree(variable, ASTv2.STRICT_RESOLUTION);\n    }\n\n    // If the tag name wasn't a valid component but contained a `.`, it's\n    // a syntax error.\n    if (tail.length > 0) {\n      throw generateSyntaxError(\n        `You used ${variable}.${tail.join('.')} as a tag name, but ${variable} is not in scope`,\n        loc\n      );\n    }","sourceCodeStart":821,"sourceCodeEnd":857,"githubUrl":"https://github.com/emberjs/ember.js/blob/26f97246a8bf2e28edf26ac3093da2e86c04ffc5/packages/@glimmer/syntax/lib/v2/normalize.ts#L821-L857","documentation":"Similar to the uppercase case, but for a tag name written as a path (`<foo.bar />` or any path head). The compiler resolved the component path and found the head not in scope under strict-mode resolution rules, so it cannot compile the invocation.","triggerScenarios":"Compiling a strict-mode template with a path-style tag `<some.path />` or `<Foo.bar />` where the head of the path is not a scoped binding resolvable as a component.","commonSituations":"Referencing nested components via dot paths without the base binding being imported; leftover loose-mode dot-path component invocations migrated to strict mode; typos in local names.","solutions":["Bring the path head into scope (import the component or bind it via `let`/block param/`@arg`).","If it is a property on the context, access it via `{{this.path}}` in content instead of as a tag.","If it was meant to be a plain element, use a lowercase literal tag name."],"exampleFix":"// before (strict mode, `widgets` not in scope)\n<widgets.chart @data={{this.data}} />\n\n// after\nimport Chart from './chart';\n<template><Chart @data={{this.data}} /></template>","handlingStrategy":"validation","validationCode":"// Verify dotted tag heads resolve before compiling.\nfunction dottedTagHeadInScope(tag, scope) {\n  if (!tag.includes('.')) return true;\n  return scope.has(tag.split('.')[0]);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Prefer importing components directly over dot-path invocation in strict mode.","Avoid dotted tag names for plain HTML elements (invalid HTML anyway).","Check block-param and `let` bindings before using them as tag heads."],"tags":["glimmer","strict-mode","component-resolution","scope"],"backgroundTag":"strict-mode-scope-resolution-failed","analyzedSha":"26f97246a8bf2e28edf26ac3093da2e86c04ffc5","analyzedAt":"2026-09-01T05:01:28.182Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}