feat: implement the 0.6.0 Human Review Loop (#17)#23
Conversation
confirm/reject now accept one or more ids (nargs+). The batch is transactional: all ids are validated first, and if any is unknown the batch aborts with a hint and resolves nothing — no half-applied state (decision c17). Covers plan targets c14, h3. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…#17) New 'devague review' (+ --json) surfaces every proposed claim and proposed honesty condition with ids. It is NOT gated on convergence and never mutates state — a read-only view of what awaits a user decision. Adds a review-md renderer with an explicit non-authoritative banner. Covers plan targets c12, h1. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…re (#17) devague review now writes .devague/reviews/<slug>.md (banner-marked, distinct from docs/specs/) and ensures .devague/reviews/ is git-ignored so it stays uncommitted working state by default (decision c19). --no-write prints only. Adds store.ensure_ignored / review_path / write_review. Covers plan targets c13, h2. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…#17) The review artifact is now round-trippable: each proposed item is emitted with an editable 'pending' marker. Change it to 'confirm'/'reject' and run 'devague confirm --from-review <file>' to apply exactly those decisions via the transactional path. 'pending' lines are never auto-confirmed; conflicting, empty, missing-file, and ids+file inputs all error cleanly. Covers c21, h13. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…<slug>.md (#17) New 'devague question' records/lists/resolves pending user decisions in durable, uncommitted working state under .devague/questions/<slug>.md (CLI-owns the round-trippable format, decision c20; git-ignored, decision c19). --resolve only records a human's decision; applying it into the frame stays an explicit move. Covers plan targets c15, h4. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds the verification suite proving the spec's honesty conditions: no review-flow command auto-confirms (c16/h5); one review + one batched confirm/reject resolves a chosen set on a non-converged frame (c3/h8); an llm proposal stays proposed until an explicit user confirm (c5/h10). Coverage 96.97%. Covers c16,h5,c6,h11,c5,h10,c3,h8. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ecks (#17) README documents the review loop (review, multi-id + --from-review confirm/reject, question) and which .devague/ files are committed vs uncommitted working state. CLAUDE.md status + flat-moves and the /think SKILL.md move table updated for the new verbs (doc-test alignment). Integration tests assert the announcement is literally true at scale and that 0.6.0 introduced no new claim/condition states (c1,h6,c2,h7,c4,h9,c7,h12). Bump 0.5.1 -> 0.6.0; CHANGELOG updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Review Summary by QodoImplement 0.6.0 Human Review Loop with multi-id transactional confirm/reject and review artifacts
WalkthroughsDescription• Implements the 0.6.0 Human Review Loop with devague review command - Lists every proposed (unconfirmed) claim and honesty condition with ids - Un-gated by convergence; never mutates state; writes non-authoritative artifact to .devague/reviews/.md • Extends confirm/reject to accept multiple ids in one transactional call - Validates all ids first; if any unknown, batch aborts with no half-applied state - Adds confirm --from-review to apply edited review artifacts • Introduces devague question command for recording/listing/resolving pending user decisions - Durable working state in .devague/questions/.md - Uncommitted by default; devague manages .gitignore • Adds review artifact parser and renderer with round-trippable pending/confirm/reject markers Diagramflowchart LR
A["User proposes items<br/>via LLM"] -->|"devague review"| B["Review artifact<br/>.devague/reviews/"]
B -->|"Edit pending→confirm/reject"| C["Apply decisions<br/>confirm --from-review"]
C -->|"Transactional batch"| D["Frame state<br/>confirmed/rejected"]
E["Pending decisions"] -->|"devague question"| F[".devague/questions/<br/>working state"]
F -->|"--resolve"| G["Record decision"]
File Changes1. devague/cli/__init__.py
|
Code Review by Qodo
1.
|
…ex (ReDoS hotspot) PR #23 SonarCloud gate (ERROR): - python:S3516 (BLOCKER): cmd_question always returned 0 via three identical returns. Split into _resolve_question/_add_question/_list_questions with one return point. - DoS hotspot: the questions _LINE regex had a \s+...\s+...\.* shape flagged for polynomial backtracking. Replaced variable whitespace with single literal spaces (rest is stripped in parse) so the pattern is linear. Behaviour and round-trip are unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… corruption) questions_io.parse() split resolved lines on the FIRST ' — decided: ', so a question whose text contains that delimiter was truncated on the next parse/render cycle, silently corrupting .devague/questions/<slug>.md. render() appends the decided tail last, so split from the right (rsplit). Adds a regression test with the delimiter inside the question text. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|



What
Implements the 0.6.0 Human Review Loop (#17) — the full 7-task plan exported
by
/spec-to-planin #22. Makes the user-only confirmation step ergonomic atscale while preserving the anti-fabrication guarantee. No LLM in the CLI; no
external services.
The loop
reviewwrites a non-authoritative artifact to.devague/reviews/<slug>.md;each item carries an editable
pendingmarker (change toconfirm/reject,then
confirm --from-review).pendinglines are never auto-confirmed; batchesare transactional (one bad id ⇒ nothing changes). devague manages
.gitignoreso
.devague/reviews/and.devague/questions/stay uncommitted working state.Tasks (each its own commit)
feat(t1)devague review(un-gated, no mutation)feat(t2).gitignorefeat(t3)confirm --from-reviewround-tripfeat(t4)devague questionworking statefeat(t5)test(t6)feat(t7)All 26 plan coverage targets implemented and tested.
Verification
confirm/reject, and the
--from-reviewround-trip each have explicit tests; anintegration test asserts 0.6.0 introduced no new claim/condition states.
--from-review) verified outside thetest harness.
Bumps
0.5.1 → 0.6.0. Closes #17 (and the directions of #11, #14).