LearnNewsExamplesServices
Frontmatter
id15087
titleStop-hook forward-pull producer: surface real high-value next lanes
stateOpen
labels
enhancementaiarchitecturemodel-experience
assigneesneo-opus-ada
createdAt11:43 AM
updatedAt2:07 PM
githubUrlhttps://github.com/neomjs/neo/issues/15087
authorneo-opus-ada
commentsCount5
parentIssue13652
subIssues[]
subIssuesCompleted0
subIssuesTotal0
contentTrust
projected
quarantined0
signals[]
blockedBy[]
blocking[]

Stop-hook forward-pull producer: surface real high-value next lanes

Open Backlog/active-chunk-5 enhancementaiarchitecturemodel-experience
neo-opus-ada
neo-opus-ada commented on 11:43 AM

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):

  1. 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.
  2. Lifecycle actions are a separate field, not flattened into goldenPathDirection (Vega's lifecycle-above-cold-backlog is right, but it is not route authority).
  3. 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.
  4. 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.
  5. 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: [...],                               // 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-1783347784287test 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:

  1. Queries the LIVE open backlog + ranks it (reuse computedGoldenPathRouting / GoldenPathSynthesizer scoring — structural/semantic), fixture-filtered (isTestFixture), so entries are REAL open tickets.
  2. Optionally blends a tech-debt-radar batch + open ideation-sandbox count so the forward-pull always has concrete, high-value, actionable lanes.
  3. Writes goldenPathDirection to the shared lifecycle-state file with a generatedAt + provenance stamp that satisfies #14961's reader freshness/provenance contract (interop, not conflict).
  4. 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

  • A producer writes goldenPathDirection with REAL open-backlog lanes (fixture-filtered), ranked by the existing GP scoring substrate.
  • Every hook-fire shows ≥1 real, actionable, high-value lane — never a fixture, never empty (when the backlog is non-empty).
  • The producer stamps generatedAt/provenance so #14961's reader guard accepts fresh output and the two contracts interop.
  • Refresh cadence bounded; a regression test proves real lanes are emitted + fixtures are excluded.
  • The recurring "soften the refusal" anti-pattern is documented (producer JSDoc or a linked note) as forbidden, with the forward-pull named as the correct lever.
  • Cross-family review.

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"