devflow-kit 3.4.0 → 3.5.0

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 (186) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +8 -4
  3. package/dist/agents/code-edit.md +133 -0
  4. package/dist/agents/code-fix.md +165 -0
  5. package/dist/agents/code.md +39 -182
  6. package/dist/agents/design.md +0 -1
  7. package/dist/agents/git.md +31 -693
  8. package/dist/agents/knowledge.md +8 -2
  9. package/dist/agents/research.md +6 -0
  10. package/dist/agents/review.md +0 -4
  11. package/dist/agents/scrutinize.md +3 -0
  12. package/dist/agents/skim.md +4 -0
  13. package/dist/agents/triage.md +8 -1
  14. package/dist/cli/commands/behavior-prompts.js +77 -0
  15. package/dist/cli/commands/behavior.js +123 -0
  16. package/dist/cli/commands/flags.js +8 -2
  17. package/dist/cli/commands/init-seed.js +7 -3
  18. package/dist/cli/commands/init.js +72 -5
  19. package/dist/cli/commands/rules.js +16 -0
  20. package/dist/cli/commands/tracker.js +112 -15
  21. package/dist/cli.js +2 -0
  22. package/dist/commands/bug-analysis.md +5 -5
  23. package/dist/commands/code-review.md +14 -9
  24. package/dist/commands/debug.md +25 -4
  25. package/dist/commands/dynamic-build.md +28 -38
  26. package/dist/commands/dynamic-plan.md +11 -9
  27. package/dist/commands/dynamic-profile.md +3 -3
  28. package/dist/commands/dynamic-tickets.md +12 -10
  29. package/dist/commands/explore.md +3 -3
  30. package/dist/commands/implement.md +91 -125
  31. package/dist/commands/plan.md +15 -8
  32. package/dist/commands/release.md +3 -2
  33. package/dist/commands/research.md +16 -9
  34. package/dist/commands/resolve.md +20 -15
  35. package/dist/commands/self-review.md +2 -2
  36. package/dist/core/agent-frontmatter.js +101 -0
  37. package/dist/core/compliance-compose.js +6 -4
  38. package/dist/core/feature-switch.js +23 -2
  39. package/dist/core/flags.js +111 -0
  40. package/dist/core/manifest.js +11 -3
  41. package/dist/core/mds-variants.js +68 -26
  42. package/dist/core/plugins.js +42 -65
  43. package/dist/core/project-paths.js +0 -4
  44. package/dist/core/proxy-log.js +1 -1
  45. package/dist/core/proxy-state.js +1 -1
  46. package/dist/core/tracker.js +120 -2
  47. package/dist/learning-off/agents/code-edit.md +129 -0
  48. package/dist/learning-off/agents/code-fix.md +161 -0
  49. package/dist/learning-off/agents/code.md +37 -180
  50. package/dist/learning-off/agents/design.md +0 -1
  51. package/dist/learning-off/agents/knowledge.md +8 -2
  52. package/dist/learning-off/agents/research.md +6 -0
  53. package/dist/learning-off/agents/review.md +0 -4
  54. package/dist/learning-off/agents/scrutinize.md +3 -0
  55. package/dist/learning-off/agents/skim.md +4 -0
  56. package/dist/learning-off/agents/triage.md +8 -1
  57. package/dist/learning-off/commands/bug-analysis.md +3 -3
  58. package/dist/learning-off/commands/code-review.md +12 -7
  59. package/dist/learning-off/commands/debug.md +22 -2
  60. package/dist/learning-off/commands/dynamic-build.md +27 -37
  61. package/dist/learning-off/commands/dynamic-plan.md +10 -8
  62. package/dist/learning-off/commands/dynamic-profile.md +2 -2
  63. package/dist/learning-off/commands/dynamic-tickets.md +11 -9
  64. package/dist/learning-off/commands/explore.md +1 -1
  65. package/dist/learning-off/commands/implement.md +89 -123
  66. package/dist/learning-off/commands/plan.md +13 -6
  67. package/dist/learning-off/commands/release.md +3 -2
  68. package/dist/learning-off/commands/research.md +14 -7
  69. package/dist/learning-off/commands/resolve.md +18 -13
  70. package/dist/skills/git/references/learn-conventions.md +27 -3
  71. package/dist/skills/git/references/pr/check-ci-status.md +19 -0
  72. package/dist/skills/git/references/pr/check-merge-readiness.md +19 -0
  73. package/dist/skills/git/references/pr/fetch-review-threads.md +30 -0
  74. package/dist/skills/git/references/pr/post-resolution-summary.md +18 -0
  75. package/dist/skills/git/references/pr/post-review-summary.md +20 -0
  76. package/dist/skills/git/references/pr/resolve-review-threads.md +28 -4
  77. package/dist/skills/git/references/pr/update-pr-evidence.md +13 -0
  78. package/dist/skills/git/references/pr/validate-branch.md +26 -0
  79. package/dist/skills/git/references/tracker/github/associate-release.md +24 -0
  80. package/dist/skills/git/references/tracker/github/backlink-shipped-issues.md +31 -1
  81. package/dist/skills/git/references/tracker/github/create-release.md +30 -1
  82. package/dist/skills/git/references/tracker/github/ensure-pr-ready.md +89 -2
  83. package/dist/skills/git/references/tracker/github/ensure-traceable-issue.md +16 -1
  84. package/dist/skills/git/references/tracker/github/fetch-issue.md +36 -1
  85. package/dist/skills/git/references/tracker/github/fetch-issues-batch.md +47 -1
  86. package/dist/skills/git/references/tracker/github/gather-release-evidence.md +25 -0
  87. package/dist/skills/git/references/tracker/github/manage-debt.md +21 -1
  88. package/dist/skills/git/references/tracker/github/post-wave-report.md +15 -1
  89. package/dist/skills/git/references/tracker/github/setup-task.md +41 -1
  90. package/dist/skills/git/references/tracker/jira/associate-release.md +24 -0
  91. package/dist/skills/git/references/tracker/jira/backlink-shipped-issues.md +31 -1
  92. package/dist/skills/git/references/tracker/jira/create-release.md +30 -1
  93. package/dist/skills/git/references/tracker/jira/ensure-pr-ready.md +89 -2
  94. package/dist/skills/git/references/tracker/jira/ensure-traceable-issue.md +16 -1
  95. package/dist/skills/git/references/tracker/jira/fetch-issue.md +36 -1
  96. package/dist/skills/git/references/tracker/jira/fetch-issues-batch.md +47 -1
  97. package/dist/skills/git/references/tracker/jira/gather-release-evidence.md +25 -0
  98. package/dist/skills/git/references/tracker/jira/manage-debt.md +21 -1
  99. package/dist/skills/git/references/tracker/jira/post-wave-report.md +15 -1
  100. package/dist/skills/git/references/tracker/jira/setup-task.md +41 -1
  101. package/dist/skills/git/references/tracker/linear/associate-release.md +24 -0
  102. package/dist/skills/git/references/tracker/linear/backlink-shipped-issues.md +31 -1
  103. package/dist/skills/git/references/tracker/linear/create-release.md +30 -1
  104. package/dist/skills/git/references/tracker/linear/ensure-pr-ready.md +89 -2
  105. package/dist/skills/git/references/tracker/linear/ensure-traceable-issue.md +16 -1
  106. package/dist/skills/git/references/tracker/linear/fetch-issue.md +36 -1
  107. package/dist/skills/git/references/tracker/linear/fetch-issues-batch.md +47 -1
  108. package/dist/skills/git/references/tracker/linear/gather-release-evidence.md +25 -0
  109. package/dist/skills/git/references/tracker/linear/manage-debt.md +21 -1
  110. package/dist/skills/git/references/tracker/linear/post-wave-report.md +15 -1
  111. package/dist/skills/git/references/tracker/linear/setup-task.md +41 -1
  112. package/dist/targets/claude-code/agent-type-owner.js +164 -0
  113. package/dist/targets/claude-code/behavior-install.js +111 -0
  114. package/dist/targets/claude-code/installer.js +69 -2
  115. package/dist/targets/claude-code/learning-install.js +9 -1
  116. package/dist/targets/claude-code/tracker-install.js +33 -16
  117. package/dist/targets/claude-code/tracker-servers.js +107 -0
  118. package/package.json +4 -3
  119. package/src/assets/agents/_partials/_code.mds +109 -0
  120. package/src/assets/agents/code-edit.mds +81 -0
  121. package/src/assets/agents/code-fix.mds +113 -0
  122. package/src/assets/agents/code.mds +18 -222
  123. package/src/assets/agents/design.mds +0 -1
  124. package/src/assets/agents/evaluate.md +7 -1
  125. package/src/assets/agents/explore.md +58 -0
  126. package/src/assets/agents/git.mds +31 -693
  127. package/src/assets/agents/knowledge.mds +8 -2
  128. package/src/assets/agents/learning.md +19 -69
  129. package/src/assets/agents/research.mds +6 -0
  130. package/src/assets/agents/review.mds +0 -4
  131. package/src/assets/agents/scrutinize.mds +3 -0
  132. package/src/assets/agents/simplify.md +3 -0
  133. package/src/assets/agents/skim.mds +4 -0
  134. package/src/assets/agents/synthesize.md +26 -352
  135. package/src/assets/agents/test.md +8 -0
  136. package/src/assets/agents/tracker.md +20 -7
  137. package/src/assets/agents/triage.mds +8 -1
  138. package/src/assets/agents/validate.md +5 -0
  139. package/src/assets/commands/_partials/_compliance.mds +36 -0
  140. package/src/assets/commands/_partials/_decisions.mds +2 -2
  141. package/src/assets/commands/_partials/_engine.mds +8 -8
  142. package/src/assets/commands/_partials/_preamble.mds +3 -3
  143. package/src/assets/commands/_partials/_roster.mds +4 -3
  144. package/src/assets/commands/_partials/_wave.mds +2 -2
  145. package/src/assets/commands/bug-analysis.mds +3 -3
  146. package/src/assets/commands/code-review.mds +11 -8
  147. package/src/assets/commands/debug.mds +24 -2
  148. package/src/assets/commands/dynamic-build.mds +14 -25
  149. package/src/assets/commands/dynamic-plan.mds +4 -3
  150. package/src/assets/commands/dynamic-tickets.mds +5 -4
  151. package/src/assets/commands/explore.mds +1 -1
  152. package/src/assets/commands/implement.mds +89 -125
  153. package/src/assets/commands/plan.mds +12 -7
  154. package/src/assets/commands/release.mds +3 -2
  155. package/src/assets/commands/research.mds +14 -7
  156. package/src/assets/commands/resolve.mds +17 -14
  157. package/src/assets/mds/.mdsroot +4 -0
  158. package/src/assets/mds/git/_ops.mds +383 -0
  159. package/src/assets/mds/git/_ops_pr.mds +201 -0
  160. package/src/assets/mds/git/_ops_steps.mds +147 -0
  161. package/src/assets/mds/git/_pr.mds +39 -44
  162. package/src/assets/mds/git/_references.mds +6 -3
  163. package/src/assets/mds/tracker/_common.mds +5 -5
  164. package/src/assets/mds/tracker/_contract.mds +4 -3
  165. package/src/assets/mds/tracker/_github.mds +60 -14
  166. package/src/assets/mds/tracker/_jira.mds +60 -14
  167. package/src/assets/mds/tracker/_linear.mds +60 -14
  168. package/src/assets/mds/tracker/_steps.mds +10 -9
  169. package/src/assets/rules/behavior.md +6 -0
  170. package/src/assets/scripts/hooks/assets/orchestrator-charter.md +2 -1
  171. package/src/assets/scripts/hooks/lib/project-paths.cjs +0 -6
  172. package/src/assets/skills/agent-references/SKILL.md +33 -0
  173. package/src/assets/skills/agent-references/references/learning/maintain.md +71 -0
  174. package/src/assets/skills/agent-references/references/synthesize/bug-analysis.md +71 -0
  175. package/src/assets/skills/agent-references/references/synthesize/design.md +36 -0
  176. package/src/assets/skills/agent-references/references/synthesize/exploration.md +38 -0
  177. package/src/assets/skills/agent-references/references/synthesize/planning.md +60 -0
  178. package/src/assets/skills/agent-references/references/synthesize/research.md +61 -0
  179. package/src/assets/skills/agent-references/references/synthesize/review.md +76 -0
  180. package/src/assets/skills/compliance/SKILL.md +1 -1
  181. package/src/assets/skills/docs-framework/SKILL.md +80 -83
  182. package/src/assets/skills/docs-framework/references/patterns.md +14 -25
  183. package/src/assets/skills/docs-framework/references/violations.md +7 -7
  184. package/src/assets/skills/gap-analysis/SKILL.md +0 -16
  185. package/src/assets/skills/gap-analysis/references/compliance.md +19 -0
  186. package/dist/skills/git/references/pr/ensure-pr-ready.md +0 -24
@@ -85,7 +85,7 @@ Ask each explorer for a final report of at most about 1,500 tokens: findings wit
85
85
  **Produces:** MERGED_FINDINGS
86
86
  **Requires:** EXPLORE_OUTPUT
87
87
 
88
- Spawn `Agent(subagent_type="Synthesize")` in `exploration` mode with combined findings:
88
+ Spawn `Agent(subagent_type="Synthesize")` with the prompt line `Mode: exploration` first, then the combined findings:
89
89
 
90
90
  - Merge overlapping discoveries from parallel explorers
91
91
  - Resolve any contradictions between explorer findings
@@ -52,16 +52,16 @@ When the user explicitly asks to re-validate, re-check, or re-run quality gates
52
52
  2. **Skip Phase 2** — no Code agent needed, user already made changes.
53
53
  3. **Detect FILES_CHANGED**: `git diff --name-only {base_branch}...HEAD`
54
54
  4. **Run Phases 3-8** — Simplify, Self-Review, Alignment, the one full Validate, QA Testing and the conditional Re-Validate, on the detected changes.
55
- 5. **Proceed to Phase 10** (Create PR), **Phase 10b** (Evidence) and **Phase 11** (Report).
55
+ 5. **Proceed to Phase 9** (Open PR), **Phase 11** (Evidence) and **Phase 12** (Report).
56
56
 
57
57
  If the user prompt does NOT match re-validation, proceed with the full pipeline below.
58
58
 
59
59
  ### Phase 1: Setup
60
60
 
61
61
  <!-- learning:on -->
62
- **Produces:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION
62
+ **Produces:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, DECISIONS_CONTEXT, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, ISSUE_PR_LINK, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION
63
63
  <!-- learning:off -->
64
- **Produces:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION
64
+ **Produces:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, FEATURE_KNOWLEDGE, FEATURE_KNOWLEDGE_RULES, PR_DESCRIPTION_GUIDANCE, ISSUE_NUMBER, ISSUE_PR_LINK, EVIDENCE_POLICY, ISSUE_REQUIRED, APPLY_CONVENTIONS, REQUIRE_NON_AUTHOR_APPROVAL, PR_EXCEPTIONS, TEST_PLAN, EVIDENCE_FILE, PR_TEST_PLAN_BLOCK, REVIEW_PUBLICATION
65
65
  <!-- learning:end -->
66
66
 
67
67
  Record the current branch name as `BASE_BRANCH` - this will be the PR target.
@@ -131,6 +131,7 @@ visible, a silently discarded request is not.
131
131
  - `TASK_ID`: The branch name created by Git agent (use as TASK_ID for rest of flow)
132
132
  - `BASE_BRANCH`: Branch this feature was created from (for PR target)
133
133
  - `ISSUE_NUMBER`: the provider-canonical issue identifier for this task — the same value the Git agent emits as `ISSUE_ID` (if provided, or created by the Git agent's issue-first step in setup-task)
134
+ - `branch_slug`: `TASK_ID` with every `/` replaced by `-`. It names `handoff-{branch_slug}.md` and `evidence-{branch_slug}.md` only when it matches `^[A-Za-z0-9._-]{1,200}$`; any other branch name stops the run here, telling the user it cannot name those files.
134
135
 
135
136
  {{issue_capture_contract()}}
136
137
 
@@ -140,7 +141,7 @@ visible, a silently discarded request is not.
140
141
 
141
142
  {{evidence_exception()}}
142
143
 
143
- **Record the exception at once**, before any Code spawn: write the rendered section as the `## Evidence Exceptions` section of `{worktree}/.devflow/docs/handoff-{branch_slug}.md`, creating the file if absent, and set `PR_EXCEPTIONS` to that section. The file is its one home until the PR exists: every later write to the file keeps the section byte-identical, every PR-creating Code spawn passes it verbatim as `PR_EXCEPTIONS`, and the file is deleted only once the PR exists — after the PR-creating Phase 2 Code agent under SINGLE_CODE_AGENT and SEQUENTIAL_CODE_AGENTS, after Phase 10 under PARALLEL_CODE_AGENTS. With no exception recorded, `PR_EXCEPTIONS` is `(none)`.
144
+ **Record the exception at once**, before any Code spawn: write the rendered section as the `## Evidence Exceptions` section of `{worktree}/.devflow/docs/handoff-{branch_slug}.md`, creating the file if absent, and set `PR_EXCEPTIONS` to that section. The file is its one home until the PR exists: every later write to the file keeps the section byte-identical, the Phase 9 Git spawn passes it verbatim as `PR_EXCEPTIONS`, and the file is deleted only once the PR exists — after Phase 9, under every strategy. With no exception recorded, `PR_EXCEPTIONS` is `(none)`.
144
145
 
145
146
  **Test plan.** Before any Code spawn, give the task a test plan in the evidence file `{worktree}/.devflow/docs/evidence-{branch_slug}.md` (`EVIDENCE_FILE`) — unlike the handoff file, it stays after the PR exists. It holds up to three sections, in this order and nothing else: `## Test Plan`; `## Evidence Exceptions`, a byte copy of `PR_EXCEPTIONS` present only while that is not `(none)`; and `## Claims`, always last, so every claim is appended at the end of the file. Create the file if absent; if it exists, replace its `## Test Plan` and `## Evidence Exceptions` sections and keep `## Claims` byte-identical.
146
147
 
@@ -160,7 +161,7 @@ node "$HOME/.devflow/scripts/verify-evidence.cjs" check tp "{worktree}/.devflow/
160
161
  - **Record an exception** — the user gives the reason as free text. Render it with the exception grammar above, as kind `test-plan`; when the rendered reason is empty, ask for it once more, and stop as below if it is empty again. Add the rendered line to the `## Evidence Exceptions` section of `{worktree}/.devflow/docs/handoff-{branch_slug}.md` — after any `ticket-link` line, creating the section and the file when absent — and set `PR_EXCEPTIONS` to that section, under the same rules as the record above.
161
162
  - **Stop** — report `BLOCKED (no test plan)`, name `TASK_ID` and `BASE_BRANCH` so the branch can be reused or removed, and give the remedy: state the acceptance criteria in the task, the issue or a `/plan` document (its `## Test Plan` section is copied) and re-run `/implement`, or — for a team that does not want test plans enforced — commit `.devflow/project.json` as `{"version":1,"evidence":"standard"}` on the default branch; a machine with compliance enabled still resolves `required` whatever that file says. Spawn nothing further.
162
163
 
163
- When `EVIDENCE_POLICY` is `standard`, a missing test plan is never asked about: carry `Test plan: missing` to the Phase 11 report.
164
+ When `EVIDENCE_POLICY` is `standard`, a missing test plan is never asked about: carry `Test plan: missing` to the Phase 12 report.
164
165
 
165
166
  **Test-plan outputs**, set once before any Code spawn:
166
167
  - `TEST_PLAN` — the TP lines of the evidence file's `## Test Plan` section, or `(none)` when the test plan is missing.
@@ -175,7 +176,11 @@ node "$HOME/.devflow/scripts/verify-evidence.cjs" render --plan "{worktree}/.dev
175
176
  {{settings.settings_resolve()}}
176
177
 
177
178
  {{publication_gate()}}
178
- Phase 10b passes the resolved value to `update-pr-evidence`, which decides what each value means for the evidence comment. From the same line: {{compliance.compliance_frameworks()}} Pass it to every Code spawn.
179
+ Phase 11 passes the resolved value to `update-pr-evidence`, which decides what each value means for the evidence comment. From the same line: {{compliance.compliance_frameworks()}}
180
+
181
+ {{compliance.compliance_inject()}}
182
+
183
+ Pass `COMPLIANCE_DIRECTIVE` to every Code and Code-fix spawn, on a line of its own.
179
184
 
180
185
  {{decisions_load()}}
181
186
  <!-- learning:on -->
@@ -186,8 +191,8 @@ Pass `DECISIONS_CONTEXT` to Code agent (Phase 2) and Scrutinize agent (Phase 4).
186
191
 
187
192
  ### Phase 2: Implement
188
193
 
189
- **Produces:** CODE_AGENT_OUTPUT, FILES_CHANGED, PR_URL
190
- **Requires:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN, PR_DESCRIPTION_GUIDANCE, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK
194
+ **Produces:** CODE_AGENT_OUTPUT, FILES_CHANGED
195
+ **Requires:** TASK_ID, BASE_BRANCH, EXECUTION_PLAN
191
196
 
192
197
  Based on Setup context (plan document, issue body, or conversation context), use the three-strategy framework:
193
198
 
@@ -213,18 +218,11 @@ TASK_DESCRIPTION: {description}
213
218
  BASE_BRANCH: {base branch}
214
219
  EXECUTION_PLAN: {full plan from setup context}
215
220
  PATTERNS: {patterns from plan document or empty}
216
- CREATE_PR: true
217
- DOMAIN: {detected domain or 'fullstack'}
218
221
  FEATURE_KNOWLEDGE: {feature_knowledge}
219
222
  <!-- learning:on -->
220
223
  DECISIONS_CONTEXT: {decisions_context}
221
224
  <!-- learning:end -->
222
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}
223
- PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
224
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
225
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
226
- PR_EXCEPTIONS: {the ## Evidence Exceptions section of {worktree}/.devflow/docs/handoff-{branch_slug}.md verbatim, or (none)}
227
- PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK from Phase 1 verbatim, or (none)}"
225
+ {COMPLIANCE_DIRECTIVE}"
228
226
  ```
229
227
 
230
228
  ---
@@ -242,16 +240,11 @@ TASK_DESCRIPTION: {phase 1 description}
242
240
  BASE_BRANCH: {base branch}
243
241
  EXECUTION_PLAN: {phase 1 steps}
244
242
  PATTERNS: {patterns from plan document or empty}
245
- CREATE_PR: false
246
- DOMAIN: {phase 1 domain, e.g., 'backend'}
247
243
  FEATURE_KNOWLEDGE: {feature_knowledge}
248
244
  <!-- learning:on -->
249
245
  DECISIONS_CONTEXT: {decisions_context}
250
246
  <!-- learning:end -->
251
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}
252
- PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
253
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
254
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
247
+ {COMPLIANCE_DIRECTIVE}
255
248
  HANDOFF_REQUIRED: true
256
249
  HANDOFF_FILE: {worktree}/.devflow/docs/handoff-{branch_slug}.md"
257
250
  ```
@@ -265,25 +258,18 @@ TASK_DESCRIPTION: {phase N description}
265
258
  BASE_BRANCH: {base branch}
266
259
  EXECUTION_PLAN: {phase N steps}
267
260
  PATTERNS: {patterns from plan document or empty}
268
- CREATE_PR: {true if last phase, false otherwise}
269
- DOMAIN: {phase N domain, e.g., 'frontend'}
270
261
  PRIOR_PHASE_SUMMARY: {summary from previous Code agent}
271
262
  FILES_FROM_PRIOR_PHASE: {list of files created}
272
263
  FEATURE_KNOWLEDGE: {feature_knowledge}
273
264
  <!-- learning:on -->
274
265
  DECISIONS_CONTEXT: {decisions_context}
275
266
  <!-- learning:end -->
276
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}
277
- PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
278
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
279
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
280
- PR_EXCEPTIONS: {the ## Evidence Exceptions section of {worktree}/.devflow/docs/handoff-{branch_slug}.md verbatim, or (none)}
281
- PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK from Phase 1 verbatim, or (none)}
267
+ {COMPLIANCE_DIRECTIVE}
282
268
  HANDOFF_REQUIRED: {true if not last phase}
283
269
  HANDOFF_FILE: {worktree}/.devflow/docs/handoff-{branch_slug}.md"
284
270
  ```
285
271
 
286
- **Handoff Protocol**: Each sequential Code agent receives the prior Code agent's implementation summary via PRIOR_PHASE_SUMMARY and FILES_FROM_PRIOR_PHASE. The Code agent's built-in branch orientation step handles git log scanning, file reading, and pattern discovery automatically. Each Code agent with HANDOFF_REQUIRED=true appends its own `## Phase {N} Implementation Summary` section, at most 8,192 bytes, to `{worktree}/.devflow/docs/handoff-{branch_slug}.md` (survives context compaction), never rewriting an earlier section and keeping any `## Evidence Exceptions` section byte-identical; the next Code agent reads only the section of the phase immediately before its own through HANDOFF_FILE. The orchestrator writes no phase section. Delete `{worktree}/.devflow/docs/handoff-{branch_slug}.md` once the PR exists — after the final Code agent, which creates it, completes (cleanup).
272
+ **Handoff Protocol**: Each sequential Code agent receives the prior Code agent's implementation summary via PRIOR_PHASE_SUMMARY and FILES_FROM_PRIOR_PHASE. The Code agent's built-in branch orientation step handles git log scanning, file reading, and pattern discovery automatically. Each Code agent with HANDOFF_REQUIRED=true appends its own `## Phase {N} Implementation Summary` section, at most 8,192 bytes, to `{worktree}/.devflow/docs/handoff-{branch_slug}.md` (survives context compaction), never rewriting an earlier section and keeping any `## Evidence Exceptions` section byte-identical; the next Code agent reads only the section of the phase immediately before its own through HANDOFF_FILE. The orchestrator writes no phase section. Delete `{worktree}/.devflow/docs/handoff-{branch_slug}.md` once the PR exists — after Phase 9 (cleanup).
287
273
 
288
274
  ---
289
275
 
@@ -299,16 +285,11 @@ TASK_DESCRIPTION: {independent subtask 1}
299
285
  BASE_BRANCH: {base branch}
300
286
  EXECUTION_PLAN: {subtask 1 steps}
301
287
  PATTERNS: {patterns}
302
- CREATE_PR: false
303
- DOMAIN: {subtask 1 domain}
304
288
  FEATURE_KNOWLEDGE: {feature_knowledge}
305
289
  <!-- learning:on -->
306
290
  DECISIONS_CONTEXT: {decisions_context}
307
291
  <!-- learning:end -->
308
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}
309
- PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
310
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
311
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}"
292
+ {COMPLIANCE_DIRECTIVE}"
312
293
 
313
294
  Agent(subagent_type="Code"): # Code agent 2 (same message)
314
295
  "OPERATION: implement
@@ -317,16 +298,11 @@ TASK_DESCRIPTION: {independent subtask 2}
317
298
  BASE_BRANCH: {base branch}
318
299
  EXECUTION_PLAN: {subtask 2 steps}
319
300
  PATTERNS: {patterns}
320
- CREATE_PR: false
321
- DOMAIN: {subtask 2 domain}
322
301
  FEATURE_KNOWLEDGE: {feature_knowledge}
323
302
  <!-- learning:on -->
324
303
  DECISIONS_CONTEXT: {decisions_context}
325
304
  <!-- learning:end -->
326
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}
327
- PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
328
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
329
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}"
305
+ {COMPLIANCE_DIRECTIVE}"
330
306
  ```
331
307
 
332
308
  **Independence criteria** (all must be true for PARALLEL_CODE_AGENTS):
@@ -394,21 +370,18 @@ Validate alignment with request and plan. Report ALIGNED or MISALIGNED with deta
394
370
  1. Extract misalignment details from Evaluate agent output
395
371
  2. Increment `alignment_fix_count`
396
372
  3. If `alignment_fix_count <= 2`:
397
- - Spawn Code agent to fix misalignments:
373
+ - Spawn Code-fix agent to fix misalignments:
398
374
  ```
399
- Agent(subagent_type="Code"):
375
+ Agent(subagent_type="Code-fix"):
400
376
  "OPERATION: alignment-fix
401
377
  TASK_ID: {task-id}
402
378
  TASK_DESCRIPTION: Fix alignment issues
403
379
  MISALIGNMENTS: {structured misalignments from Evaluate agent}
404
380
  SCOPE: Fix only the listed misalignments, no other changes
405
- CREATE_PR: false
406
381
  <!-- learning:on -->
407
382
  DECISIONS_CONTEXT: {decisions_context}
408
383
  <!-- learning:end -->
409
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
410
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
411
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}"
384
+ {COMPLIANCE_DIRECTIVE}"
412
385
  ```
413
386
  - Loop back to Phase 5 (re-check alignment). The fix is not validated here: the Phase 6 run covers it.
414
387
  4. If `alignment_fix_count > 2`: Report misalignments to user for decision
@@ -431,21 +404,18 @@ Run build, typecheck, lint, test. Report pass/fail with failure details."
431
404
  1. Extract failure details from Validate agent output
432
405
  2. Increment `validation_retry_count`
433
406
  3. If `validation_retry_count <= 2`:
434
- - Spawn Code agent with fix context:
407
+ - Spawn Code-fix agent with fix context:
435
408
  ```
436
- Agent(subagent_type="Code"):
409
+ Agent(subagent_type="Code-fix"):
437
410
  "OPERATION: validation-fix
438
411
  TASK_ID: {task-id}
439
412
  TASK_DESCRIPTION: Fix validation failures
440
413
  VALIDATION_FAILURES: {parsed failures from Validate agent}
441
414
  SCOPE: Fix only the listed failures, no other changes
442
- CREATE_PR: false
443
415
  <!-- learning:on -->
444
416
  DECISIONS_CONTEXT: {decisions_context}
445
417
  <!-- learning:end -->
446
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
447
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
448
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}"
418
+ {COMPLIANCE_DIRECTIVE}"
449
419
  ```
450
420
  - Loop back to Phase 6 (re-validate at the new HEAD, full scope)
451
421
  4. If `validation_retry_count > 2`: Report failures to user and halt
@@ -461,7 +431,7 @@ Run build, typecheck, lint, test. Report pass/fail with failure details."
461
431
 
462
432
  - `gate:validate` — after a Phase 6 or Phase 8 PASS.
463
433
  - `TP-<n>` — after every Phase 7 run, one line per `### Test Plan Evidence` row whose TP is in `TEST_PLAN`, with the row's outcome; the line ends at `by:test` when the row's Exit is not a number from 0 to 255.
464
- - Append nothing from a report whose `HEAD:` is not a single 40-hex SHA — a reported before/after change included — and say so in the Phase 11 report.
434
+ - Append nothing from a report whose `HEAD:` is not a single 40-hex SHA — a reported before/after change included — and say so in the Phase 12 report.
465
435
 
466
436
  ### Phase 7: QA Testing
467
437
 
@@ -488,24 +458,21 @@ After every Test agent run — PASS or FAIL, first run or retry — append its T
488
458
  1. Extract failure details from Test agent output
489
459
  2. Increment `qa_retry_count`
490
460
  3. If `qa_retry_count <= 2`:
491
- - Spawn Code agent to fix QA failures:
461
+ - Spawn Code-fix agent to fix QA failures:
492
462
  ```
493
- Agent(subagent_type="Code"):
463
+ Agent(subagent_type="Code-fix"):
494
464
  "OPERATION: qa-fix
495
465
  TASK_ID: {task-id}
496
466
  TASK_DESCRIPTION: Fix QA test failures
497
467
  QA_FAILURES: {structured failures from Test agent}
498
468
  SCOPE: Fix only the listed failures, no other changes
499
- CREATE_PR: false
500
469
  <!-- learning:on -->
501
470
  DECISIONS_CONTEXT: {decisions_context}
502
471
  <!-- learning:end -->
503
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
504
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
505
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}"
472
+ {COMPLIANCE_DIRECTIVE}"
506
473
  ```
507
474
  - Loop back to Phase 7 (re-run Test agent). The fix is not validated here: Phase 8 covers it.
508
- 4. If `qa_retry_count > 2`: Report QA failures to user for decision. The run stops at the report (Phase 11), so Phases 8 and 9 do not run.
475
+ 4. If `qa_retry_count > 2`: Report QA failures to user for decision. The run stops at the report (Phase 12), so Phases 8 to 11 do not run.
509
476
 
510
477
  ### Phase 8: Re-Validate (only if a qa-fix committed)
511
478
 
@@ -525,12 +492,37 @@ Verify the qa-fix commits did not break anything."
525
492
 
526
493
  **If PASS:** append a `gate:validate` claim (Phase 6's **Evidence claims**), then continue to Phase 9.
527
494
 
528
- ### Phase 9: CI Status Gate
495
+ ### Phase 9: Open PR
496
+
497
+ **Produces:** PR_NUMBER
498
+ **Requires:** BASE_BRANCH, TASK_ID, ISSUE_NUMBER, ISSUE_PR_LINK, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK, PR_DESCRIPTION_GUIDANCE, APPLY_CONVENTIONS, CODE_AGENT_OUTPUT
499
+
500
+ Run once, after the gates, under every strategy. This phase sits outside the strategy branches, so no run reaches the end with commits and no PR. No Code agent opens a PR: the Git agent does, and it pastes `ISSUE_PR_LINK`, `PR_EXCEPTIONS` and `PR_TEST_PLAN_BLOCK` through their paste gates and scrubs the body (D11) before `gh pr create`. This command renders no link line and creates no PR itself: the Git agent's Phase-1 rendering is the only one, forwarded verbatim.
501
+
502
+ ```
503
+ Agent(subagent_type="Git"):
504
+ "OPERATION: ensure-pr-ready
505
+ WORKTREE_PATH: {worktree}
506
+ BASE_BRANCH: {base branch}
507
+ TASK_ID: {task-id}
508
+ ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
509
+ ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
510
+ PR_EXCEPTIONS: {the ## Evidence Exceptions section of {worktree}/.devflow/docs/handoff-{branch_slug}.md verbatim, or (none)}
511
+ PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK verbatim, or (none)}
512
+ PR_DESCRIPTION_GUIDANCE: {pr_description_guidance from Phase 1 unless it is (none), then the Code agents' reports from CODE_AGENT_OUTPUT in spawn order — Implementation, Commits and Key Decisions, and a sequential agent's ## Phase {N} Implementation Summary}
513
+ APPLY_CONVENTIONS: {APPLY_CONVENTIONS}
514
+ COMMIT_UNCOMMITTED: false
515
+ Open the pull request for this branch and return the pre-flight summary."
516
+ ```
517
+
518
+ `COMMIT_UNCOMMITTED: false` keeps the Git agent from committing a stray file: the Code, Simplify, Scrutinize and fix agents commit their own work. Capture the `- **PR**: #{number}` line of its `### Branch` as `PR_NUMBER`, its `### Uncommitted files` list and its `TRACEABILITY: DEGRADED ({reason})` lines for the Phase 12 report. If it returns `### Status: BLOCKED` or no PR number, report its reason to the user and stop at the report (Phase 12); Phases 10 and 11 do not run.
519
+
520
+ ### Phase 10: CI Status Gate
529
521
 
530
522
  **Produces:** CI_STATUS
531
- **Requires:** PR_URL, FILES_CHANGED
523
+ **Requires:** PR_NUMBER, FILES_CHANGED
532
524
 
533
- Strategy-conditional: run when the PR already exists — **SINGLE_CODE_AGENT** and **SEQUENTIAL_CODE_AGENTS** (the Phase 2 Code agent with `CREATE_PR: true` creates it); skip for **PARALLEL_CODE_AGENTS** (its unified PR is created in Phase 10).
525
+ Run under every strategy: Phase 9 opened the PR.
534
526
 
535
527
  **Push first, outside the gate block.** The gate reads CI for the pushed head, and the Simplify, Scrutinize and fix commits reach the PR only by a push. Push once — never force, and no retry:
536
528
 
@@ -538,56 +530,28 @@ Strategy-conditional: run when the PR already exists — **SINGLE_CODE_AGENT** a
538
530
  git push origin HEAD; echo "exit=$?"
539
531
  ```
540
532
 
541
- `exit=0` continues to the gate. Any other result, a rejected non-fast-forward push included, records `TRACEABILITY: DEGRADED (ci push failed)` for the Phase 11 report, reports "CI status unknown — verify manually before merging" and proceeds to Phase 10 without waiting. `PR_NUMBER` is the number in `PR_URL`.
533
+ `exit=0` continues to the gate. Any other result, a rejected non-fast-forward push included, records `TRACEABILITY: DEGRADED (ci push failed)` for the Phase 12 report, reports "CI status unknown — verify manually before merging" and proceeds to Phase 11 without waiting.
542
534
 
543
535
  <!-- PATTERN: ci-status-gate -->
544
536
  1. Wait: run `cd {worktree} && HEAD_SHA=$(git rev-parse HEAD) && node "$HOME/.devflow/scripts/ci-wait.cjs" --pr {PR_NUMBER} --head "$HEAD_SHA"` through the Bash tool with `timeout: 600000`. Each run is one wait of at most 570 seconds and prints one line, `CI <STATUS> pr=… head=… failing=… pending=… waited=…` (INDETERMINATE adds `reason=…`). A missing or unparseable line, a status outside the six below, or a non-zero exit is INDETERMINATE.
545
- 2. **If PASSING** → proceed to Phase 10.
546
- 3. **If NO_PR or NO_CI** → skip: "No PR/CI configured, skipping CI validation." Proceed to Phase 10.
537
+ 2. **If PASSING** → proceed to Phase 11.
538
+ 3. **If NO_PR or NO_CI** → skip: "No PR/CI configured, skipping CI validation." Proceed to Phase 11.
547
539
  4. **If PENDING** and fewer than 3 waits have run → wait again (step 1). After the third wait → report "CI still running — verify manually before merging" and proceed.
548
540
  5. **If INDETERMINATE** and fewer than 3 waits have run → wait again (step 1). After the third wait → report "CI status unknown — verify manually before merging" and proceed.
549
541
  <!-- learning:on -->
550
- 6. **If FAILING** and fewer than 2 fixes have run → report the failing checks from the line. Spawn `Agent(subagent_type="Code")` whose prompt opens with `OPERATION: ci-fix`, with `COMPLIANCE_FRAMEWORKS`, `CI_FAILURES`, `DECISIONS_CONTEXT` and `PUSH: false`; `CI_FAILURES` holds the failing-check names from the line and nothing else, because the Code agent fetches the full names and reads the logs itself and this command reads none. After a fix, push with the command above and, if a wait remains, wait again (step 1); a failed push records `TRACEABILITY: DEGRADED (ci push failed)`, reports "CI status unknown — verify manually before merging" and stops waiting. After the second fix still FAILING → report the failing checks and proceed.
542
+ 6. **If FAILING** and fewer than 2 fixes have run → report the failing checks from the line. Spawn `Agent(subagent_type="Code-fix")` whose prompt opens with `OPERATION: ci-fix`, with `COMPLIANCE_DIRECTIVE` (when it is not empty), `CI_FAILURES`, `DECISIONS_CONTEXT` and `PUSH: false`; `CI_FAILURES` holds the failing-check names from the line and nothing else, because the Code-fix agent fetches the full names and reads the logs itself and this command reads none. After a fix, push with the command above and, if a wait remains, wait again (step 1); a failed push records `TRACEABILITY: DEGRADED (ci push failed)`, reports "CI status unknown — verify manually before merging" and stops waiting. After the second fix still FAILING → report the failing checks and proceed.
551
543
  <!-- learning:off -->
552
- 6. **If FAILING** and fewer than 2 fixes have run → report the failing checks from the line. Spawn `Agent(subagent_type="Code")` whose prompt opens with `OPERATION: ci-fix`, with `COMPLIANCE_FRAMEWORKS`, `CI_FAILURES` and `PUSH: false`; `CI_FAILURES` holds the failing-check names from the line and nothing else, because the Code agent fetches the full names and reads the logs itself and this command reads none. After a fix, push with the command above and, if a wait remains, wait again (step 1); a failed push records `TRACEABILITY: DEGRADED (ci push failed)`, reports "CI status unknown — verify manually before merging" and stops waiting. After the second fix still FAILING → report the failing checks and proceed.
544
+ 6. **If FAILING** and fewer than 2 fixes have run → report the failing checks from the line. Spawn `Agent(subagent_type="Code-fix")` whose prompt opens with `OPERATION: ci-fix`, with `COMPLIANCE_DIRECTIVE` (when it is not empty), `CI_FAILURES` and `PUSH: false`; `CI_FAILURES` holds the failing-check names from the line and nothing else, because the Code-fix agent fetches the full names and reads the logs itself and this command reads none. After a fix, push with the command above and, if a wait remains, wait again (step 1); a failed push records `TRACEABILITY: DEGRADED (ci push failed)`, reports "CI status unknown — verify manually before merging" and stops waiting. After the second fix still FAILING → report the failing checks and proceed.
553
545
  <!-- learning:end -->
554
546
  7. **Budget**: at most 3 waits and 2 fixes in all. When one is spent, report the current status and proceed.
555
547
  <!-- /PATTERN: ci-status-gate -->
556
548
 
557
- ### Phase 10: Create PR
558
-
559
- **Produces:** PR_URL
560
- **Requires:** BASE_BRANCH, TASK_ID, PR_EXCEPTIONS, PR_TEST_PLAN_BLOCK
561
-
562
- **For SEQUENTIAL_CODE_AGENTS**: the PR already exists — the last Phase 2 Code agent (`CREATE_PR: true`) created it, and Phase 9 has gated its CI.
563
-
564
- **For PARALLEL_CODE_AGENTS**: spawn one Code agent to create the unified PR:
565
-
566
- ```
567
- Agent(subagent_type="Code"):
568
- "OPERATION: pr-create
569
- TASK_ID: {task-id}
570
- TASK_DESCRIPTION: Create the unified PR for the parallel implementation
571
- BASE_BRANCH: {base branch}
572
- CREATE_PR: true
573
- PR_DESCRIPTION_GUIDANCE: {pr_description_guidance}
574
- ISSUE_NUMBER: {ISSUE_ID captured in Phase 1, or (none)}
575
- ISSUE_PR_LINK: {ISSUE_PR_LINK captured in Phase 1, or (none)}
576
- PR_EXCEPTIONS: {the ## Evidence Exceptions section of {worktree}/.devflow/docs/handoff-{branch_slug}.md verbatim, or (none)}
577
- PR_TEST_PLAN_BLOCK: {PR_TEST_PLAN_BLOCK from Phase 1 verbatim, or (none)}
578
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS}"
579
- ```
580
-
581
- Its Responsibility 7 composes the body, pastes `ISSUE_PR_LINK`, `PR_EXCEPTIONS` and `PR_TEST_PLAN_BLOCK` through their paste gates and scrubs the body (D11) before `gh pr create`. This command renders no link line and creates no PR itself: the Git agent's Phase-1 rendering is the only one, forwarded verbatim.
582
-
583
- **For SINGLE_CODE_AGENT**: PR is created by the Code agent (CREATE_PR: true) — the Code agent's Responsibility 7 handles Related Issues inclusion when ISSUE_NUMBER is provided.
584
-
585
- ### Phase 10b: Evidence
549
+ ### Phase 11: Evidence
586
550
 
587
551
  **Produces:** EVIDENCE_RESULT
588
- **Requires:** PR_URL, EVIDENCE_FILE, REVIEW_PUBLICATION
552
+ **Requires:** PR_NUMBER, EVIDENCE_FILE, REVIEW_PUBLICATION
589
553
 
590
- Run once, after Phase 10, under every strategy: the PR exists by now under all three — from Phase 2 for SINGLE_CODE_AGENT and SEQUENTIAL_CODE_AGENTS, from Phase 10 for PARALLEL_CODE_AGENTS. Skip it only when no PR was created. PARALLEL_CODE_AGENTS ran no CI gate, so its `ci` TPs usually read `INDETERMINATE` until a later refresh.
554
+ Run once, after Phase 10, under every strategy: the PR exists by now, opened in Phase 9. The re-validation path has no CI gate and runs this phase straight after Phase 9. Skip it only when Phase 9 stopped the run. A `ci` TP reads `INDETERMINATE` only when the CI gate could not tell or did not run.
591
555
 
592
556
  **Push first.** Every claim is keyed to the HEAD an agent reported, and a Scrutinize or fix agent may have committed without pushing; a claim whose SHA is not in the PR reads `UNVERIFIED`. So push the branch once before the spawn — never force, and no retry:
593
557
 
@@ -595,29 +559,31 @@ Run once, after Phase 10, under every strategy: the PR exists by now under all t
595
559
  git push origin HEAD; echo "exit=$?"
596
560
  ```
597
561
 
598
- `exit=0` continues to the spawn. Any other result, a rejected non-fast-forward push included, does not block: record `TRACEABILITY: DEGRADED (evidence push failed)` for the Phase 11 report and spawn anyway.
562
+ `exit=0` continues to the spawn. Any other result, a rejected non-fast-forward push included, does not block: record `TRACEABILITY: DEGRADED (evidence push failed)` for the Phase 12 report and spawn anyway.
599
563
 
600
564
  ```
601
565
  Agent(subagent_type="Git"):
602
566
  "OPERATION: update-pr-evidence
603
- PR_NUMBER: {number from PR_URL}
567
+ PR_NUMBER: {PR_NUMBER}
604
568
  EVIDENCE_FILE: .devflow/docs/evidence-{branch_slug}.md
605
569
  REVIEW_PUBLICATION: {REVIEW_PUBLICATION resolved in Phase 1, or auto}
606
570
  WORKTREE_PATH: {worktree}
607
571
  Update the PR's test-plan block and post its evidence comment."
608
572
  ```
609
573
 
610
- Omit the `EVIDENCE_FILE` line when that file does not exist. Capture the op's `## PR Evidence` block — its `EVIDENCE` line and its `**Body**:` / `**Comment**:` line — as `EVIDENCE_RESULT`, or its `TRACEABILITY: DEGRADED ({reason})` line. It never blocks: whatever it returns, continue to Phase 11.
574
+ Omit the `EVIDENCE_FILE` line when that file does not exist. Capture the op's `## PR Evidence` block — its `EVIDENCE` line and its `**Body**:` / `**Comment**:` line — as `EVIDENCE_RESULT`, or its `TRACEABILITY: DEGRADED ({reason})` line. It never blocks: whatever it returns, continue to Phase 12.
611
575
 
612
- ### Phase 11: Report
576
+ ### Phase 12: Report
613
577
 
614
- **Requires:** VALIDATION_RESULT, ALIGNMENT_RESULT, QA_RESULT, PR_URL, EVIDENCE_RESULT
578
+ **Requires:** VALIDATION_RESULT, ALIGNMENT_RESULT, QA_RESULT, PR_NUMBER, EVIDENCE_RESULT
615
579
 
616
580
  Display completion summary with phase status, PR info, and next steps.
617
581
 
618
- Show the test plan's evidence from Phase 10b: `Test plan: {VERIFIED-CI + ATTESTED-LOCAL}/{total} verified (VERIFIED-CI {n}, ATTESTED-LOCAL {n})`, read from the `EVIDENCE` line and never inferred, then its `**Body**:` / `**Comment**:` line verbatim. Without an `EVIDENCE` line, show `Test plan: evidence unavailable`; with no test plan, `Test plan: missing`.
582
+ Show the test plan's evidence from Phase 11: `Test plan: {VERIFIED-CI + ATTESTED-LOCAL}/{total} verified (VERIFIED-CI {n}, ATTESTED-LOCAL {n})`, read from the `EVIDENCE` line and never inferred, then its `**Body**:` / `**Comment**:` line verbatim. Without an `EVIDENCE` line, show `Test plan: evidence unavailable`; with no test plan, `Test plan: missing`.
583
+
584
+ If any Git agent output emitted `TRACEABILITY: DEGRADED ({reason})` lines during the run, or Phase 10's push or Phase 11's push recorded one, surface them verbatim in the report under a `### Traceability` subsection so the user can act on them.
619
585
 
620
- If any Git agent output emitted `TRACEABILITY: DEGRADED ({reason})` lines during the run, or Phase 9's push or Phase 10b's push recorded one, surface them verbatim in the report under a `### Traceability` subsection so the user can act on them.
586
+ If Phase 9 listed uncommitted files, show them as a `### Uncommitted files` subsection: the user commits them or discards them.
621
587
 
622
588
  If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lines in the report.
623
589
 
@@ -629,7 +595,7 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
629
595
  /implement (orchestrator - spawns agents only)
630
596
  │
631
597
  ├─ Re-validation Path (when user says "re-validate"/"re-check"/"re-run gates")
632
- │ └─ Branch safety → skip Phase 2 → detect FILES_CHANGED → Phases 3-8 → Phase 10, 10b, 11
598
+ │ └─ Branch safety → skip Phase 2 → detect FILES_CHANGED → Phases 3-8 → Phase 9, 11, 12
633
599
  │
634
600
  ├─ Phase 1: Setup
635
601
  │ └─ Plan document parsing (if .md path provided) - extracts execution plan, strategy, frontmatter issue
@@ -638,7 +604,7 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
638
604
  │ └─ Test plan (evidence file) - copy or author TP lines, check them, render the PR block; missing under a required policy: record a test-plan exception or stop
639
605
  │
640
606
  ├─ Phase 2: Implement (3-strategy framework)
641
- │ ├─ SINGLE_CODE_AGENT (80%): One Code agent, full plan, CREATE_PR: true
607
+ │ ├─ SINGLE_CODE_AGENT (80%): One Code agent, full plan
642
608
  │ ├─ SEQUENTIAL_CODE_AGENTS (15%): N Code agents with handoff summaries
643
609
  │ └─ PARALLEL_CODE_AGENTS (5%): N Code agents in single message (rare)
644
610
  │
@@ -650,33 +616,31 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
650
616
  │
651
617
  ├─ Phase 5: Alignment Check
652
618
  │ └─ Evaluate agent (validates alignment - reports only, no fixes)
653
- │ └─ If MISALIGNED: Code agent fix loop (max 2 iterations) → re-check alignment
619
+ │ └─ If MISALIGNED: Code-fix agent loop (max 2 iterations) → re-check alignment
654
620
  │
655
621
  ├─ Phase 6: Validate (the one full-suite slot)
656
622
  │ └─ Validate agent (build, typecheck, lint, test over the branch diff)
657
- │ └─ If FAIL: Code agent fix loop (max 2 retries) → re-validate at the new HEAD
623
+ │ └─ If FAIL: Code-fix agent loop (max 2 retries) → re-validate at the new HEAD
658
624
  │ └─ If PASS: record VALIDATED_HEAD, gate:validate claim → evidence file
659
625
  │
660
626
  ├─ Phase 7: QA Testing
661
627
  │ └─ Test agent (scenario-based acceptance tests, TEST_PLAN) → one claim per TP row → evidence file
662
- │ └─ If FAIL: Code agent fix loop (max 2 retries) → re-test
628
+ │ └─ If FAIL: Code-fix agent loop (max 2 retries) → re-test
663
629
  │
664
630
  ├─ Phase 8: Re-Validate (only if a qa-fix committed)
665
631
  │ └─ Validate agent (changed-only over VALIDATED_HEAD..HEAD) → gate:validate claim
666
632
  │
667
- ├─ Phase 9: CI Status Gate (SINGLE_CODE_AGENT + SEQUENTIAL_CODE_AGENTS; skipped for PARALLEL_CODE_AGENTS)
668
- │ └─ Push the branch, then ci-wait.cjs (inline, one wait ≤ 570 s) → Code agent on FAILING (3 waits + 2 fixes)
633
+ ├─ Phase 9: Open PR (every strategy, outside the strategy branches)
634
+ │ └─ Git agent (operation: ensure-pr-ready) - commits nothing (COMMIT_UNCOMMITTED: false), pushes, opens the PR with the pasted link line, exceptions and test-plan block, D11-scrubbed body
669
635
  │
670
- ├─ Phase 10: Create PR (if needed)
671
- │ └─ SINGLE_CODE_AGENT: already created by the Phase 2 Code agent
672
- │ └─ SEQUENTIAL: already created by the last Phase 2 Code agent
673
- │ └─ PARALLEL: Code agent (pr-create) creates unified PR
636
+ ├─ Phase 10: CI Status Gate (every strategy)
637
+ │ └─ Push the branch, then ci-wait.cjs (inline, one wait ≤ 570 s) → Code-fix agent on FAILING (3 waits + 2 fixes)
674
638
  │
675
- ├─ Phase 10b: Evidence (every strategy, once the PR exists)
639
+ ├─ Phase 11: Evidence (every strategy, once the PR exists)
676
640
  │ └─ Push the branch (never force; a failure is DEGRADED, not a stop)
677
641
  │ └─ Git agent (update-pr-evidence) - test-plan block + evidence comment; never blocks
678
642
  │
679
- ├─ Phase 11: Report
643
+ ├─ Phase 12: Report
680
644
  │
681
645
  └─ Feature Knowledge Write-Back (Conditional)
682
646
  └─ Knowledge agent (if documented area changed AND knowledge enabled)
@@ -684,7 +648,7 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
684
648
 
685
649
  ## Principles
686
650
 
687
- 1. **Orchestration only** - Command spawns agents, never does work itself; the inline calls are the bounded plumbing the charter allows: the Phase 9 and Phase 10b pushes, the Phase 9 ci-wait call and the evidence script checks
651
+ 1. **Orchestration only** - Command spawns agents, never does work itself; the inline calls are the bounded plumbing the charter allows: the Phase 10 and Phase 11 pushes, the Phase 10 ci-wait call and the evidence script checks
688
652
  2. **Plan-first** - Plan documents from `/plan` skip exploration/planning overhead entirely
689
653
  3. **Coherence-first** - Single Code agent produces more consistent code (default ~80% of tasks)
690
654
  4. **Agent ownership** - Each agent owns its output completely
@@ -693,9 +657,9 @@ If Phase 1 recorded an evidence exception, show its `## Evidence Exceptions` lin
693
657
  7. **Simplification pass** - Code refined for clarity before PR
694
658
  8. **Strict delegation** - Never perform agent work in main session. "Spawn X" means call Agent tool with X, not do X's work yourself
695
659
  9. **Validate agent owns validation** - Never run `npm test`, `npm run build`, or similar in main session; always delegate to Validate agent
696
- 10. **Code agent owns fixes** - Never implement fixes in main session; spawn Code agent for validation failures and alignment fixes
660
+ 10. **Code-fix agent owns fixes** - Never implement fixes in main session; spawn Code-fix agent for validation failures and alignment fixes
697
661
  11. **Loop limits** - Max 2 validation retries, max 2 alignment fix iterations, max 2 QA retries before escalating to user; the CI gate allows at most 3 waits and 2 fixes
698
- 12. **CI awareness** - CI status is checked before merge for SINGLE_CODE_AGENT and SEQUENTIAL_CODE_AGENTS, whose PR exists from Phase 2; skipped for PARALLEL_CODE_AGENTS, whose PR is created in Phase 10; test-plan evidence (Phase 10b) is recorded under every strategy once the PR exists
662
+ 12. **CI awareness** - CI status is checked before merge under every strategy, once Phase 9 has opened the PR; test-plan evidence (Phase 11) is recorded under every strategy once the PR exists
699
663
 
700
664
  ## Error Handling
701
665
 
@@ -5,7 +5,7 @@ output-dir: dist/commands
5
5
  @import { knowledge_load } from "./_partials/_knowledge.mds"
6
6
  @import { decisions_load } from "./_partials/_decisions.mds"
7
7
  @import { docs_root } from "./_partials/_docs_root.mds"
8
- @import { compliance_gate } from "./_partials/_compliance.mds"
8
+ @import { compliance_gate, compliance_focus_inject } from "./_partials/_compliance.mds"
9
9
  @import { evidence_policy } from "./_partials/_evidence_policy.mds"
10
10
  @import { test_plan_line } from "./_partials/_plan_contract.mds"
11
11
  @import { issue_ref_grammar, issue_capture_contract } from "./_partials/_tracker.mds"
@@ -159,7 +159,7 @@ Pass `FEATURE_KNOWLEDGE` to Explore and Design agents.
159
159
  **Produces:** EXPLORE_OUTPUTS
160
160
  **Requires:** SKIM_CONTEXT
161
161
 
162
- Spawn 4 Explore agents **in a single message**, each with Skim agent context and `FEATURE_KNOWLEDGE: {feature_knowledge}` (from Phase 2). Include the instruction: "The FEATURE_KNOWLEDGE is a baseline — VALIDATE, EXTEND, and CORRECT it. For anything it already covers, cite its KB IDs (`{slug} KB-AP-n`) instead of restating the text. Focus on areas the feature knowledge doesn't cover and changes since it was last updated." Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
162
+ Spawn 4 `Agent(subagent_type="Explore")` agents **in a single message**, each with Skim agent context and `FEATURE_KNOWLEDGE: {feature_knowledge}` (from Phase 2). Include the instruction: "The FEATURE_KNOWLEDGE is a baseline — VALIDATE, EXTEND, and CORRECT it. For anything it already covers, cite its KB IDs (`{slug} KB-AP-n`) instead of restating the text. Focus on areas the feature knowledge doesn't cover and changes since it was last updated." Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
163
163
 
164
164
  | Focus | Thoroughness | Find |
165
165
  |-------|-------------|------|
@@ -223,9 +223,11 @@ Each Design agent receives:
223
223
  <!-- learning:on -->
224
224
  - `DECISIONS_CONTEXT` (index from Phase 2)
225
225
  <!-- learning:end -->
226
- - `COMPLIANCE_FRAMEWORKS` (compliance focus only)
226
+ - `COMPLIANCE_FOCUS_DIRECTIVE` (compliance focus only)
227
227
  - Multi-issue: all issue bodies
228
228
 
229
+ {{compliance_focus_inject()}}
230
+
229
231
  ```
230
232
  Agent(subagent_type="Design"):
231
233
  "Mode: gap-analysis
@@ -234,7 +236,8 @@ Focus: {completeness|architecture|security|performance|compliance|consistency|de
234
236
  DECISIONS_CONTEXT: {decisions_context}
235
237
  <!-- learning:end -->
236
238
  FEATURE_KNOWLEDGE: {feature_knowledge}
237
- COMPLIANCE_FRAMEWORKS: {COMPLIANCE_FRAMEWORKS} (compliance focus only)
239
+ {COMPLIANCE_FOCUS_DIRECTIVE} (compliance focus only)
240
+ Resolve `${CLAUDE_CONFIG_DIR:-$HOME/.claude}` in Bash, then Read `<that directory>/skills/devflow:gap-analysis/references/compliance.md` with the Read tool and apply it as your focus patterns. (compliance focus only)
238
241
  Artifacts:
239
242
  Feature/Issues: {feature description or issue bodies}
240
243
  Exploration synthesis: {Phase 4 output}
@@ -300,7 +303,7 @@ User can:
300
303
  **Produces:** IMPL_EXPLORE_OUTPUTS
301
304
  **Requires:** SKIM_CONTEXT, ACCEPTED_SCOPE
302
305
 
303
- Spawn 4 Explore agents **in a single message**, each with Skim agent context + accepted scope. Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
306
+ Spawn 4 `Agent(subagent_type="Explore")` agents **in a single message**, each with Skim agent context + accepted scope. Ask each agent for a final report of at most about 1,500 tokens: findings with file:line references, not file dumps.
304
307
 
305
308
  | Focus | Thoroughness | Find |
306
309
  |-------|-------------|------|
@@ -419,8 +422,10 @@ User can:
419
422
 
420
423
  **Store design artifact:**
421
424
 
422
- **Pre-compute the artifact path** from the slug (it never changes after this):
423
- - If one issue: `{worktree}/.devflow/docs/design/{ISSUE_ID}-{topic-slug}.{YYYY-MM-DD_HHMM}.md` (the `docs-framework` skill's design-document pattern, e.g. `42-jwt-auth.2026-04-07_1430.md`)
425
+ **Load `devflow:docs-framework`** — Load via Skill tool: `devflow:docs-framework`, here and not earlier, so a run that stops before this phase never pays for it. If it fails to load, continue with the paths below.
426
+
427
+ **Pre-compute the artifact path** (it never changes after this) by the skill's rules: `{topic-slug}` is its topic slug of the feature title, the same value as the artifact's `slug:` frontmatter, and `{YYYY-MM-DD_HHMM}` is the local time, computed once:
428
+ - If one issue: `{worktree}/.devflow/docs/design/{ISSUE_ID}-{topic-slug}.{YYYY-MM-DD_HHMM}.md` (e.g. `42-jwt-auth.2026-04-07_1430.md`)
424
429
  - If multi-issue: `{worktree}/.devflow/docs/design/multi-{topic-slug}.{YYYY-MM-DD_HHMM}.md`, frontmatter `issue: pending` — a batch fetch returns no issue ID to name it by
425
430
  - If no issue: `{worktree}/.devflow/docs/design/{topic-slug}.{YYYY-MM-DD_HHMM}.md`
426
431
 
@@ -45,8 +45,6 @@ Parse from `COMMAND_INPUT`:
45
45
 
46
46
  **Produces:** RELEASE_CONFIG, CONFIG_STATE (`learned` | `fresh`)
47
47
 
48
- **Load Companion Skills** — Load via Skill tool: `devflow:git`. If a skill fails to load, continue without it.
49
-
50
48
  **Continuation detection**: Check `.release/.progress.json`. If exists, an interrupted release is in progress. Offer user:
51
49
  - **Resume**: continue from last checkpoint (skip phases already completed)
52
50
  - **Restart**: clean start (delete `.release/.progress.json` and begin from Phase 1)
@@ -190,6 +188,9 @@ Confirm with user via AskUserQuestion before executing:
190
188
  Sequential execution with progress checkpoints:
191
189
  1. **Version bumps** — write new version to configured files
192
190
  2. **Changelog update** — move Unreleased section to versioned entry (if configured)
191
+
192
+ **Load Companion Skills** (D-RELEASE-GIT-LOAD-LATE) — Load via Skill tool: `devflow:git`, here and not earlier: steps 1–2 only write files and `--dry-run` halts after Phase 4, so neither carries the skill. A resume that skips step 3 loads it before its next main-thread git write. If a skill fails to load, continue without it.
193
+
193
194
  3. **Release commit** — `chore(release): v{VERSION}` (conventional commit)
194
195
  4. **Tag and GitHub Release** — spawn `Agent(subagent_type="Git")` with `create-release` operation (the agent reads `.devflow/conventions.md` for tag format and release title conventions; compliance defaults when absent); only when `EVIDENCE_POLICY` is `required`, also pass `COMMIT_LIST` and `SHIPPED_ISSUES` from RELEASE_EVIDENCE, and `TRACEABILITY_EXCEPTIONS` when composed (Record, or the no-ask exempt rule), as inputs so the agent includes them in the release notes body.
195
196
  4b. **Back-link shipped issues** (only when `EVIDENCE_POLICY` is `required`) — spawn `Agent(subagent_type="Git")` with `backlink-shipped-issues` operation, passing `VERSION` and `SHIPPED_ISSUES`; posts a marker-deduped comment on each issue (bounds and throttle enforced by the operation); degrade gracefully (D4) on any API failure — never block the release
@@ -65,6 +65,10 @@ Use `FEATURE_KNOWLEDGE` **locally** for research framing. Pass to each Research
65
65
 
66
66
  **Produces:** RESEARCH_PLAN
67
67
 
68
+ **Load `devflow:docs-framework`** — Load via Skill tool: `devflow:docs-framework`, here and not earlier, so a run that stops before this phase never pays for it. If it fails to load, continue with the rules below.
69
+
70
+ Name the research directory by the skill's rules, once: `{topic-slug}` is its topic slug of the research question and `{YYYY-MM-DD_HHMM}` is the local time. When `{worktree}/.devflow/docs/research/{topic-slug}/{YYYY-MM-DD_HHMM}` already exists (a same-minute collision), the timestamp takes seconds instead, `YYYY-MM-DD_HHMMSS`. Every path of this run uses that one directory.
71
+
68
72
  Analyze the research question to infer research types needed (min 2, max 5). For each type:
69
73
  - `RESEARCH_TYPE`: `codebase | external | market | competitor | technology`
70
74
  - `RESEARCH_QUESTION`: Focused sub-question for this type
@@ -72,8 +76,6 @@ Analyze the research question to infer research types needed (min 2, max 5). For
72
76
 
73
77
  **Tool availability check**: If WebSearch/WebFetch are unavailable, restrict to `codebase` type only.
74
78
 
75
- Generate topic slug from the research question (kebab-case, lowercase, no articles).
76
-
77
79
  ### Phase 3: Orient (Conditional)
78
80
 
79
81
  **Produces:** ORIENT_OUTPUT
@@ -111,12 +113,17 @@ Each Research agent writes findings to disk at OUTPUT_PATH.
111
113
  **Produces:** RESEARCH_SUMMARY
112
114
  **Requires:** RESEARCH_OUTPUTS
113
115
 
114
- Spawn `Agent(subagent_type="Synthesize")` in `research` mode:
115
- - Reads Research agent outputs from RESEARCH_OUTPUTS paths
116
- - Merges findings with trust-aware aggregation
117
- - Writes `research-summary.md` to the same timestamped directory
116
+ Spawn `Agent(subagent_type="Synthesize")` in `research` mode. It reads the Research agent outputs from the `RESEARCH_OUTPUTS` paths, merges them with trust-aware aggregation, and writes `research-summary.md` into `RESEARCH_BASE_DIR` — the one directory of this run, which only this spawn names:
118
117
 
119
- Output path: `{worktree}/.devflow/docs/research/{topic-slug}/{timestamp}/research-summary.md`
118
+ ```
119
+ Agent(subagent_type="Synthesize", run_in_background=false):
120
+ "Mode: research
121
+ WORKTREE_PATH: {WORKTREE_PATH} (omit if none was provided)
122
+ RESEARCH_OUTPUTS: {the OUTPUT_PATH of every Research agent that wrote its file}
123
+ RESEARCH_BASE_DIR: {worktree}/.devflow/docs/research/{topic-slug}/{YYYY-MM-DD_HHMM}
124
+ Merge findings with trust-aware aggregation.
125
+ Output: {worktree}/.devflow/docs/research/{topic-slug}/{YYYY-MM-DD_HHMM}/research-summary.md"
126
+ ```
120
127
 
121
128
  ### Phase 6: Present
122
129