devague 0.5.0__tar.gz → 0.6.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/think/SKILL.md +3 -1
- devague-0.6.0/.devague/current_plan +1 -0
- devague-0.6.0/.devague/frames/devague-0-6-0-ships-the-human-review-loop-devague.json +299 -0
- devague-0.6.0/.devague/plans/devague-0-6-0-ships-the-human-review-loop-devague.json +288 -0
- {devague-0.5.0 → devague-0.6.0}/CHANGELOG.md +26 -0
- {devague-0.5.0 → devague-0.6.0}/CLAUDE.md +12 -2
- {devague-0.5.0 → devague-0.6.0}/PKG-INFO +45 -1
- devague-0.6.0/README.md +85 -0
- {devague-0.5.0 → devague-0.6.0}/culture.yaml +1 -1
- {devague-0.5.0 → devague-0.6.0}/devague/cli/__init__.py +4 -0
- devague-0.6.0/devague/cli/_commands/confirm.py +96 -0
- devague-0.6.0/devague/cli/_commands/question.py +80 -0
- devague-0.6.0/devague/cli/_commands/reject.py +15 -0
- devague-0.6.0/devague/cli/_commands/review.py +63 -0
- devague-0.6.0/devague/questions_io.py +64 -0
- {devague-0.5.0 → devague-0.6.0}/devague/render/__init__.py +2 -0
- {devague-0.5.0 → devague-0.6.0}/devague/render/frame_md.py +5 -1
- devague-0.6.0/devague/render/review_md.py +76 -0
- devague-0.6.0/devague/render/spec_md.py +61 -0
- {devague-0.5.0 → devague-0.6.0}/devague/store.py +52 -0
- devague-0.6.0/docs/plans/devague-0-6-0-ships-the-human-review-loop-devague.md +71 -0
- devague-0.6.0/docs/specs/devague-0-6-0-ships-the-human-review-loop-devague.md +54 -0
- {devague-0.5.0 → devague-0.6.0}/pyproject.toml +1 -1
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_moves.py +32 -0
- devague-0.6.0/tests/test_cli_question.py +70 -0
- devague-0.6.0/tests/test_cli_review.py +153 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_render.py +64 -0
- devague-0.6.0/tests/test_review_loop_integration.py +66 -0
- devague-0.6.0/tests/test_review_loop_invariants.py +72 -0
- {devague-0.5.0 → devague-0.6.0}/uv.lock +1 -1
- devague-0.5.0/.devague/current_plan +0 -1
- devague-0.5.0/README.md +0 -41
- devague-0.5.0/devague/cli/_commands/confirm.py +0 -38
- devague-0.5.0/devague/cli/_commands/reject.py +0 -19
- devague-0.5.0/devague/render/spec_md.py +0 -50
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/cicd/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/communicate/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/think/scripts/think.sh +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/.claude/skills.local.yaml.example +0 -0
- {devague-0.5.0 → devague-0.6.0}/.devague/frames/devague-now-ships-a-documented-spec-contract-every.json +0 -0
- {devague-0.5.0 → devague-0.6.0}/.devague/plans/devague-now-ships-a-documented-spec-contract-every.json +0 -0
- {devague-0.5.0 → devague-0.6.0}/.flake8 +0 -0
- {devague-0.5.0 → devague-0.6.0}/.github/workflows/publish.yml +0 -0
- {devague-0.5.0 → devague-0.6.0}/.github/workflows/security-checks.yml +0 -0
- {devague-0.5.0 → devague-0.6.0}/.github/workflows/tests.yml +0 -0
- {devague-0.5.0 → devague-0.6.0}/.gitignore +0 -0
- {devague-0.5.0 → devague-0.6.0}/.markdownlint-cli2.yaml +0 -0
- {devague-0.5.0 → devague-0.6.0}/.pre-commit-config.yaml +0 -0
- {devague-0.5.0 → devague-0.6.0}/LICENSE +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/__init__.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/__main__.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/__init__.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/capture.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/converge.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/explain.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/export.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/interrogate.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/learn.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/list_frames.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/new.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/park.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/plan.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_commands/show.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_errors.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_frames.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_output.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/cli/_plans.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/convergence.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/frame.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/plan.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/plan_convergence.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/plan_store.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/devague/render/plan_md.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/examples/contract-example.json +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/plans/devague-now-ships-a-documented-spec-contract-every.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/reviews/spec-contract-frame-review.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/skill-sources.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/spec-contract.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/specs/devague-now-ships-a-documented-spec-contract-every.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/superpowers/plans/2026-05-22-specifix-onboarding.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/superpowers/plans/2026-05-23-devague-rename.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/superpowers/plans/2026-05-23-devague-working-backwards-engine.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/superpowers/specs/2026-05-22-specifix-onboarding-design.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/superpowers/specs/2026-05-23-devague-spec-to-plan-design.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/docs/superpowers/specs/2026-05-23-devague-working-backwards-design.md +0 -0
- {devague-0.5.0 → devague-0.6.0}/sonar-project.properties +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/__init__.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_affordances.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_chassis.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_converge_export.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_errors.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_output.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_cli_plan.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_contract.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_convergence.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_frame.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_offline.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_package.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_plan.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_plan_convergence.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_plan_store.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_render_plan.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_spec_to_plan_skill.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_store.py +0 -0
- {devague-0.5.0 → devague-0.6.0}/tests/test_think_skill.py +0 -0
|
@@ -58,7 +58,9 @@ portable resolution and the `status` helper.
|
|
|
58
58
|
| `new "<announcement>"` | Start a frame from the announcement (the first move). Seeds an auto-confirmed `announcement` claim. |
|
|
59
59
|
| `capture --kind <kind> "<text>"` | Record + classify a claim. `--origin llm` lands it as `proposed`. |
|
|
60
60
|
| `interrogate <id> --honesty "…"` | Attach an honesty condition (what must be true). Also `--hard-question`, `--risk`, `--contradicts`, `--blocking`. |
|
|
61
|
-
| `confirm <id
|
|
61
|
+
| `confirm <id> [<id>…]` / `reject <id> [<id>…]` | Resolve one or more claims (`c*`) / honesty conditions (`h*`) in one **transactional** call. **User-only decision.** Also `confirm --from-review <file>` to apply an edited review artifact. |
|
|
62
|
+
| `review` | List every **proposed** (unconfirmed) claim + honesty condition with ids (`--json` too); writes a non-authoritative artifact to `.devague/reviews/<slug>.md`. Un-gated; never mutates. |
|
|
63
|
+
| `question "<text>"` | Record / list / `--resolve` a pending user decision as durable working state in `.devague/questions/<slug>.md`. |
|
|
62
64
|
| `park "<text>" --kind <kind>` | Move uncertainty into first-class open vagueness instead of forcing an answer. |
|
|
63
65
|
| `converge` | Evaluate the gate; list remaining gaps. |
|
|
64
66
|
| `export` | Write the buildable spec to `docs/specs/` — only after `converge` passes. |
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
devague-0-6-0-ships-the-human-review-loop-devague
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "devague-0-6-0-ships-the-human-review-loop-devague",
|
|
3
|
+
"title": "devague 0.6.0 ships the Human Review Loop: 'devague review' surfaces every unconfirmed LLM proposal in one pass, and confirm/reject now take many ids at once \u2014 so honest human review scales to frames full of proposals without ever auto-confirming anything.",
|
|
4
|
+
"schema_version": 1,
|
|
5
|
+
"status": "exported",
|
|
6
|
+
"created": "2026-05-23T11:07:38Z",
|
|
7
|
+
"updated": "2026-05-23T11:24:24Z",
|
|
8
|
+
"claims": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "devague 0.6.0 ships the Human Review Loop: 'devague review' surfaces every unconfirmed LLM proposal in one pass, and confirm/reject now take many ids at once \u2014 so honest human review scales to frames full of proposals without ever auto-confirming anything.",
|
|
13
|
+
"origin": "user",
|
|
14
|
+
"status": "confirmed",
|
|
15
|
+
"honesty_conditions": [
|
|
16
|
+
{
|
|
17
|
+
"id": "h6",
|
|
18
|
+
"text": "At 0.6.0 release the announcement is literally true of the shipped CLI: 'devague review' exists, and a frame full of proposed items can be reviewed then bulk confirmed/rejected in one pass with no path that auto-confirms.",
|
|
19
|
+
"status": "confirmed"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"hard_questions": [],
|
|
23
|
+
"links": []
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "c2",
|
|
27
|
+
"kind": "audience",
|
|
28
|
+
"text": "The human operator driving devague who must review and confirm/reject LLM-proposed claims and honesty conditions, plus the assisting LLM agent that produces those proposals.",
|
|
29
|
+
"origin": "user",
|
|
30
|
+
"status": "confirmed",
|
|
31
|
+
"honesty_conditions": [
|
|
32
|
+
{
|
|
33
|
+
"id": "h7",
|
|
34
|
+
"text": "Both audiences are served: the operator gets a single review + bulk-decide path, and the LLM agent's proposals stay visibly 'proposed' until the operator explicitly acts.",
|
|
35
|
+
"status": "confirmed"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"hard_questions": [],
|
|
39
|
+
"links": []
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "c3",
|
|
43
|
+
"kind": "after_state",
|
|
44
|
+
"text": "In one pass the operator sees every unconfirmed proposal (proposed claims + proposed honesty conditions) without the frame needing to converge, then confirms or rejects many in a single command; pending design questions persist as durable .devague working state to decide later.",
|
|
45
|
+
"origin": "user",
|
|
46
|
+
"status": "confirmed",
|
|
47
|
+
"honesty_conditions": [
|
|
48
|
+
{
|
|
49
|
+
"id": "h8",
|
|
50
|
+
"text": "On a non-converged frame, one 'review' shows every proposed item and one 'confirm'/'reject' call resolves a chosen set \u2014 demonstrable end-to-end in a test.",
|
|
51
|
+
"status": "confirmed"
|
|
52
|
+
}
|
|
53
|
+
],
|
|
54
|
+
"hard_questions": [],
|
|
55
|
+
"links": []
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"id": "c4",
|
|
59
|
+
"kind": "before_state",
|
|
60
|
+
"text": "Review was ad-hoc (hand-rolled from show / show --json) and confirmation was one id per command, so a frame with ~15 proposed conditions meant 15 sequential commands \u2014 pushing toward rubber-stamping instead of genuine review (surfaced dogfooding /think on #5).",
|
|
61
|
+
"origin": "user",
|
|
62
|
+
"status": "confirmed",
|
|
63
|
+
"honesty_conditions": [
|
|
64
|
+
{
|
|
65
|
+
"id": "h9",
|
|
66
|
+
"text": "The before-state pain is real and removed: the pre-0.6.0 flow needed N commands for N conditions with no review artifact; 0.6.0 replaces that with one review plus one bulk decision.",
|
|
67
|
+
"status": "confirmed"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"hard_questions": [],
|
|
71
|
+
"links": []
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"id": "c5",
|
|
75
|
+
"kind": "why_it_matters",
|
|
76
|
+
"text": "The user-only confirmation step is devague's whole anti-fabrication guarantee; it must be ergonomic enough to do honestly at scale and support out-of-band review (read proposals somewhere comfortable like NotebookLM or a shared doc, then apply decisions), or it gets skipped or rubber-stamped.",
|
|
77
|
+
"origin": "user",
|
|
78
|
+
"status": "confirmed",
|
|
79
|
+
"honesty_conditions": [
|
|
80
|
+
{
|
|
81
|
+
"id": "h10",
|
|
82
|
+
"text": "The anti-fabrication guarantee is preserved exactly: ergonomics improve but no proposal becomes authoritative without an explicit user action, asserted by test.",
|
|
83
|
+
"status": "confirmed"
|
|
84
|
+
}
|
|
85
|
+
],
|
|
86
|
+
"hard_questions": [],
|
|
87
|
+
"links": []
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "c6",
|
|
91
|
+
"kind": "success_signal",
|
|
92
|
+
"text": "A frame with many proposed items is reviewed and resolved in a single 'devague review' plus one batched confirm/reject, and the test suite proves: review export works before convergence, multi-id confirm/reject works, and no review-flow command auto-confirms a proposal.",
|
|
93
|
+
"origin": "user",
|
|
94
|
+
"status": "confirmed",
|
|
95
|
+
"honesty_conditions": [
|
|
96
|
+
{
|
|
97
|
+
"id": "h11",
|
|
98
|
+
"text": "The success signals are verified by the committed test suite, not asserted by hand.",
|
|
99
|
+
"status": "confirmed"
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"hard_questions": [],
|
|
103
|
+
"links": []
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "c7",
|
|
107
|
+
"kind": "boundary",
|
|
108
|
+
"text": "Scope is the review/confirm UX layered over the existing proposed-vs-confirmed contract (#5/#16); it does not change the state model itself \u2014 proposals still only become authoritative by explicit user action.",
|
|
109
|
+
"origin": "user",
|
|
110
|
+
"status": "confirmed",
|
|
111
|
+
"honesty_conditions": [
|
|
112
|
+
{
|
|
113
|
+
"id": "h12",
|
|
114
|
+
"text": "0.6.0 adds only review/confirm UX; the proposed-vs-confirmed state model and convergence gate from #5/#16 are unchanged \u2014 no new claim or condition states are introduced.",
|
|
115
|
+
"status": "confirmed"
|
|
116
|
+
}
|
|
117
|
+
],
|
|
118
|
+
"hard_questions": [],
|
|
119
|
+
"links": []
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"id": "c8",
|
|
123
|
+
"kind": "non_goal",
|
|
124
|
+
"text": "Does not generate a polished buildable spec from unconfirmed review output \u2014 review output stays explicitly non-authoritative, distinct from what 'export' produces post-convergence.",
|
|
125
|
+
"origin": "user",
|
|
126
|
+
"status": "confirmed",
|
|
127
|
+
"honesty_conditions": [],
|
|
128
|
+
"hard_questions": [],
|
|
129
|
+
"links": []
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"id": "c9",
|
|
133
|
+
"kind": "non_goal",
|
|
134
|
+
"text": "Does not auto-resolve questions and does not auto-confirm any LLM-proposed content anywhere in the review flow.",
|
|
135
|
+
"origin": "user",
|
|
136
|
+
"status": "confirmed",
|
|
137
|
+
"honesty_conditions": [],
|
|
138
|
+
"hard_questions": [],
|
|
139
|
+
"links": []
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
"id": "c10",
|
|
143
|
+
"kind": "non_goal",
|
|
144
|
+
"text": "The CLI does not call an LLM.",
|
|
145
|
+
"origin": "user",
|
|
146
|
+
"status": "confirmed",
|
|
147
|
+
"honesty_conditions": [],
|
|
148
|
+
"hard_questions": [],
|
|
149
|
+
"links": []
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"id": "c11",
|
|
153
|
+
"kind": "non_goal",
|
|
154
|
+
"text": "Does not require GitHub, NotebookLM, or any external service.",
|
|
155
|
+
"origin": "user",
|
|
156
|
+
"status": "confirmed",
|
|
157
|
+
"honesty_conditions": [],
|
|
158
|
+
"hard_questions": [],
|
|
159
|
+
"links": []
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "c12",
|
|
163
|
+
"kind": "requirement",
|
|
164
|
+
"text": "'devague review' (and 'devague review --json') emits all proposed claims and proposed honesty conditions, with their ids, without requiring or triggering convergence.",
|
|
165
|
+
"origin": "user",
|
|
166
|
+
"status": "confirmed",
|
|
167
|
+
"honesty_conditions": [
|
|
168
|
+
{
|
|
169
|
+
"id": "h1",
|
|
170
|
+
"text": "Running 'devague review' on a frame that has NOT converged still exits 0 and lists every proposed claim and proposed honesty condition with ids; it never invokes the convergence gate nor mutates any claim/condition state.",
|
|
171
|
+
"status": "confirmed"
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"hard_questions": [],
|
|
175
|
+
"links": []
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"id": "c13",
|
|
179
|
+
"kind": "requirement",
|
|
180
|
+
"text": "Review output is clearly labelled unconfirmed and non-authoritative, visually distinct from the buildable spec that 'export' produces only after convergence.",
|
|
181
|
+
"origin": "user",
|
|
182
|
+
"status": "confirmed",
|
|
183
|
+
"honesty_conditions": [
|
|
184
|
+
{
|
|
185
|
+
"id": "h2",
|
|
186
|
+
"text": "The review artifact carries an explicit 'nothing confirmed yet \u2014 non-authoritative' banner and is written to a path under .devague/reviews/<slug>.md, distinct from docs/specs/, so it cannot be mistaken for the buildable spec.",
|
|
187
|
+
"status": "confirmed"
|
|
188
|
+
}
|
|
189
|
+
],
|
|
190
|
+
"hard_questions": [],
|
|
191
|
+
"links": []
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"id": "c14",
|
|
195
|
+
"kind": "requirement",
|
|
196
|
+
"text": "'devague confirm' accepts multiple claim/honesty ids in one invocation, and 'devague reject' likewise.",
|
|
197
|
+
"origin": "user",
|
|
198
|
+
"status": "confirmed",
|
|
199
|
+
"honesty_conditions": [
|
|
200
|
+
{
|
|
201
|
+
"id": "h3",
|
|
202
|
+
"text": "'devague confirm a b c' resolves every listed id in a single call (and 'reject a b c' likewise), and the handling of a batch containing an invalid/unknown id follows one defined, tested rule.",
|
|
203
|
+
"status": "confirmed"
|
|
204
|
+
}
|
|
205
|
+
],
|
|
206
|
+
"hard_questions": [],
|
|
207
|
+
"links": []
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"id": "c15",
|
|
211
|
+
"kind": "requirement",
|
|
212
|
+
"text": "Open questions / pending user decisions can be written as durable .devague working state (e.g. .devague/questions/<slug>.md), treated as uncommitted working state by default unless the user intentionally promotes one into docs.",
|
|
213
|
+
"origin": "user",
|
|
214
|
+
"status": "confirmed",
|
|
215
|
+
"honesty_conditions": [
|
|
216
|
+
{
|
|
217
|
+
"id": "h4",
|
|
218
|
+
"text": "A pending question the CLI writes persists across runs under .devague/questions/<slug>.md, is treated as uncommitted working state by default, and a documented path exists to apply a confirmed decision back into the frame.",
|
|
219
|
+
"status": "confirmed"
|
|
220
|
+
}
|
|
221
|
+
],
|
|
222
|
+
"hard_questions": [],
|
|
223
|
+
"links": []
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"id": "c16",
|
|
227
|
+
"kind": "requirement",
|
|
228
|
+
"text": "No command in the review flow auto-confirms LLM-proposed content; every confirm/reject stays an explicit user action.",
|
|
229
|
+
"origin": "user",
|
|
230
|
+
"status": "confirmed",
|
|
231
|
+
"honesty_conditions": [
|
|
232
|
+
{
|
|
233
|
+
"id": "h5",
|
|
234
|
+
"text": "An automated test asserts that no review-flow command (review, multi-id confirm/reject, any --json path) transitions an llm-origin proposed item to confirmed without an explicit user confirm naming that id.",
|
|
235
|
+
"status": "confirmed"
|
|
236
|
+
}
|
|
237
|
+
],
|
|
238
|
+
"hard_questions": [],
|
|
239
|
+
"links": []
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"id": "c17",
|
|
243
|
+
"kind": "decision",
|
|
244
|
+
"text": "Batch confirm/reject is TRANSACTIONAL: validate all ids first; if any id is unknown/invalid, resolve none and exit non-zero with a hint \u2014 never a half-applied batch.",
|
|
245
|
+
"origin": "user",
|
|
246
|
+
"status": "confirmed",
|
|
247
|
+
"honesty_conditions": [],
|
|
248
|
+
"hard_questions": [],
|
|
249
|
+
"links": []
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"id": "c18",
|
|
253
|
+
"kind": "decision",
|
|
254
|
+
"text": "'devague confirm --from-review <file>' IS in scope for 0.6.0: it parses a reviewed decision set (confirm/reject per id) from the review artifact and applies it, so the review artifact format must be documented and round-trippable.",
|
|
255
|
+
"origin": "user",
|
|
256
|
+
"status": "confirmed",
|
|
257
|
+
"honesty_conditions": [],
|
|
258
|
+
"hard_questions": [],
|
|
259
|
+
"links": []
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"id": "c19",
|
|
263
|
+
"kind": "decision",
|
|
264
|
+
"text": "devague manages .gitignore: it ensures .devague/reviews/ and .devague/questions/ are git-ignored so review/question state is uncommitted working state by default; the user opts in to promote one into docs.",
|
|
265
|
+
"origin": "user",
|
|
266
|
+
"status": "confirmed",
|
|
267
|
+
"honesty_conditions": [],
|
|
268
|
+
"hard_questions": [],
|
|
269
|
+
"links": []
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"id": "c20",
|
|
273
|
+
"kind": "decision",
|
|
274
|
+
"text": "Pending questions/decisions are produced by a CLI move that writes .devague/questions/<slug>.md and owns the format (first-class + unit-testable), not a hand-written skill artifact.",
|
|
275
|
+
"origin": "user",
|
|
276
|
+
"status": "confirmed",
|
|
277
|
+
"honesty_conditions": [],
|
|
278
|
+
"hard_questions": [],
|
|
279
|
+
"links": []
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"id": "c21",
|
|
283
|
+
"kind": "requirement",
|
|
284
|
+
"text": "'devague confirm --from-review <file>' applies a reviewed decision set parsed from the review artifact; the artifact 'devague review' emits is documented and round-trippable (review -> edit decisions -> apply).",
|
|
285
|
+
"origin": "user",
|
|
286
|
+
"status": "confirmed",
|
|
287
|
+
"honesty_conditions": [
|
|
288
|
+
{
|
|
289
|
+
"id": "h13",
|
|
290
|
+
"text": "A review artifact emitted by 'devague review' can be edited with confirm/reject decisions and fed to 'devague confirm --from-review <file>' to apply exactly those decisions \u2014 proven by a round-trip test \u2014 and applying it still auto-confirms nothing the file did not mark confirmed.",
|
|
291
|
+
"status": "confirmed"
|
|
292
|
+
}
|
|
293
|
+
],
|
|
294
|
+
"hard_questions": [],
|
|
295
|
+
"links": []
|
|
296
|
+
}
|
|
297
|
+
],
|
|
298
|
+
"open_vagueness": []
|
|
299
|
+
}
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "devague-0-6-0-ships-the-human-review-loop-devague",
|
|
3
|
+
"title": "devague 0.6.0 ships the Human Review Loop: 'devague review' surfaces every unconfirmed LLM proposal in one pass, and confirm/reject now take many ids at once \u2014 so honest human review scales to frames full of proposals without ever auto-confirming anything.",
|
|
4
|
+
"frame_slug": "devague-0-6-0-ships-the-human-review-loop-devague",
|
|
5
|
+
"status": "exported",
|
|
6
|
+
"created": "2026-05-23T11:29:36Z",
|
|
7
|
+
"updated": "2026-05-23T11:32:13Z",
|
|
8
|
+
"targets": [
|
|
9
|
+
{
|
|
10
|
+
"id": "c1",
|
|
11
|
+
"kind": "announcement",
|
|
12
|
+
"text": "devague 0.6.0 ships the Human Review Loop: 'devague review' surfaces every unconfirmed LLM proposal in one pass, and confirm/reject now take many ids at once \u2014 so honest human review scales to frames full of proposals without ever auto-confirming anything."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"id": "h6",
|
|
16
|
+
"kind": "honesty",
|
|
17
|
+
"text": "At 0.6.0 release the announcement is literally true of the shipped CLI: 'devague review' exists, and a frame full of proposed items can be reviewed then bulk confirmed/rejected in one pass with no path that auto-confirms."
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "c2",
|
|
21
|
+
"kind": "audience",
|
|
22
|
+
"text": "The human operator driving devague who must review and confirm/reject LLM-proposed claims and honesty conditions, plus the assisting LLM agent that produces those proposals."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "h7",
|
|
26
|
+
"kind": "honesty",
|
|
27
|
+
"text": "Both audiences are served: the operator gets a single review + bulk-decide path, and the LLM agent's proposals stay visibly 'proposed' until the operator explicitly acts."
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "c3",
|
|
31
|
+
"kind": "after_state",
|
|
32
|
+
"text": "In one pass the operator sees every unconfirmed proposal (proposed claims + proposed honesty conditions) without the frame needing to converge, then confirms or rejects many in a single command; pending design questions persist as durable .devague working state to decide later."
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "h8",
|
|
36
|
+
"kind": "honesty",
|
|
37
|
+
"text": "On a non-converged frame, one 'review' shows every proposed item and one 'confirm'/'reject' call resolves a chosen set \u2014 demonstrable end-to-end in a test."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"id": "c4",
|
|
41
|
+
"kind": "before_state",
|
|
42
|
+
"text": "Review was ad-hoc (hand-rolled from show / show --json) and confirmation was one id per command, so a frame with ~15 proposed conditions meant 15 sequential commands \u2014 pushing toward rubber-stamping instead of genuine review (surfaced dogfooding /think on #5)."
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "h9",
|
|
46
|
+
"kind": "honesty",
|
|
47
|
+
"text": "The before-state pain is real and removed: the pre-0.6.0 flow needed N commands for N conditions with no review artifact; 0.6.0 replaces that with one review plus one bulk decision."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"id": "c5",
|
|
51
|
+
"kind": "why_it_matters",
|
|
52
|
+
"text": "The user-only confirmation step is devague's whole anti-fabrication guarantee; it must be ergonomic enough to do honestly at scale and support out-of-band review (read proposals somewhere comfortable like NotebookLM or a shared doc, then apply decisions), or it gets skipped or rubber-stamped."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"id": "h10",
|
|
56
|
+
"kind": "honesty",
|
|
57
|
+
"text": "The anti-fabrication guarantee is preserved exactly: ergonomics improve but no proposal becomes authoritative without an explicit user action, asserted by test."
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"id": "c6",
|
|
61
|
+
"kind": "success_signal",
|
|
62
|
+
"text": "A frame with many proposed items is reviewed and resolved in a single 'devague review' plus one batched confirm/reject, and the test suite proves: review export works before convergence, multi-id confirm/reject works, and no review-flow command auto-confirms a proposal."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"id": "h11",
|
|
66
|
+
"kind": "honesty",
|
|
67
|
+
"text": "The success signals are verified by the committed test suite, not asserted by hand."
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "c7",
|
|
71
|
+
"kind": "boundary",
|
|
72
|
+
"text": "Scope is the review/confirm UX layered over the existing proposed-vs-confirmed contract (#5/#16); it does not change the state model itself \u2014 proposals still only become authoritative by explicit user action."
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "h12",
|
|
76
|
+
"kind": "honesty",
|
|
77
|
+
"text": "0.6.0 adds only review/confirm UX; the proposed-vs-confirmed state model and convergence gate from #5/#16 are unchanged \u2014 no new claim or condition states are introduced."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"id": "c12",
|
|
81
|
+
"kind": "requirement",
|
|
82
|
+
"text": "'devague review' (and 'devague review --json') emits all proposed claims and proposed honesty conditions, with their ids, without requiring or triggering convergence."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"id": "h1",
|
|
86
|
+
"kind": "honesty",
|
|
87
|
+
"text": "Running 'devague review' on a frame that has NOT converged still exits 0 and lists every proposed claim and proposed honesty condition with ids; it never invokes the convergence gate nor mutates any claim/condition state."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"id": "c13",
|
|
91
|
+
"kind": "requirement",
|
|
92
|
+
"text": "Review output is clearly labelled unconfirmed and non-authoritative, visually distinct from the buildable spec that 'export' produces only after convergence."
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "h2",
|
|
96
|
+
"kind": "honesty",
|
|
97
|
+
"text": "The review artifact carries an explicit 'nothing confirmed yet \u2014 non-authoritative' banner and is written to a path under .devague/reviews/<slug>.md, distinct from docs/specs/, so it cannot be mistaken for the buildable spec."
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "c14",
|
|
101
|
+
"kind": "requirement",
|
|
102
|
+
"text": "'devague confirm' accepts multiple claim/honesty ids in one invocation, and 'devague reject' likewise."
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"id": "h3",
|
|
106
|
+
"kind": "honesty",
|
|
107
|
+
"text": "'devague confirm a b c' resolves every listed id in a single call (and 'reject a b c' likewise), and the handling of a batch containing an invalid/unknown id follows one defined, tested rule."
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"id": "c15",
|
|
111
|
+
"kind": "requirement",
|
|
112
|
+
"text": "Open questions / pending user decisions can be written as durable .devague working state (e.g. .devague/questions/<slug>.md), treated as uncommitted working state by default unless the user intentionally promotes one into docs."
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"id": "h4",
|
|
116
|
+
"kind": "honesty",
|
|
117
|
+
"text": "A pending question the CLI writes persists across runs under .devague/questions/<slug>.md, is treated as uncommitted working state by default, and a documented path exists to apply a confirmed decision back into the frame."
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "c16",
|
|
121
|
+
"kind": "requirement",
|
|
122
|
+
"text": "No command in the review flow auto-confirms LLM-proposed content; every confirm/reject stays an explicit user action."
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
"id": "h5",
|
|
126
|
+
"kind": "honesty",
|
|
127
|
+
"text": "An automated test asserts that no review-flow command (review, multi-id confirm/reject, any --json path) transitions an llm-origin proposed item to confirmed without an explicit user confirm naming that id."
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"id": "c21",
|
|
131
|
+
"kind": "requirement",
|
|
132
|
+
"text": "'devague confirm --from-review <file>' applies a reviewed decision set parsed from the review artifact; the artifact 'devague review' emits is documented and round-trippable (review -> edit decisions -> apply)."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"id": "h13",
|
|
136
|
+
"kind": "honesty",
|
|
137
|
+
"text": "A review artifact emitted by 'devague review' can be edited with confirm/reject decisions and fed to 'devague confirm --from-review <file>' to apply exactly those decisions \u2014 proven by a round-trip test \u2014 and applying it still auto-confirms nothing the file did not mark confirmed."
|
|
138
|
+
}
|
|
139
|
+
],
|
|
140
|
+
"tasks": [
|
|
141
|
+
{
|
|
142
|
+
"id": "t1",
|
|
143
|
+
"summary": "Multi-id, transactional confirm/reject",
|
|
144
|
+
"origin": "user",
|
|
145
|
+
"status": "confirmed",
|
|
146
|
+
"acceptance_criteria": [
|
|
147
|
+
"confirm and reject accept multiple ids (nargs+) in a single invocation",
|
|
148
|
+
"batch is transactional: if any id is unknown/invalid, resolve none and exit non-zero with a hint (decision c17)",
|
|
149
|
+
"an all-valid batch resolves every listed id; existing single-id behaviour is unchanged"
|
|
150
|
+
],
|
|
151
|
+
"deps": [],
|
|
152
|
+
"covers": [
|
|
153
|
+
"c14",
|
|
154
|
+
"h3"
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"id": "t2",
|
|
159
|
+
"summary": "'devague review' lists proposed items, un-gated, with no mutation (+ --json)",
|
|
160
|
+
"origin": "user",
|
|
161
|
+
"status": "confirmed",
|
|
162
|
+
"acceptance_criteria": [
|
|
163
|
+
"review lists every proposed claim and proposed honesty condition with their ids",
|
|
164
|
+
"review runs on a NON-converged frame, exits 0, and never invokes the convergence gate",
|
|
165
|
+
"review never mutates any claim/condition state; review --json emits the same set structured"
|
|
166
|
+
],
|
|
167
|
+
"deps": [],
|
|
168
|
+
"covers": [
|
|
169
|
+
"c12",
|
|
170
|
+
"h1"
|
|
171
|
+
]
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
"id": "t3",
|
|
175
|
+
"summary": "Non-authoritative review artifact at .devague/reviews/<slug>.md",
|
|
176
|
+
"origin": "user",
|
|
177
|
+
"status": "confirmed",
|
|
178
|
+
"acceptance_criteria": [
|
|
179
|
+
"review writes .devague/reviews/<slug>.md carrying an explicit 'nothing confirmed yet \u2014 non-authoritative' banner",
|
|
180
|
+
"the path is distinct from docs/specs/ so it cannot be mistaken for the buildable spec",
|
|
181
|
+
"devague ensures .devague/reviews/ is git-ignored so it is uncommitted working state by default (decision c19)"
|
|
182
|
+
],
|
|
183
|
+
"deps": [
|
|
184
|
+
"t2"
|
|
185
|
+
],
|
|
186
|
+
"covers": [
|
|
187
|
+
"c13",
|
|
188
|
+
"h2"
|
|
189
|
+
]
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"id": "t4",
|
|
193
|
+
"summary": "'confirm --from-review <file>' apply path + documented round-trippable format",
|
|
194
|
+
"origin": "user",
|
|
195
|
+
"status": "confirmed",
|
|
196
|
+
"acceptance_criteria": [
|
|
197
|
+
"the review artifact format is documented and round-trippable: review -> edit decisions -> apply",
|
|
198
|
+
"confirm --from-review parses confirm/reject decisions per id and applies them via the transactional path (t1)",
|
|
199
|
+
"applying a from-review file auto-confirms nothing the file did not mark confirmed; proven by a round-trip test"
|
|
200
|
+
],
|
|
201
|
+
"deps": [
|
|
202
|
+
"t1",
|
|
203
|
+
"t2",
|
|
204
|
+
"t3"
|
|
205
|
+
],
|
|
206
|
+
"covers": [
|
|
207
|
+
"c21",
|
|
208
|
+
"h13"
|
|
209
|
+
]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"id": "t5",
|
|
213
|
+
"summary": "Pending questions as durable .devague/questions/<slug>.md working state",
|
|
214
|
+
"origin": "user",
|
|
215
|
+
"status": "confirmed",
|
|
216
|
+
"acceptance_criteria": [
|
|
217
|
+
"a CLI move writes .devague/questions/<slug>.md that persists across runs and owns the format (decision c20)",
|
|
218
|
+
"devague ensures .devague/questions/ is git-ignored \u2014 uncommitted working state by default (decision c19)",
|
|
219
|
+
"a documented path exists to apply a confirmed decision from the questions file back into the frame"
|
|
220
|
+
],
|
|
221
|
+
"deps": [],
|
|
222
|
+
"covers": [
|
|
223
|
+
"c15",
|
|
224
|
+
"h4"
|
|
225
|
+
]
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"id": "t6",
|
|
229
|
+
"summary": "Verification test suite for the review loop",
|
|
230
|
+
"origin": "user",
|
|
231
|
+
"status": "confirmed",
|
|
232
|
+
"acceptance_criteria": [
|
|
233
|
+
"a test asserts NO review-flow command (review, multi-id confirm/reject, --from-review, any --json path) confirms an llm-origin proposed item without an explicit user confirm naming that id (c16/h5)",
|
|
234
|
+
"tests prove review export works before convergence, multi-id confirm/reject works, and the from-review round-trip applies exactly the file's decisions (c6/h11)",
|
|
235
|
+
"an end-to-end test demonstrates one 'review' + one batched confirm/reject resolving a chosen set on a non-converged frame (c3/h8), and that the anti-fabrication guarantee is preserved (c5/h10)"
|
|
236
|
+
],
|
|
237
|
+
"deps": [
|
|
238
|
+
"t1",
|
|
239
|
+
"t2",
|
|
240
|
+
"t3",
|
|
241
|
+
"t4",
|
|
242
|
+
"t5"
|
|
243
|
+
],
|
|
244
|
+
"covers": [
|
|
245
|
+
"c16",
|
|
246
|
+
"h5",
|
|
247
|
+
"c6",
|
|
248
|
+
"h11",
|
|
249
|
+
"c5",
|
|
250
|
+
"h10",
|
|
251
|
+
"c3",
|
|
252
|
+
"h8"
|
|
253
|
+
]
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"id": "t7",
|
|
257
|
+
"summary": "Docs, .gitignore/working-state guidance, version bump to 0.6.0 + CHANGELOG",
|
|
258
|
+
"origin": "user",
|
|
259
|
+
"status": "confirmed",
|
|
260
|
+
"acceptance_criteria": [
|
|
261
|
+
"docs explain which .devague/ files are local working state vs artifacts intentionally promoted to docs, and document the review-file format + apply-back path",
|
|
262
|
+
"an integration check confirms the shipped 0.6.0 CLI makes the announcement literally true: 'devague review' exists and a proposal-heavy frame is reviewed then bulk-resolved with no auto-confirm path (c1/h6, c2/h7, c4/h9)",
|
|
263
|
+
"verify ONLY review/confirm UX was added \u2014 no new claim/condition states and the #5/#16 convergence gate is unchanged (c7/h12); bump version to 0.6.0 and prepend a CHANGELOG entry"
|
|
264
|
+
],
|
|
265
|
+
"deps": [
|
|
266
|
+
"t6"
|
|
267
|
+
],
|
|
268
|
+
"covers": [
|
|
269
|
+
"c1",
|
|
270
|
+
"h6",
|
|
271
|
+
"c2",
|
|
272
|
+
"h7",
|
|
273
|
+
"c4",
|
|
274
|
+
"h9",
|
|
275
|
+
"c7",
|
|
276
|
+
"h12"
|
|
277
|
+
]
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"risks": [
|
|
281
|
+
{
|
|
282
|
+
"id": "r1",
|
|
283
|
+
"text": "Exact review-file markers for the --from-review round-trip (e.g. checkbox vs CONFIRM/REJECT tokens, how ids are anchored) are unsettled \u2014 to be pinned during implementation of t4.",
|
|
284
|
+
"kind": "unknown_nonblocking",
|
|
285
|
+
"task_id": "t4"
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
}
|
|
@@ -5,6 +5,32 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/). This project
|
|
6
6
|
adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.6.0] - 2026-05-23
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **Human Review Loop (#17).** Makes the user-only confirmation step ergonomic at scale, preserving the anti-fabrication guarantee.
|
|
13
|
+
- `devague review` (+ `--json`) lists every proposed (unconfirmed) claim and honesty condition with ids — un-gated by convergence and without mutating state — and persists a non-authoritative artifact to `.devague/reviews/<slug>.md`.
|
|
14
|
+
- `confirm` / `reject` now accept multiple ids in one transactional call (any unknown id ⇒ nothing changes).
|
|
15
|
+
- `confirm --from-review <file>` applies a reviewed decision set: each item is emitted with a `pending` marker the human edits to `confirm`/`reject`; `pending` lines are never auto-confirmed (round-trippable artifact).
|
|
16
|
+
- `devague question` records / lists / resolves pending user decisions as durable working state in `.devague/questions/<slug>.md`.
|
|
17
|
+
- devague manages `.gitignore` so `.devague/reviews/` and `.devague/questions/` stay uncommitted working state by default.
|
|
18
|
+
|
|
19
|
+
### Changed
|
|
20
|
+
|
|
21
|
+
- `confirm --json` now emits `{confirmed, rejected}` (lists) instead of `{id, status}`, reflecting the multi-id, transactional batch.
|
|
22
|
+
|
|
23
|
+
## [0.5.1] - 2026-05-23
|
|
24
|
+
|
|
25
|
+
### Added
|
|
26
|
+
|
|
27
|
+
- Spec + plan for the 0.6.0 Human Review Loop milestone (#17, folding in #11 and #14), produced by dogfooding `/think` then `/spec-to-plan` on devague itself. `docs/specs/devague-0-6-0-ships-the-human-review-loop-devague.md` (converged frame: 13 confirmed claims, 13 confirmed honesty conditions) and `docs/plans/devague-0-6-0-ships-the-human-review-loop-devague.md` (7 topologically ordered tasks covering all 26 targets, one parked non-blocking risk).
|
|
28
|
+
- Recorded design decisions in the frame: batch confirm/reject is transactional (abort-all on any invalid id); `confirm --from-review` is in scope for 0.6.0; devague manages `.gitignore` for `.devague/reviews/` and `.devague/questions/`; a CLI move (not a hand-written skill artifact) owns the pending-questions file.
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
- Renderers were lossy since the #5/#16 contract: `spec_md` rendered "Non-goals" from `boundary` claims only and never emitted `non_goal` / `decision`; `frame_md`'s sections omitted `non_goal` / `requirement` / `assumption` / `decision`. Both now render every claim kind — `spec_md` gains Scope / boundaries, Non-goals, Assumptions, Decisions, and Open questions sections; `frame_md` covers all twelve kinds. Re-exported this spec so the committed md matches the authoritative frame. Closes #21 (also flagged by Qodo on PR #22).
|
|
33
|
+
|
|
8
34
|
## [0.5.0] - 2026-05-23
|
|
9
35
|
|
|
10
36
|
### Added
|