diff --git a/docs/sprints/2026-07-23.md b/docs/sprints/2026-07-23.md index 21471473..1cb87629 100644 --- a/docs/sprints/2026-07-23.md +++ b/docs/sprints/2026-07-23.md @@ -13,8 +13,8 @@ **Tasks.** - **#80** [EPIC] LSP validation gate — real per-stage gate + terminal typecheck replacement. Design finalized in the task body; break into the 5 sub-tasks listed there. Container for the work below. - **#310** ✅ LSP diagnostics runner: anchor read on server readiness, not the 750ms timer (kills phantom unresolved-import). - - **#311** LSP gate: lint-class diagnostics (unused/deprecated) must not fail the run — classify by `DiagnosticTag`, not severity. -- **#263** Auto build-gate never fires on real freestyle scaffold — promotion attaches to no reachable stage. Blocks the terminal safety net #80 doesn't replace. + - **#311** ✅ LSP gate: lint-class diagnostics (unused/deprecated) must not fail the run — classify by `DiagnosticTag`, not severity. +- **#263** ✅ Auto build-gate never fires on real freestyle scaffold — promotion attaches to no reachable stage. Blocks the terminal safety net #80 doesn't replace. - **#267** Verify build-gate actually fires + re-scope #40 (LSP obsoletes the typecheck alias) — one live run settles both. Acceptance gate for the whole goal; do last. **Exit.** One live freestyle run where every write stage gets LSP diagnostics scoped to its write blast-radius, terminal build-gate fires, and a stranded-scaffold case goes to recovery instead of `WorkflowFailed`. @@ -78,6 +78,32 @@ | 2 W | #80 sub4 — blast-radius filter | #305 + #306 — ACR external + sticky hint | #304 + #309 — recovery runaway | | 2 F | #310, #311, #267 — readiness anchor + tag class + acceptance run | — | — | +### Goal 1 progress — 2026-07-26 + +- **#310 ✅** (commit `a95475be`). `awaitDiagnostics` waits for one push per URI then a *quiescent* + period anchored to the last server publication (`awaitAll` + `awaitQuiet`), not a 750ms timer + started at `didOpen`. Kills the half-loaded-project phantom unresolved-import. +- **#311 ✅** (commit `f61864ff`). `LspDiagnostic.tags` (lowercased `DiagnosticTag` names) is carried + from LSP4J through the event; `SessionOrchestratorGates2` gates on `severity == error && !isLint`. + A `noUnusedLocals` tsconfig promoting TS6133 to *error* no longer hard-fails a run that no rewrite + could clear. Lint diagnostics stay recorded and visible, just non-gating. Classification by + protocol tag, not a TS-code whitelist. Test: `core/events/.../LspDiagnosticTest.kt`. +- **#263 ✅** (commit `867e99d1`). Two findings on trace: + - The *reported* selection bug was already fixed by `159b3f1e` (#277) — `autoGateStages` is every + write-declaring stage **plus** `terminalStageId(plan)`, so a non-writing review terminal is + gated and `runExecutionGate` promotes it to PROJECT off the real `FileWritten` manifest. The + 2026-07-18 evidence was stale. + - The hole that remained: any stage declaring `build_expectation: project|tests` zeroed the whole + auto-gate set, so a plan building at stage 3 of 9 had nothing verifying the six stages written + after it. A declared build now suppresses only the redundant *per-writing-stage* gates; the + terminal floor always stays. + - Left deliberately: the gate chain still short-circuits before the execution gate when the + contract gate fails. The stage fails either way — cheap gates first, no COMPLETE-lie. + +**Goal 1 remaining: #267 only** — the acceptance live run. Needs the #191 `setup = "npm ci"` alias +first, or the now-firing gate fails on absent `node_modules` rather than on real code. Fold the +unverified #312/#313 trailing-mandate check into the same run. + --- ## Landed out-of-band — context message-type sweep (#312, #313)