{"record":{"id":"c1d91fb76ea30a84","repo":"pbakaus/impeccable","slug":"concept-seed-scope-must-be-direction-or-surface-c1d91f","errorCode":null,"errorMessage":"concept-seed: --scope must be direction or surface","messagePattern":"concept-seed: --scope must be direction or surface","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"skill/scripts/concept-seed.mjs","lineNumber":307,"sourceCode":"  };\n}\n\nconst SEED_MODES = new Set(['persuade', 'operate', 'read', 'experience']);\n\nexport function renderConceptSeed({\n  scope = 'surface',\n  key = process.env.IMPECCABLE_CONCEPT_SEED || crypto.randomBytes(4).toString('hex'),\n  reroll = 0,\n  register = null,\n  mode = null,\n  grain = null,\n  platform = null,\n  candidateCount = 7,\n  catalogDir = CATALOG_DIR,\n  _resolvedData = undefined,\n} = {}) {\n  if (scope !== 'surface' && scope !== 'direction') {\n    throw new Error('concept-seed: --scope must be direction or surface');\n  }\n  if (!Number.isInteger(reroll) || reroll < 0) {\n    throw new Error('concept-seed: --reroll must be a non-negative integer');\n  }\n  if (register !== null && register !== 'safer' && register !== 'bolder') {\n    throw new Error('concept-seed: --register must be safer or bolder');\n  }\n  if (register !== null && reroll < 1) {\n    throw new Error('concept-seed: --register steers a re-roll round; pass --reroll <n> with it');\n  }\n  if (register !== null && scope !== 'direction') {\n    throw new Error('concept-seed: --register applies to direction rounds only');\n  }\n  if (mode !== null && !SEED_MODES.has(mode)) {\n    throw new Error('concept-seed: --mode must be persuade, operate, read, or experience');\n  }\n  // Grain needs no mode: how much of the product is in play is independent of\n  // which register of work it is.","sourceCodeStart":289,"sourceCodeEnd":325,"githubUrl":"https://github.com/pbakaus/impeccable/blob/d14711ae3d1a1dd62dee61a358d27f107c51ccd0/skill/scripts/concept-seed.mjs#L289-L325","documentation":"Thrown at the top of the concept-seed selection function when the `scope` argument is neither 'surface' nor 'direction'. Scope selects which roll axis runs: surface deals grounded structures, direction deals product worlds. Any other value (including undefined-as-string or a typo) is rejected before any work begins.","triggerScenarios":"Passing scope='page', 'product', 'web' (confusing scope with grain/platform); passing an empty string; CLI flag parsing that yields undefined and gets stringified; a programmatic caller using the wrong enum.","commonSituations":"Confusing scope with grain (product/flow/view/region) or platform (web/ios/android); a typo like 'surfaces' or 'direct'; a caller reading scope from an unvalidated config file.","solutions":["Set scope to exactly 'surface' or 'direction' (the default is 'surface', so omitting it is also valid).","If driving from CLI, use --scope surface or --scope direction and check for typos.","Validate the value against the allowed set before calling the function."],"exampleFix":"// before\nawait seedConcepts({ scope: 'page' });\n\n// after\nawait seedConcepts({ scope: 'surface' }); // or 'direction'","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"const SCOPES = new Set(['surface', 'direction']);\nfunction isValidScope(v) {\n  return v == null || SCOPES.has(v);\n}","tryCatchPattern":null,"preventionTips":["Validate scope against {'surface','direction'} before calling seedConcepts.","Remember the default is 'surface' — omit the arg rather than guessing.","Do not confuse scope with grain (product/flow/view/region) or platform (web/ios/android)."],"tags":["validation","concept-seed","cli","enum"],"backgroundTag":null,"analyzedSha":"d14711ae3d1a1dd62dee61a358d27f107c51ccd0","analyzedAt":"2026-08-13T00:52:25.771Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}