{"record":{"id":"54236837469e381b","repo":"gastownhall/beads","slug":"extends-s-w","errorCode":null,"errorMessage":"extends %s: %w","messagePattern":"extends (.+?): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/formula/parser.go","lineNumber":238,"sourceCode":"\t}\n\n\t// Build merged formula from parents\n\tmerged := &Formula{\n\t\tFormula:     formula.Formula,\n\t\tDescription: formula.Description,\n\t\tVersion:     formula.Version,\n\t\tType:        formula.Type,\n\t\tSource:      formula.Source,\n\t\tVars:        make(map[string]*VarDef),\n\t\tSteps:       nil,\n\t\tCompose:     nil,\n\t}\n\n\t// Apply each parent in order\n\tfor _, parentName := range formula.Extends {\n\t\tparent, err := p.loadFormula(parentName)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"extends %s: %w\", parentName, err)\n\t\t}\n\n\t\t// Resolve parent recursively\n\t\tparent, err = p.Resolve(parent)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"resolve parent %s: %w\", parentName, err)\n\t\t}\n\n\t\t// Merge parent vars (parent vars are inherited, child overrides)\n\t\tfor name, varDef := range parent.Vars {\n\t\t\tif _, exists := merged.Vars[name]; !exists {\n\t\t\t\tmerged.Vars[name] = varDef\n\t\t\t}\n\t\t}\n\n\t\t// Merge parent steps (append, child steps come after)\n\t\tmerged.Steps = append(merged.Steps, parent.Steps...)\n","sourceCodeStart":220,"sourceCodeEnd":256,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/formula/parser.go#L220-L256","documentation":"Resolve() failed to load one of the formula's parents via loadFormula(parentName) while walking the Extends list, and wraps that underlying error (e.g. 'not found in search paths' or a parse error) as 'extends <parent>: <cause>'. It identifies which parent entry in the extends list is broken.","triggerScenarios":"Calling Resolve or LoadByName on a formula whose 'extends:' names a parent that does not exist in any search path, or whose parent file fails to parse/load (loadFormula returned a non-nil error).","commonSituations":"Typo in the parent name inside extends; parent formula file deleted or renamed; search paths (searchPath option) not including the directory containing the parent; parent file has YAML syntax errors so parsing fails.","solutions":["Check the parent name in the error against the actual formula filenames in your search-path directories; fix typos.","Add the directory holding the parent formula to the parser's search paths.","Restore or fix the parent formula file (the wrapped cause tells you whether it is missing or unparseable)."],"exampleFix":"# before: build.md\nextends: [deplo]  # typo\n\n# after: build.md\nextends: [deploy]","handlingStrategy":"validation","validationCode":"// Pre-check every extends entry resolves before Resolve.\nfor _, parent := range f.Extends {\n\tif _, err := p.LoadByName(parent); err != nil {\n\t\treturn fmt.Errorf\"bad extends entry %q: %w\", parent, err\n\t}\n}","typeGuard":null,"tryCatchPattern":"if _, err := p.Resolve(f); err != nil {\n\tvar cause error\n\terrors.As(err, &cause) // unwrap chain; log full chain\n}","preventionTips":["Use editor autocompletion or a lint list of known formula names for extends values.","Keep parents and children in directories covered by the parser's search paths.","Rename formulas atomically: update all references in the same commit."],"tags":["go","formula","inheritance","load-failure"],"backgroundTag":"formula-parent-not-found","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}