docs: reconcile BACKLOG→RETRO for static_check stage + critique producer (e46777e)

Per the hygiene rule: the §B-§5 static_check stage seam + emitter and the §B-§6/A3
critique-outcome producer are built and unit-verified, so move them out of the live
"missing" list. Both narrowed to their remaining live-QA-gated *activations* (a sandboxed
production CommandRunner for §B-§5; model-emitted CritiqueFindingsRecordedEvents for §6),
with a dated RETRO entry + commit map. Updated QA-reviewer-static-first (the producing
stage now exists — check 4 reframed from "blocked on unbuilt seam" to an activation step)
and its README index line.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-22 21:52:59 +00:00
parent e46777e29f
commit 33baaed903
4 changed files with 40 additions and 18 deletions
+17 -12
View File
@@ -36,13 +36,13 @@ quick commit map:
- **C-A2** stage-level plan checkpointing — `1a1b5cc` - **C-A2** stage-level plan checkpointing — `1a1b5cc`
- **B §4** architect contradiction-check (display-only) — `eae0a0c`, **activated** `4e08510` (server subscribes to the architect `design` artifact → emits the flag) - **B §4** architect contradiction-check (display-only) — `eae0a0c`, **activated** `4e08510` (server subscribes to the architect `design` artifact → emits the flag)
- **D** dedicated `SourceFetched`/`LowQualityExtraction` events — `b098d87`; dynamic per-session egress allowlist — `027ff1f`, **activated** `ab7e4be` (session state threaded into assessment input); batch source-list fetch-approval — `4b0024f` - **D** dedicated `SourceFetched`/`LowQualityExtraction` events — `b098d87`; dynamic per-session egress allowlist — `027ff1f`, **activated** `ab7e4be` (session state threaded into assessment input); batch source-list fetch-approval — `4b0024f`
- **B §5** reviewer static-first (runner + event + context-exclusion, live-wired) — `447fc7a` *(follow-up: a stage that emits `StaticFindingsRecordedEvent`)* - **B §5** reviewer static-first (runner + event + context-exclusion, live-wired) — `447fc7a`; the deterministic `static_check` stage seam + emitter — `e46777e` *(remaining: production sandboxed-runner activation, live-QA)*
- **G** narration-lane lag — `eff8f8d` - **G** narration-lane lag — `eff8f8d`
- **E** tui-go go.mod directive fix — `1e6699a`; markdown rendering — `da72ee5`; session list / resume view — `1f7a5d9`; per-event render-matrix golden tests — `2a99e15`; approval ergonomics (queue + tier-gated confirm) — `d5afcd3` - **E** tui-go go.mod directive fix — `1e6699a`; markdown rendering — `da72ee5`; session list / resume view — `1f7a5d9`; per-event render-matrix golden tests — `2a99e15`; approval ergonomics (queue + tier-gated confirm) — `d5afcd3`
- **B §2** plan-derived diff manifest — `641051b` - **B §2** plan-derived diff manifest — `641051b`
**Remaining (deeper / lower-verifiability):** H freestyle follow-ups (graph re-route, child-session runner — deep session-lifecycle, want live testing); the dormant model-dependent activations (A1 planner prompt, A3 producer, B§5 static_check stage — live-QA-gated, deprioritized to last). §E plan-comparison view is BLOCKED (no plan-candidate event; see §E). All cleanly unit-verifiable deterministic tracks are now landed. **Remaining (deeper / lower-verifiability):** H freestyle follow-ups (graph re-route, child-session runner — deep session-lifecycle, want live testing); the dormant *activations* whose deterministic halves are now built (A1 planner prompt; A3/§6 critique calibration — correlator + producer landed `e46777e`, awaiting model-emitted findings; B§5 static_check — seam + emitter landed `e46777e`, awaiting a sandboxed production runner — both live-QA-gated). §E plan-comparison view is BLOCKED (no plan-candidate event; see §E). All cleanly unit-verifiable deterministic tracks are now landed.
**Still blocked in this sandbox:** F live-QA gates + D §6 web approval client (need local model / SearXNG / GPU). **Still blocked in this sandbox:** F live-QA gates + D §6 web approval client (need local model / SearXNG / GPU).
**📋 Live-QA plans drafted** (`docs/qa/QA-*.md`, index `docs/qa/README.md`, env `docs/qa/ENV.md` + `scripts/qa/`): **📋 Live-QA plans drafted** (`docs/qa/QA-*.md`, index `docs/qa/README.md`, env `docs/qa/ENV.md` + `scripts/qa/`):
@@ -71,13 +71,17 @@ health probes shipped (`266bbf0`, `64a90e7`) → see RETRO. Remaining:
`CritiqueFinding` type + calibration projection (`f783eed`), and §4 architect `CritiqueFinding` type + calibration projection (`f783eed`), and §4 architect
contradiction-check (`eae0a0c`/`4e08510`) are shipped — see RETRO. Remaining: contradiction-check (`eae0a0c`/`4e08510`) are shipped — see RETRO. Remaining:
- [ ] **§5 static_check stage (emitter)** — the runner/event/filter are built and live-wired - [ ] **§5 static_check stage — production runner activation only** (seam + emitter built
(`447fc7a`); what's missing is a deterministic workflow stage that actually runs `e46777e`, see RETRO). The deterministic stage-type seam, `StaticCheckStageExecutor`, the
compiler/ktlint/detekt and emits `StaticFindingsRecordedEvent` (`// TODO(wiring)` in TOML fields, and the role_pipeline stage now exist; the stage is a **no-op until** a
`StaticAnalysisRunner.kt`). Needs an event-emitting stage-type seam. sandboxed, workspace-scoped `CommandRunner` is wired into the orchestrator AND `static_argv`
- [ ] **§6 `CritiqueOutcomeCorrelatedEvent` producer** (= pipeline-addenda A3) — the is set. That activation (ShellTool-style ProcessBuilder + session cwd + timeout) is
`CritiqueFinding` type + `CriticCalibrationProjection` exist (`f783eed`) but nothing feeds live-QA-gated — left for a focused pass with a real workspace.
them; needs a reviewer-loop producer that records finding outcomes. Build once, two consumers. - [ ] **§6 reviewer must emit structured findings** (correlator + producer built `e46777e`, see
RETRO). `CritiqueOutcomeCorrelator` + the `CritiqueFindingsRecordedEvent` → outcome →
calibration chain is built and unit-verified; it's **dormant until** the reviewer/plan-critic
actually emit `CritiqueFindingsRecordedEvent`s (a `review_report` findings array + prompt
change). That LLM-side emission is model-dependent → live-QA.
- [ ] **§3 symbol grounding** — deferred; needs a real symbol index (file-path grounding done). - [ ] **§3 symbol grounding** — deferred; needs a real symbol index (file-path grounding done).
- [ ] **§2 dynamic plan-derived diff manifest** — allowed files from the `impl_plan` - [ ] **§2 dynamic plan-derived diff manifest** — allowed files from the `impl_plan`
artifact. Future refinement; static per-stage `writes = [globs]` form is shipped. artifact. Future refinement; static per-stage `writes = [globs]` form is shipped.
@@ -94,9 +98,10 @@ checkpointing (`1a1b5cc`) → see RETRO. Remaining:
- [ ] **A1 activation** (model-dependent → live-QA) — `planner.md` must emit a `brief_echo` - [ ] **A1 activation** (model-dependent → live-QA) — `planner.md` must emit a `brief_echo`
block and `role_pipeline.toml` must set `briefEcho="true"` / `briefEchoSource` for the gate block and `role_pipeline.toml` must set `briefEcho="true"` / `briefEchoSource` for the gate
to fire live. The gate (`BriefEchoMismatchEvent` + comparator/extractor) is already built. to fire live. The gate (`BriefEchoMismatchEvent` + comparator/extractor) is already built.
- [ ] **A3 critique calibration tracking** — the `CriticCalibrationProjection` exists - [ ] **A3 critique calibration tracking** — the projection (`f783eed`) AND the producer
(`f783eed`); only the `CritiqueOutcomeCorrelatedEvent` producer is missing. Tracked as the (`CritiqueOutcomeCorrelator` + loop-resolution hook, `e46777e`) are now built. Remaining is
§6 producer follow-up above (build once, two consumers). only the model-gated reviewer-side emission of `CritiqueFindingsRecordedEvent`s — tracked as
the narrowed §6 item above.
## D. Research workflow spec — `docs/plans/2026-06-13-research-workflow-spec.md` ## D. Research workflow spec — `docs/plans/2026-06-13-research-workflow-spec.md`
+17
View File
@@ -53,6 +53,23 @@ viewer scrolling one line at a time; `db27b34` adds paging. Item moved out of BA
--- ---
## 2026-06-22 — reviewer reliability: static_check stage + critique calibration producer (branch `feat/backlog-burndown`)
Two deterministic role-reliability tracks whose consumer halves already existed but had nothing
feeding them. Both built + unit-verified (Gradle green, detekt clean); their *activations* are
model-/sandbox-gated and stay narrowed in BACKLOG.
| Commit | What | Item |
|--------|------|------|
| `e46777e` | **§B-§5 deterministic `static_check` stage seam + emitter.** `StaticCheckStageExecutor` runs a configured tool (`static_tool`/`static_argv` via stage metadata) through the existing `StaticAnalysisRunner` and emits `StaticFindingsRecordedEvent`; `DefaultSessionOrchestrator.enterStage` dispatches any `metadata["stage_type"]=="static_check"` stage to it instead of the LLM subagent and advances on the unconditional exit edge; `TomlWorkflowLoader` gained `stage_type`/`static_tool`/`static_argv` fields; `role_pipeline.toml` carries a `static_check` stage between implementer and reviewer. **No-op until** a sandboxed, workspace-scoped `CommandRunner` is wired + `static_argv` set (live-QA-gated). Tests: `StaticCheckStageExecutorTest` (4) + `StaticCheckStageTest` integration (1). | B §5 |
| `e46777e` | **§B-§6 / A3 critique-outcome producer.** New `CritiqueFindingsRecordedEvent` (+ `CritiqueVerdict`) is the producing side — a critic's findings + verdict per iteration, with `modelHash`. `CritiqueOutcomeCorrelator` (pure, in the reviewer-loop runtime) decides UPHELD / DISMISSED / INCONCLUSIVE per critic and finding id; a hook in `completeWorkflow`/`failWorkflow` correlates recorded findings into `CritiqueOutcomeCorrelatedEvent`s at loop resolution (no-op + idempotent), feeding the existing `:core:critique` calibration projection. **Dormant until** the reviewer/plan-critic emit `CritiqueFindingsRecordedEvent`s (model-gated). Tests: `CritiqueOutcomeCorrelatorTest` (8) + `CritiqueCalibrationWiringTest` integration (1). | B §6 / C-A3 |
Both follow the same shape as the earlier dormant-activation work: the deterministic seam + the
event wiring land and are unit-proven now; the LLM-/sandbox-side activation is the live-QA-gated
follow-up. `docs/qa/QA-reviewer-static-first.md` updated (no longer "producing stage not built").
---
## 2026-06-21 — wider grants + revoke (branch `feat/backlog-burndown`) ## 2026-06-21 — wider grants + revoke (branch `feat/backlog-burndown`)
Operator-requested (not a prior BACKLOG item): grants that outlive a single session, plus a Operator-requested (not a prior BACKLOG item): grants that outlive a single session, plus a
+5 -5
View File
@@ -2,13 +2,13 @@
**Status:** DRAFT (PARTIAL — see gap) **Status:** DRAFT (PARTIAL — see gap)
**Run date / operator:** **Run date / operator:**
**BACKLOG item:** §B-§5 "reviewer static-first INFRA" — runner + event + context-exclusion `447fc7a`. **BACKLOG item:** §B-§5 "reviewer static-first" — runner + event + context-exclusion `447fc7a`; deterministic `static_check` stage seam + emitter `e46777e`.
--- ---
## Gap up front (read first) ## Gap up front (read first)
The exclusion **filter** is live-wired into reviewer context assembly, and `StaticAnalysisRunner` + `StaticFindingsRecordedEvent` are built and unit-tested — but **no stock workflow stage emits `StaticFindingsRecordedEvent` yet** (the deterministic static-check stage-type seam is an open BACKLOG follow-up). So this pass verifies the **filter behavior by injecting the event**; the end-to-end "a stage runs detekt and the reviewer skips those findings" flow is blocked on that seam. The exclusion **filter** is live-wired into reviewer context assembly; `StaticAnalysisRunner` + `StaticFindingsRecordedEvent` are built; and the deterministic **`static_check` stage seam + emitter now exist** (`e46777e`): the orchestrator runs any `stage_type = "static_check"` stage through `StaticCheckStageExecutor`, and `role_pipeline.toml` carries one between implementer and reviewer. The remaining gap is **activation**: that stage is a **no-op until** a sandboxed, workspace-scoped `CommandRunner` is wired into the orchestrator AND the stage sets `static_argv`. So checks 13 verify the **filter by injecting the event** (unchanged); check 4 is now an **activation** check (configure `static_argv` + wire a runner) rather than "blocked on an unbuilt seam".
## Preconditions ## Preconditions
@@ -29,16 +29,16 @@ The exclusion **filter** is live-wired into reviewer context assembly, and `Stat
| 1 | Seed a `StaticFindingsRecordedEvent` for the session with a known finding (e.g. an unused-import lint at `Foo.kt:12`). | The event is in `correx events {id}`. | | | 1 | Seed a `StaticFindingsRecordedEvent` for the session with a known finding (e.g. an unused-import lint at `Foo.kt:12`). | The event is in `correx events {id}`. | |
| 2 | Drive the implementer→reviewer step so reviewer context is assembled. | The reviewer's input context (server log of the assembled prompt / context pack) **does not** contain a feedback entry restating the seeded static finding — `excludeStaticFindingsFromReview` stripped it. | | | 2 | Drive the implementer→reviewer step so reviewer context is assembled. | The reviewer's input context (server log of the assembled prompt / context pack) **does not** contain a feedback entry restating the seeded static finding — `excludeStaticFindingsFromReview` stripped it. | |
| 3 | Seed a finding that does **not** match any retry-feedback entry. | Non-matching entries are untouched; only restatements of recorded static findings are dropped. | | | 3 | Seed a finding that does **not** match any retry-feedback entry. | Non-matching entries are untouched; only restatements of recorded static findings are dropped. | |
| 4 | (When the static-check stage seam lands) run a workflow whose static stage emits the event for real. | The reviewer never re-raises the compiler/detekt issues the deterministic tool already caught. _(Deferred — seam not built.)_ | | | 4 | **Activate** the `static_check` stage: wire a sandboxed `CommandRunner` into the orchestrator and set `static_argv` (e.g. `./gradlew detekt --console=plain`) on the role_pipeline stage, then run a workflow that produces a patch with a real lint/compile issue. | A `StaticFindingsRecordedEvent` with the tool's parsed findings appears in `correx events {id}`, and the reviewer never re-raises those issues. _(Activation is the open §B-§5 follow-up — the seam + emitter are built.)_ | |
Evidence sources: server logs of the assembled reviewer context / context pack, `correx events {id}`. Evidence sources: server logs of the assembled reviewer context / context pack, `correx events {id}`.
## Out of scope (explicitly NOT covered this pass) ## Out of scope (explicitly NOT covered this pass)
- The **producing** static-check stage (open BACKLOG §B-§5 follow-up: "a stage that emits `StaticFindingsRecordedEvent`"). Check 4 stays deferred until that seam exists. - **Production runner activation** (open BACKLOG §B-§5 follow-up): wiring a sandboxed, workspace-scoped `CommandRunner` is itself live-QA-gated. The seam + emitter are built (`e46777e`) and unit-verified (`StaticCheckStageExecutorTest`, `StaticCheckStageTest`); check 4 exercises the activation once a runner is wired.
- The reviewer prompt half (shipped earlier, `3467826`). - The reviewer prompt half (shipped earlier, `3467826`).
## Disposition ## Disposition
- **PASS (partial)** → record in `RETRO.md` that the **filter** is live-verified (checks 13) and keep the §B-§5 *producing-stage* follow-up open in BACKLOG. Do not claim the full static-first loop until check 4 passes. - **PASS (partial)** → record in `RETRO.md` that the **filter** is live-verified (checks 13) and keep the §B-§5 *production-runner activation* follow-up open in BACKLOG. Do not claim the full static-first loop until check 4 passes.
- **FAIL** → numbered findings. Status: FAILED until green. - **FAIL** → numbered findings. Status: FAILED until green.
+1 -1
View File
@@ -15,7 +15,7 @@ to RETRO with the run date + cited evidence; on FAIL → refile each miss as a n
| `QA-architect-contradiction.md` | architect contradiction-check (display-only) | `4e08510` `eae0a0c` | model + **llamacpp embedder** + `project.enabled`, 2 sessions/1 process | | `QA-architect-contradiction.md` | architect contradiction-check (display-only) | `4e08510` `eae0a0c` | model + **llamacpp embedder** + `project.enabled`, 2 sessions/1 process |
| `QA-llama-health-probe.md` | LLAMA_SERVER liveness probe | `64a90e7` `9eef936` `266bbf0` | static llama-server you can stop | | `QA-llama-health-probe.md` | LLAMA_SERVER liveness probe | `64a90e7` `9eef936` `266bbf0` | static llama-server you can stop |
| `QA-idea-promotion.md` | idea-board → `.correx/project.toml` promotion | `f107ff5` | bound workspace (router model optional — can seed the event) | | `QA-idea-promotion.md` | idea-board → `.correx/project.toml` promotion | `f107ff5` | bound workspace (router model optional — can seed the event) |
| `QA-reviewer-static-first.md` | reviewer static-findings exclusion (PARTIAL — producing stage not built) | `447fc7a` | seed `StaticFindingsRecordedEvent` | | `QA-reviewer-static-first.md` | reviewer static-findings exclusion (PARTIAL — stage seam+emitter built `e46777e`; runner activation pending) | `447fc7a` `e46777e` | seed `StaticFindingsRecordedEvent` |
| `QA-brief-echo-gate.md` | **ARM-IT** plan: brief echo-back gate (off by default; risky to arm blind) | `1df7af5` | prod-candidate model | | `QA-brief-echo-gate.md` | **ARM-IT** plan: brief echo-back gate (off by default; risky to arm blind) | `1df7af5` | prod-candidate model |
| `QA-grants.md` | cross-session grants (PROJECT/GLOBAL) + revoke | `c36d41b` `8df0ec7` | model + a T2+ tool call, 2 sessions, 2 workspaces | | `QA-grants.md` | cross-session grants (PROJECT/GLOBAL) + revoke | `c36d41b` `8df0ec7` | model + a T2+ tool call, 2 sessions, 2 workspaces |
| `QA-tui-v2.md` | Bubble Tea v2 + Shift+Enter + native cursor + window title | `d247b19` `85af2c6` | **kitty-protocol terminal** + a server with a resumable session | | `QA-tui-v2.md` | Bubble Tea v2 + Shift+Enter + native cursor + window title | `d247b19` `85af2c6` | **kitty-protocol terminal** + a server with a resumable session |