devague 0.9.0__tar.gz → 0.9.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. devague-0.9.1/.devague/current_plan +1 -0
  2. devague-0.9.1/.devague/frames/devague-turns-a-converged-plan-into-parallel-simpl.json +353 -0
  3. devague-0.9.1/.devague/plans/devague-turns-a-converged-plan-into-parallel-simpl.json +217 -0
  4. {devague-0.9.0 → devague-0.9.1}/.gitignore +5 -0
  5. {devague-0.9.0 → devague-0.9.1}/CHANGELOG.md +6 -0
  6. {devague-0.9.0 → devague-0.9.1}/PKG-INFO +1 -1
  7. devague-0.9.1/docs/plans/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md +57 -0
  8. devague-0.9.1/docs/specs/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md +52 -0
  9. {devague-0.9.0 → devague-0.9.1}/pyproject.toml +1 -1
  10. {devague-0.9.0 → devague-0.9.1}/uv.lock +1 -1
  11. devague-0.9.0/.devague/current_plan +0 -1
  12. {devague-0.9.0 → devague-0.9.1}/.claude/skills/cicd/SKILL.md +0 -0
  13. {devague-0.9.0 → devague-0.9.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  14. {devague-0.9.0 → devague-0.9.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  15. {devague-0.9.0 → devague-0.9.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  16. {devague-0.9.0 → devague-0.9.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  17. {devague-0.9.0 → devague-0.9.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  18. {devague-0.9.0 → devague-0.9.1}/.claude/skills/communicate/SKILL.md +0 -0
  19. {devague-0.9.0 → devague-0.9.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  20. {devague-0.9.0 → devague-0.9.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  21. {devague-0.9.0 → devague-0.9.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  22. {devague-0.9.0 → devague-0.9.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  23. {devague-0.9.0 → devague-0.9.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  24. {devague-0.9.0 → devague-0.9.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  25. {devague-0.9.0 → devague-0.9.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  26. {devague-0.9.0 → devague-0.9.1}/.claude/skills/run-tests/SKILL.md +0 -0
  27. {devague-0.9.0 → devague-0.9.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  28. {devague-0.9.0 → devague-0.9.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
  29. {devague-0.9.0 → devague-0.9.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  30. {devague-0.9.0 → devague-0.9.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  31. {devague-0.9.0 → devague-0.9.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  32. {devague-0.9.0 → devague-0.9.1}/.claude/skills/think/SKILL.md +0 -0
  33. {devague-0.9.0 → devague-0.9.1}/.claude/skills/think/scripts/think.sh +0 -0
  34. {devague-0.9.0 → devague-0.9.1}/.claude/skills/version-bump/SKILL.md +0 -0
  35. {devague-0.9.0 → devague-0.9.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
  36. {devague-0.9.0 → devague-0.9.1}/.claude/skills.local.yaml.example +0 -0
  37. {devague-0.9.0 → devague-0.9.1}/.devague/frames/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
  38. {devague-0.9.0 → devague-0.9.1}/.devague/frames/devague-now-ships-a-documented-spec-contract-every.json +0 -0
  39. {devague-0.9.0 → devague-0.9.1}/.devague/plans/devague-0-6-0-ships-the-human-review-loop-devague.json +0 -0
  40. {devague-0.9.0 → devague-0.9.1}/.devague/plans/devague-now-ships-a-documented-spec-contract-every.json +0 -0
  41. {devague-0.9.0 → devague-0.9.1}/.flake8 +0 -0
  42. {devague-0.9.0 → devague-0.9.1}/.github/workflows/publish.yml +0 -0
  43. {devague-0.9.0 → devague-0.9.1}/.github/workflows/security-checks.yml +0 -0
  44. {devague-0.9.0 → devague-0.9.1}/.github/workflows/tests.yml +0 -0
  45. {devague-0.9.0 → devague-0.9.1}/.markdownlint-cli2.yaml +0 -0
  46. {devague-0.9.0 → devague-0.9.1}/.pre-commit-config.yaml +0 -0
  47. {devague-0.9.0 → devague-0.9.1}/CLAUDE.md +0 -0
  48. {devague-0.9.0 → devague-0.9.1}/LICENSE +0 -0
  49. {devague-0.9.0 → devague-0.9.1}/README.md +0 -0
  50. {devague-0.9.0 → devague-0.9.1}/culture.yaml +0 -0
  51. {devague-0.9.0 → devague-0.9.1}/devague/__init__.py +0 -0
  52. {devague-0.9.0 → devague-0.9.1}/devague/__main__.py +0 -0
  53. {devague-0.9.0 → devague-0.9.1}/devague/cli/__init__.py +0 -0
  54. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/__init__.py +0 -0
  55. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/capture.py +0 -0
  56. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/confirm.py +0 -0
  57. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/converge.py +0 -0
  58. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/explain.py +0 -0
  59. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/export.py +0 -0
  60. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/interrogate.py +0 -0
  61. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/learn.py +0 -0
  62. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/list_frames.py +0 -0
  63. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/new.py +0 -0
  64. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/park.py +0 -0
  65. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/plan.py +0 -0
  66. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/question.py +0 -0
  67. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/reject.py +0 -0
  68. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/review.py +0 -0
  69. {devague-0.9.0 → devague-0.9.1}/devague/cli/_commands/show.py +0 -0
  70. {devague-0.9.0 → devague-0.9.1}/devague/cli/_errors.py +0 -0
  71. {devague-0.9.0 → devague-0.9.1}/devague/cli/_frames.py +0 -0
  72. {devague-0.9.0 → devague-0.9.1}/devague/cli/_output.py +0 -0
  73. {devague-0.9.0 → devague-0.9.1}/devague/cli/_paths.py +0 -0
  74. {devague-0.9.0 → devague-0.9.1}/devague/cli/_plans.py +0 -0
  75. {devague-0.9.0 → devague-0.9.1}/devague/convergence.py +0 -0
  76. {devague-0.9.0 → devague-0.9.1}/devague/frame.py +0 -0
  77. {devague-0.9.0 → devague-0.9.1}/devague/plan.py +0 -0
  78. {devague-0.9.0 → devague-0.9.1}/devague/plan_convergence.py +0 -0
  79. {devague-0.9.0 → devague-0.9.1}/devague/plan_store.py +0 -0
  80. {devague-0.9.0 → devague-0.9.1}/devague/questions_io.py +0 -0
  81. {devague-0.9.0 → devague-0.9.1}/devague/render/__init__.py +0 -0
  82. {devague-0.9.0 → devague-0.9.1}/devague/render/frame_md.py +0 -0
  83. {devague-0.9.0 → devague-0.9.1}/devague/render/plan_md.py +0 -0
  84. {devague-0.9.0 → devague-0.9.1}/devague/render/review_md.py +0 -0
  85. {devague-0.9.0 → devague-0.9.1}/devague/render/spec_md.py +0 -0
  86. {devague-0.9.0 → devague-0.9.1}/devague/store.py +0 -0
  87. {devague-0.9.0 → devague-0.9.1}/docs/examples/contract-example.json +0 -0
  88. {devague-0.9.0 → devague-0.9.1}/docs/llm-guidance.md +0 -0
  89. {devague-0.9.0 → devague-0.9.1}/docs/plans/2026-05-23-devague-0-6-0-ships-the-human-review-loop-devague.md +0 -0
  90. {devague-0.9.0 → devague-0.9.1}/docs/plans/2026-05-23-devague-now-ships-a-documented-spec-contract-every.md +0 -0
  91. {devague-0.9.0 → devague-0.9.1}/docs/reviews/spec-contract-frame-review.md +0 -0
  92. {devague-0.9.0 → devague-0.9.1}/docs/skill-sources.md +0 -0
  93. {devague-0.9.0 → devague-0.9.1}/docs/spec-contract.md +0 -0
  94. {devague-0.9.0 → devague-0.9.1}/docs/specs/2026-05-23-devague-0-6-0-ships-the-human-review-loop-devague.md +0 -0
  95. {devague-0.9.0 → devague-0.9.1}/docs/specs/2026-05-23-devague-now-ships-a-documented-spec-contract-every.md +0 -0
  96. {devague-0.9.0 → devague-0.9.1}/docs/superpowers/plans/2026-05-22-specifix-onboarding.md +0 -0
  97. {devague-0.9.0 → devague-0.9.1}/docs/superpowers/plans/2026-05-23-devague-rename.md +0 -0
  98. {devague-0.9.0 → devague-0.9.1}/docs/superpowers/plans/2026-05-23-devague-working-backwards-engine.md +0 -0
  99. {devague-0.9.0 → devague-0.9.1}/docs/superpowers/specs/2026-05-22-specifix-onboarding-design.md +0 -0
  100. {devague-0.9.0 → devague-0.9.1}/docs/superpowers/specs/2026-05-23-devague-spec-to-plan-design.md +0 -0
  101. {devague-0.9.0 → devague-0.9.1}/docs/superpowers/specs/2026-05-23-devague-working-backwards-design.md +0 -0
  102. {devague-0.9.0 → devague-0.9.1}/sonar-project.properties +0 -0
  103. {devague-0.9.0 → devague-0.9.1}/tests/__init__.py +0 -0
  104. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_affordances.py +0 -0
  105. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_chassis.py +0 -0
  106. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_converge_export.py +0 -0
  107. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_errors.py +0 -0
  108. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_moves.py +0 -0
  109. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_output.py +0 -0
  110. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_paths.py +0 -0
  111. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_plan.py +0 -0
  112. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_question.py +0 -0
  113. {devague-0.9.0 → devague-0.9.1}/tests/test_cli_review.py +0 -0
  114. {devague-0.9.0 → devague-0.9.1}/tests/test_contract.py +0 -0
  115. {devague-0.9.0 → devague-0.9.1}/tests/test_convergence.py +0 -0
  116. {devague-0.9.0 → devague-0.9.1}/tests/test_frame.py +0 -0
  117. {devague-0.9.0 → devague-0.9.1}/tests/test_offline.py +0 -0
  118. {devague-0.9.0 → devague-0.9.1}/tests/test_package.py +0 -0
  119. {devague-0.9.0 → devague-0.9.1}/tests/test_plan.py +0 -0
  120. {devague-0.9.0 → devague-0.9.1}/tests/test_plan_convergence.py +0 -0
  121. {devague-0.9.0 → devague-0.9.1}/tests/test_plan_store.py +0 -0
  122. {devague-0.9.0 → devague-0.9.1}/tests/test_render.py +0 -0
  123. {devague-0.9.0 → devague-0.9.1}/tests/test_render_plan.py +0 -0
  124. {devague-0.9.0 → devague-0.9.1}/tests/test_review_loop_integration.py +0 -0
  125. {devague-0.9.0 → devague-0.9.1}/tests/test_review_loop_invariants.py +0 -0
  126. {devague-0.9.0 → devague-0.9.1}/tests/test_spec_to_plan_skill.py +0 -0
  127. {devague-0.9.0 → devague-0.9.1}/tests/test_store.py +0 -0
  128. {devague-0.9.0 → devague-0.9.1}/tests/test_think_skill.py +0 -0
@@ -0,0 +1 @@
1
+ devague-turns-a-converged-plan-into-parallel-simpl
@@ -0,0 +1,353 @@
1
+ {
2
+ "slug": "devague-turns-a-converged-plan-into-parallel-simpl",
3
+ "title": "Devague plans get parallel, TDD-gated, simpler-model implementation via assign-to-workforce",
4
+ "schema_version": 1,
5
+ "status": "exported",
6
+ "created": "2026-05-23T19:47:38Z",
7
+ "updated": "2026-05-23T20:21:25Z",
8
+ "claims": [
9
+ {
10
+ "id": "c1",
11
+ "kind": "announcement",
12
+ "text": "Devague turns a converged plan into parallel, simpler-model-executable work: /spec-to-plan yields plans whose tasks are independently parallelizable and scoped tightly enough for a cheap model to build, and a cited subagent-driven-development skill fans out 'devague plan waves' to one subagent per task per wave \u2014 contention-safe, acceptance-gated, and human-merged. The CLI stays deterministic and non-orchestrating (#20).",
13
+ "origin": "user",
14
+ "status": "rejected",
15
+ "honesty_conditions": [
16
+ {
17
+ "id": "h7",
18
+ "text": "End-to-end the flow runs on a real converged plan \u2014 'devague plan waves' -> one subagent per task per wave in isolated worktrees -> resident-agent acceptance review -> human spec+PR gate \u2014 without adding any orchestration or LLM call to the devague CLI.",
19
+ "status": "rejected"
20
+ },
21
+ {
22
+ "id": "h16",
23
+ "text": "End-to-end the flow runs on a real converged plan \u2014 'devague plan waves' -> human approves the implementation split plan (plan map, per-task subagent/model assignment, go/no-go to workforce) -> one subagent per task per wave in isolated worktrees -> main-agent TDD-gated merges (no human per task) -> human spec & final-PR gates \u2014 without adding any orchestration or LLM call to the devague CLI.",
24
+ "status": "rejected"
25
+ }
26
+ ],
27
+ "hard_questions": [],
28
+ "links": []
29
+ },
30
+ {
31
+ "id": "c2",
32
+ "kind": "audience",
33
+ "text": "The devague/AgentCulture operator agent that implements a converged plan, plus the human who owns the merge gate. Per-task work may be delegated to cheaper/simpler models.",
34
+ "origin": "llm",
35
+ "status": "confirmed",
36
+ "honesty_conditions": [
37
+ {
38
+ "id": "h20",
39
+ "text": "Each named audience really interacts with the flow: the operator agent drives waves and merges, the human owns the three gates (spec / split plan / PR), and cheaper models execute individual tasks \u2014 no silent fourth approver.",
40
+ "status": "confirmed"
41
+ }
42
+ ],
43
+ "hard_questions": [],
44
+ "links": []
45
+ },
46
+ {
47
+ "id": "c3",
48
+ "kind": "after_state",
49
+ "text": "A converged plan can be built by fanning out independent tasks to parallel subagents \u2014 including a simpler model per task \u2014 instead of one agent building serially.",
50
+ "origin": "llm",
51
+ "status": "confirmed",
52
+ "honesty_conditions": [
53
+ {
54
+ "id": "h21",
55
+ "text": "The parallel + cheap-model build yields the same result as a serial build would \u2014 fan-out changes speed and cost, not correctness; the merged result passes the same TDD tests.",
56
+ "status": "confirmed"
57
+ }
58
+ ],
59
+ "hard_questions": [],
60
+ "links": []
61
+ },
62
+ {
63
+ "id": "c4",
64
+ "kind": "before_state",
65
+ "text": "'devague plan waves' emits the schedule, but there is no devague convention for who fans it out, how files stay contention-safe, how a task is accepted, or how plans should be authored to be parallel- and simple-model-friendly.",
66
+ "origin": "llm",
67
+ "status": "confirmed",
68
+ "honesty_conditions": [
69
+ {
70
+ "id": "h22",
71
+ "text": "Today there genuinely is no devague convention for fan-out / contention / acceptance: 'devague plan waves' (#20) emits the schedule but stops at description, and nothing downstream consumes it yet.",
72
+ "status": "confirmed"
73
+ }
74
+ ],
75
+ "hard_questions": [],
76
+ "links": []
77
+ },
78
+ {
79
+ "id": "c5",
80
+ "kind": "why_it_matters",
81
+ "text": "Parallel + cheap-model execution makes plans much faster and cheaper to build and forces tighter task scoping \u2014 but only pays off if it stays safe and reviewable.",
82
+ "origin": "llm",
83
+ "status": "confirmed",
84
+ "honesty_conditions": [
85
+ {
86
+ "id": "h23",
87
+ "text": "The speed/cost win is real, not assumed: parallel waves plus cheap per-task models cut wall-clock and token cost versus one serial agent, while the TDD gates keep quality from dropping.",
88
+ "status": "confirmed"
89
+ }
90
+ ],
91
+ "hard_questions": [],
92
+ "links": []
93
+ },
94
+ {
95
+ "id": "c6",
96
+ "kind": "boundary",
97
+ "text": "Devague's CLI does not orchestrate: it does not spawn subagents, manage worktrees, mark tasks done, or pick a backend (#20 stands). This work is a convention + cited skill, not new CLI and not a CI/CD runner.",
98
+ "origin": "llm",
99
+ "status": "confirmed",
100
+ "honesty_conditions": [
101
+ {
102
+ "id": "h5",
103
+ "text": "This work adds no LLM calls and no orchestration to the devague CLI.",
104
+ "status": "confirmed"
105
+ }
106
+ ],
107
+ "hard_questions": [],
108
+ "links": []
109
+ },
110
+ {
111
+ "id": "c7",
112
+ "kind": "success_signal",
113
+ "text": "An operator takes a converged plan, runs 'devague plan waves', and fans out each wave to subagents with zero file collisions, each task gated on its own acceptance criteria, and nothing merged without the human.",
114
+ "origin": "llm",
115
+ "status": "rejected",
116
+ "honesty_conditions": [
117
+ {
118
+ "id": "h3",
119
+ "text": "Same-wave tasks that touch the same file are made safe by an explicit mechanism \u2014 the dependency graph alone does NOT guarantee file-disjointness.",
120
+ "status": "rejected"
121
+ },
122
+ {
123
+ "id": "h4",
124
+ "text": "The human merge gate is enforced: no subagent output merges without human review (mirrors the no-auto-confirm rule).",
125
+ "status": "rejected"
126
+ }
127
+ ],
128
+ "hard_questions": [],
129
+ "links": []
130
+ },
131
+ {
132
+ "id": "c8",
133
+ "kind": "requirement",
134
+ "text": "/spec-to-plan yields plans whose tasks are independently parallelizable AND scoped tightly enough that a simpler/cheaper model can execute each one against its acceptance criteria.",
135
+ "origin": "llm",
136
+ "status": "rejected",
137
+ "honesty_conditions": [
138
+ {
139
+ "id": "h1",
140
+ "text": "Within-wave independence is real: same-wave tasks have no inter-task dependency and can be built concurrently.",
141
+ "status": "rejected"
142
+ },
143
+ {
144
+ "id": "h2",
145
+ "text": "'Scoped for a simpler model' is operational, not a vibe: each task's acceptance criteria are crisp enough to validate a cheap model's output without re-deriving the design.",
146
+ "status": "rejected"
147
+ }
148
+ ],
149
+ "hard_questions": [],
150
+ "links": []
151
+ },
152
+ {
153
+ "id": "c9",
154
+ "kind": "decision",
155
+ "text": "Orchestration lives in a cited, devague-specific subagent-driven-development skill (citing superpowers:subagent-driven-development) plus a CLAUDE.md convention \u2014 not in the deterministic CLI.",
156
+ "origin": "llm",
157
+ "status": "rejected",
158
+ "honesty_conditions": [
159
+ {
160
+ "id": "h6",
161
+ "text": "The new skill is cited (copied), not imported, with provenance recorded in docs/skill-sources.md (cite-don't-import).",
162
+ "status": "rejected"
163
+ }
164
+ ],
165
+ "hard_questions": [],
166
+ "links": []
167
+ },
168
+ {
169
+ "id": "c10",
170
+ "kind": "decision",
171
+ "text": "File-contention safety: each subagent runs in an isolated git worktree, so same-file overlap surfaces as a merge conflict at reconcile time rather than a live race. (resolves q1)",
172
+ "origin": "llm",
173
+ "status": "confirmed",
174
+ "honesty_conditions": [],
175
+ "hard_questions": [],
176
+ "links": []
177
+ },
178
+ {
179
+ "id": "c11",
180
+ "kind": "decision",
181
+ "text": "Parallel/simple-model fitness is enforced two ways: /spec-to-plan skill guidance for small, parallel, crisply-accepted tasks, PLUS a deterministic NON-blocking plan_convergence warning (e.g. missing acceptance criteria, over-serialized waves). No hard gate, no LLM in the CLI. (resolves q2)",
182
+ "origin": "llm",
183
+ "status": "confirmed",
184
+ "honesty_conditions": [],
185
+ "hard_questions": [],
186
+ "links": []
187
+ },
188
+ {
189
+ "id": "c12",
190
+ "kind": "decision",
191
+ "text": "Two-tier acceptance gate: the resident/operating agent reviews each subagent's output against that task's acceptance criteria and records it in a review-style artifact (mirroring the #17 Human Review Loop); the human reviews the exported spec and the final PR \u2014 the human merge gate. (resolves q3)",
192
+ "origin": "llm",
193
+ "status": "rejected",
194
+ "honesty_conditions": [
195
+ {
196
+ "id": "h8",
197
+ "text": "The per-task acceptance review the resident agent writes is non-authoritative working state; only the human's PR review merges anything.",
198
+ "status": "rejected"
199
+ }
200
+ ],
201
+ "hard_questions": [],
202
+ "links": []
203
+ },
204
+ {
205
+ "id": "c13",
206
+ "kind": "decision",
207
+ "text": "The plan stays model-agnostic; per-task subagent assignment (scope + chosen model) is the resident agent's proposal, presented as a clear, editable table the human approves or edits, and the human decides whether to run subagent-driven at all. Devague does not pick a backend (#20). (resolves q4)",
208
+ "origin": "llm",
209
+ "status": "confirmed",
210
+ "honesty_conditions": [],
211
+ "hard_questions": [],
212
+ "links": []
213
+ },
214
+ {
215
+ "id": "c14",
216
+ "kind": "success_signal",
217
+ "text": "An operator takes a converged plan, runs 'devague plan waves', and fans out each wave to subagents in isolated worktrees with no live file races. The main/operating agent merges each task's worktree gated by TDD \u2014 the task's tests pass before AND after merge \u2014 plus its acceptance criteria; no human is needed per task. The human gates only the exported spec and the final PR.",
218
+ "origin": "llm",
219
+ "status": "rejected",
220
+ "honesty_conditions": [
221
+ {
222
+ "id": "h9",
223
+ "text": "Same-wave tasks touching the same file are made safe by isolated worktrees \u2014 the dependency graph alone does NOT guarantee file-disjointness; overlaps reconcile at merge.",
224
+ "status": "rejected"
225
+ },
226
+ {
227
+ "id": "h10",
228
+ "text": "Per-task merges need no human: the main agent gates each subagent's worktree merge with TDD (the task's tests pass before and after merge); the only human gates are spec approval and the final PR.",
229
+ "status": "rejected"
230
+ }
231
+ ],
232
+ "hard_questions": [],
233
+ "links": []
234
+ },
235
+ {
236
+ "id": "c15",
237
+ "kind": "decision",
238
+ "text": "Orchestration lives in a cited, devague-specific skill named 'assign-to-workforce' (citing superpowers:subagent-driven-development) plus a CLAUDE.md convention \u2014 not in the deterministic CLI. The name is deliberately broader than 'subagents' to leave room for teammate agents and generalist agents in future.",
239
+ "origin": "llm",
240
+ "status": "confirmed",
241
+ "honesty_conditions": [
242
+ {
243
+ "id": "h11",
244
+ "text": "The assign-to-workforce skill is cited (copied), not imported, with provenance recorded in docs/skill-sources.md (cite-don't-import).",
245
+ "status": "confirmed"
246
+ }
247
+ ],
248
+ "hard_questions": [],
249
+ "links": []
250
+ },
251
+ {
252
+ "id": "c16",
253
+ "kind": "decision",
254
+ "text": "Two-tier gate: per task, the main/operating agent gates the subagent's worktree merge with TDD (tests pass before and after merge) against the task's acceptance criteria \u2014 NO human per task; the human's gate is only the exported spec and the final PR. Per-task acceptance is recorded as uncommitted working state (mirroring the #17 Human Review Loop).",
255
+ "origin": "llm",
256
+ "status": "rejected",
257
+ "honesty_conditions": [
258
+ {
259
+ "id": "h12",
260
+ "text": "Per-task acceptance is the main agent's, expressed as tests (TDD) plus the task's acceptance criteria, recorded as non-authoritative working state; the authoritative human gates are the spec and the final PR.",
261
+ "status": "rejected"
262
+ }
263
+ ],
264
+ "hard_questions": [],
265
+ "links": []
266
+ },
267
+ {
268
+ "id": "c17",
269
+ "kind": "decision",
270
+ "text": "The assign-to-workforce skill and any skill changes are shared via 'devague learn' \u2014 'devague learn' carries the instructions for how to invoke subagent-driven-development / assign-to-workforce (how to fan out a converged plan's waves).",
271
+ "origin": "llm",
272
+ "status": "confirmed",
273
+ "honesty_conditions": [],
274
+ "hard_questions": [],
275
+ "links": []
276
+ },
277
+ {
278
+ "id": "c18",
279
+ "kind": "success_signal",
280
+ "text": "An operator takes a converged plan, runs 'devague plan waves', and presents the implementation split plan for the human to approve \u2014 the plan/tasks map, the per-task subagent + model assignment, and the go/no-go on assigning the plan to the workforce. Approved waves fan out to subagents in isolated worktrees with no live file races; the main agent merges each task's worktree gated by TDD (tests pass before and after merge) \u2014 no human per task. The human's remaining gates are the exported spec and the final PR.",
281
+ "origin": "llm",
282
+ "status": "confirmed",
283
+ "honesty_conditions": [
284
+ {
285
+ "id": "h13",
286
+ "text": "Same-wave tasks touching the same file are made safe by isolated worktrees \u2014 the dependency graph alone does NOT guarantee file-disjointness; overlaps reconcile at merge.",
287
+ "status": "confirmed"
288
+ },
289
+ {
290
+ "id": "h14",
291
+ "text": "Per-task merges need no human: the main agent gates each subagent's worktree merge with TDD (tests pass before and after merge). The human's three gates are the spec, the implementation split plan (plan map + assignments + go/no-go to workforce), and the final PR.",
292
+ "status": "confirmed"
293
+ }
294
+ ],
295
+ "hard_questions": [],
296
+ "links": []
297
+ },
298
+ {
299
+ "id": "c19",
300
+ "kind": "decision",
301
+ "text": "The human's gates are exactly three: (1) the exported spec, (2) the implementation split plan \u2014 the plan/tasks map, the per-task subagent + model assignment, and the go/no-go on assigning the plan to the workforce \u2014 and (3) the final PR. The human is NOT in the per-task worktree-merge loop: the main/operating agent gates each merge with TDD (tests pass before and after merge) against the task's acceptance criteria. Per-task acceptance is uncommitted working state (mirroring the #17 Human Review Loop).",
302
+ "origin": "llm",
303
+ "status": "confirmed",
304
+ "honesty_conditions": [
305
+ {
306
+ "id": "h15",
307
+ "text": "Per-task acceptance is the main agent's (TDD tests + the task's acceptance criteria), recorded as non-authoritative working state; the authoritative human gates are the spec, the implementation split plan, and the final PR.",
308
+ "status": "confirmed"
309
+ }
310
+ ],
311
+ "hard_questions": [],
312
+ "links": []
313
+ },
314
+ {
315
+ "id": "c20",
316
+ "kind": "announcement",
317
+ "text": "Devague turns a converged plan into parallel, simpler-model-executable work. /spec-to-plan yields plans whose tasks are independently parallelizable and given TDD acceptance criteria \u2014 scoped tightly enough for a cheap model to build test-first. A cited 'assign-to-workforce' skill (shared via 'devague learn') fans out 'devague plan waves' to one subagent per task per wave in isolated git worktrees; the main agent merges each task via TDD (its tests pass before AND after merge), while the human gates the spec, the implementation split plan, and the final PR. The CLI stays deterministic and non-orchestrating (#20).",
318
+ "origin": "user",
319
+ "status": "confirmed",
320
+ "honesty_conditions": [
321
+ {
322
+ "id": "h17",
323
+ "text": "End-to-end the flow runs on a real converged plan \u2014 'devague plan waves' -> human approves the implementation split plan (plan map, per-task subagent/model assignment, go/no-go to workforce) -> one subagent per task per wave in isolated worktrees -> main-agent TDD-gated merges (tests pass before and after merge; no human per task) -> human spec & final-PR gates \u2014 without adding any orchestration or LLM call to the devague CLI.",
324
+ "status": "confirmed"
325
+ }
326
+ ],
327
+ "hard_questions": [],
328
+ "links": []
329
+ },
330
+ {
331
+ "id": "c21",
332
+ "kind": "requirement",
333
+ "text": "/spec-to-plan yields plans whose tasks are independently parallelizable AND given TDD acceptance criteria \u2014 tests specified first, scoped tightly enough that a simpler/cheaper model can build each one test-first and have its output validated by those tests.",
334
+ "origin": "llm",
335
+ "status": "confirmed",
336
+ "honesty_conditions": [
337
+ {
338
+ "id": "h18",
339
+ "text": "Within-wave independence is real: same-wave tasks have no inter-task dependency and can be built concurrently.",
340
+ "status": "confirmed"
341
+ },
342
+ {
343
+ "id": "h19",
344
+ "text": "'Scoped for a simpler model' is operational via TDD, not a vibe: each task ships with tests crisp enough to validate a cheap model's output (the tests pass) without re-deriving the design.",
345
+ "status": "confirmed"
346
+ }
347
+ ],
348
+ "hard_questions": [],
349
+ "links": []
350
+ }
351
+ ],
352
+ "open_vagueness": []
353
+ }
@@ -0,0 +1,217 @@
1
+ {
2
+ "slug": "devague-turns-a-converged-plan-into-parallel-simpl",
3
+ "title": "Devague plans get parallel, TDD-gated, simpler-model implementation via assign-to-workforce",
4
+ "frame_slug": "devague-turns-a-converged-plan-into-parallel-simpl",
5
+ "schema_version": 1,
6
+ "status": "exported",
7
+ "created": "2026-05-23T20:24:19Z",
8
+ "updated": "2026-05-23T20:35:22Z",
9
+ "targets": [
10
+ {
11
+ "id": "c2",
12
+ "kind": "audience",
13
+ "text": "The devague/AgentCulture operator agent that implements a converged plan, plus the human who owns the merge gate. Per-task work may be delegated to cheaper/simpler models."
14
+ },
15
+ {
16
+ "id": "h20",
17
+ "kind": "honesty",
18
+ "text": "Each named audience really interacts with the flow: the operator agent drives waves and merges, the human owns the three gates (spec / split plan / PR), and cheaper models execute individual tasks \u2014 no silent fourth approver."
19
+ },
20
+ {
21
+ "id": "c3",
22
+ "kind": "after_state",
23
+ "text": "A converged plan can be built by fanning out independent tasks to parallel subagents \u2014 including a simpler model per task \u2014 instead of one agent building serially."
24
+ },
25
+ {
26
+ "id": "h21",
27
+ "kind": "honesty",
28
+ "text": "The parallel + cheap-model build yields the same result as a serial build would \u2014 fan-out changes speed and cost, not correctness; the merged result passes the same TDD tests."
29
+ },
30
+ {
31
+ "id": "c4",
32
+ "kind": "before_state",
33
+ "text": "'devague plan waves' emits the schedule, but there is no devague convention for who fans it out, how files stay contention-safe, how a task is accepted, or how plans should be authored to be parallel- and simple-model-friendly."
34
+ },
35
+ {
36
+ "id": "h22",
37
+ "kind": "honesty",
38
+ "text": "Today there genuinely is no devague convention for fan-out / contention / acceptance: 'devague plan waves' (#20) emits the schedule but stops at description, and nothing downstream consumes it yet."
39
+ },
40
+ {
41
+ "id": "c5",
42
+ "kind": "why_it_matters",
43
+ "text": "Parallel + cheap-model execution makes plans much faster and cheaper to build and forces tighter task scoping \u2014 but only pays off if it stays safe and reviewable."
44
+ },
45
+ {
46
+ "id": "h23",
47
+ "kind": "honesty",
48
+ "text": "The speed/cost win is real, not assumed: parallel waves plus cheap per-task models cut wall-clock and token cost versus one serial agent, while the TDD gates keep quality from dropping."
49
+ },
50
+ {
51
+ "id": "c6",
52
+ "kind": "boundary",
53
+ "text": "Devague's CLI does not orchestrate: it does not spawn subagents, manage worktrees, mark tasks done, or pick a backend (#20 stands). This work is a convention + cited skill, not new CLI and not a CI/CD runner."
54
+ },
55
+ {
56
+ "id": "h5",
57
+ "kind": "honesty",
58
+ "text": "This work adds no LLM calls and no orchestration to the devague CLI."
59
+ },
60
+ {
61
+ "id": "c18",
62
+ "kind": "success_signal",
63
+ "text": "An operator takes a converged plan, runs 'devague plan waves', and presents the implementation split plan for the human to approve \u2014 the plan/tasks map, the per-task subagent + model assignment, and the go/no-go on assigning the plan to the workforce. Approved waves fan out to subagents in isolated worktrees with no live file races; the main agent merges each task's worktree gated by TDD (tests pass before and after merge) \u2014 no human per task. The human's remaining gates are the exported spec and the final PR."
64
+ },
65
+ {
66
+ "id": "h13",
67
+ "kind": "honesty",
68
+ "text": "Same-wave tasks touching the same file are made safe by isolated worktrees \u2014 the dependency graph alone does NOT guarantee file-disjointness; overlaps reconcile at merge."
69
+ },
70
+ {
71
+ "id": "h14",
72
+ "kind": "honesty",
73
+ "text": "Per-task merges need no human: the main agent gates each subagent's worktree merge with TDD (tests pass before and after merge). The human's three gates are the spec, the implementation split plan (plan map + assignments + go/no-go to workforce), and the final PR."
74
+ },
75
+ {
76
+ "id": "c20",
77
+ "kind": "announcement",
78
+ "text": "Devague turns a converged plan into parallel, simpler-model-executable work. /spec-to-plan yields plans whose tasks are independently parallelizable and given TDD acceptance criteria \u2014 scoped tightly enough for a cheap model to build test-first. A cited 'assign-to-workforce' skill (shared via 'devague learn') fans out 'devague plan waves' to one subagent per task per wave in isolated git worktrees; the main agent merges each task via TDD (its tests pass before AND after merge), while the human gates the spec, the implementation split plan, and the final PR. The CLI stays deterministic and non-orchestrating (#20)."
79
+ },
80
+ {
81
+ "id": "h17",
82
+ "kind": "honesty",
83
+ "text": "End-to-end the flow runs on a real converged plan \u2014 'devague plan waves' -> human approves the implementation split plan (plan map, per-task subagent/model assignment, go/no-go to workforce) -> one subagent per task per wave in isolated worktrees -> main-agent TDD-gated merges (tests pass before and after merge; no human per task) -> human spec & final-PR gates \u2014 without adding any orchestration or LLM call to the devague CLI."
84
+ },
85
+ {
86
+ "id": "c21",
87
+ "kind": "requirement",
88
+ "text": "/spec-to-plan yields plans whose tasks are independently parallelizable AND given TDD acceptance criteria \u2014 tests specified first, scoped tightly enough that a simpler/cheaper model can build each one test-first and have its output validated by those tests."
89
+ },
90
+ {
91
+ "id": "h18",
92
+ "kind": "honesty",
93
+ "text": "Within-wave independence is real: same-wave tasks have no inter-task dependency and can be built concurrently."
94
+ },
95
+ {
96
+ "id": "h19",
97
+ "kind": "honesty",
98
+ "text": "'Scoped for a simpler model' is operational via TDD, not a vibe: each task ships with tests crisp enough to validate a cheap model's output (the tests pass) without re-deriving the design."
99
+ }
100
+ ],
101
+ "tasks": [
102
+ {
103
+ "id": "t1",
104
+ "summary": "Author the assign-to-workforce skill: SKILL.md + a portable helper script, plus its first-party provenance entry",
105
+ "origin": "llm",
106
+ "status": "confirmed",
107
+ "acceptance_criteria": [
108
+ "SKILL.md documents the full flow: read 'devague plan waves' -> present the implementation split plan (tasks map + per-task subagent+model proposal) -> human go/no-go -> one subagent per task per wave in isolated git worktrees -> main-agent TDD-gated merge (the task's tests pass before AND after merge) -> human gates spec + split-plan + final PR",
109
+ "scripts/assign-to-workforce.sh resolves devague portably (mirrors think.sh) and prints the split-plan from 'devague plan waves --json'; on a converged plan it exits 0 and lists the waves",
110
+ "docs/skill-sources.md records assign-to-workforce as first-party (origin=devague); the skill states the CLI is never orchestrated by devague (#20)"
111
+ ],
112
+ "deps": [],
113
+ "covers": [
114
+ "c18",
115
+ "c20",
116
+ "h13",
117
+ "h14",
118
+ "h17"
119
+ ]
120
+ },
121
+ {
122
+ "id": "t2",
123
+ "summary": "Document the assign-to-workforce convention in CLAUDE.md",
124
+ "origin": "llm",
125
+ "status": "confirmed",
126
+ "acceptance_criteria": [
127
+ "CLAUDE.md gains a 'Subagent-driven implementation (assign-to-workforce)' section stating the three human gates (spec / implementation split plan / final PR), worktree contention safety, the main-agent TDD merge gate (no human per task), and the boundary that the CLI never spawns/orchestrates/marks-done/picks-backend (#20)",
128
+ "The section names the operator-agent and human roles and notes today's gap (waves emits the schedule but nothing downstream consumes it)",
129
+ "markdownlint-cli2 passes on CLAUDE.md and doc-test-alignment finds the section consistent with the skill"
130
+ ],
131
+ "deps": [],
132
+ "covers": [
133
+ "c2",
134
+ "c4",
135
+ "c5",
136
+ "c6",
137
+ "h5",
138
+ "h20",
139
+ "h22"
140
+ ]
141
+ },
142
+ {
143
+ "id": "t3",
144
+ "summary": "Add a deterministic, non-blocking plan_convergence warning for parallel/TDD fitness",
145
+ "origin": "llm",
146
+ "status": "confirmed",
147
+ "acceptance_criteria": [
148
+ "Tests written first: 'devague plan converge --json' emits a non-blocking warnings[] entry for a confirmed task with no acceptance criteria, and for an over-serialized graph (e.g. a needless single-task wave / trivial chain)",
149
+ "Warnings never change ready_for_plan/blockers \u2014 convergence still passes; a clean plan emits zero warnings",
150
+ "A unit test asserts same-wave tasks have no inter-task dependency (within-wave independence holds)"
151
+ ],
152
+ "deps": [],
153
+ "covers": [
154
+ "c21",
155
+ "h18",
156
+ "h19"
157
+ ]
158
+ },
159
+ {
160
+ "id": "t4",
161
+ "summary": "Carry assign-to-workforce invocation instructions in 'devague learn' (implements decision c17)",
162
+ "origin": "llm",
163
+ "status": "confirmed",
164
+ "acceptance_criteria": [
165
+ "Tests written first: 'devague learn' (and --json) output contains an assign-to-workforce / subagent-driven-development section covering when to fan out, the three gates, and worktree+TDD",
166
+ "A unit test asserts the learn text includes the assign-to-workforce guidance"
167
+ ],
168
+ "deps": [],
169
+ "covers": []
170
+ },
171
+ {
172
+ "id": "t5",
173
+ "summary": "Coach /spec-to-plan to yield small, file-disjoint, TDD-accepted (parallelizable) tasks",
174
+ "origin": "llm",
175
+ "status": "confirmed",
176
+ "acceptance_criteria": [
177
+ "spec-to-plan SKILL.md gains guidance: prefer many small, file-disjoint tasks; give each TDD acceptance criteria (tests first); reference the new convergence warning; state that a parallel build must equal a serial build because the tests are the contract",
178
+ "markdownlint-cli2 passes; the skill's worked example yields a plan whose waves contain >1 task (demonstrably parallel)"
179
+ ],
180
+ "deps": [],
181
+ "covers": [
182
+ "c3",
183
+ "h21"
184
+ ]
185
+ },
186
+ {
187
+ "id": "t6",
188
+ "summary": "Dogfood: run assign-to-workforce on a real converged plan and capture the worked example",
189
+ "origin": "llm",
190
+ "status": "confirmed",
191
+ "acceptance_criteria": [
192
+ "A worked example (in the skill or docs/) runs the flow on a real converged plan's waves: split-plan -> parallel subagents in worktrees -> TDD-gated merges, recording the qualitative speed/cost difference vs a serial build, with the TDD gates holding",
193
+ "The example is reproducible from the committed plan + 'devague plan waves' output"
194
+ ],
195
+ "deps": [
196
+ "t1"
197
+ ],
198
+ "covers": [
199
+ "h23"
200
+ ]
201
+ }
202
+ ],
203
+ "risks": [
204
+ {
205
+ "id": "r1",
206
+ "text": "Quantitative speed/cost benchmarking (measured wall-clock/token savings) is out of scope for #13; the win is demonstrated qualitatively via the worked example, not measured",
207
+ "kind": "unknown_nonblocking",
208
+ "task_id": "t6"
209
+ },
210
+ {
211
+ "id": "r2",
212
+ "text": "A turnkey orchestrator that actually spawns subagents/worktrees is out of scope; assign-to-workforce is operator guidance + a waves/split-plan helper \u2014 the operating agent performs the fan-out (CLI stays non-orchestrating, #20)",
213
+ "kind": "out_of_scope",
214
+ "task_id": "t1"
215
+ }
216
+ ]
217
+ }
@@ -225,3 +225,8 @@ __marimo__/
225
225
 
226
226
  # devague: local current-frame pointer (frames under .devague/frames/ are committed)
227
227
  .devague/current
228
+
229
+ # devague working state (not committed by default)
230
+ .devague/questions/
231
+
232
+ .devague/reviews/
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/). This project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.9.1] - 2026-05-23
9
+
10
+ ### Added
11
+
12
+ - Spec + plan for subagent-driven implementation (#13). Drove `devague` /think then /spec-to-plan to produce a converged spec (`docs/specs/2026-05-23-devague-turns-a-converged-plan-into-parallel-simpl.md`) and a buildable, parallelizable plan (`docs/plans/...`) for the **assign-to-workforce** convention: a cited skill that fans out `devague plan waves` to one subagent per task per wave in isolated git worktrees, with main-agent TDD-gated per-task merges (no human per task) and exactly three human gates — the spec, the implementation split plan (tasks map + per-task subagent/model assignment + go/no-go), and the final PR. Planning artifacts only (no code yet); the CLI stays deterministic and non-orchestrating (#20).
13
+
8
14
  ## [0.9.0] - 2026-05-23
9
15
 
10
16
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devague
3
- Version: 0.9.0
3
+ Version: 0.9.1
4
4
  Summary: devague — turns a vague feature idea into a buildable spec, then a buildable plan.
5
5
  Project-URL: Homepage, https://github.com/agentculture/devague
6
6
  Project-URL: Issues, https://github.com/agentculture/devague/issues
@@ -0,0 +1,57 @@
1
+ # Build Plan — Devague plans get parallel, TDD-gated, simpler-model implementation via assign-to-workforce
2
+
3
+ slug: `devague-turns-a-converged-plan-into-parallel-simpl` · status: `exported` · from frame: `devague-turns-a-converged-plan-into-parallel-simpl`
4
+
5
+ > Devague turns a converged plan into parallel, simpler-model-executable work. /spec-to-plan yields plans whose tasks are independently parallelizable and given TDD acceptance criteria — scoped tightly enough for a cheap model to build test-first. A cited 'assign-to-workforce' skill (shared via 'devague learn') fans out 'devague plan waves' to one subagent per task per wave in isolated git worktrees; the main agent merges each task via TDD (its tests pass before AND after merge), while the human gates the spec, the implementation split plan, and the final PR. The CLI stays deterministic and non-orchestrating (#20).
6
+
7
+ ## Tasks
8
+
9
+ ### t1 — Author the assign-to-workforce skill: SKILL.md + a portable helper script, plus its first-party provenance entry
10
+
11
+ - covers: c18, c20, h13, h14, h17
12
+ - acceptance:
13
+ - SKILL.md documents the full flow: read 'devague plan waves' -> present the implementation split plan (tasks map + per-task subagent+model proposal) -> human go/no-go -> one subagent per task per wave in isolated git worktrees -> main-agent TDD-gated merge (the task's tests pass before AND after merge) -> human gates spec + split-plan + final PR
14
+ - scripts/assign-to-workforce.sh resolves devague portably (mirrors think.sh) and prints the split-plan from 'devague plan waves --json'; on a converged plan it exits 0 and lists the waves
15
+ - docs/skill-sources.md records assign-to-workforce as first-party (origin=devague); the skill states the CLI is never orchestrated by devague (#20)
16
+
17
+ ### t2 — Document the assign-to-workforce convention in CLAUDE.md
18
+
19
+ - covers: c2, c4, c5, c6, h5, h20, h22
20
+ - acceptance:
21
+ - CLAUDE.md gains a 'Subagent-driven implementation (assign-to-workforce)' section stating the three human gates (spec / implementation split plan / final PR), worktree contention safety, the main-agent TDD merge gate (no human per task), and the boundary that the CLI never spawns/orchestrates/marks-done/picks-backend (#20)
22
+ - The section names the operator-agent and human roles and notes today's gap (waves emits the schedule but nothing downstream consumes it)
23
+ - markdownlint-cli2 passes on CLAUDE.md and doc-test-alignment finds the section consistent with the skill
24
+
25
+ ### t3 — Add a deterministic, non-blocking plan_convergence warning for parallel/TDD fitness
26
+
27
+ - covers: c21, h18, h19
28
+ - acceptance:
29
+ - Tests written first: 'devague plan converge --json' emits a non-blocking warnings[] entry for a confirmed task with no acceptance criteria, and for an over-serialized graph (e.g. a needless single-task wave / trivial chain)
30
+ - Warnings never change ready_for_plan/blockers — convergence still passes; a clean plan emits zero warnings
31
+ - A unit test asserts same-wave tasks have no inter-task dependency (within-wave independence holds)
32
+
33
+ ### t4 — Carry assign-to-workforce invocation instructions in 'devague learn' (implements decision c17)
34
+
35
+ - acceptance:
36
+ - Tests written first: 'devague learn' (and --json) output contains an assign-to-workforce / subagent-driven-development section covering when to fan out, the three gates, and worktree+TDD
37
+ - A unit test asserts the learn text includes the assign-to-workforce guidance
38
+
39
+ ### t5 — Coach /spec-to-plan to yield small, file-disjoint, TDD-accepted (parallelizable) tasks
40
+
41
+ - covers: c3, h21
42
+ - acceptance:
43
+ - spec-to-plan SKILL.md gains guidance: prefer many small, file-disjoint tasks; give each TDD acceptance criteria (tests first); reference the new convergence warning; state that a parallel build must equal a serial build because the tests are the contract
44
+ - markdownlint-cli2 passes; the skill's worked example yields a plan whose waves contain >1 task (demonstrably parallel)
45
+
46
+ ### t6 — Dogfood: run assign-to-workforce on a real converged plan and capture the worked example
47
+
48
+ - depends on: t1
49
+ - covers: h23
50
+ - acceptance:
51
+ - A worked example (in the skill or docs/) runs the flow on a real converged plan's waves: split-plan -> parallel subagents in worktrees -> TDD-gated merges, recording the qualitative speed/cost difference vs a serial build, with the TDD gates holding
52
+ - The example is reproducible from the committed plan + 'devague plan waves' output
53
+
54
+ ## Risks
55
+
56
+ - [unknown_nonblocking] Quantitative speed/cost benchmarking (measured wall-clock/token savings) is out of scope for #13; the win is demonstrated qualitatively via the worked example, not measured (task t6)
57
+ - [out_of_scope] A turnkey orchestrator that actually spawns subagents/worktrees is out of scope; assign-to-workforce is operator guidance + a waves/split-plan helper — the operating agent performs the fan-out (CLI stays non-orchestrating, #20) (task t1)
@@ -0,0 +1,52 @@
1
+ # Devague plans get parallel, TDD-gated, simpler-model implementation via assign-to-workforce
2
+
3
+ > Devague turns a converged plan into parallel, simpler-model-executable work. /spec-to-plan yields plans whose tasks are independently parallelizable and given TDD acceptance criteria — scoped tightly enough for a cheap model to build test-first. A cited 'assign-to-workforce' skill (shared via 'devague learn') fans out 'devague plan waves' to one subagent per task per wave in isolated git worktrees; the main agent merges each task via TDD (its tests pass before AND after merge), while the human gates the spec, the implementation split plan, and the final PR. The CLI stays deterministic and non-orchestrating (#20).
4
+
5
+ ## Audience
6
+
7
+ - The devague/AgentCulture operator agent that implements a converged plan, plus the human who owns the merge gate. Per-task work may be delegated to cheaper/simpler models.
8
+
9
+ ## Before → After
10
+
11
+ - Before: 'devague plan waves' emits the schedule, but there is no devague convention for who fans it out, how files stay contention-safe, how a task is accepted, or how plans should be authored to be parallel- and simple-model-friendly.
12
+ - After: A converged plan can be built by fanning out independent tasks to parallel subagents — including a simpler model per task — instead of one agent building serially.
13
+
14
+ ## Why it matters
15
+
16
+ - Parallel + cheap-model execution makes plans much faster and cheaper to build and forces tighter task scoping — but only pays off if it stays safe and reviewable.
17
+
18
+ ## Requirements
19
+
20
+ - /spec-to-plan yields plans whose tasks are independently parallelizable AND given TDD acceptance criteria — tests specified first, scoped tightly enough that a simpler/cheaper model can build each one test-first and have its output validated by those tests.
21
+ - honesty: Within-wave independence is real: same-wave tasks have no inter-task dependency and can be built concurrently.
22
+ - honesty: 'Scoped for a simpler model' is operational via TDD, not a vibe: each task ships with tests crisp enough to validate a cheap model's output (the tests pass) without re-deriving the design.
23
+
24
+ ## Honesty conditions
25
+
26
+ - Each named audience really interacts with the flow: the operator agent drives waves and merges, the human owns the three gates (spec / split plan / PR), and cheaper models execute individual tasks — no silent fourth approver.
27
+ - The parallel + cheap-model build yields the same result as a serial build would — fan-out changes speed and cost, not correctness; the merged result passes the same TDD tests.
28
+ - Today there genuinely is no devague convention for fan-out / contention / acceptance: 'devague plan waves' (#20) emits the schedule but stops at description, and nothing downstream consumes it yet.
29
+ - The speed/cost win is real, not assumed: parallel waves plus cheap per-task models cut wall-clock and token cost versus one serial agent, while the TDD gates keep quality from dropping.
30
+ - This work adds no LLM calls and no orchestration to the devague CLI.
31
+ - The assign-to-workforce skill is cited (copied), not imported, with provenance recorded in docs/skill-sources.md (cite-don't-import).
32
+ - Same-wave tasks touching the same file are made safe by isolated worktrees — the dependency graph alone does NOT guarantee file-disjointness; overlaps reconcile at merge.
33
+ - Per-task merges need no human: the main agent gates each subagent's worktree merge with TDD (tests pass before and after merge). The human's three gates are the spec, the implementation split plan (plan map + assignments + go/no-go to workforce), and the final PR.
34
+ - Per-task acceptance is the main agent's (TDD tests + the task's acceptance criteria), recorded as non-authoritative working state; the authoritative human gates are the spec, the implementation split plan, and the final PR.
35
+ - End-to-end the flow runs on a real converged plan — 'devague plan waves' -> human approves the implementation split plan (plan map, per-task subagent/model assignment, go/no-go to workforce) -> one subagent per task per wave in isolated worktrees -> main-agent TDD-gated merges (tests pass before and after merge; no human per task) -> human spec & final-PR gates — without adding any orchestration or LLM call to the devague CLI.
36
+
37
+ ## Success signals
38
+
39
+ - An operator takes a converged plan, runs 'devague plan waves', and presents the implementation split plan for the human to approve — the plan/tasks map, the per-task subagent + model assignment, and the go/no-go on assigning the plan to the workforce. Approved waves fan out to subagents in isolated worktrees with no live file races; the main agent merges each task's worktree gated by TDD (tests pass before and after merge) — no human per task. The human's remaining gates are the exported spec and the final PR.
40
+
41
+ ## Scope / boundaries
42
+
43
+ - Devague's CLI does not orchestrate: it does not spawn subagents, manage worktrees, mark tasks done, or pick a backend (#20 stands). This work is a convention + cited skill, not new CLI and not a CI/CD runner.
44
+
45
+ ## Decisions
46
+
47
+ - File-contention safety: each subagent runs in an isolated git worktree, so same-file overlap surfaces as a merge conflict at reconcile time rather than a live race. (resolves q1)
48
+ - Parallel/simple-model fitness is enforced two ways: /spec-to-plan skill guidance for small, parallel, crisply-accepted tasks, PLUS a deterministic NON-blocking plan_convergence warning (e.g. missing acceptance criteria, over-serialized waves). No hard gate, no LLM in the CLI. (resolves q2)
49
+ - The plan stays model-agnostic; per-task subagent assignment (scope + chosen model) is the resident agent's proposal, presented as a clear, editable table the human approves or edits, and the human decides whether to run subagent-driven at all. Devague does not pick a backend (#20). (resolves q4)
50
+ - Orchestration lives in a cited, devague-specific skill named 'assign-to-workforce' (citing superpowers:subagent-driven-development) plus a CLAUDE.md convention — not in the deterministic CLI. The name is deliberately broader than 'subagents' to leave room for teammate agents and generalist agents in future.
51
+ - The assign-to-workforce skill and any skill changes are shared via 'devague learn' — 'devague learn' carries the instructions for how to invoke subagent-driven-development / assign-to-workforce (how to fan out a converged plan's waves).
52
+ - The human's gates are exactly three: (1) the exported spec, (2) the implementation split plan — the plan/tasks map, the per-task subagent + model assignment, and the go/no-go on assigning the plan to the workforce — and (3) the final PR. The human is NOT in the per-task worktree-merge loop: the main/operating agent gates each merge with TDD (tests pass before and after merge) against the task's acceptance criteria. Per-task acceptance is uncommitted working state (mirroring the #17 Human Review Loop).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "devague"
3
- version = "0.9.0"
3
+ version = "0.9.1"
4
4
  description = "devague — turns a vague feature idea into a buildable spec, then a buildable plan."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -183,7 +183,7 @@ wheels = [
183
183
 
184
184
  [[package]]
185
185
  name = "devague"
186
- version = "0.9.0"
186
+ version = "0.9.1"
187
187
  source = { editable = "." }
188
188
 
189
189
  [package.dev-dependencies]
@@ -1 +0,0 @@
1
- devague-0-6-0-ships-the-human-review-loop-devague
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes