Files
correx/docs/qa/QA-idea-promotion.md
T
kami 12ff2e97b0 docs(qa): live-QA plans + env bring-up for the burndown features
Six QA plans (docs/qa/QA-*.md) pinning observable evidence for the shipped tracks:
research egress + batch source-approval (D), architect contradiction (B§4), llama health
probe (A§4), idea promotion (E), reviewer static-first filter (B§5, partial), and the
brief-echo gate ARM-IT plan (C-A1) — the latter is the go/no-go for arming the gate in
production (it breaks the planner if the model can't emit a parseable brief_echo).

Plus the env: docs/qa/ENV.md runbook + docs/qa/README.md index, and scripts/qa/
(sync-config.sh, searxng-up/down.sh with the JSON-format gotcha, README). Scripts are
set -euo pipefail, syntax-checked, executable. Authored from the repo build/config
(server :apps:server:run, CLI :apps:cli:run, tui-go GOTOOLCHAIN=auto, sample-config.toml).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 09:14:36 +00:00

3.3 KiB

QA Plan: idea-board → project-profile promotion — f107ff5

Status: DRAFT Run date / operator: BACKLOG item: §E "Idea board → profile promotion".


Preconditions

  • server build/branch: feat/backlog-burndown.
  • llama-server + model: a router model only if you capture the idea via the rubber-duck path (it must emit a ```json {"ideas":[...]} ``` block). To avoid model-dependence you may instead seed an IdeaCapturedEvent directly (see note below).
  • external deps: none.
  • config synced: standard.
  • fixtures/seed: a session bound to a workspace (a SessionWorkspaceBoundEvent must exist for the capturing session — promotion writes into <workspaceRoot>/.correx/project.toml and no-ops without a bound workspace). Start the TUI/session from inside the target repo dir so the workspace resolves.

Acceptance gate (one sentence)

Promoting a captured idea appends its text as a conventions entry in <workspaceRoot>/.correx/project.toml, records an IdeaPromotedEvent, and removes the idea from the board.

Checks

# Action Expected observable evidence Result
1 Capture an idea (rubber-duck {"ideas":[...]}, or seed an IdeaCapturedEvent). List the board (TUI R/idea overlay, or ListIdeas WS). The idea shows on the board with a stable ideaId; IdeaCapturedEvent in the log.
2 Note the pre-state of <workspaceRoot>/.correx/project.toml (may be absent). File absent or its current conventions = [...] recorded.
3 Send PromoteIdea(ideaId) (TUI promote key, or the WS PromoteIdea message). <workspaceRoot>/.correx/project.toml now exists and its conventions list contains the idea text verbatim (escaped if it had quotes). Re-reading via ProjectProfileLoader round-trips it (no corruption).
4 Re-read the log and the board. An IdeaPromotedEvent(ideaId, sessionId, text, timestampMs) is appended; the idea no longer appears on the board (activeIdeas tombstones promoted ids like discards).
5 Promote the same idea text again from a second idea (dedup). withConvention does not duplicate an identical convention — the list has it once.
6 Promote with no bound workspace (start a session with an unresolved working dir). No file write, no IdeaPromotedEvent — the handler no-ops and just refreshes the board (safe).

Seeding without a model: append an IdeaCapturedEvent(ideaId, sessionId, text, timestampMs) for a workspace-bound session via the event store, then drive PromoteIdea. This isolates the promotion path from router-prompt behavior.

Evidence sources: the file <workspaceRoot>/.correx/project.toml on disk, correx events {id}, the TUI board render.

Out of scope (explicitly NOT covered this pass)

  • The rubber-duck capture quality itself (covered by the separate idea-board live-QA, §F).
  • Promotion into about/commands — v1 promotes into conventions only.

Disposition

  • PASS → move the §E "Idea board → profile promotion" bullet to RETRO.md with this run date + the on-disk .correx/project.toml evidence. Status: PASSED.
  • FAIL → numbered findings (e.g. quote-escaping corruption, board not clearing). Status: FAILED until green.