{"record":{"id":"f200975c4174c3a2","repo":"Yeachan-Heo/oh-my-codex","slug":"missing-field","errorCode":null,"errorMessage":"Missing ${field}.","messagePattern":"Missing (.+?)\\.","errorType":"validation","errorClass":"AutoresearchGoalError","httpStatus":null,"severity":"error","filePath":"src/autoresearch/goal.ts","lineNumber":100,"sourceCode":"  summary?: string;\n  artifactPath?: string;\n  now?: Date;\n}\n\nexport interface CompleteAutoresearchGoalOptions {\n  codexGoal?: unknown;\n  now?: Date;\n}\n\nexport class AutoresearchGoalError extends Error {}\n\nfunction iso(now = new Date()): string {\n  return now.toISOString();\n}\n\nfunction requireText(value: string, field: string): string {\n  const trimmed = value.trim();\n  if (!trimmed) throw new AutoresearchGoalError(`Missing ${field}.`);\n  return trimmed;\n}\n\nfunction repoRelative(cwd: string, path: string): string {\n  return relative(cwd, path).split('\\\\').join('/');\n}\n\nexport function autoresearchGoalDir(cwd: string, slug: string): string {\n  return join(cwd, AUTORESEARCH_GOAL_ROOT, slug);\n}\n\nexport function autoresearchGoalMissionPath(cwd: string, slug: string): string {\n  return join(autoresearchGoalDir(cwd, slug), AUTORESEARCH_GOAL_MISSION);\n}\n\nexport function autoresearchGoalRubricPath(cwd: string, slug: string): string {\n  return join(autoresearchGoalDir(cwd, slug), AUTORESEARCH_GOAL_RUBRIC);\n}","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/Yeachan-Heo/oh-my-codex/blob/3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2/src/autoresearch/goal.ts#L82-L118","documentation":"The pinned worker-pane target resolver (createPinnedWorkerPaneTargetResolverSync) refuses to return a target when the worker pane id equals the canonical HUD pane id. Even though both ids are trusted config, double-booking one pane as both worker and HUD would let worker I/O hit the HUD pane, so it throws immediately at resolve time.","triggerScenarios":"Creating/using a pinned worker resolver where workerPaneId === hudPaneId.trim() — a wiring bug where the HUD pane id was captured as the worker pane id (common when copying ids by hand or when a split returned the wrong pane).","commonSituations":"Hand-configured pane ids, copy-paste from `tmux list-panes`, or split-pane bookkeeping that stored the HUD pane id in the worker field after a layout change.","solutions":["Print both ids at setup and assert they differ before creating the resolver","Re-derive each id from its own split-pane creation result","Avoid hand-copying pane ids; always capture programmatically at creation","Add a startup validation step that fails fast on workerPaneId === hudPaneId"],"exampleFix":"// before\nconst resolver = createPinnedWorkerPaneTargetResolverSync(session, hudPaneId, hudPaneId /* bug */, pid, owner);\n\n// after\nif (workerPaneId === hudPaneId.trim()) throw new Error('bad wiring: worker pane equals HUD pane');\nconst resolver = createPinnedWorkerPaneTargetResolverSync(session, workerPaneId, hudPaneId, pid, owner);","handlingStrategy":"validation","validationCode":"if (workerPaneId === (hudPaneId ?? '').trim()) throw new Error('worker pane must differ from HUD pane');","typeGuard":null,"tryCatchPattern":"catch (err) { if (/is HUD target/.test(err.message)) { /* wiring bug: re-derive both ids and rebuild resolver */ } }","preventionTips":["Fail fast at setup with an inequality assertion","Never hand-copy pane ids between config fields","Derive ids programmatically from each split"],"tags":["tmux","configuration","hud","fail-fast"],"backgroundTag":"misconfigured-pane-target","analyzedSha":"3ad79a8a6fe6e95fdbb8c00e40716fffe4011ce2","analyzedAt":"2026-08-27T22:18:39.783Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}