Files
correx/BACKLOG.md
kami 3e94d7fbff merge: integrate feat/backlog-burndown into master
master had advanced 16 commits past feat/backlog-burndown's base, and the two
branches independently built four of the same features. Resolved 26 conflicts.

Overlap features — kept master's implementation (more complete / production-wired /
more robust), dropped the feature branch's parallel constellation:
- llama-server health probe: kept master's event-store-backed tps probe; dropped the
  branch's LlamaLivenessClient (liveness-only, throughput unwired).
- event-store probe: kept master's EventStoreHealthProbe; dropped EventStoreLatencyProbe.
- brief echo-back gate: kept master's BriefEchoDiff (Jaccard, tolerates rewording);
  dropped the branch's exact-set-diff BriefEchoComparator/Extractor.
- static-first reviewer: kept master's command/exit-code gate (ProcessStaticAnalysisRunner,
  wired); dropped the branch's structured-finding static_check stage (no-op seam).
  Its structured-findings model is filed as a follow-up in BACKLOG.

Feature-branch net-new work brought in and kept (master had none):
- native task tracking (aggregate, agent tools wired into analyst/implementer/reviewer,
  dependency graph + gates, decompose, REST/CLI, TUI task board)
- critique-outcome producer (role-rel §6 — master had deferred it)
- stage-level plan checkpointing (C-A2, folded into runPostStageGates)
- CLAUDE.md/AGENTS.md L0 standing context
- cross-session grants + TUI (grant scopes/revoke, @ picker, session resume browser)

Verified: full Gradle compile (all modules + tests) green; tests pass for core:events,
core:kernel, infrastructure:workflow, apps:server, apps:cli, testing:integration; tui-go
go build + go test green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-26 11:30:41 +00:00

111 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CORREX — BACKLOG (live unbuilt work only)
> **Rules.** This file is *only* outstanding work. Shipped code lives in `RETRO.md` (Pending live-QA →
> Landed). When you ship something: move it straight to `RETRO.md` under *Pending live-QA*, don't leave it
> here. After shipping, draft its QA: `/qa-plan <commits|spec>` → `docs/qa/QA-<feature>.md`.
> Pointers (commits, spec §) are point-in-time — verify against current code before acting.
---
## ★ Active epic — Plan-generation pipeline · `docs/plans/plan-pipeline-spec.md`
Turns a freestyle prompt into a confirmed `ExecutionPlan` via bounded **multi-candidate generation →
deterministic lint → structured critique → tournament → operator selection**. For the founding constraint
(local models are weak planners): narrow every model call, deterministic Kotlin joints, operator is the
terminal verifier. Generalizes today's degenerate N=1 freestyle planning. Slice 1 (lint) shipped → RETRO.
- [ ] **Slice 2 — multi-candidate round-1 + templates** (§4): `PlanTemplate` library, template-select +
slot-fill, GBNF-constrained, N₁=3 high-temp → `PlanCandidateGeneratedEvent`.
- [ ] **Slice 3 — critique + aggregate** (§6/§7): one-shot GBNF critic per survivor →
`CritiqueFinding{stageId,severity,finding,suggestedChange}` (first consumer of the role-rel §6 schema);
deterministic dedupe/contradiction-drop/severity-sort → `DefectList``PlanCritiqueCompletedEvent`.
- [ ] **Slice 4 — round-2 + tournament + operator selection** (§8/§9): N₂=2 low-temp regen from best
survivor + DefectList; deterministic ranking; top-2 → operator at the approval gate (**this is the TUI
plan-comparison view**). Reject-both → `PlanGenerationFailedEvent`.
- [ ] **Slice 5 — preference-pair logging** (§10): `PreferencePairRecordedEvent` (winner/loser/context),
BradleyTerry data for the future learned ranker (§12, deferred).
- [ ] **Slice 1b — plan file/symbol grounding**: extend the lint to ground the compiled plan's file paths
(reuse `BriefReferenceExtractor` + `worldProbe`, record per invariant #9) and symbols (needs the index
from "symbol grounding" below).
Caveats: `PlanConfirmedEvent` does **not** exist — extend `ExecutionPlanLockedEvent` with a candidate ref.
Module home: new `:core:planning`. Spec §11 — never execute a stage, auto-confirm, LLM-aggregate/rank,
mutate a candidate in place, or exceed 2 gen rounds / 1 critique round. Defect dedup: pin + version it.
## Ready to build (unblocked)
- [ ] **structured static-analysis findings** (role-rel §5, salvaged from `feat/backlog-burndown` at
the 2026-06-26 merge) — the merge kept master's command/exit-code static gate; the feature
branch's richer model is worth rebuilding on top of it: parse tool output into
`StaticFinding{tool,file,line,column,severity,ruleId}` (detekt/compiler/ktlint parsers existed)
and mechanically strip already-recorded findings from the reviewer's context
(`excludeStaticFindingsFromReview`) instead of only gating on exit code. Needs a production
runner that resolves the command to the session workspace (the original was a no-op seam).
- [ ] **§6 reviewer structured-findings emission** — the critique-outcome producer
(`CritiqueOutcomeCorrelator` → calibration) merged in from `feat/backlog-burndown` is dormant
until the reviewer/plan-critic actually emit `CritiqueFindingsRecordedEvent`s (a `review_report`
findings array + prompt change). Model-dependent → live-QA.
- [ ] **architect contradiction-check** (role-rel §4) — L3 over decision journal + ADRs →
`PossibleContradictionFlag` (display-only in v1).
- [ ] **symbol grounding** (role-rel §3) — needs a real symbol index (file-path grounding done); also
unblocks plan-lint Slice 1b symbol resolution. (`ctx.py` subprocess vs in-process tree-sitter — the
replay story prefers in-process + versioned.)
- [ ] **tier-2 stats polish** (obs §3) — session-completion summary pane (basic pane shipped).
- [ ] **full Go↔Kotlin per-event render matrix** (TUI §2) — golden-fixture tests asserting a render for
every event type (partially covered today).
- [ ] **approval ergonomics audit** (TUI §3) — single-key y/n/e for T0T2, mandatory confirm T3+, queued
approvals as a navigable list (never modal-stacked). Verify against current band impl.
- [ ] **render markdown in chat turns** (TUI) — currently ignored.
- [ ] **session list / resume view** (TUI) — no way to see a prior session after server restart + reopen;
`GET /sessions` data exists server-side.
- [ ] **research follow-ups** (§D): batch fetch-approval at source-list level (not per-URL); dedicated
`SourceFetched`/`LowQualityExtraction` events (quality+sha currently in `ToolExecutionCompleted`
metadata); dynamic per-session egress allowlist; **web approval client** (third client on the Ktor
bus, behind WireGuard/Tailscale, never public); fresh-machine runtime install (copy `research.toml` +
`prompts/` + `schemas/` + config entries into `~/.config/correx`).
- [ ] **low-sev hardening** (§G): turnId prefix collision — `startsWith("repomap:$repoRoot")` collides
`/repo` vs `/repo2`; fix = trailing `:` in 3 places (ProjectMemoryService write+check,
L3RepoKnowledgeRetriever). Narration lane lag — drop queued pause narrations once their approval
resolves. WorkspaceStateProbe fingerprint — hashes `path|mtime|size` without newline separators
(cosmetic, deterministic).
- [ ] **gamedev/Godot** (§I): `.cs` in `RepoMapIndexer` SYMBOL_PATTERNS (if the repo is Godot Mono; `.gd`
+ `.md` shipped `81a21bf`/`f521ac8`); structural `.tscn`/`.tres` validator (node-tree-aware diff).
## Blocked / sequenced (don't start yet)
- [ ] **`CritiqueFinding` schema** (role-rel §6) — lands with Slice 3 (its first consumer); no consumer
until then. **`CriticCalibrationProjection`** (= addenda A3) — after Slice 3 *runs*; needs runtime
critique/outcome history (`CritiqueOutcomeCorrelatedEvent`) to exist first.
- [ ] **dynamic plan-derived diff manifest** (role-rel §2) — allowed files from the `impl_plan` artifact;
refinement over the shipped static per-stage `writes=[globs]`.
- [ ] **§5.2 command-card LLM annotation layer** (TUI) — deferred by spec until layer 1 is used.
- [ ] **idea board → profile promotion** — deferred hook; auto-captured ideas promote into
`.correx/project.toml`.
- [ ] **freestyle follow-ups** (§H): graph re-routing by preemptive steering (mid-execution input can't
re-route the compiled graph yet); child-session `SubagentRunner` (seam exists; sequential only);
post-lock `ApprovalDecisionResolvedEvent.userSteering` → L0 promotion.
- [ ] **scene editing + event-log fine-tuning dataset** (§I, far future) — ⚠️ fine-tuning is on CLAUDE.md's
not-implemented list; needs an explicit epic + operator de-listing, not an incidental add.
## Won't build / deferred-by-design (don't re-litigate)
- 🚫 **obs tier-3 Prometheus/Grafana export** — spec says "deferred indefinitely."
- 🚫 **plan checkpointing** (addenda A2) — superseded: `verifyProduces` + `ManifestContainmentRule` +
validation already reconcile execution vs the compiled plan; only net-new bit fed a consumer (A3) that
isn't ready. Revisit only if a positive per-stage checkpoint event gains a real consumer.
- 🚫 **research non-responsibilities** — no headless browser, no LLM-based extraction, no public approval
endpoint.
- ⚠️ **architect ADR shape** (`alternativesConsidered` required non-empty, role-rel §4) — conflicts with
the standing "don't raise alternatives unless real cost/breakage" preference in `architect.md`.
- ⚠️ **`PreemptRedirectEvent` producer** (QA bug #6) — B3 hard re-route unreachable from the TUI; skipped
by design. Build only if the hard-reroute path is actually wanted.
---
## Ops notes (bite repeatedly)
- Config copies of `examples/*` in `~/.config/correx` go **stale silently** (e.g. a missing
`inject_artifact_kinds` → invented artifact kinds). Re-sync after editing repo examples.
- **Do not rebuild jars while the server JVM is running** — lazy classloading breaks
(`NoClassDefFoundError`). Stop the server first.