docs(backlog): mark plan-lint Slice 1 shipped, add QA plan

This commit is contained in:
2026-06-15 00:27:31 +04:00
parent 68136e77d7
commit 63863a90ae
2 changed files with 75 additions and 6 deletions
+13 -6
View File
@@ -120,12 +120,15 @@ built analog is `ExecutionPlanLockedEvent` (extend it with a candidate ref; don'
Slices (spec §, in build order):
- [ ] **Slice 1 — §5 deterministic lint** *(in progress — see plan)*. Pure Kotlin, zero inference:
`PlanLinter` over the compiled `WorkflowGraph` → hard failures (missing file paths, unresolved
symbols, unproduced `needs`, produces-kind not in registry, ADR-0000 violations) discard a
candidate; soft findings (stage count, fan-out, budget, dup briefs) are scored. Records
`PlanLintCompletedEvent` (env observations — repo-map/symbol existence — per invariant #9). Wired
into `FreestyleDriver` before lock so it pays off **now** for single-plan freestyle. Standalone.
- [~] **Slice 1 — §5 deterministic lint** **SHIPPED (pending live-QA)** `68136e7`. Pure-Kotlin
`PlanLinter` over the compiled `WorkflowGraph`, run in `FreestyleDriver` before lock; records
`PlanLintCompletedEvent` (pure function of the recorded plan → replay-safe, no env observation),
and a hard failure → `ExecutionPlanRejectedEvent(source="lint")` before the operator is asked or
the plan locks. **Hard:** `unproduced_need` (real gap — the freestyle compiler never checked needs),
`trap_state` (no path to terminal; uses terminal-reachability so verdict-gated review loops pass).
**Soft (non-blocking):** `stage_count`, `fan_out`, `empty_brief`, `duplicate_brief`. QA gate in §F →
`docs/qa/QA-plan-lint.md`. **Deferred to Slice 1b:** file-path grounding + symbol resolution (env;
symbols need an index, §B §3), token-budget/ADR-bypass checks, a dedicated `:core:planning` module.
- [ ] **Slice 2 — §4 multi-candidate round-1 + templates.** `PlanTemplate` library, template-select +
slot-fill, GBNF-constrained, N₁=3 high-temp. `PlanCandidateGeneratedEvent`.
- [ ] **Slice 3 — §6 critique + §7 aggregate.** One-shot GBNF critic per survivor →
@@ -213,6 +216,10 @@ These are SHIPPED in code but prompt-/server-/network-dependent and not yet live
gate uncommented in the copied `role_pipeline.toml`). Plan: `docs/qa/QA-static-first-reviewer.md`
(clean→reviewer runs, non-clean→`StaticAnalysisCompleted`+retryable fail w/ output fed back,
gate-OFF absence check, no-runner no-op WARN, replay reads recorded findings without re-running).
- [ ] **Plan-lint (§C★ Slice 1) live-QA**`68136e7`; logic is unit-covered, so this is confirmatory:
needs a freestyle run reaching the plan-lock gate (+ a crafted bad plan to force the reject path).
Plan: `docs/qa/QA-plan-lint.md` (unproduced_need/trap_state → `PlanLintCompleted`+`ExecutionPlan-
Rejected(source=lint)`+no lock; review-loop NOT trapped; soft findings non-blocking; replay stable).
- [ ] **TUI kernel-steering + AMD gauge fresh live-QA** — approve+note actually revising the
*same* stage's output; AMD VRAM/RAM gauge on the real box.
- [ ] **Unit-tested-only fixes, not live-verified:** `1a7eb05` (verdict-edge rejection),