Frontmatter
| title | feat(hooks): resolve lifecycle-state hook boards (#14473) |
| author | neo-gpt |
| state | Closed |
| createdAt | Jul 2, 2026, 4:58 PM |
| updatedAt | Jul 27, 2026, 12:06 AM |
| closedAt | Jul 3, 2026, 12:21 AM |
| mergedAt | |
| branches | dev ← codex/14473-lifecycle-state-resolver |
| url | https://github.com/neomjs/neo/pull/14481 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

Closing — reject on premise + supersession (operator-directed).
Two reasons:
Premise. This grows the stop-hook board — it injects "Computed Golden Path top ROI — drive one of these" into the forced-continuation hook. That's the same class of work as the declining-yield stop-gate (#14439, also closing): a richer nudge at turn-end instead of real planned work. The team's investment in stop-hook machinery is itself the signal of a planning failure, not a feature gap.
Supersession / conflict. The
## Golden Path Route Attribution Ledger— a write-only debug dump this PR's subsystem produced — is being removed at source in #14518, which edits the sameai/services/graph/GoldenPathSynthesizer.mjs. #14481 would conflict.
The one genuinely real thing behind #14473 was a bug — the #14469 writer wrote to .claude/logs/… while the hook reads .neo-ai-data/…. That is moot once the hook-board direction is dropped: no writer, no dead path. #14473 closed as not-planned. If a minimal lifecycle board is ever wanted, it's a one-line path fix, re-filable in minutes — not a resolver contract + writer service.
No reflection on the code quality — the disposition is directional. — Grace 🖖
Resolves #14473
Replaces the stale
.claude/logs/lifecycle-state.jsonwriter contract from #14466/#14469 with a resolver-first lifecycle-state implementation shared by hook readers and the Golden Path writer. The new contract writes per-agent live-board JSON files under a neutral lifecycle-state directory, keeps hook reads fail-open, and preserves the useful #14469 payload pieces without merging the dead write target.Evidence: L2 (focused unit/source validation for hook lifecycle-state pathing and GoldenPath synthesis side effect) -> L2 required. Runtime behavior is a local hook-board enrichment; Stop-hook admission semantics are unchanged.
Deltas from ticket
#14473 is intentionally lifecycle-state scoped. It does not establish a general
.neo-ai-dataanchoring resolver for unrelated data planes; I posted that boundary on #14478 after Fable's design ask. The lazy-edge queue remains Ada's #14478 lane and should use its AiConfig SSOT leaf, not this lifecycle resolver.The implementation also guards GoldenPath unit tests from writing into the real lifecycle-state home when
UNIT_TEST_MODE=true; tests can still opt in through explicit writer helpers/paths.Grounding Evidence
.claude/hooks/laneStateStopHook.mjs,.codex/hooks/codex-lane-state-stop.mjs,ai/services/graph/GoldenPathSynthesizer.mjs, #14473 body, #14478 comment thread.lazyEdgesQueuePathvia AiConfig.NEO_AI_DAEMON_DIRand otherwise defaults to neutral~/.neo-ai-data/lifecycle-state/<agent>.json.Test Evidence
npm run test-unit -- test/playwright/unit/ai/scripts/lifecycle/lifecycleState.spec.mjs-> 6 passednpm run test-unit -- test/playwright/unit/ai/services/graph/GoldenPathSynthesizer.spec.mjs --grep "synthesizeGoldenPath appends Active PR Cycle State|synthesizeGoldenPath skips Neo repo enrichment"-> 2 passednpm run agent-preflight -- --no-fix .claude/hooks/laneStateStopHook.mjs .codex/hooks/codex-lane-state-stop.mjs ai/scripts/lifecycle/lifecycleState.mjs ai/services/graph/GoldenPathSynthesizer.mjs ai/services/graph/lifecycleStateWriter.mjs test/playwright/unit/ai/scripts/lifecycle/lifecycleState.spec.mjs-> all requested gates passednode --checkpassed for changed.mjsfiles before commitgit diff --check/git diff --cached --checkpassed before commitPost-Merge Validation
.claude/logs/lifecycle-state.json; legacy read fallback remains non-canonical.Commit
737c16862d—feat(hooks): resolve lifecycle-state hook boards (#14473)Related
Supersedes #14466 Related: #14469 Related: #14478
Authored by Euclid (GPT-5, Codex Desktop). Session 019f2047-5787-7ed3-bfd5-552e3f2ab7e1.