devague 0.6.0__tar.gz → 0.6.1__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.6.0 → devague-0.6.1}/CHANGELOG.md +6 -0
- {devague-0.6.0 → devague-0.6.1}/PKG-INFO +1 -1
- {devague-0.6.0 → devague-0.6.1}/devague/render/spec_md.py +29 -3
- {devague-0.6.0 → devague-0.6.1}/docs/specs/devague-0-6-0-ships-the-human-review-loop-devague.md +16 -7
- {devague-0.6.0 → devague-0.6.1}/docs/specs/devague-now-ships-a-documented-spec-contract-every.md +2 -2
- {devague-0.6.0 → devague-0.6.1}/pyproject.toml +1 -1
- {devague-0.6.0 → devague-0.6.1}/tests/test_render.py +26 -1
- {devague-0.6.0 → devague-0.6.1}/uv.lock +1 -1
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/cicd/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/run-tests/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/think/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/think/scripts/think.sh +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/version-bump/SKILL.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/.claude/skills.local.yaml.example +0 -0
- {devague-0.6.0 → devague-0.6.1}/.devague/current_plan +0 -0
- {devague-0.6.0 → devague-0.6.1}/.devague/frames/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
- {devague-0.6.0 → devague-0.6.1}/.devague/frames/devague-now-ships-a-documented-spec-contract-every.json +0 -0
- {devague-0.6.0 → devague-0.6.1}/.devague/plans/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
- {devague-0.6.0 → devague-0.6.1}/.devague/plans/devague-now-ships-a-documented-spec-contract-every.json +0 -0
- {devague-0.6.0 → devague-0.6.1}/.flake8 +0 -0
- {devague-0.6.0 → devague-0.6.1}/.github/workflows/publish.yml +0 -0
- {devague-0.6.0 → devague-0.6.1}/.github/workflows/security-checks.yml +0 -0
- {devague-0.6.0 → devague-0.6.1}/.github/workflows/tests.yml +0 -0
- {devague-0.6.0 → devague-0.6.1}/.gitignore +0 -0
- {devague-0.6.0 → devague-0.6.1}/.markdownlint-cli2.yaml +0 -0
- {devague-0.6.0 → devague-0.6.1}/.pre-commit-config.yaml +0 -0
- {devague-0.6.0 → devague-0.6.1}/CLAUDE.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/LICENSE +0 -0
- {devague-0.6.0 → devague-0.6.1}/README.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/culture.yaml +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/__init__.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/__main__.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/__init__.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/__init__.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/capture.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/confirm.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/converge.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/explain.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/export.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/interrogate.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/learn.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/list_frames.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/new.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/park.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/plan.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/question.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/reject.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/review.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_commands/show.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_errors.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_frames.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_output.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/cli/_plans.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/convergence.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/frame.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/plan.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/plan_convergence.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/plan_store.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/questions_io.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/render/__init__.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/render/frame_md.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/render/plan_md.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/render/review_md.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/devague/store.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/examples/contract-example.json +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/plans/devague-0-6-0-ships-the-human-review-loop-devague.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/plans/devague-now-ships-a-documented-spec-contract-every.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/reviews/spec-contract-frame-review.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/skill-sources.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/spec-contract.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/superpowers/plans/2026-05-22-specifix-onboarding.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/superpowers/plans/2026-05-23-devague-rename.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/superpowers/plans/2026-05-23-devague-working-backwards-engine.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/superpowers/specs/2026-05-22-specifix-onboarding-design.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/superpowers/specs/2026-05-23-devague-spec-to-plan-design.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/docs/superpowers/specs/2026-05-23-devague-working-backwards-design.md +0 -0
- {devague-0.6.0 → devague-0.6.1}/sonar-project.properties +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/__init__.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_affordances.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_chassis.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_converge_export.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_errors.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_moves.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_output.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_plan.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_question.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_cli_review.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_contract.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_convergence.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_frame.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_offline.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_package.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_plan.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_plan_convergence.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_plan_store.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_render_plan.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_review_loop_integration.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_review_loop_invariants.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_spec_to_plan_skill.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_store.py +0 -0
- {devague-0.6.0 → devague-0.6.1}/tests/test_think_skill.py +0 -0
|
@@ -5,6 +5,12 @@ 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.1] - 2026-05-23
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- `spec_md` now surfaces `requirement` **claim text** — the last remaining item of #21. Requirements render in a `## Requirements` section with their confirmed honesty conditions nested beneath each claim; honesty conditions on non-requirement claims move to a separate `## Honesty conditions` section (previously every honesty condition was dumped into one flat "Requirements / honesty conditions" list and the requirement claim text never rendered). Re-exported the committed specs to match. Closes #21.
|
|
13
|
+
|
|
8
14
|
## [0.6.0] - 2026-05-23
|
|
9
15
|
|
|
10
16
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devague
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.1
|
|
4
4
|
Summary: devague — turns a vague feature idea into a buildable spec, then a buildable plan.
|
|
5
5
|
Project-URL: Homepage, https://github.com/agentculture/devague
|
|
6
6
|
Project-URL: Issues, https://github.com/agentculture/devague/issues
|
|
@@ -27,8 +27,33 @@ def _before_after(frame: Frame) -> list[str]:
|
|
|
27
27
|
return lines + [""]
|
|
28
28
|
|
|
29
29
|
|
|
30
|
-
def
|
|
31
|
-
|
|
30
|
+
def _requirements_block(frame: Frame) -> list[str]:
|
|
31
|
+
"""Requirement claims (confirmed) with their confirmed honesty conditions nested."""
|
|
32
|
+
reqs = [c for c in frame.claims if c.kind == "requirement" and c.status == "confirmed"]
|
|
33
|
+
if not reqs:
|
|
34
|
+
return []
|
|
35
|
+
out = ["## Requirements", ""]
|
|
36
|
+
for c in reqs:
|
|
37
|
+
out.append(f"- {c.text}")
|
|
38
|
+
out += [f" - honesty: {h.text}" for h in c.honesty_conditions if h.status == "confirmed"]
|
|
39
|
+
return out + [""]
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _other_honesty(frame: Frame) -> list[str]:
|
|
43
|
+
"""Confirmed honesty conditions on **confirmed** non-requirement claims.
|
|
44
|
+
|
|
45
|
+
The parent claim must be confirmed too: spec-md renders only confirmed claims
|
|
46
|
+
(see ``_texts``), so emitting honesty for a proposed/rejected claim would
|
|
47
|
+
leave an orphan bullet with no parent — inconsistent with the confirmed-only
|
|
48
|
+
export contract.
|
|
49
|
+
"""
|
|
50
|
+
return [
|
|
51
|
+
h.text
|
|
52
|
+
for c in frame.claims
|
|
53
|
+
if c.kind != "requirement" and c.status == "confirmed"
|
|
54
|
+
for h in c.honesty_conditions
|
|
55
|
+
if h.status == "confirmed"
|
|
56
|
+
]
|
|
32
57
|
|
|
33
58
|
|
|
34
59
|
def _hard_questions(frame: Frame) -> list[str]:
|
|
@@ -49,7 +74,8 @@ def render_spec(frame: Frame) -> str:
|
|
|
49
74
|
out += _section("Audience", _texts(frame, "audience"))
|
|
50
75
|
out += _before_after(frame)
|
|
51
76
|
out += _section("Why it matters", _texts(frame, "why_it_matters"))
|
|
52
|
-
out +=
|
|
77
|
+
out += _requirements_block(frame)
|
|
78
|
+
out += _section("Honesty conditions", _other_honesty(frame))
|
|
53
79
|
out += _section("Success signals", _texts(frame, "success_signal"))
|
|
54
80
|
out += _section("Scope / boundaries", _texts(frame, "boundary"))
|
|
55
81
|
out += _section("Non-goals", _texts(frame, "non_goal"))
|
{devague-0.6.0 → devague-0.6.1}/docs/specs/devague-0-6-0-ships-the-human-review-loop-devague.md
RENAMED
|
@@ -15,7 +15,22 @@
|
|
|
15
15
|
|
|
16
16
|
- 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.
|
|
17
17
|
|
|
18
|
-
## Requirements
|
|
18
|
+
## Requirements
|
|
19
|
+
|
|
20
|
+
- 'devague review' (and 'devague review --json') emits all proposed claims and proposed honesty conditions, with their ids, without requiring or triggering convergence.
|
|
21
|
+
- honesty: 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.
|
|
22
|
+
- Review output is clearly labelled unconfirmed and non-authoritative, visually distinct from the buildable spec that 'export' produces only after convergence.
|
|
23
|
+
- honesty: The review artifact carries an explicit 'nothing confirmed yet — 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.
|
|
24
|
+
- 'devague confirm' accepts multiple claim/honesty ids in one invocation, and 'devague reject' likewise.
|
|
25
|
+
- honesty: '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.
|
|
26
|
+
- 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.
|
|
27
|
+
- honesty: 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.
|
|
28
|
+
- No command in the review flow auto-confirms LLM-proposed content; every confirm/reject stays an explicit user action.
|
|
29
|
+
- honesty: 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.
|
|
30
|
+
- `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).
|
|
31
|
+
- honesty: 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 — proven by a round-trip test — and applying it still auto-confirms nothing the file did not mark confirmed.
|
|
32
|
+
|
|
33
|
+
## Honesty conditions
|
|
19
34
|
|
|
20
35
|
- 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.
|
|
21
36
|
- 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.
|
|
@@ -24,12 +39,6 @@
|
|
|
24
39
|
- The anti-fabrication guarantee is preserved exactly: ergonomics improve but no proposal becomes authoritative without an explicit user action, asserted by test.
|
|
25
40
|
- The success signals are verified by the committed test suite, not asserted by hand.
|
|
26
41
|
- 0.6.0 adds only review/confirm UX; the proposed-vs-confirmed state model and convergence gate from #5/#16 are unchanged — no new claim or condition states are introduced.
|
|
27
|
-
- 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.
|
|
28
|
-
- The review artifact carries an explicit 'nothing confirmed yet — 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.
|
|
29
|
-
- '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.
|
|
30
|
-
- 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.
|
|
31
|
-
- 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.
|
|
32
|
-
- 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 — proven by a round-trip test — and applying it still auto-confirms nothing the file did not mark confirmed.
|
|
33
42
|
|
|
34
43
|
## Success signals
|
|
35
44
|
|
{devague-0.6.0 → devague-0.6.1}/docs/specs/devague-now-ships-a-documented-spec-contract-every.md
RENAMED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
- An LLM and devague can only coordinate reliably around a contract that is documented, validated, and machine-readable — convergence must mean something, not vibes
|
|
17
17
|
|
|
18
|
-
##
|
|
18
|
+
## Honesty conditions
|
|
19
19
|
|
|
20
20
|
- A frame round-trips losslessly (save then load yields an identical frame) including schema_version, the new claim types, and the structured convergence payload; existing 0.4.0 frames still load
|
|
21
21
|
- Every move accepts and emits documented JSON, and the contract spells out per-move input / output / state-transition / validation-errors so an LLM can drive devague without guessing internal state
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
- The claim-type vocabulary adds non_goal, requirement, assumption, and decision to the shipped set, each with a documented convergence-gate impact
|
|
43
43
|
- Every frame carries a schema_version field; load validates by version so existing frames keep loading as the schema grows
|
|
44
44
|
|
|
45
|
-
##
|
|
45
|
+
## Scope / boundaries
|
|
46
46
|
|
|
47
47
|
- Not a full PRD generator and not a fixed wizard; the move-driven, deterministic model stays
|
|
48
48
|
- The local contract requires no GitHub, agents, or external services
|
|
@@ -79,7 +79,8 @@ def test_spec_md_omits_empty_before_after_section() -> None:
|
|
|
79
79
|
def _rich_frame() -> Frame:
|
|
80
80
|
"""A frame exercising the kinds added by the #5/#16 contract."""
|
|
81
81
|
f = Frame(slug="r", title="Rich Feature")
|
|
82
|
-
f.add_claim("announcement", "Shipped", origin="user")
|
|
82
|
+
ann = f.add_claim("announcement", "Shipped", origin="user")
|
|
83
|
+
f.add_honesty(ann, "must be honest", origin="user") # non-requirement honesty
|
|
83
84
|
f.add_claim("boundary", "scope is X only", origin="user")
|
|
84
85
|
f.add_claim("non_goal", "does not call an LLM", origin="user")
|
|
85
86
|
f.add_claim("non_goal", "no external services", origin="user")
|
|
@@ -106,6 +107,18 @@ def test_spec_md_renders_non_goal_and_decision() -> None:
|
|
|
106
107
|
assert_markdownlint_clean(out)
|
|
107
108
|
|
|
108
109
|
|
|
110
|
+
def test_spec_md_renders_requirement_claim_text_with_nested_honesty() -> None:
|
|
111
|
+
# #21 remaining item: requirement *claim* text must render, not only its honesty.
|
|
112
|
+
out = render.render(_rich_frame(), "spec-md")
|
|
113
|
+
assert "## Requirements" in out
|
|
114
|
+
assert "- review lists proposed items" in out # the requirement claim text
|
|
115
|
+
assert " - honesty: review never mutates state" in out # nested under it
|
|
116
|
+
# honesty on non-requirement claims still appears, in its own section
|
|
117
|
+
assert "## Honesty conditions" in out
|
|
118
|
+
assert "must be honest" in out # the announcement's honesty (non-requirement)
|
|
119
|
+
assert_markdownlint_clean(out)
|
|
120
|
+
|
|
121
|
+
|
|
109
122
|
def test_frame_md_renders_non_goal_and_decision() -> None:
|
|
110
123
|
out = render.render(_rich_frame(), "frame-md")
|
|
111
124
|
for needle in (
|
|
@@ -140,6 +153,18 @@ def test_review_md_empty_when_no_proposals() -> None:
|
|
|
140
153
|
assert_markdownlint_clean(out)
|
|
141
154
|
|
|
142
155
|
|
|
156
|
+
def test_spec_md_omits_honesty_for_unconfirmed_claims() -> None:
|
|
157
|
+
# #24 (Qodo): a proposed/rejected claim carrying a confirmed honesty must not
|
|
158
|
+
# leave an orphan honesty bullet — spec-md renders confirmed claims only.
|
|
159
|
+
f = Frame(slug="o", title="Orphan")
|
|
160
|
+
f.add_claim("announcement", "Shipped", origin="user") # confirmed
|
|
161
|
+
proposed = f.add_claim("audience", "maybe devs", origin="llm") # proposed
|
|
162
|
+
f.add_honesty(proposed, "honesty whose parent is unconfirmed", origin="user")
|
|
163
|
+
out = render.render(f, "spec-md")
|
|
164
|
+
assert "honesty whose parent is unconfirmed" not in out
|
|
165
|
+
assert "maybe devs" not in out # the proposed claim text is omitted too
|
|
166
|
+
|
|
167
|
+
|
|
143
168
|
def test_unknown_format_raises() -> None:
|
|
144
169
|
with pytest.raises(DevagueError):
|
|
145
170
|
render.render(_frame(), "nope")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devague-0.6.0 → devague-0.6.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devague-0.6.0 → devague-0.6.1}/docs/plans/devague-0-6-0-ships-the-human-review-loop-devague.md
RENAMED
|
File without changes
|
{devague-0.6.0 → devague-0.6.1}/docs/plans/devague-now-ships-a-documented-spec-contract-every.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{devague-0.6.0 → devague-0.6.1}/docs/superpowers/specs/2026-05-22-specifix-onboarding-design.md
RENAMED
|
File without changes
|
{devague-0.6.0 → devague-0.6.1}/docs/superpowers/specs/2026-05-23-devague-spec-to-plan-design.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|