bc5afa51b371f0b9713225d51b4156e3494fe8c1
Root cause: unconfirmedFixEntries() re-derived the hint on every context build from "the latest RetryAttemptedEvent for this stage," with no guard on whether that retry occurrence had already been delivered. A single contradicted retry (e.g. a workflow-routing dead end, gate="stage") therefore kept re-injecting its "Steer away from a known dead end" block on every subsequent stage retry/rebuild, even once the model had moved on to a materially different sub-problem — live evidence: session d734e1de, stage scaffold_frontend, injected on 7 consecutive turns. Fix (direction 1 from the three proposed): key delivery to the specific RetryAttemptedEvent occurrence and check whether it was already delivered by folding prior ContextAssembledEvent manifests (#307) for sourceType="unconfirmedFix"/sourceId=classKey recorded after that retry's own sessionSequence — no new mutable state, replay-safe (invariant #9). A fresh contradicted retry now injects exactly once; later rebuilds for the same occurrence stay silent; a NEW RetryAttemptedEvent of the same class (a real recurrence) earns one fresh injection. Direction 2 (match the current turn's own classKey, not "latest in stage") turned out to be already true by construction — classKey already comes from the single "latest" retry being matched — so the mismatch in the evidence was purely temporal/sticky, which direction 1 resolves. Implementing 2 separately would have been redundant; noted rather than silently dropped. Direction 3 (tighten the signature so routing and build failures can't collapse): already structurally true — routing dead-ends ("no transition condition matched...") only ever reach RetryAttemptedEvent via DefaultRetryCoordinator.shouldRetry(), which defaults gate="stage", while every other failure path uses .decide() with its real gate (build/contract/lint/...). Since classKey = "$gate: $normalizedSignature", the two families can never share a classKey. Added a regression test locking this in rather than changing the scheme. Docstring on unconfirmedFixEntries updated to describe the one-shot mechanism precisely instead of just asserting it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HgDL1v3GuQ9RZnYR6fDT95
fix: workflow inference chain — surface llama-server errors, user-turn-last, bundle-relative prompts
Description
No description provided
Languages
Kotlin
89.1%
Go
10.6%
Python
0.2%
CSS
0.1%