12ff2e97b0
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>
45 lines
3.3 KiB
Markdown
45 lines
3.3 KiB
Markdown
# 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.
|