docs(sprint): record Goal 1 progress — #310, #311, #263 landed

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-26 21:31:23 +04:00
parent 867e99d1cb
commit 1b3b2f401a
+28 -2
View File
@@ -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)