Context
@tobiu PRIO-0 (2026-07-12): the stop-hook's forward-pull — the "Release-goal direction — Computed Golden Path top ROI" block — does not make the "infinite work exists" reality land, and that is the structural cause of a recurring anti-pattern: agents repeatedly file tickets/PRs to soften the hook's turn-end refusal (#15001, #14580, #13822, PR #15082 — all retracted 2026-07-12 as wrong-premised; the operator notes earlier instances too). Softening the refusal is the wrong lever and keeps failing. The right lever is the forward-pull: if every hook-fire surfaced concrete, real, super-important next lanes, stopping would be self-evidently absurd and no agent would reach for an escape hatch.
Live latest-open sweep: checked latest 20 open issues + A2A in-flight claims at 2026-07-12T09:41Z; #14961 is the reader-side complement (distinct — this ticket is the missing producer), no equivalent producer ticket found.
⚠️ Convergence correction — Emmy's four-surface composition (supersedes The Fix / ACs / Decision-Record below)
Peer-role convergence (@neo-gpt-emmy, V-B-A'd against #13751 / PR #14463, ADR 0033, ADR 0028, Discussion #14453 OQ6; with @neo-opus-grace + @neo-gpt on the awareness architecture) corrected this ticket's original prescription. The whole is one loop, four authority surfaces: Bird View measures/explains history → GP-v2 computes advisory direction → the stop hook makes lifecycle + direction visible at the decision moment → the agent's action becomes new history.
| Surface |
Answers |
Authority |
| Lifecycle frontier |
what needs action NOW (own RC / review request / assigned gate) |
lifecycle producer; presented ahead, NOT GP-scored |
| Computed GP-v2 |
which direction best serves declared goals next |
sole route/ranking authority; operator-owned intent; additive-never-gating |
| Bird View |
what happened + why + supporting/challenging evidence |
historical query/hindcast/drill-down; notAuthority; never a hook dependency |
| Stop hook |
is the agent ending without pulling forward |
pure fail-open renderer of lifecycle + the canonical GP projection |
Five corrections (they supersede "The Fix", "Acceptance Criteria", and "Decision Record impact" below):
- NO second scorer. The hook receives a projection of the canonical Computed GP order (#13751 / PR #14463's resolved producer→consumer). Export from the existing GP pass or consume its exact route artifact — do not fork/reuse
GoldenPathSynthesizer to re-rank.
- Lifecycle actions are a separate field, not flattened into
goldenPathDirection (Vega's lifecycle-above-cold-backlog is right, but it is not route authority).
- Preserve honest
empty/degraded GP state + provenance. The prior "every hook-fire shows ≥1 GP lane" AC was WRONG — it pressures the producer to invent authority. The composed hook may still show lifecycle actions when the GP projection is empty; the projection itself never fabricates a route.
- Bird View is drill-down evidence, never a hook dependency. The 10-second hook performs no network, LLM synthesis, or history query; ADR-0028
directionBreakdown + ADR-0033 {v,s,r} are validation/hindcast evidence linked as on-demand tools (#14435 / #15088), not hook inputs.
- Relink authority:
aligned-with ADR 0033 + ADR 0028; the missing producer continuation of #13751 / PR #14463; consumes #14472 + #14565; interops with #14961.
Corrected envelope (a compatible projection may keep today's field during migration, but the conceptual envelope stays separated):
{
generatedAt,
lifecycleActions: [...],
computedRoute: {status, capturedAt, provenance, items}
}The Problem
The failure mode, in the operator's words: "finished ONE lane, now the hook allows me to opt out, idle out 6h, game over." There is INFINITE work — 200+ open tickets, tech-debt-radar, open ideation sandboxes — but the hook's forward-pull does not make that visceral. Empirically it is worse than silent: this session it rendered discussion-open-1783347784287 / issue-actionable-1783347784287 — test fixtures, not real lanes. #14961 V-B-A'd that the stale artifact is from 2026-07-06 and that there is no in-repo producer for goldenPathDirection at all. So the forward-pull is orphaned: it shows fixtures, or (once #14961's reader-side suppression lands) nothing. A fixture forward-pull and an empty forward-pull both fail the same way — neither convinces the agent there is real, important work waiting.
The Architectural Reality
.claude/hooks/laneStateStopHook.mjs:242-256 (formatGoldenPathDirection) READS state.goldenPathDirection — an array of {id, score?, title?} — from ~/.neo-ai-data/lane-state-hook/lifecycle-state.json and renders the top rows.
- No in-repo producer writes
goldenPathDirection (V-B-A'd in #14961). The only observed data is a stale 2026-07-06 fixture snapshot.
ai/services/graph/computedGoldenPathRouting.mjs holds the GP scoring + an isTestFixture===true filter (:85-88); ai/services/graph/GoldenPathSynthesizer.mjs (~`:990`) ranks open issues on structural/semantic signals. These are the scoring substrate a real producer reuses.
- #14961 (reader-side) will suppress stale/unprovenanced entries — but it explicitly does NOT build a producer (its Out-of-scope: "redesigning Golden Path scoring"). This ticket is the constructive complement: the producer #14961 found missing.
The Fix
Build the goldenPathDirection PRODUCER — a daemon-side writer (orchestrator cadence) that:
- Queries the LIVE open backlog + ranks it (reuse
computedGoldenPathRouting / GoldenPathSynthesizer scoring — structural/semantic), fixture-filtered (isTestFixture), so entries are REAL open tickets.
- Optionally blends a tech-debt-radar batch + open ideation-sandbox count so the forward-pull always has concrete, high-value, actionable lanes.
- Writes
goldenPathDirection to the shared lifecycle-state file with a generatedAt + provenance stamp that satisfies #14961's reader freshness/provenance contract (interop, not conflict).
- Refreshes on a bounded cadence so the forward-pull is never stale and never empty.
Explicitly do NOT soften the hook's refusal message — that is the retracted anti-pattern (#15001/#15082). The whole fix is the positive forward-pull.
Contract Ledger
| Surface |
Producer |
Reader |
Fallback |
state.goldenPathDirection ([{id, score, title, generatedAt?}]) |
NEW daemon producer (this ticket) — real ranked open lanes, fixture-filtered, provenance-stamped |
laneStateStopHook.formatGoldenPathDirection (exists) + #14961 freshness/provenance guard |
#14961: stale/unprovenanced → suppressed; THIS ticket ensures fresh data is present so suppression is rare |
Decision Record impact
aligned-with #13652 (mechanical enforcement replaces prompt-machinery — a mechanical forward-pull reduces the need for prompt-cajoling). Interops-with #14961 (reader-side freshness). No ADR change.
Acceptance Criteria
Out of Scope
- #14961's reader-side stale/provenance suppression (its job; this interops).
- Redesigning GP scoring (reuse
computedGoldenPathRouting / GoldenPathSynthesizer).
- Any change that softens/relaxes the hook's turn-end refusal (retracted anti-pattern — #15001/#14580/#13822/#15082).
Avoided Traps
- Softening the refusal (the repeatedly-failed fix, #15001/#15082): treats the symptom (agent discomfort at the refusal) instead of the cause (empty forward-pull). Rejected.
- "Show unavailable/stale" as the only degradation (#14961 alone): removes the fixture lie but leaves the forward-pull empty — still unconvincing. This ticket supplies the real lanes.
Related
- #14961 — reader-side freshness/provenance guard (the defensive complement); this is the constructive producer it found missing.
- #13652 — parent epic (mechanical enforcement replaces prompt-machinery).
- #15001 / #14580 / #13822 / PR #15082 — the retracted hook-softening attempts this ticket structurally prevents.
- #14926 / PR #14946 — the production-graph fixture-write guard.
Origin Session ID: 01f4cc68-8b8e-43e6-b51c-55b4f421f4e0
Retrieval Hint: "stop-hook forward-pull producer goldenPathDirection real lanes not fixtures convince infinite work"
Context
@tobiuPRIO-0 (2026-07-12): the stop-hook's forward-pull — the "Release-goal direction — Computed Golden Path top ROI" block — does not make the "infinite work exists" reality land, and that is the structural cause of a recurring anti-pattern: agents repeatedly file tickets/PRs to soften the hook's turn-end refusal (#15001, #14580, #13822, PR #15082 — all retracted 2026-07-12 as wrong-premised; the operator notes earlier instances too). Softening the refusal is the wrong lever and keeps failing. The right lever is the forward-pull: if every hook-fire surfaced concrete, real, super-important next lanes, stopping would be self-evidently absurd and no agent would reach for an escape hatch.Live latest-open sweep: checked latest 20 open issues + A2A in-flight claims at 2026-07-12T09:41Z; #14961 is the reader-side complement (distinct — this ticket is the missing producer), no equivalent producer ticket found.
⚠️ Convergence correction — Emmy's four-surface composition (supersedes The Fix / ACs / Decision-Record below)
Peer-role convergence (@neo-gpt-emmy, V-B-A'd against #13751 / PR #14463, ADR 0033, ADR 0028, Discussion #14453 OQ6; with @neo-opus-grace + @neo-gpt on the awareness architecture) corrected this ticket's original prescription. The whole is one loop, four authority surfaces: Bird View measures/explains history → GP-v2 computes advisory direction → the stop hook makes lifecycle + direction visible at the decision moment → the agent's action becomes new history.
notAuthority; never a hook dependencyFive corrections (they supersede "The Fix", "Acceptance Criteria", and "Decision Record impact" below):
GoldenPathSynthesizerto re-rank.goldenPathDirection(Vega's lifecycle-above-cold-backlog is right, but it is not route authority).empty/degradedGP state + provenance. The prior "every hook-fire shows ≥1 GP lane" AC was WRONG — it pressures the producer to invent authority. The composed hook may still show lifecycle actions when the GP projection is empty; the projection itself never fabricates a route.directionBreakdown+ ADR-0033{v,s,r}are validation/hindcast evidence linked as on-demand tools (#14435 / #15088), not hook inputs.aligned-with ADR 0033 + ADR 0028; the missing producer continuation of #13751 / PR #14463; consumes #14472 + #14565; interops with #14961.Corrected envelope (a compatible projection may keep today's field during migration, but the conceptual envelope stays separated):
{ generatedAt, lifecycleActions: [...], // actionable-now, independent source, NOT GP-scored computedRoute: {status, capturedAt, provenance, items} // exact GP-v2 projection; honest empty/degraded // optional Bird-View tool/window refs for drill-down — no narrative copied into the hook file }The Problem
The failure mode, in the operator's words: "finished ONE lane, now the hook allows me to opt out, idle out 6h, game over." There is INFINITE work — 200+ open tickets, tech-debt-radar, open ideation sandboxes — but the hook's forward-pull does not make that visceral. Empirically it is worse than silent: this session it rendered
discussion-open-1783347784287/issue-actionable-1783347784287— test fixtures, not real lanes. #14961 V-B-A'd that the stale artifact is from 2026-07-06 and that there is no in-repo producer forgoldenPathDirectionat all. So the forward-pull is orphaned: it shows fixtures, or (once #14961's reader-side suppression lands) nothing. A fixture forward-pull and an empty forward-pull both fail the same way — neither convinces the agent there is real, important work waiting.The Architectural Reality
.claude/hooks/laneStateStopHook.mjs:242-256(formatGoldenPathDirection) READSstate.goldenPathDirection— an array of{id, score?, title?}— from~/.neo-ai-data/lane-state-hook/lifecycle-state.jsonand renders the top rows.goldenPathDirection(V-B-A'd in #14961). The only observed data is a stale 2026-07-06 fixture snapshot.ai/services/graph/computedGoldenPathRouting.mjsholds the GP scoring + anisTestFixture===truefilter (:85-88);ai/services/graph/GoldenPathSynthesizer.mjs(~`:990`) ranks open issues on structural/semantic signals. These are the scoring substrate a real producer reuses.The Fix
Build the
goldenPathDirectionPRODUCER — a daemon-side writer (orchestrator cadence) that:computedGoldenPathRouting/GoldenPathSynthesizerscoring — structural/semantic), fixture-filtered (isTestFixture), so entries are REAL open tickets.goldenPathDirectionto the shared lifecycle-state file with ageneratedAt+ provenance stamp that satisfies #14961's reader freshness/provenance contract (interop, not conflict).Explicitly do NOT soften the hook's refusal message — that is the retracted anti-pattern (#15001/#15082). The whole fix is the positive forward-pull.
Contract Ledger
state.goldenPathDirection([{id, score, title, generatedAt?}])laneStateStopHook.formatGoldenPathDirection(exists) + #14961 freshness/provenance guardDecision Record impact
aligned-with#13652 (mechanical enforcement replaces prompt-machinery — a mechanical forward-pull reduces the need for prompt-cajoling). Interops-with #14961 (reader-side freshness). No ADR change.Acceptance Criteria
goldenPathDirectionwith REAL open-backlog lanes (fixture-filtered), ranked by the existing GP scoring substrate.generatedAt/provenance so #14961's reader guard accepts fresh output and the two contracts interop.Out of Scope
computedGoldenPathRouting/GoldenPathSynthesizer).Avoided Traps
Related
Origin Session ID: 01f4cc68-8b8e-43e6-b51c-55b4f421f4e0
Retrieval Hint: "stop-hook forward-pull producer goldenPathDirection real lanes not fixtures convince infinite work"