devague 0.22.0__tar.gz → 0.24.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.22.0 → devague-0.24.0}/.claude/skills/assign-to-workforce/SKILL.md +39 -20
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +18 -3
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/challenge/SKILL.md +1 -1
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/deviate/SKILL.md +8 -6
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/spec-to-plan/SKILL.md +10 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/summarize-delivery/SKILL.md +6 -3
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/think/SKILL.md +7 -5
- devague-0.24.0/.claude/skills/validate-delivery/SKILL.md +227 -0
- devague-0.24.0/.devague/current_plan +1 -0
- devague-0.24.0/.devague/deliveries/behavior-validation-and-today-spec.json +108 -0
- devague-0.24.0/.devague/deliveries/next-leg-hints.json +162 -0
- devague-0.24.0/.devague/frames/behavior-validation-and-today-spec.json +937 -0
- devague-0.24.0/.devague/frames/next-leg-hints.json +563 -0
- devague-0.24.0/.devague/plans/behavior-validation-and-today-spec.json +715 -0
- devague-0.24.0/.devague/plans/next-leg-hints.json +333 -0
- {devague-0.22.0 → devague-0.24.0}/CHANGELOG.md +43 -0
- {devague-0.22.0 → devague-0.24.0}/CLAUDE.md +68 -11
- {devague-0.22.0 → devague-0.24.0}/PKG-INFO +34 -12
- {devague-0.22.0 → devague-0.24.0}/README.md +32 -10
- {devague-0.22.0 → devague-0.24.0}/devague/cli/__init__.py +13 -1
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/converge.py +10 -2
- devague-0.24.0/devague/cli/_commands/delta.py +379 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/deviate.py +11 -28
- devague-0.24.0/devague/cli/_commands/evidence.py +297 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/learn.py +504 -17
- devague-0.24.0/devague/cli/_commands/oblige.py +208 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/plan.py +218 -5
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/show.py +21 -2
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/status.py +17 -1
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/summary.py +20 -3
- devague-0.24.0/devague/cli/_commands/today.py +59 -0
- devague-0.24.0/devague/cli/_hint_config.py +126 -0
- devague-0.24.0/devague/cli/_hints.py +205 -0
- devague-0.24.0/devague/cli/_refs.py +55 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_status.py +37 -1
- {devague-0.22.0 → devague-0.24.0}/devague/contested.py +29 -12
- {devague-0.22.0 → devague-0.24.0}/devague/convergence.py +57 -2
- devague-0.24.0/devague/delivery.py +605 -0
- {devague-0.22.0 → devague-0.24.0}/devague/delivery_store.py +15 -6
- {devague-0.22.0 → devague-0.24.0}/devague/frame.py +157 -0
- devague-0.24.0/devague/obligation_evidence.py +119 -0
- {devague-0.22.0 → devague-0.24.0}/devague/plan.py +180 -1
- {devague-0.22.0 → devague-0.24.0}/devague/plan_convergence.py +47 -3
- {devague-0.22.0 → devague-0.24.0}/devague/render/frame_md.py +20 -3
- {devague-0.22.0 → devague-0.24.0}/devague/render/plan_md.py +23 -3
- {devague-0.22.0 → devague-0.24.0}/devague/render/summary_md.py +353 -10
- devague-0.24.0/devague/render/today_md.py +217 -0
- devague-0.24.0/devague/staleness.py +332 -0
- devague-0.24.0/devague/today.py +792 -0
- devague-0.24.0/docs/current-spec.md +40 -0
- devague-0.24.0/docs/deliveries/2026-08-31-behavior-validation-and-today-spec.md +134 -0
- devague-0.24.0/docs/deliveries/2026-08-31-next-leg-hints.md +105 -0
- devague-0.24.0/docs/plans/2026-08-31-behavior-validation-and-today-spec-split.md +217 -0
- devague-0.24.0/docs/plans/2026-08-31-behavior-validation-and-today-spec.md +160 -0
- devague-0.24.0/docs/plans/2026-08-31-next-leg-hints-split.md +106 -0
- devague-0.24.0/docs/plans/2026-08-31-next-leg-hints.md +60 -0
- {devague-0.22.0 → devague-0.24.0}/docs/skill-sources.md +16 -13
- {devague-0.22.0 → devague-0.24.0}/docs/skills.md +35 -4
- {devague-0.22.0 → devague-0.24.0}/docs/spec-contract.md +21 -0
- devague-0.24.0/docs/specs/2026-08-31-behavior-validation-and-today-spec.md +139 -0
- devague-0.24.0/docs/specs/2026-08-31-next-leg-hints.md +121 -0
- {devague-0.22.0 → devague-0.24.0}/pyproject.toml +4 -1
- devague-0.24.0/tests/test_cli_delta.py +626 -0
- devague-0.24.0/tests/test_cli_evidence.py +498 -0
- devague-0.24.0/tests/test_cli_hints.py +715 -0
- devague-0.24.0/tests/test_cli_learn.py +639 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_moves.py +3 -1
- devague-0.24.0/tests/test_cli_oblige.py +440 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_plan.py +245 -10
- {devague-0.22.0 → devague-0.24.0}/tests/test_convergence.py +65 -1
- devague-0.24.0/tests/test_delivery_evidence.py +582 -0
- devague-0.24.0/tests/test_end_to_end_validation.py +239 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_frame.py +20 -11
- {devague-0.22.0 → devague-0.24.0}/tests/test_frame_lapse.py +9 -5
- devague-0.24.0/tests/test_frame_obligation.py +295 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_frame_schema_v2.py +4 -3
- devague-0.24.0/tests/test_hint_config.py +397 -0
- devague-0.24.0/tests/test_obligation_warnings.py +432 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan.py +9 -5
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_cli_instructions.py +3 -1
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_convergence.py +61 -0
- devague-0.24.0/tests/test_plan_obligation.py +293 -0
- devague-0.24.0/tests/test_render_obligations.py +132 -0
- devague-0.24.0/tests/test_staleness.py +571 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_summary.py +3 -1
- devague-0.24.0/tests/test_summary_delivery_claims.py +410 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_teaching_surface_sweep.py +5 -3
- devague-0.24.0/tests/test_today.py +619 -0
- devague-0.24.0/tests/test_today_cli.py +131 -0
- devague-0.24.0/tests/test_today_md.py +210 -0
- {devague-0.22.0 → devague-0.24.0}/uv.lock +1 -1
- devague-0.22.0/.devague/current_plan +0 -1
- devague-0.22.0/devague/delivery.py +0 -149
- devague-0.22.0/tests/test_cli_learn.py +0 -273
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/agent-config/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/recall/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/recall/scripts/recall.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/remember/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/remember/scripts/remember.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/scope/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/think/scripts/think.sh +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/.claude/skills.local.yaml.example +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/challenge-skill.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/execution-seam-and-deviate.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/issue-backlog-sweep.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/reasoning-degradation-ledger.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/challenge-skill.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-now-ships-a-documented-spec-contract-every.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-ships-a-sharper-end-to-end-method-a-guided.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-turns-a-converged-plan-into-parallel-simpl.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/execution-seam-and-deviate.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/issue-backlog-sweep.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/reasoning-degradation-ledger.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/resolve-parked-vagueness.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/frames/summarize-delivery-skill.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/challenge-skill.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-now-ships-a-documented-spec-contract-every.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-ships-a-sharper-end-to-end-method-a-guided.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-turns-a-converged-plan-into-parallel-simpl.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/execution-seam-and-deviate.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/issue-backlog-sweep.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/reasoning-degradation-ledger.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/resolve-parked-vagueness.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.devague/plans/summarize-delivery-skill.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/.flake8 +0 -0
- {devague-0.22.0 → devague-0.24.0}/.github/workflows/publish.yml +0 -0
- {devague-0.22.0 → devague-0.24.0}/.github/workflows/security-checks.yml +0 -0
- {devague-0.22.0 → devague-0.24.0}/.github/workflows/tests.yml +0 -0
- {devague-0.22.0 → devague-0.24.0}/.gitignore +0 -0
- {devague-0.22.0 → devague-0.24.0}/.markdownlint-cli2.yaml +0 -0
- {devague-0.22.0 → devague-0.24.0}/.pre-commit-config.yaml +0 -0
- {devague-0.22.0 → devague-0.24.0}/LICENSE +0 -0
- {devague-0.22.0 → devague-0.24.0}/LICENSES/MIT-guildmaster-skills.txt +0 -0
- {devague-0.22.0 → devague-0.24.0}/culture.yaml +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/__init__.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/__main__.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/__init__.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/amend.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/capture.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/confirm.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/explain.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/export.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/interrogate.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/lapse.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/list_frames.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/new.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/park.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/question.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/reject.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/review.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/scope.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_deliveries.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_errors.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_frames.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_output.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_paths.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/cli/_plans.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/plan_store.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/questions_io.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/render/__init__.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/render/_md_safety.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/render/deliverables_md.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/render/review_md.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/render/spec_md.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/devague/store.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/assign-to-workforce-worked-example.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-09-sharper-end-to-end-method.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-09-summarize-delivery-skill.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-14-execution-seam-and-deviate.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-15-challenge-skill.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-17-resolve-parked-vagueness.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-28-issue-backlog-sweep-closure-map.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-28-issue-backlog-sweep.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-29-reasoning-degradation-ledger.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/examples/contract-example.json +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/llm-guidance.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-05-23-devague-0-6-0-ships-the-human-review-loop-devague.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-05-23-devague-now-ships-a-documented-spec-contract-every.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-01-devague-ships-a-sharper-end-to-end-method-a-guided.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-09-summarize-delivery-skill.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-14-execution-seam-and-deviate.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-15-challenge-skill.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-17-resolve-parked-vagueness.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-28-issue-backlog-sweep-split.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-28-issue-backlog-sweep.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-29-reasoning-degradation-ledger-split.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-29-reasoning-degradation-ledger.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/reviews/spec-contract-frame-review.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-05-23-devague-0-6-0-ships-the-human-review-loop-devague.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-05-23-devague-now-ships-a-documented-spec-contract-every.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-01-devague-ships-a-sharper-end-to-end-method-a-guided.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-09-summarize-delivery-skill.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-14-execution-seam-and-deviate.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-15-challenge-skill.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-17-resolve-parked-vagueness.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-28-issue-backlog-sweep.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-29-reasoning-degradation-ledger.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/superpowers/plans/2026-05-22-specifix-onboarding.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/superpowers/plans/2026-05-23-devague-rename.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/superpowers/plans/2026-05-23-devague-working-backwards-engine.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/superpowers/specs/2026-05-22-specifix-onboarding-design.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/superpowers/specs/2026-05-23-devague-spec-to-plan-design.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/docs/superpowers/specs/2026-05-23-devague-working-backwards-design.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/sonar-project.properties +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/__init__.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/goldens/resolved_vagueness_frame.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/goldens/resolved_vagueness_spec.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/goldens/sharper_frame.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/goldens/sharper_plan.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/goldens/sharper_spec.md +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_assign_to_workforce_script.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_boundary_audit.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_affordances.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_chassis.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_converge_export.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_errors.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_instructions.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_lapse.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_output.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_paths.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_question.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_review.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_scope.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_cli_status.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_contested.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_contract.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_convergence_sharper.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_deviate.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_e2e_resolve.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_e2e_sharper_method.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_export_markdownlint_integration.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_md_safety.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_offline.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_package.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_convergence_sharper.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_deliverables.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_escape_hatches.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_render_sharper.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_plan_store.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_render.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_render_plan.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_render_sharper.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_review_loop_integration.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_review_loop_invariants.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_spec_to_plan_skill.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_store.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_teaching_scope.py +0 -0
- {devague-0.22.0 → devague-0.24.0}/tests/test_think_skill.py +0 -0
|
@@ -282,28 +282,47 @@ Once all waves are merged and the full test suite passes, the main agent opens
|
|
|
282
282
|
a PR via the `cicd` skill (`agex pr open`). The human reviews and merges. This
|
|
283
283
|
is the last and only remaining human gate.
|
|
284
284
|
|
|
285
|
-
##
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
1. **
|
|
291
|
-
the
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
285
|
+
## Hand-offs: mid-run and after the final PR
|
|
286
|
+
|
|
287
|
+
Two hand-offs bracket execution — one that can fire mid-run, one that always
|
|
288
|
+
fires after the final PR merges:
|
|
289
|
+
|
|
290
|
+
1. **Mid-run — hand off to `/deviate`.** If a task agent (or the main agent)
|
|
291
|
+
discovers the confirmed plan no longer matches reality partway through a
|
|
292
|
+
wave, that is not a silent edit to this run — stop, get explicit human
|
|
293
|
+
approval for the divergence, and record it via the sibling **`/deviate`**
|
|
294
|
+
skill (`devague deviate`) before resuming the fan-out. This is not a fourth
|
|
295
|
+
standing gate; it is the human owner of gate 2 approving an amendment to it
|
|
296
|
+
in-flight.
|
|
297
|
+
2. **Post-merge — hand off to `/validate-delivery`, then `/summarize-delivery`.**
|
|
298
|
+
Once the final PR is **merged**, close the execution loop cleanly instead of
|
|
299
|
+
stopping at a green merge:
|
|
300
|
+
a. **Validate delivery.** Run the sibling **`/validate-delivery`** skill —
|
|
301
|
+
the execution-to-evidence leg. It runs the plan's behavioral tests
|
|
302
|
+
agent-side and files what it found (obligations met, evidence, and any
|
|
303
|
+
behavioral deltas) via the devague CLI; a failing or unchecked outcome is
|
|
304
|
+
filed and reported exactly as such, never rounded up.
|
|
305
|
+
b. **Summarize the delivery.** Run the sibling **`/summarize-delivery`**
|
|
306
|
+
skill — the delivery-side closure leg. It turns the run into a committed
|
|
307
|
+
accountability artifact (`docs/deliveries/<created-date>-<slug>.md`) that
|
|
308
|
+
records planned-versus-actual delivery, the mid-work decisions the
|
|
309
|
+
workforce made, where execution drifted from the plan, evidence-backed
|
|
310
|
+
delivery claims (a claim without evidence stays `unverified`, never
|
|
311
|
+
asserted as done — the strength ladder now draws on what
|
|
312
|
+
`/validate-delivery` filed), and any remaining work. The `devague plan
|
|
313
|
+
waves --json` payload you fanned out is the planned-work baseline it
|
|
314
|
+
compares actuals against.
|
|
315
|
+
c. **Both close partial and failed runs too.** Neither skill requires every
|
|
316
|
+
wave to have merged — a run that shipped only some tasks, or none, still
|
|
317
|
+
produces a truthful record: the failure lands under drift and remaining
|
|
318
|
+
work, and no claim says done without evidence.
|
|
302
319
|
|
|
303
320
|
This is the accountability wrap-up after the three gates, not a fourth gate —
|
|
304
|
-
`/summarize-delivery`
|
|
305
|
-
|
|
306
|
-
|
|
321
|
+
`/deviate`, `/validate-delivery`, and `/summarize-delivery` are all method-only
|
|
322
|
+
and record- or read-only (#20): none of them orchestrate, gate merges, or
|
|
323
|
+
mutate devague state beyond their own append-only records. Don't stop at "PR
|
|
324
|
+
merged" — the standing flow is **merge, then `/validate-delivery`, then
|
|
325
|
+
`/summarize-delivery`**.
|
|
307
326
|
|
|
308
327
|
## Hard rules (do not violate)
|
|
309
328
|
|
{devague-0.22.0 → devague-0.24.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh
RENAMED
|
@@ -292,13 +292,28 @@ PY
|
|
|
292
292
|
# extra read-only call (for the plan's `created`/`title`, to match the
|
|
293
293
|
# date-prefixed filename convention `devague plan export` already uses).
|
|
294
294
|
if [ "$write_mode" -eq 1 ]; then
|
|
295
|
-
local show_json show_rc
|
|
295
|
+
local show_json show_rc show_err show_tmp_err show_old_exit_trap
|
|
296
|
+
# A successful `devague plan show --json` now also emits a one-line
|
|
297
|
+
# `next: ...` stderr hint (next-leg-hints t1) — stderr must stay OFF
|
|
298
|
+
# the captured JSON string (a plain `2>&1` merge would corrupt it), so
|
|
299
|
+
# it is captured separately and only surfaced on a real failure,
|
|
300
|
+
# mirroring the `plan waves --json` capture above — including that
|
|
301
|
+
# capture's trap discipline: prior EXIT trap saved before mktemp,
|
|
302
|
+
# cleanup installed on the line after it, prior trap restored once the
|
|
303
|
+
# file is gone (PR #110 review).
|
|
304
|
+
show_old_exit_trap="$(trap -p EXIT)"
|
|
305
|
+
show_tmp_err="$(mktemp)"
|
|
306
|
+
trap 'rm -f "$show_tmp_err"' EXIT
|
|
296
307
|
set +e
|
|
297
|
-
show_json="$("${DEVAGUE[@]}" plan show --json "${extra_args[@]}" 2
|
|
308
|
+
show_json="$("${DEVAGUE[@]}" plan show --json "${extra_args[@]}" 2>"$show_tmp_err")"
|
|
298
309
|
show_rc=$?
|
|
299
310
|
set -e
|
|
311
|
+
show_err="$(cat "$show_tmp_err")"
|
|
312
|
+
rm -f "$show_tmp_err"
|
|
313
|
+
trap - EXIT
|
|
314
|
+
eval "${show_old_exit_trap}" # empty string is a no-op; re-installs a prior trap if any
|
|
300
315
|
if [ "$show_rc" -ne 0 ]; then
|
|
301
|
-
printf '%s\n' "$
|
|
316
|
+
printf '%s\n' "$show_err" >&2
|
|
302
317
|
return "$show_rc"
|
|
303
318
|
fi
|
|
304
319
|
|
|
@@ -24,7 +24,7 @@ the devague method — the *seventh* origin skill, sitting *third* in flow
|
|
|
24
24
|
order, between the spec leg and the plan leg:
|
|
25
25
|
|
|
26
26
|
```text
|
|
27
|
-
scope -> think -> challenge -> spec-to-plan -> assign-to-workforce -> deviate -> summarize-delivery
|
|
27
|
+
scope -> think -> challenge -> spec-to-plan -> assign-to-workforce -> deviate -> validate-delivery -> summarize-delivery
|
|
28
28
|
```
|
|
29
29
|
|
|
30
30
|
Before this leg existed, a frame could converge on precisely stated claims
|
|
@@ -154,15 +154,17 @@ record would land `proposed` and need an explicit
|
|
|
154
154
|
`devague deviate --confirm d1` from the user before `/summarize-delivery`
|
|
155
155
|
could cite it as approved.
|
|
156
156
|
|
|
157
|
-
## After recording — resume, then hand off to /summarize-delivery
|
|
157
|
+
## After recording — resume, then hand off through /validate-delivery to /summarize-delivery
|
|
158
158
|
|
|
159
159
|
Once the affected task briefs are adjusted and the fan-out resumes, nothing
|
|
160
160
|
further is needed from this skill — the record already lives in the delivery
|
|
161
|
-
store. When the
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
161
|
+
store. When the waves finish merging, the run continues through
|
|
162
|
+
`/validate-delivery` (running the plan's behavioral tests and filing evidence
|
|
163
|
+
and behavioral deltas) before it reaches `/summarize-delivery`. That skill's
|
|
164
|
+
Drift From Plan and Mid-work Decisions sections quote these deviation records
|
|
165
|
+
by their `dN` id instead of reconstructing drift from memory, so the
|
|
166
|
+
connective tissue between the confirmed plan and the delivery summary is the
|
|
167
|
+
ledger this skill wrote, not anyone's recollection of the run.
|
|
166
168
|
|
|
167
169
|
## Provenance
|
|
168
170
|
|
|
@@ -305,6 +305,16 @@ The exported plan-md is a buildable artifact: topologically ordered tasks, each
|
|
|
305
305
|
with acceptance criteria and the spec targets it covers. It feeds directly into
|
|
306
306
|
implementation (or `superpowers:writing-plans`).
|
|
307
307
|
|
|
308
|
+
## After the plan converges — hand off to /assign-to-workforce
|
|
309
|
+
|
|
310
|
+
Once `converge` passes and `export` writes the plan-md, this leg is done.
|
|
311
|
+
`devague plan waves --json` emits the dependency-graph plus the per-task brief
|
|
312
|
+
(see above) as scheduling metadata — the single source the `/assign-to-workforce`
|
|
313
|
+
skill needs to fan the plan's waves out to parallel subagents, get the human's
|
|
314
|
+
go/no-go on the implementation split plan, and TDD-gate each merge. Continue
|
|
315
|
+
with `/assign-to-workforce` next; if a fan-out mid-run needs to diverge from
|
|
316
|
+
this plan, that is `/deviate`'s job, not a silent edit here.
|
|
317
|
+
|
|
308
318
|
## Provenance
|
|
309
319
|
|
|
310
320
|
This is a **first-party** skill — its origin is `agentculture/devague`, where the
|
|
@@ -451,9 +451,12 @@ produces the artifact the human reviews.
|
|
|
451
451
|
## Provenance
|
|
452
452
|
|
|
453
453
|
This is a **first-party** skill — its origin is `agentculture/devague`, the
|
|
454
|
-
*fifth* in the outbound family after `/
|
|
455
|
-
`/assign-to-workforce`,
|
|
456
|
-
|
|
454
|
+
*fifth* in the outbound family chronologically (after `/think`,
|
|
455
|
+
`/spec-to-plan`, `/assign-to-workforce`, and `/scope`), but the **terminal,
|
|
456
|
+
eighth leg in flow order** — the closing skill of the full eight-leg family:
|
|
457
|
+
`/scope` → `/think` → `/challenge` → `/spec-to-plan` → `/assign-to-workforce`
|
|
458
|
+
→ `/deviate` → `/validate-delivery` → `/summarize-delivery`. guildmaster
|
|
459
|
+
pulls it from here and broadcasts it to the AgentCulture
|
|
457
460
|
mesh; because devague is upstream, it is **never re-vendored back** from
|
|
458
461
|
guildmaster's re-broadcast copy. The `cite, don't import` policy still holds:
|
|
459
462
|
downstream repos copy it, they don't symlink or depend on it. See
|
|
@@ -280,13 +280,15 @@ idea→spec leg cleanly before moving on:
|
|
|
280
280
|
claim — keep them together. (Per the repo's standing convention this normally
|
|
281
281
|
becomes a branch + PR via the `cicd` skill; commit-only is fine when the user
|
|
282
282
|
asks for it.)
|
|
283
|
-
2. **Hand off to `/spec-to-plan`.** The
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
283
|
+
2. **Hand off to `/challenge`, then `/spec-to-plan`.** The next leg is the
|
|
284
|
+
blind-spot pass: `/challenge` pressure-tests the exported frame before it
|
|
285
|
+
becomes a plan. Once that pass clears (or lands nothing new), the forward
|
|
286
|
+
leg is the sibling skill: `devague plan new --frame <slug>` seeds a plan
|
|
287
|
+
from the converged frame and works it forward into a buildable plan (it can
|
|
288
|
+
equally feed `superpowers:writing-plans` or a normal implementation PR).
|
|
287
289
|
|
|
288
290
|
Don't pause for a "what next?" menu after a reviewed export — the standing flow
|
|
289
|
-
is **commit, then `/spec-to-plan`**.
|
|
291
|
+
is **commit, then `/challenge`, then `/spec-to-plan`**.
|
|
290
292
|
|
|
291
293
|
## Provenance
|
|
292
294
|
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validate-delivery
|
|
3
|
+
description: >
|
|
4
|
+
Run the confirmed plan's behavioral tests agent-side after
|
|
5
|
+
assign-to-workforce merges its waves and before summarize-delivery closes
|
|
6
|
+
the loop, then file what was found — evidence for what passed, behavioral
|
|
7
|
+
deltas for what the run added, amended, or removed — as first-class,
|
|
8
|
+
record-only entries via the devague CLI. Never runs the tests inside the
|
|
9
|
+
CLI (issue #20); never suppresses a failing or partial outcome. Use when
|
|
10
|
+
the user says "validate delivery", "run behavioral tests", "check what
|
|
11
|
+
actually behaves", "file evidence", "record a behavioral delta", or after
|
|
12
|
+
assign-to-workforce merges (or fails to merge) a plan's waves and before
|
|
13
|
+
summarize-delivery runs. Authored and maintained in agentculture/devague
|
|
14
|
+
(origin = devague); guildmaster pulls this skill from here and broadcasts
|
|
15
|
+
it to the AgentCulture mesh — it is NOT vendored from guildmaster like the
|
|
16
|
+
inbound skills here.
|
|
17
|
+
type: command
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# validate-delivery — run behavioral tests, file evidence and deltas
|
|
21
|
+
|
|
22
|
+
The skill is named **`validate-delivery`**; it is the **execution-to-evidence
|
|
23
|
+
leg** of the devague method — the *seventh* leg in flow order (the *eighth*
|
|
24
|
+
origin skill, chronologically), sitting between the two closing execution
|
|
25
|
+
skills:
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
scope -> think -> challenge -> spec-to-plan -> assign-to-workforce ->
|
|
29
|
+
deviate -> validate-delivery -> summarize-delivery
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Where `/assign-to-workforce` fans out a converged plan's waves and
|
|
33
|
+
`/summarize-delivery` closes the loop afterward, `/validate-delivery` runs
|
|
34
|
+
**after waves merge and before the delivery summary is written**. It is the
|
|
35
|
+
gap that used to be filled by memory: the confirmed plan's claims are
|
|
36
|
+
obligations, and until this skill existed nothing forced the run to check
|
|
37
|
+
whether the merged code actually behaves as claimed before the summary
|
|
38
|
+
asserted it did.
|
|
39
|
+
|
|
40
|
+
## When to invoke
|
|
41
|
+
|
|
42
|
+
Run this skill once a wave (or the whole plan) has merged and there is
|
|
43
|
+
behavior to check against a claim or an approved deviation — always before
|
|
44
|
+
`/summarize-delivery`, never as a substitute for it. It is not gated on a
|
|
45
|
+
complete run: a partial or failed fan-out is still worth validating for
|
|
46
|
+
whatever did merge.
|
|
47
|
+
|
|
48
|
+
## The method
|
|
49
|
+
|
|
50
|
+
1. **Identify the obligations.** Read the plan's confirmed claims (via the
|
|
51
|
+
frame) and any approved `/deviate` records to see what the run promised —
|
|
52
|
+
an announcement, an after-state, a success signal, an acceptance
|
|
53
|
+
criterion. Each one that has a behavioral test backing it is an
|
|
54
|
+
obligation this leg checks.
|
|
55
|
+
2. **Locate the behavioral tests.** Consuming repos identify behavioral
|
|
56
|
+
tests one of two ways (either is valid; pick whichever the repo already
|
|
57
|
+
uses, and say which one in the filed evidence):
|
|
58
|
+
- a **pytest marker**, e.g. `@pytest.mark.behavioral` — run with
|
|
59
|
+
`pytest -m behavioral`;
|
|
60
|
+
- a **dedicated folder**, e.g. `tests/behavioral/` or
|
|
61
|
+
`behavioral-tests/` — run that path directly.
|
|
62
|
+
3. **Run the tests agent-side.** The agent (not the devague CLI) executes
|
|
63
|
+
the behavioral test suite, or the specific tests relevant to the
|
|
64
|
+
obligations in scope. This is read-only against the codebase — it does
|
|
65
|
+
not modify code to make a test pass.
|
|
66
|
+
4. **File evidence for every obligation checked.** For each obligation, file
|
|
67
|
+
an evidence record naming the obligation met, the test that asserted the
|
|
68
|
+
behavior, and the outcome — `pass` or `fail`. A failing outcome is filed
|
|
69
|
+
exactly like a passing one; it is never omitted or reworded into
|
|
70
|
+
something softer.
|
|
71
|
+
5. **File behavioral deltas for what changed.** When the run's actual
|
|
72
|
+
behavior added, amended, or removed a behavior relative to the plan, file
|
|
73
|
+
a delta record — `added` / `amended` / `removed` — with provenance back
|
|
74
|
+
to the claim or approved deviation that motivated it, and forward to the
|
|
75
|
+
evidence record(s) that back it.
|
|
76
|
+
6. **Report faithfully.** Summarize what was validated, what passed, what
|
|
77
|
+
failed, and what could not be checked at all (no behavioral test exists
|
|
78
|
+
for that obligation yet). An unmet obligation is unmet — it is reported
|
|
79
|
+
as such, not folded into a passing tally or left out of the report.
|
|
80
|
+
7. **Hand off to `/summarize-delivery`.** The filed evidence and deltas feed
|
|
81
|
+
directly into `devague summary`'s Delivery Claims table: evidence
|
|
82
|
+
strength (coverage / fidelity / execution / sensitivity) is the
|
|
83
|
+
confidence vocabulary there, and any approved lapse on a claim caps its
|
|
84
|
+
confidence the same way it always has.
|
|
85
|
+
|
|
86
|
+
## The CLI surface this skill drives
|
|
87
|
+
|
|
88
|
+
**Record-only.** The devague CLI never runs a test itself (issue
|
|
89
|
+
[#20](https://github.com/agentculture/devague/issues/20)) — it only records
|
|
90
|
+
what the agent already ran and found. The exact verb shapes below are
|
|
91
|
+
minimal placeholders while the underlying schema lands in a parallel task;
|
|
92
|
+
treat the verb names as stable and the flags as illustrative, and reconcile
|
|
93
|
+
against `devague explain <move>` once that task merges.
|
|
94
|
+
|
|
95
|
+
| Move | What it records |
|
|
96
|
+
|------|------------------|
|
|
97
|
+
| `devague oblige <cN> --seam "<seam>" --behavior "<behavior>"` | Files a behavioral obligation against a claim, naming the seam to test and the behavior to assert (snapshots the claim text at filing). |
|
|
98
|
+
| `devague evidence --obligation <oN> --test "<ref>" --behavior "<asserted>" --contract "<claim text>" --type <type> --strength <level> --basis "<basis>" --outcome pass\|fail [--run-commit <sha> --run-timestamp <ts>]` | Files an evidence record: obligation met by this test, asserting this behavior, outcome pass or fail (a run reference is required at execution strength and above). `llm`-origin filings land `proposed`; the human adjudicates. |
|
|
99
|
+
| `devague delta --kind added\|amended\|removed --behavior "<what changed>" --caused-by <cN\|dN> [--evidence <eN> ...]` | Files a behavioral delta: provenance back to the claim/deviation it diverges from (`--caused-by`), forward to the evidence that backs it. |
|
|
100
|
+
| `devague summary [--pr] [--json]` | Reads the filed evidence and deltas back into the Delivery Claims table (`/summarize-delivery`'s starting point). |
|
|
101
|
+
|
|
102
|
+
`--origin llm` on `oblige` / `evidence` / `delta` lands the record `proposed`
|
|
103
|
+
— exactly the same anti-fabrication contract as `deviate` and `lapse`: an
|
|
104
|
+
agent's own filing never self-confirms, and only the human's `--confirm` /
|
|
105
|
+
`--reject` moves a proposed record forward. A `user`-origin filing
|
|
106
|
+
auto-approves, mirroring `deviate` and `lapse`.
|
|
107
|
+
|
|
108
|
+
## Hard rules (do not violate)
|
|
109
|
+
|
|
110
|
+
- **The CLI never runs tests.** `devague oblige` / `evidence` / `delta` are
|
|
111
|
+
record-only moves — they take the agent's already-obtained result and
|
|
112
|
+
file it. Running the suite is the agent's job, agent-side, exactly like
|
|
113
|
+
`/summarize-delivery`'s read-only verification step (issue #20).
|
|
114
|
+
- **Unmet is unmet.** A failing or unchecked obligation is filed and
|
|
115
|
+
reported as failing or unchecked — never smoothed into "mostly passing" or
|
|
116
|
+
silently dropped from the report. This is the direct fix for the
|
|
117
|
+
motivating failure below: findings discovered only by reading data after
|
|
118
|
+
the fact, never by a test failing loudly in the record.
|
|
119
|
+
- **A partial or failed run is still a valid input.** There is no
|
|
120
|
+
completion precondition — validate whatever merged, report the rest as
|
|
121
|
+
not yet checkable.
|
|
122
|
+
- **`llm`-origin filings stay proposed until the user confirms.** Same
|
|
123
|
+
anti-fabrication contract as every other origin vocabulary in this
|
|
124
|
+
method — an agent's own proposal never self-confirms.
|
|
125
|
+
- **Provenance both ways.** Every evidence record ties back to an obligation
|
|
126
|
+
(a claim or an approved deviation); every delta ties back to what it
|
|
127
|
+
diverges from and forward to the evidence that backs it. An untraceable
|
|
128
|
+
evidence or delta record is not filed.
|
|
129
|
+
- **This is not a new gate.** Like `/deviate`, `/validate-delivery` does not
|
|
130
|
+
add a fourth standing human gate — it produces the record `/summarize-
|
|
131
|
+
delivery` and the final PR review consume; the three gates (spec,
|
|
132
|
+
implementation split plan, final PR) are unchanged.
|
|
133
|
+
|
|
134
|
+
## Worked example
|
|
135
|
+
|
|
136
|
+
Wave 2 of a plan merged the `export --format widget-md` verb. The plan's
|
|
137
|
+
confirmed `success_signal` claim `c9` said "round-tripping a widget through
|
|
138
|
+
`export` and back loses no fields." A behavioral test exists for it,
|
|
139
|
+
marked `@pytest.mark.behavioral`, plus two more behavioral tests for
|
|
140
|
+
adjacent claims — one of which fails.
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# 1. Identify the obligation (echoes its id, e.g. o1)
|
|
144
|
+
devague oblige c9 --seam "widget export round-trip" \
|
|
145
|
+
--behavior "round-tripping a widget loses no fields"
|
|
146
|
+
|
|
147
|
+
# 2. Locate and run the behavioral tests agent-side (read-only)
|
|
148
|
+
pytest -m behavioral -q
|
|
149
|
+
# -> tests/behavioral/test_widget_export.py::test_round_trip PASSED
|
|
150
|
+
# -> tests/behavioral/test_widget_export.py::test_empty_field_rendering FAILED
|
|
151
|
+
|
|
152
|
+
# 3. File evidence for each outcome — the failure included, not smoothed over
|
|
153
|
+
devague evidence --obligation o1 \
|
|
154
|
+
--test tests/behavioral/test_widget_export.py::test_round_trip \
|
|
155
|
+
--behavior "asserts an exported-then-reimported widget compares equal field by field" \
|
|
156
|
+
--contract "round-tripping a widget loses no fields" \
|
|
157
|
+
--type automated --strength execution \
|
|
158
|
+
--basis "behavioral test ran green at the named commit" \
|
|
159
|
+
--outcome pass --run-commit abc1234 --run-timestamp 2026-08-31T12:00:00
|
|
160
|
+
devague evidence --obligation o2 \
|
|
161
|
+
--test tests/behavioral/test_widget_export.py::test_empty_field_rendering \
|
|
162
|
+
--behavior "asserts an absent widget field renders as an empty line" \
|
|
163
|
+
--contract "an absent field renders honestly, never as filler" \
|
|
164
|
+
--type automated --strength execution \
|
|
165
|
+
--basis "behavioral test ran red at the named commit" \
|
|
166
|
+
--outcome fail --run-commit abc1234 --run-timestamp 2026-08-31T12:00:00
|
|
167
|
+
|
|
168
|
+
# 4. File a delta if the failure reveals a real behavioral divergence
|
|
169
|
+
devague delta --kind amended \
|
|
170
|
+
--behavior "empty widget fields render as garbled text, not an empty line" \
|
|
171
|
+
--caused-by c11 --evidence e2
|
|
172
|
+
|
|
173
|
+
# 5. Report faithfully: c9 is validated; c11's claimed behavior is unmet —
|
|
174
|
+
# say so plainly, hand it to /summarize-delivery as Remaining Work, not
|
|
175
|
+
# as a passing claim.
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`/summarize-delivery` then reads these back — `c9`'s Delivery Claims row
|
|
179
|
+
cites evidence `e1` at `high` confidence (a passing behavioral test); `c11`'s
|
|
180
|
+
row is `unverified` or explicitly failing, never rounded up.
|
|
181
|
+
|
|
182
|
+
## After validating — hand off to /summarize-delivery
|
|
183
|
+
|
|
184
|
+
Once every obligation in scope has an evidence record (or is reported as not
|
|
185
|
+
yet checkable) and any behavioral deltas are filed, this leg is done — there
|
|
186
|
+
is nothing separate to export, the filed records already live in devague
|
|
187
|
+
state. Continue with the sibling **`/summarize-delivery`** skill: its
|
|
188
|
+
Delivery Claims table reads the evidence and deltas filed here directly
|
|
189
|
+
(`devague summary`), so the confidence a claim carries in the final delivery
|
|
190
|
+
artifact traces back to a test that actually ran, not to memory. Don't stop
|
|
191
|
+
at "tests ran" — the standing flow is **file the evidence, then
|
|
192
|
+
`/summarize-delivery`**.
|
|
193
|
+
|
|
194
|
+
## The motivating record
|
|
195
|
+
|
|
196
|
+
The Reasoning Degradation Ledger (`devague lapse`, issue
|
|
197
|
+
[`agentculture/devague#97`](https://github.com/agentculture/devague/issues/97))
|
|
198
|
+
exists because of this, cited verbatim: "Four graders failed in that
|
|
199
|
+
cycle... Every one was found by reading data afterwards; none by a test
|
|
200
|
+
failing." That gap — a corrections record reconstructed only at the end,
|
|
201
|
+
from memory, because nothing forced a behavioral check to run and be filed
|
|
202
|
+
along the way — is exactly what `/validate-delivery` closes for the
|
|
203
|
+
*execution* side, the same way `/challenge` closes it for the *spec* side.
|
|
204
|
+
|
|
205
|
+
The design itself traces to issue
|
|
206
|
+
[`agentculture/devague#107`](https://github.com/agentculture/devague/issues/107),
|
|
207
|
+
"Suggestion: behavioral validation and a derived current spec," which
|
|
208
|
+
proposed behavior as the primary contract, four evidence types, a strength
|
|
209
|
+
ladder, and the current spec as a projection of a behavior ledger rather
|
|
210
|
+
than a hand-maintained document. This skill is the method-only front door to
|
|
211
|
+
that idea: it does not implement the full ledger or the derived-spec
|
|
212
|
+
projection — it establishes where in the flow behavioral checking happens,
|
|
213
|
+
what gets filed, and how the failure mode #97 documented gets closed instead
|
|
214
|
+
of rediscovered.
|
|
215
|
+
|
|
216
|
+
## Provenance
|
|
217
|
+
|
|
218
|
+
This is a **first-party** skill — its origin is `agentculture/devague`, the
|
|
219
|
+
*eighth* in the outbound family after `/scope`, `/think`, `/challenge`,
|
|
220
|
+
`/spec-to-plan`, `/assign-to-workforce`, `/deviate`, and
|
|
221
|
+
`/summarize-delivery`, covering the execution-to-evidence leg that runs
|
|
222
|
+
after a plan's waves merge and before the delivery summary is written.
|
|
223
|
+
guildmaster pulls it from here and broadcasts it to the AgentCulture mesh;
|
|
224
|
+
because devague is upstream, it is **never re-vendored back** from
|
|
225
|
+
guildmaster's re-broadcast copy. The `cite, don't import` policy still
|
|
226
|
+
holds: downstream repos copy it, they don't symlink or depend on it. See
|
|
227
|
+
`docs/skill-sources.md`.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
next-leg-hints
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
{
|
|
2
|
+
"plan_slug": "behavior-validation-and-today-spec",
|
|
3
|
+
"schema_version": 2,
|
|
4
|
+
"created": "2026-08-31T18:27:51Z",
|
|
5
|
+
"updated": "2026-08-31T18:41:30Z",
|
|
6
|
+
"deviations": [],
|
|
7
|
+
"evidence": [
|
|
8
|
+
{
|
|
9
|
+
"id": "e1",
|
|
10
|
+
"obligation_ref": "o1",
|
|
11
|
+
"test_ref": "tests/test_obligation_warnings.py",
|
|
12
|
+
"behavior_text": "asserts converge and plan converge emit a warning naming the obligation id and seam when no approved evidence exists, that proposed or superseded evidence does not discharge it, and that ready flags and lapse exclusions are untouched",
|
|
13
|
+
"contract_text": "an obligation with no approved evidence emits a visibly-untested warning naming the obligation and its seam, and ready_for_spec / ready_for_plan stay untouched",
|
|
14
|
+
"evidence_type": "automated",
|
|
15
|
+
"strength": "execution",
|
|
16
|
+
"strength_basis": "29-test behavioral file ran green at the named commit in the run just recorded; assertions read and matched against the obligation text",
|
|
17
|
+
"outcome": "pass",
|
|
18
|
+
"run": {
|
|
19
|
+
"timestamp": "2026-08-31T21:27:40+03:00",
|
|
20
|
+
"commit": "3945fb7"
|
|
21
|
+
},
|
|
22
|
+
"origin": "llm",
|
|
23
|
+
"status": "approved",
|
|
24
|
+
"superseded": false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "e2",
|
|
28
|
+
"obligation_ref": "o2",
|
|
29
|
+
"test_ref": "tests/test_today.py + tests/test_today_cli.py",
|
|
30
|
+
"behavior_text": "asserts the projection loads every frame, plan, and delivery fail-open with diagnostics, that devague today writes docs/current-spec.md and every other file hashes byte-identical before and after, and that the same stores project to the same bytes",
|
|
31
|
+
"contract_text": "the projection walks every frame, plan, and delivery fail-open, writes only docs/current-spec.md, and leaves every store file byte-identical",
|
|
32
|
+
"evidence_type": "automated",
|
|
33
|
+
"strength": "execution",
|
|
34
|
+
"strength_basis": "52 behavioral tests ran green at the named commit, including the hash-everything-before-and-after pin and two determinism pins",
|
|
35
|
+
"outcome": "pass",
|
|
36
|
+
"run": {
|
|
37
|
+
"timestamp": "2026-08-31T21:27:40+03:00",
|
|
38
|
+
"commit": "3945fb7"
|
|
39
|
+
},
|
|
40
|
+
"origin": "llm",
|
|
41
|
+
"status": "approved",
|
|
42
|
+
"superseded": false
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "e3",
|
|
46
|
+
"obligation_ref": "o3",
|
|
47
|
+
"test_ref": "tests/test_summary_delivery_claims.py",
|
|
48
|
+
"behavior_text": "asserts one Delivery Claims row per obligation-bearing claim with ladder strength from best approved passing evidence, failing evidence rendered as FAILING, proposed as pending, and approved lapses capping rendered strength with most-restrictive-wins",
|
|
49
|
+
"contract_text": "one row per obligation-bearing claim renders ladder strength from approved passing evidence, with approved lapses capping renderable strength",
|
|
50
|
+
"evidence_type": "automated",
|
|
51
|
+
"strength": "execution",
|
|
52
|
+
"strength_basis": "25-test behavioral file ran green at the named commit; cap mapping and row-state assertions read directly",
|
|
53
|
+
"outcome": "pass",
|
|
54
|
+
"run": {
|
|
55
|
+
"timestamp": "2026-08-31T21:27:40+03:00",
|
|
56
|
+
"commit": "3945fb7"
|
|
57
|
+
},
|
|
58
|
+
"origin": "llm",
|
|
59
|
+
"status": "approved",
|
|
60
|
+
"superseded": false
|
|
61
|
+
}
|
|
62
|
+
],
|
|
63
|
+
"deltas": [
|
|
64
|
+
{
|
|
65
|
+
"id": "b1",
|
|
66
|
+
"kind": "added",
|
|
67
|
+
"behavior_text": "converge and plan converge warn on behavioral obligations with no approved evidence \u2014 visibly untested, never gating",
|
|
68
|
+
"caused_by": [
|
|
69
|
+
"c6"
|
|
70
|
+
],
|
|
71
|
+
"evidence_refs": [
|
|
72
|
+
"e1"
|
|
73
|
+
],
|
|
74
|
+
"origin": "llm",
|
|
75
|
+
"status": "approved",
|
|
76
|
+
"superseded": false
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"id": "b2",
|
|
80
|
+
"kind": "added",
|
|
81
|
+
"behavior_text": "devague today projects the behavior ledger across all frames, plans, and deliveries into the committed docs/current-spec.md, fail-open and read-only over stores",
|
|
82
|
+
"caused_by": [
|
|
83
|
+
"c7"
|
|
84
|
+
],
|
|
85
|
+
"evidence_refs": [
|
|
86
|
+
"e2"
|
|
87
|
+
],
|
|
88
|
+
"origin": "llm",
|
|
89
|
+
"status": "approved",
|
|
90
|
+
"superseded": false
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"id": "b3",
|
|
94
|
+
"kind": "added",
|
|
95
|
+
"behavior_text": "devague summary's Delivery Claims table renders per-claim evidence strength on the coverage/fidelity/execution/sensitivity ladder, capped by approved lapses",
|
|
96
|
+
"caused_by": [
|
|
97
|
+
"c20"
|
|
98
|
+
],
|
|
99
|
+
"evidence_refs": [
|
|
100
|
+
"e3"
|
|
101
|
+
],
|
|
102
|
+
"origin": "llm",
|
|
103
|
+
"status": "approved",
|
|
104
|
+
"superseded": false
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
"supersessions": []
|
|
108
|
+
}
|