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.
Files changed (278) hide show
  1. {devague-0.22.0 → devague-0.24.0}/.claude/skills/assign-to-workforce/SKILL.md +39 -20
  2. {devague-0.22.0 → devague-0.24.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +18 -3
  3. {devague-0.22.0 → devague-0.24.0}/.claude/skills/challenge/SKILL.md +1 -1
  4. {devague-0.22.0 → devague-0.24.0}/.claude/skills/deviate/SKILL.md +8 -6
  5. {devague-0.22.0 → devague-0.24.0}/.claude/skills/spec-to-plan/SKILL.md +10 -0
  6. {devague-0.22.0 → devague-0.24.0}/.claude/skills/summarize-delivery/SKILL.md +6 -3
  7. {devague-0.22.0 → devague-0.24.0}/.claude/skills/think/SKILL.md +7 -5
  8. devague-0.24.0/.claude/skills/validate-delivery/SKILL.md +227 -0
  9. devague-0.24.0/.devague/current_plan +1 -0
  10. devague-0.24.0/.devague/deliveries/behavior-validation-and-today-spec.json +108 -0
  11. devague-0.24.0/.devague/deliveries/next-leg-hints.json +162 -0
  12. devague-0.24.0/.devague/frames/behavior-validation-and-today-spec.json +937 -0
  13. devague-0.24.0/.devague/frames/next-leg-hints.json +563 -0
  14. devague-0.24.0/.devague/plans/behavior-validation-and-today-spec.json +715 -0
  15. devague-0.24.0/.devague/plans/next-leg-hints.json +333 -0
  16. {devague-0.22.0 → devague-0.24.0}/CHANGELOG.md +43 -0
  17. {devague-0.22.0 → devague-0.24.0}/CLAUDE.md +68 -11
  18. {devague-0.22.0 → devague-0.24.0}/PKG-INFO +34 -12
  19. {devague-0.22.0 → devague-0.24.0}/README.md +32 -10
  20. {devague-0.22.0 → devague-0.24.0}/devague/cli/__init__.py +13 -1
  21. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/converge.py +10 -2
  22. devague-0.24.0/devague/cli/_commands/delta.py +379 -0
  23. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/deviate.py +11 -28
  24. devague-0.24.0/devague/cli/_commands/evidence.py +297 -0
  25. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/learn.py +504 -17
  26. devague-0.24.0/devague/cli/_commands/oblige.py +208 -0
  27. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/plan.py +218 -5
  28. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/show.py +21 -2
  29. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/status.py +17 -1
  30. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/summary.py +20 -3
  31. devague-0.24.0/devague/cli/_commands/today.py +59 -0
  32. devague-0.24.0/devague/cli/_hint_config.py +126 -0
  33. devague-0.24.0/devague/cli/_hints.py +205 -0
  34. devague-0.24.0/devague/cli/_refs.py +55 -0
  35. {devague-0.22.0 → devague-0.24.0}/devague/cli/_status.py +37 -1
  36. {devague-0.22.0 → devague-0.24.0}/devague/contested.py +29 -12
  37. {devague-0.22.0 → devague-0.24.0}/devague/convergence.py +57 -2
  38. devague-0.24.0/devague/delivery.py +605 -0
  39. {devague-0.22.0 → devague-0.24.0}/devague/delivery_store.py +15 -6
  40. {devague-0.22.0 → devague-0.24.0}/devague/frame.py +157 -0
  41. devague-0.24.0/devague/obligation_evidence.py +119 -0
  42. {devague-0.22.0 → devague-0.24.0}/devague/plan.py +180 -1
  43. {devague-0.22.0 → devague-0.24.0}/devague/plan_convergence.py +47 -3
  44. {devague-0.22.0 → devague-0.24.0}/devague/render/frame_md.py +20 -3
  45. {devague-0.22.0 → devague-0.24.0}/devague/render/plan_md.py +23 -3
  46. {devague-0.22.0 → devague-0.24.0}/devague/render/summary_md.py +353 -10
  47. devague-0.24.0/devague/render/today_md.py +217 -0
  48. devague-0.24.0/devague/staleness.py +332 -0
  49. devague-0.24.0/devague/today.py +792 -0
  50. devague-0.24.0/docs/current-spec.md +40 -0
  51. devague-0.24.0/docs/deliveries/2026-08-31-behavior-validation-and-today-spec.md +134 -0
  52. devague-0.24.0/docs/deliveries/2026-08-31-next-leg-hints.md +105 -0
  53. devague-0.24.0/docs/plans/2026-08-31-behavior-validation-and-today-spec-split.md +217 -0
  54. devague-0.24.0/docs/plans/2026-08-31-behavior-validation-and-today-spec.md +160 -0
  55. devague-0.24.0/docs/plans/2026-08-31-next-leg-hints-split.md +106 -0
  56. devague-0.24.0/docs/plans/2026-08-31-next-leg-hints.md +60 -0
  57. {devague-0.22.0 → devague-0.24.0}/docs/skill-sources.md +16 -13
  58. {devague-0.22.0 → devague-0.24.0}/docs/skills.md +35 -4
  59. {devague-0.22.0 → devague-0.24.0}/docs/spec-contract.md +21 -0
  60. devague-0.24.0/docs/specs/2026-08-31-behavior-validation-and-today-spec.md +139 -0
  61. devague-0.24.0/docs/specs/2026-08-31-next-leg-hints.md +121 -0
  62. {devague-0.22.0 → devague-0.24.0}/pyproject.toml +4 -1
  63. devague-0.24.0/tests/test_cli_delta.py +626 -0
  64. devague-0.24.0/tests/test_cli_evidence.py +498 -0
  65. devague-0.24.0/tests/test_cli_hints.py +715 -0
  66. devague-0.24.0/tests/test_cli_learn.py +639 -0
  67. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_moves.py +3 -1
  68. devague-0.24.0/tests/test_cli_oblige.py +440 -0
  69. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_plan.py +245 -10
  70. {devague-0.22.0 → devague-0.24.0}/tests/test_convergence.py +65 -1
  71. devague-0.24.0/tests/test_delivery_evidence.py +582 -0
  72. devague-0.24.0/tests/test_end_to_end_validation.py +239 -0
  73. {devague-0.22.0 → devague-0.24.0}/tests/test_frame.py +20 -11
  74. {devague-0.22.0 → devague-0.24.0}/tests/test_frame_lapse.py +9 -5
  75. devague-0.24.0/tests/test_frame_obligation.py +295 -0
  76. {devague-0.22.0 → devague-0.24.0}/tests/test_frame_schema_v2.py +4 -3
  77. devague-0.24.0/tests/test_hint_config.py +397 -0
  78. devague-0.24.0/tests/test_obligation_warnings.py +432 -0
  79. {devague-0.22.0 → devague-0.24.0}/tests/test_plan.py +9 -5
  80. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_cli_instructions.py +3 -1
  81. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_convergence.py +61 -0
  82. devague-0.24.0/tests/test_plan_obligation.py +293 -0
  83. devague-0.24.0/tests/test_render_obligations.py +132 -0
  84. devague-0.24.0/tests/test_staleness.py +571 -0
  85. {devague-0.22.0 → devague-0.24.0}/tests/test_summary.py +3 -1
  86. devague-0.24.0/tests/test_summary_delivery_claims.py +410 -0
  87. {devague-0.22.0 → devague-0.24.0}/tests/test_teaching_surface_sweep.py +5 -3
  88. devague-0.24.0/tests/test_today.py +619 -0
  89. devague-0.24.0/tests/test_today_cli.py +131 -0
  90. devague-0.24.0/tests/test_today_md.py +210 -0
  91. {devague-0.22.0 → devague-0.24.0}/uv.lock +1 -1
  92. devague-0.22.0/.devague/current_plan +0 -1
  93. devague-0.22.0/devague/delivery.py +0 -149
  94. devague-0.22.0/tests/test_cli_learn.py +0 -273
  95. {devague-0.22.0 → devague-0.24.0}/.claude/skills/agent-config/SKILL.md +0 -0
  96. {devague-0.22.0 → devague-0.24.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  97. {devague-0.22.0 → devague-0.24.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
  98. {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/SKILL.md +0 -0
  99. {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  100. {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  101. {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  102. {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  103. {devague-0.22.0 → devague-0.24.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  104. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/SKILL.md +0 -0
  105. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  106. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  107. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  108. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  109. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  110. {devague-0.22.0 → devague-0.24.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  111. {devague-0.22.0 → devague-0.24.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  112. {devague-0.22.0 → devague-0.24.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  113. {devague-0.22.0 → devague-0.24.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  114. {devague-0.22.0 → devague-0.24.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  115. {devague-0.22.0 → devague-0.24.0}/.claude/skills/recall/SKILL.md +0 -0
  116. {devague-0.22.0 → devague-0.24.0}/.claude/skills/recall/scripts/recall.sh +0 -0
  117. {devague-0.22.0 → devague-0.24.0}/.claude/skills/remember/SKILL.md +0 -0
  118. {devague-0.22.0 → devague-0.24.0}/.claude/skills/remember/scripts/remember.sh +0 -0
  119. {devague-0.22.0 → devague-0.24.0}/.claude/skills/run-tests/SKILL.md +0 -0
  120. {devague-0.22.0 → devague-0.24.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
  121. {devague-0.22.0 → devague-0.24.0}/.claude/skills/scope/SKILL.md +0 -0
  122. {devague-0.22.0 → devague-0.24.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
  123. {devague-0.22.0 → devague-0.24.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  124. {devague-0.22.0 → devague-0.24.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  125. {devague-0.22.0 → devague-0.24.0}/.claude/skills/think/scripts/think.sh +0 -0
  126. {devague-0.22.0 → devague-0.24.0}/.claude/skills/version-bump/SKILL.md +0 -0
  127. {devague-0.22.0 → devague-0.24.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
  128. {devague-0.22.0 → devague-0.24.0}/.claude/skills.local.yaml.example +0 -0
  129. {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/challenge-skill.json +0 -0
  130. {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/execution-seam-and-deviate.json +0 -0
  131. {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/issue-backlog-sweep.json +0 -0
  132. {devague-0.22.0 → devague-0.24.0}/.devague/deliveries/reasoning-degradation-ledger.json +0 -0
  133. {devague-0.22.0 → devague-0.24.0}/.devague/frames/challenge-skill.json +0 -0
  134. {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
  135. {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-now-ships-a-documented-spec-contract-every.json +0 -0
  136. {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-ships-a-sharper-end-to-end-method-a-guided.json +0 -0
  137. {devague-0.22.0 → devague-0.24.0}/.devague/frames/devague-turns-a-converged-plan-into-parallel-simpl.json +0 -0
  138. {devague-0.22.0 → devague-0.24.0}/.devague/frames/execution-seam-and-deviate.json +0 -0
  139. {devague-0.22.0 → devague-0.24.0}/.devague/frames/issue-backlog-sweep.json +0 -0
  140. {devague-0.22.0 → devague-0.24.0}/.devague/frames/reasoning-degradation-ledger.json +0 -0
  141. {devague-0.22.0 → devague-0.24.0}/.devague/frames/resolve-parked-vagueness.json +0 -0
  142. {devague-0.22.0 → devague-0.24.0}/.devague/frames/summarize-delivery-skill.json +0 -0
  143. {devague-0.22.0 → devague-0.24.0}/.devague/plans/challenge-skill.json +0 -0
  144. {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
  145. {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-now-ships-a-documented-spec-contract-every.json +0 -0
  146. {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-ships-a-sharper-end-to-end-method-a-guided.json +0 -0
  147. {devague-0.22.0 → devague-0.24.0}/.devague/plans/devague-turns-a-converged-plan-into-parallel-simpl.json +0 -0
  148. {devague-0.22.0 → devague-0.24.0}/.devague/plans/execution-seam-and-deviate.json +0 -0
  149. {devague-0.22.0 → devague-0.24.0}/.devague/plans/issue-backlog-sweep.json +0 -0
  150. {devague-0.22.0 → devague-0.24.0}/.devague/plans/reasoning-degradation-ledger.json +0 -0
  151. {devague-0.22.0 → devague-0.24.0}/.devague/plans/resolve-parked-vagueness.json +0 -0
  152. {devague-0.22.0 → devague-0.24.0}/.devague/plans/summarize-delivery-skill.json +0 -0
  153. {devague-0.22.0 → devague-0.24.0}/.flake8 +0 -0
  154. {devague-0.22.0 → devague-0.24.0}/.github/workflows/publish.yml +0 -0
  155. {devague-0.22.0 → devague-0.24.0}/.github/workflows/security-checks.yml +0 -0
  156. {devague-0.22.0 → devague-0.24.0}/.github/workflows/tests.yml +0 -0
  157. {devague-0.22.0 → devague-0.24.0}/.gitignore +0 -0
  158. {devague-0.22.0 → devague-0.24.0}/.markdownlint-cli2.yaml +0 -0
  159. {devague-0.22.0 → devague-0.24.0}/.pre-commit-config.yaml +0 -0
  160. {devague-0.22.0 → devague-0.24.0}/LICENSE +0 -0
  161. {devague-0.22.0 → devague-0.24.0}/LICENSES/MIT-guildmaster-skills.txt +0 -0
  162. {devague-0.22.0 → devague-0.24.0}/culture.yaml +0 -0
  163. {devague-0.22.0 → devague-0.24.0}/devague/__init__.py +0 -0
  164. {devague-0.22.0 → devague-0.24.0}/devague/__main__.py +0 -0
  165. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/__init__.py +0 -0
  166. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/amend.py +0 -0
  167. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/capture.py +0 -0
  168. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/confirm.py +0 -0
  169. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/explain.py +0 -0
  170. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/export.py +0 -0
  171. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/interrogate.py +0 -0
  172. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/lapse.py +0 -0
  173. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/list_frames.py +0 -0
  174. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/new.py +0 -0
  175. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/park.py +0 -0
  176. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/question.py +0 -0
  177. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/reject.py +0 -0
  178. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/review.py +0 -0
  179. {devague-0.22.0 → devague-0.24.0}/devague/cli/_commands/scope.py +0 -0
  180. {devague-0.22.0 → devague-0.24.0}/devague/cli/_deliveries.py +0 -0
  181. {devague-0.22.0 → devague-0.24.0}/devague/cli/_errors.py +0 -0
  182. {devague-0.22.0 → devague-0.24.0}/devague/cli/_frames.py +0 -0
  183. {devague-0.22.0 → devague-0.24.0}/devague/cli/_output.py +0 -0
  184. {devague-0.22.0 → devague-0.24.0}/devague/cli/_paths.py +0 -0
  185. {devague-0.22.0 → devague-0.24.0}/devague/cli/_plans.py +0 -0
  186. {devague-0.22.0 → devague-0.24.0}/devague/plan_store.py +0 -0
  187. {devague-0.22.0 → devague-0.24.0}/devague/questions_io.py +0 -0
  188. {devague-0.22.0 → devague-0.24.0}/devague/render/__init__.py +0 -0
  189. {devague-0.22.0 → devague-0.24.0}/devague/render/_md_safety.py +0 -0
  190. {devague-0.22.0 → devague-0.24.0}/devague/render/deliverables_md.py +0 -0
  191. {devague-0.22.0 → devague-0.24.0}/devague/render/review_md.py +0 -0
  192. {devague-0.22.0 → devague-0.24.0}/devague/render/spec_md.py +0 -0
  193. {devague-0.22.0 → devague-0.24.0}/devague/store.py +0 -0
  194. {devague-0.22.0 → devague-0.24.0}/docs/assign-to-workforce-worked-example.md +0 -0
  195. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-09-sharper-end-to-end-method.md +0 -0
  196. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-09-summarize-delivery-skill.md +0 -0
  197. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-14-execution-seam-and-deviate.md +0 -0
  198. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-15-challenge-skill.md +0 -0
  199. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-17-resolve-parked-vagueness.md +0 -0
  200. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-28-issue-backlog-sweep-closure-map.md +0 -0
  201. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-28-issue-backlog-sweep.md +0 -0
  202. {devague-0.22.0 → devague-0.24.0}/docs/deliveries/2026-07-29-reasoning-degradation-ledger.md +0 -0
  203. {devague-0.22.0 → devague-0.24.0}/docs/examples/contract-example.json +0 -0
  204. {devague-0.22.0 → devague-0.24.0}/docs/llm-guidance.md +0 -0
  205. {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
  206. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-05-23-devague-now-ships-a-documented-spec-contract-every.md +0 -0
  207. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md +0 -0
  208. {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
  209. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-09-summarize-delivery-skill.md +0 -0
  210. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-14-execution-seam-and-deviate.md +0 -0
  211. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-15-challenge-skill.md +0 -0
  212. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-17-resolve-parked-vagueness.md +0 -0
  213. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-28-issue-backlog-sweep-split.md +0 -0
  214. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-28-issue-backlog-sweep.md +0 -0
  215. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-29-reasoning-degradation-ledger-split.md +0 -0
  216. {devague-0.22.0 → devague-0.24.0}/docs/plans/2026-07-29-reasoning-degradation-ledger.md +0 -0
  217. {devague-0.22.0 → devague-0.24.0}/docs/reviews/spec-contract-frame-review.md +0 -0
  218. {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
  219. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-05-23-devague-now-ships-a-documented-spec-contract-every.md +0 -0
  220. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md +0 -0
  221. {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
  222. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-09-summarize-delivery-skill.md +0 -0
  223. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-14-execution-seam-and-deviate.md +0 -0
  224. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-15-challenge-skill.md +0 -0
  225. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-17-resolve-parked-vagueness.md +0 -0
  226. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-28-issue-backlog-sweep.md +0 -0
  227. {devague-0.22.0 → devague-0.24.0}/docs/specs/2026-07-29-reasoning-degradation-ledger.md +0 -0
  228. {devague-0.22.0 → devague-0.24.0}/docs/superpowers/plans/2026-05-22-specifix-onboarding.md +0 -0
  229. {devague-0.22.0 → devague-0.24.0}/docs/superpowers/plans/2026-05-23-devague-rename.md +0 -0
  230. {devague-0.22.0 → devague-0.24.0}/docs/superpowers/plans/2026-05-23-devague-working-backwards-engine.md +0 -0
  231. {devague-0.22.0 → devague-0.24.0}/docs/superpowers/specs/2026-05-22-specifix-onboarding-design.md +0 -0
  232. {devague-0.22.0 → devague-0.24.0}/docs/superpowers/specs/2026-05-23-devague-spec-to-plan-design.md +0 -0
  233. {devague-0.22.0 → devague-0.24.0}/docs/superpowers/specs/2026-05-23-devague-working-backwards-design.md +0 -0
  234. {devague-0.22.0 → devague-0.24.0}/sonar-project.properties +0 -0
  235. {devague-0.22.0 → devague-0.24.0}/tests/__init__.py +0 -0
  236. {devague-0.22.0 → devague-0.24.0}/tests/goldens/resolved_vagueness_frame.md +0 -0
  237. {devague-0.22.0 → devague-0.24.0}/tests/goldens/resolved_vagueness_spec.md +0 -0
  238. {devague-0.22.0 → devague-0.24.0}/tests/goldens/sharper_frame.md +0 -0
  239. {devague-0.22.0 → devague-0.24.0}/tests/goldens/sharper_plan.md +0 -0
  240. {devague-0.22.0 → devague-0.24.0}/tests/goldens/sharper_spec.md +0 -0
  241. {devague-0.22.0 → devague-0.24.0}/tests/test_assign_to_workforce_script.py +0 -0
  242. {devague-0.22.0 → devague-0.24.0}/tests/test_boundary_audit.py +0 -0
  243. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_affordances.py +0 -0
  244. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_chassis.py +0 -0
  245. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_converge_export.py +0 -0
  246. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_errors.py +0 -0
  247. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_instructions.py +0 -0
  248. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_lapse.py +0 -0
  249. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_output.py +0 -0
  250. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_paths.py +0 -0
  251. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_question.py +0 -0
  252. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_review.py +0 -0
  253. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_scope.py +0 -0
  254. {devague-0.22.0 → devague-0.24.0}/tests/test_cli_status.py +0 -0
  255. {devague-0.22.0 → devague-0.24.0}/tests/test_contested.py +0 -0
  256. {devague-0.22.0 → devague-0.24.0}/tests/test_contract.py +0 -0
  257. {devague-0.22.0 → devague-0.24.0}/tests/test_convergence_sharper.py +0 -0
  258. {devague-0.22.0 → devague-0.24.0}/tests/test_deviate.py +0 -0
  259. {devague-0.22.0 → devague-0.24.0}/tests/test_e2e_resolve.py +0 -0
  260. {devague-0.22.0 → devague-0.24.0}/tests/test_e2e_sharper_method.py +0 -0
  261. {devague-0.22.0 → devague-0.24.0}/tests/test_export_markdownlint_integration.py +0 -0
  262. {devague-0.22.0 → devague-0.24.0}/tests/test_md_safety.py +0 -0
  263. {devague-0.22.0 → devague-0.24.0}/tests/test_offline.py +0 -0
  264. {devague-0.22.0 → devague-0.24.0}/tests/test_package.py +0 -0
  265. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_convergence_sharper.py +0 -0
  266. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_deliverables.py +0 -0
  267. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_escape_hatches.py +0 -0
  268. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_render_sharper.py +0 -0
  269. {devague-0.22.0 → devague-0.24.0}/tests/test_plan_store.py +0 -0
  270. {devague-0.22.0 → devague-0.24.0}/tests/test_render.py +0 -0
  271. {devague-0.22.0 → devague-0.24.0}/tests/test_render_plan.py +0 -0
  272. {devague-0.22.0 → devague-0.24.0}/tests/test_render_sharper.py +0 -0
  273. {devague-0.22.0 → devague-0.24.0}/tests/test_review_loop_integration.py +0 -0
  274. {devague-0.22.0 → devague-0.24.0}/tests/test_review_loop_invariants.py +0 -0
  275. {devague-0.22.0 → devague-0.24.0}/tests/test_spec_to_plan_skill.py +0 -0
  276. {devague-0.22.0 → devague-0.24.0}/tests/test_store.py +0 -0
  277. {devague-0.22.0 → devague-0.24.0}/tests/test_teaching_scope.py +0 -0
  278. {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
- ## After the final PR — summarize the delivery
286
-
287
- Once the final PR is **merged**, close the execution loop cleanly instead of
288
- stopping at a green merge:
289
-
290
- 1. **Summarize the delivery.** Run the sibling **`/summarize-delivery`** skill —
291
- the delivery-side closure leg. It turns the run into a committed
292
- accountability artifact (`docs/deliveries/<created-date>-<slug>.md`) that
293
- records planned-versus-actual delivery, the mid-work decisions the workforce
294
- made, where execution drifted from the plan, evidence-backed delivery claims
295
- (a claim without evidence stays `unverified`, never asserted as done), and
296
- any remaining work. The `devague plan waves --json` payload you fanned out is
297
- the planned-work baseline it compares actuals against.
298
- 2. **It closes partial and failed runs too.** `/summarize-delivery` does not
299
- require every wave to have merged — a run that shipped only some tasks, or
300
- none, still produces a truthful artifact: the failure lands under drift and
301
- remaining work, and no claim says done without evidence.
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` is method-only and read-only (#20): it summarizes the run,
305
- it does not orchestrate, gate merges, or mutate devague state. Don't stop at
306
- "PR merged" — the standing flow is **merge, then `/summarize-delivery`**.
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
 
@@ -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>&1)"
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' "$show_json" >&2
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 run reaches `/summarize-delivery`, that skill's Drift From
162
- Plan and Mid-work Decisions sections quote these records by their `dN` id
163
- instead of reconstructing drift from memory, so the connective tissue between
164
- the confirmed plan and the delivery summary is the ledger this skill wrote,
165
- not anyone's recollection of the run.
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 `/scope`, `/think`, `/spec-to-plan`, and
455
- `/assign-to-workforce`, covering the delivery-side closure leg after a plan is
456
- executed. guildmaster pulls it from here and broadcasts it to the AgentCulture
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 forward leg is the sibling skill:
284
- `devague plan new --frame <slug>` seeds a plan from the converged frame and
285
- works it forward into a buildable plan (it can equally feed
286
- `superpowers:writing-plans` or a normal implementation PR).
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
+ }