From c32445b8a88e0090b2b8782879d4c00f6b198e57 Mon Sep 17 00:00:00 2001 From: kami Date: Sun, 26 Jul 2026 21:13:55 +0400 Subject: [PATCH] docs(sprint): record the #312/#313 context message-type sweep Landed out-of-band on 2026-07-26: upstream of Goal 1's gate verdicts and Goal 3's recovery tickets, both of which deliver through the context builders it touched. Drops #312 from the deferred table (its stated dependency on #307 turned out to be unnecessary) and notes that #309 now lands on top of the re-roled recoveryTicket. Co-Authored-By: Claude Opus 5 --- docs/sprints/2026-07-23.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/sprints/2026-07-23.md b/docs/sprints/2026-07-23.md index 01c2b252..21471473 100644 --- a/docs/sprints/2026-07-23.md +++ b/docs/sprints/2026-07-23.md @@ -55,7 +55,7 @@ - **#299** Single provider death → unrecoverable session kill (`NoEligibleProvider` on retry) — re-route, don't die. - **#300** HealthMonitor detects provider loss ~18s too late (reactive, not gating) — gates #299's recovery path on a fast signal. - **#304** Recovery stage runs expensively then run dies on stale failure-cap — wasted work; the cap must reset on the recovery's own progress. -- **#309** Recovery stage: apply same-fingerprint loop-breaker + repair-ledger — the runaway root cause; closes the loop Goal 3 started. +- **#309** Recovery stage: apply same-fingerprint loop-breaker + repair-ledger — the runaway root cause; closes the loop Goal 3 started. Now lands on top of #312/#313: `recoveryTicket` is USER-role in the trailing slot at highest precedence, and the loop-breaker is the agreed place to escalate a repeated tool failure out of tool-role (per-failure sites stay tool-role). - **#307** Observability: no event records the assembled stage-context manifest — cheap event, makes every above failure diagnosable post-run. **Stretch (if #307 lands fast):** **#308** Background-process execution + monitor tool for long-running shell commands — unblocks real test gates but not load-bearing for the goals above. @@ -80,6 +80,32 @@ --- +## Landed out-of-band — context message-type sweep (#312, #313) + +Not in the original three goals; pulled in on 2026-07-26 because it is upstream of Goal 1's gate +verdicts and Goal 3's recovery tickets — both deliver their findings through the context builders +this touched. #312 was listed as deferred-behind-#307; that turned out to be unnecessary, placement +is statically determined by `PromptRenderer` + each producer's role, so no run ground truth was needed. + +**Rule established:** the system block carries only what does not change during a run. Anything the +run mutates is a user message — a mutating system prefix defeats prompt caching, and models +under-weight system-folded content against the trailing user turn. `role` = which chat message type, +`layer` = pinning/prune eligibility; those were tangled and are now separate. + +- **#312** ✅ Audit — report at `docs/audits/2026-07-26-context-role-audit.md` (commit 514aeae7). +- **#313** ✅ Implementation (commit a4f6cf05, `./gradlew check` green). Ten entries re-roled + SYSTEM→USER; trailing repair-mandate slot now emits exactly one mandate by precedence + (`recoveryTicket > retryFeedback > groundingFeedback > rejectionFeedback`) with `remainingDelta` + appended, so the slot stays scarce as members were added. +- **Bug fixed en route:** the renderer's `layer == L0` clause was overriding role on four L0+USER + packs — `InferenceSummarizer`, `SemanticReviewerImpl`, `CapabilityGapReflectorImpl`, Talkie + session-naming — all four were sending a system-only request with **no user turn at all**. + +**Not verified live.** Needs one freestyle run to confirm the trailing mandate lands as intended. +Fold into the Goal 1 acceptance run (#267) rather than spending a separate run. + +--- + ## Intentionally deferred (seen, not dropped) | ID | Title | Why out | @@ -94,5 +120,4 @@ | **#301** | Escalate repeated scope/manifest write-block to user approval | Falls under Goal 2 once DoD lands; premature now. | | **#302** | Mid-run hard steering (drop inference, inject operator message, restart) | Bigger surface; pairs with the steering-channel design, post-Goal 3 reliability. | | **#303** | Auto-repair collapsed-argv shell calls | Nice-to-have shell hygiene. | -| **#312** | Audit USER- vs SYSTEM/tool-role context placement | Context-salience sweep — better run after #307's manifest event exists so the audit has ground truth. | | **#25** | Backlog (deferred/spec-level from memory) | Meta-task; verify-against-code before any sub-item is promoted. |