@danmoisan/drm-copilot-mcp 1.1.22 → 1.1.24

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 (261) hide show
  1. package/out/mcp-server.js +18758 -12030
  2. package/package.json +1 -1
  3. package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +1 -1
  4. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_test_files_count_against_500_cap.md +4 -4
  5. package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +1 -1
  6. package/resources/claude-customizations/.claude/agents/discovery-capability-sentinel.md +34 -0
  7. package/resources/claude-customizations/.claude/agents/feature-review.md +8 -0
  8. package/resources/claude-customizations/.claude/agents/legacy-parity-analyst.md +101 -43
  9. package/resources/claude-customizations/.claude/agents/migration-coverage-reviewer.md +107 -43
  10. package/resources/claude-customizations/.claude/agents/orchestrator.md +1 -1
  11. package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +60 -6
  12. package/resources/claude-customizations/.claude/agents/parallel-planner.md +21 -1
  13. package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +1 -1
  14. package/resources/claude-customizations/.claude/agents/pr-author.md +48 -7
  15. package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +1 -1
  16. package/resources/claude-customizations/.claude/agents/requirements-reconciler.md +117 -42
  17. package/resources/claude-customizations/.claude/agents/runtime-characterization-analyst.md +103 -43
  18. package/resources/claude-customizations/.claude/hooks/discovery-capability-probe.ps1 +102 -0
  19. package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +69 -194
  20. package/resources/claude-customizations/.claude/hooks/enforce-discovery-planning-gate.ps1 +87 -0
  21. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-green-ci.ps1 +325 -0
  22. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +29 -7
  23. package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate-resolution.ps1 +23 -10
  24. package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate.ps1 +29 -21
  25. package/resources/claude-customizations/.claude/hooks/enforce-file-size-limit.ps1 +244 -0
  26. package/resources/claude-customizations/.claude/hooks/enforce-model-routing-receipt.ps1 +51 -0
  27. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +168 -48
  28. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate.ps1 +1 -1
  29. package/resources/claude-customizations/.claude/hooks/enforce-parallel-worktree-removal-gate.ps1 +22 -11
  30. package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +59 -20
  31. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-command-allowlist.ps1 +51 -4
  32. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill-helpers.ps1 +72 -11
  33. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.current-branch.ps1 +149 -0
  34. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.epic-base-branch.ps1 +4 -2
  35. package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +59 -20
  36. package/resources/claude-customizations/.claude/hooks/record-discovery-agent-start.ps1 +132 -0
  37. package/resources/claude-customizations/.claude/hooks/validate-discovery-artifact-gate.ps1 +56 -212
  38. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-feature-folder.ps1 +146 -0
  39. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-rejection.ps1 +172 -0
  40. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +34 -4
  41. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadius.psm1 +9 -3
  42. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusAggregate.psm1 +154 -0
  43. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusCombination.psm1 +228 -0
  44. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusExtraction.psm1 +1 -0
  45. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusNormalization.psm1 +4 -2
  46. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusScheduling.psm1 +63 -16
  47. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusTokenShape.psm1 +56 -1
  48. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusWriteIntent.psm1 +4 -1
  49. package/resources/claude-customizations/.claude/lib/cleanup-manifest/CleanupWorktreeManifest.psm1 +33 -6
  50. package/resources/claude-customizations/.claude/lib/codex-routing/CodexDeployment.psm1 +5 -1
  51. package/resources/claude-customizations/.claude/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
  52. package/resources/claude-customizations/.claude/lib/codex-routing/CodexTopology.psm1 +25 -2
  53. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
  54. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
  55. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
  56. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
  57. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
  58. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
  59. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
  60. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
  61. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
  62. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
  63. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
  64. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
  65. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
  66. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
  67. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryValidation.psm1 +188 -341
  68. package/resources/claude-customizations/.claude/lib/file-size-policy/FileSizePolicy.psm1 +434 -0
  69. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateFeatureFolderRecord.psm1 +166 -0
  70. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateIssueAdoption.psm1 +8 -3
  71. package/resources/claude-customizations/.claude/lib/worktree-resolution/HookTargetWorktree.psm1 +391 -0
  72. package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunRecordPath.psm1 +185 -0
  73. package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunResolution.psm1 +11 -21
  74. package/resources/claude-customizations/.claude/rules/general-code-change.md +4 -1
  75. package/resources/claude-customizations/.claude/rules/orchestrator-state.md +29 -5
  76. package/resources/claude-customizations/.claude/rules/parallel-orchestration.md +152 -20
  77. package/resources/claude-customizations/.claude/rules/powershell.md +1 -1
  78. package/resources/claude-customizations/.claude/rules/shell.md +1 -1
  79. package/resources/claude-customizations/.claude/settings.json +36 -3
  80. package/resources/claude-customizations/.claude/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
  81. package/resources/claude-customizations/.claude/skills/characterize-runtime-behavior/SKILL.md +134 -0
  82. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/SKILL.md +2 -2
  83. package/resources/claude-customizations/.claude/skills/discovery-behavior-reconciliation/SKILL.md +28 -47
  84. package/resources/claude-customizations/.claude/skills/discovery-coverage-ledger/SKILL.md +32 -48
  85. package/resources/claude-customizations/.claude/skills/discovery-parity-matrix/SKILL.md +28 -45
  86. package/resources/claude-customizations/.claude/skills/discovery-repo-inventory/SKILL.md +28 -62
  87. package/resources/claude-customizations/.claude/skills/discovery-runtime-characterization/SKILL.md +28 -45
  88. package/resources/claude-customizations/.claude/skills/discovery-validate-artifacts/SKILL.md +28 -61
  89. package/resources/claude-customizations/.claude/skills/discovery-workflow/SKILL.md +55 -139
  90. package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +25 -10
  91. package/resources/claude-customizations/.claude/skills/extract-feature-contract/SKILL.md +133 -0
  92. package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +1 -0
  93. package/resources/claude-customizations/.claude/skills/generate-acceptance-scenarios/SKILL.md +132 -0
  94. package/resources/claude-customizations/.claude/skills/initialize-discovery-workspace/SKILL.md +131 -0
  95. package/resources/claude-customizations/.claude/skills/inventory-legacy-system/SKILL.md +131 -0
  96. package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +15 -7
  97. package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +25 -2
  98. package/resources/claude-customizations/.claude/skills/parallel-close/SKILL.md +11 -1
  99. package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +124 -14
  100. package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +72 -7
  101. package/resources/claude-customizations/.claude/skills/parallel-remove/SKILL.md +15 -0
  102. package/resources/claude-customizations/.claude/skills/parallel-run/SKILL.md +6 -0
  103. package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +56 -9
  104. package/resources/claude-customizations/.claude/skills/reconcile-parity-matrix/SKILL.md +131 -0
  105. package/resources/claude-customizations/.claude/skills/review-discovery-coverage/SKILL.md +129 -0
  106. package/resources/claude-customizations/.claude/skills/validate-discovery-artifacts/SKILL.md +127 -0
  107. package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +1 -1
  108. package/resources/claude-customizations/config/blast-radius.json +6 -5
  109. package/resources/claude-customizations/config/orchestration-routing.json +61 -1
  110. package/resources/claude-customizations/pack-manifests/core.json +40 -1
  111. package/resources/codex-and-agents-customizations/.agents/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
  112. package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +7 -0
  113. package/resources/codex-and-agents-customizations/.agents/skills/characterize-runtime-behavior/SKILL.md +134 -0
  114. package/resources/codex-and-agents-customizations/.agents/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
  115. package/resources/codex-and-agents-customizations/.agents/skills/discovery-coverage-ledger/SKILL.md +50 -0
  116. package/resources/codex-and-agents-customizations/.agents/skills/discovery-parity-matrix/SKILL.md +46 -0
  117. package/resources/codex-and-agents-customizations/.agents/skills/discovery-repo-inventory/SKILL.md +46 -0
  118. package/resources/codex-and-agents-customizations/.agents/skills/discovery-runtime-characterization/SKILL.md +46 -0
  119. package/resources/codex-and-agents-customizations/.agents/skills/discovery-validate-artifacts/SKILL.md +46 -0
  120. package/resources/codex-and-agents-customizations/.agents/skills/discovery-workflow/SKILL.md +62 -0
  121. package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +25 -10
  122. package/resources/codex-and-agents-customizations/.agents/skills/extract-feature-contract/SKILL.md +133 -0
  123. package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +1 -1
  124. package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +8 -0
  125. package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +4 -1
  126. package/resources/codex-and-agents-customizations/.agents/skills/generate-acceptance-scenarios/SKILL.md +132 -0
  127. package/resources/codex-and-agents-customizations/.agents/skills/initialize-discovery-workspace/SKILL.md +131 -0
  128. package/resources/codex-and-agents-customizations/.agents/skills/inventory-legacy-system/SKILL.md +131 -0
  129. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +8 -0
  130. package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +1 -1
  131. package/resources/codex-and-agents-customizations/.agents/skills/reconcile-parity-matrix/SKILL.md +131 -0
  132. package/resources/codex-and-agents-customizations/.agents/skills/review-discovery-coverage/SKILL.md +129 -0
  133. package/resources/codex-and-agents-customizations/.agents/skills/validate-discovery-artifacts/SKILL.md +127 -0
  134. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +1 -1
  135. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +1 -1
  136. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +1 -1
  137. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +1 -1
  138. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +1 -1
  139. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +1 -1
  140. package/resources/codex-and-agents-customizations/.codex/agents/discovery-capability-sentinel.toml +51 -0
  141. package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +8 -0
  142. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c1.toml +148 -0
  143. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c2.toml +148 -0
  144. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3-elevated.toml +148 -0
  145. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3.toml +148 -0
  146. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c4.toml +148 -0
  147. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst.toml +148 -0
  148. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c1.toml +154 -0
  149. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c2.toml +154 -0
  150. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3-elevated.toml +154 -0
  151. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3.toml +154 -0
  152. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c4.toml +154 -0
  153. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer.toml +154 -0
  154. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +1 -1
  155. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +1 -1
  156. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +1 -1
  157. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +1 -1
  158. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +1 -1
  159. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +1 -1
  160. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +1 -1
  161. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +1 -1
  162. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +1 -1
  163. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +1 -1
  164. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +1 -1
  165. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +1 -1
  166. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c1.toml +164 -0
  167. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c2.toml +164 -0
  168. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3-elevated.toml +164 -0
  169. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3.toml +164 -0
  170. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c4.toml +164 -0
  171. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler.toml +164 -0
  172. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c1.toml +150 -0
  173. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c2.toml +150 -0
  174. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3-elevated.toml +150 -0
  175. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3.toml +150 -0
  176. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c4.toml +150 -0
  177. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst.toml +150 -0
  178. package/resources/codex-and-agents-customizations/.codex/config.toml +39 -3
  179. package/resources/codex-and-agents-customizations/.codex/hooks/codex-agent-profile-attestation.ps1 +22 -0
  180. package/resources/codex-and-agents-customizations/.codex/hooks/discovery-capability-probe.ps1 +97 -0
  181. package/resources/codex-and-agents-customizations/.codex/hooks/discovery-start-attestation.ps1 +171 -0
  182. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-codex-model-routing.ps1 +4 -1
  183. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-artifact-gate.ps1 +187 -0
  184. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-planning-gate.ps1 +149 -0
  185. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-file-size-limit.ps1 +282 -0
  186. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +239 -2
  187. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate.ps1 +6 -15
  188. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +54 -15
  189. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +54 -15
  190. package/resources/codex-and-agents-customizations/.codex/hooks/file-size-policy.ps1 +421 -0
  191. package/resources/codex-and-agents-customizations/.codex/hooks/hook-target-worktree.ps1 +369 -0
  192. package/resources/codex-and-agents-customizations/.codex/hooks/record-subagent-routing-attestation.ps1 +8 -0
  193. package/resources/codex-and-agents-customizations/.codex/hooks/validate-codex-subagent-routing.ps1 +22 -1
  194. package/resources/codex-and-agents-customizations/.codex/hooks/validate-discovery-agent-output.ps1 +178 -0
  195. package/resources/codex-and-agents-customizations/.codex/scripts/Resolve-CodexTopology.ps1 +11 -1
  196. package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +1 -1
  197. package/resources/codex-and-agents-customizations/AGENTS.md +4 -1
  198. package/resources/codex-and-agents-customizations/pack-manifests/core.json +65 -1
  199. package/resources/config/orchestration-routing.json +61 -1
  200. package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
  201. package/resources/customizations/.github/agents/discovery-capability-sentinel.agent.md +34 -0
  202. package/resources/customizations/.github/agents/legacy-parity-analyst.agent.md +122 -0
  203. package/resources/customizations/.github/agents/migration-coverage-reviewer.agent.md +128 -0
  204. package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +1 -1
  205. package/resources/customizations/.github/agents/python-typed-engineer.agent.md +1 -1
  206. package/resources/customizations/.github/agents/requirements-reconciler.agent.md +138 -0
  207. package/resources/customizations/.github/agents/runtime-characterization-analyst.agent.md +124 -0
  208. package/resources/customizations/.github/hooks/discovery-agent-start.ps1 +139 -0
  209. package/resources/customizations/.github/hooks/discovery-agent-stop.ps1 +123 -0
  210. package/resources/customizations/.github/hooks/discovery-capability-probe.ps1 +98 -0
  211. package/resources/customizations/.github/hooks/discovery-planning.ps1 +91 -0
  212. package/resources/customizations/.github/hooks/discovery-pre-tool.ps1 +123 -0
  213. package/resources/customizations/.github/hooks/discovery.json +35 -0
  214. package/resources/customizations/.github/instructions/general-code-change.instructions.md +5 -2
  215. package/resources/customizations/.github/instructions/mermaid.instructions.md +85 -0
  216. package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +1 -1
  217. package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +105 -0
  218. package/resources/customizations/.github/prompts/remediate-comments.prompt.md +1 -1
  219. package/resources/customizations/.github/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
  220. package/resources/customizations/.github/skills/characterize-runtime-behavior/SKILL.md +134 -0
  221. package/resources/customizations/.github/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
  222. package/resources/customizations/.github/skills/discovery-coverage-ledger/SKILL.md +50 -0
  223. package/resources/customizations/.github/skills/discovery-parity-matrix/SKILL.md +46 -0
  224. package/resources/customizations/.github/skills/discovery-repo-inventory/SKILL.md +46 -0
  225. package/resources/customizations/.github/skills/discovery-runtime-characterization/SKILL.md +46 -0
  226. package/resources/customizations/.github/skills/discovery-validate-artifacts/SKILL.md +46 -0
  227. package/resources/customizations/.github/skills/discovery-workflow/SKILL.md +62 -0
  228. package/resources/customizations/.github/skills/execution-environment/SKILL.md +25 -10
  229. package/resources/customizations/.github/skills/extract-feature-contract/SKILL.md +133 -0
  230. package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +8 -0
  231. package/resources/customizations/.github/skills/generate-acceptance-scenarios/SKILL.md +132 -0
  232. package/resources/customizations/.github/skills/initialize-discovery-workspace/SKILL.md +131 -0
  233. package/resources/customizations/.github/skills/inventory-legacy-system/SKILL.md +131 -0
  234. package/resources/customizations/.github/skills/reconcile-parity-matrix/SKILL.md +131 -0
  235. package/resources/customizations/.github/skills/review-discovery-coverage/SKILL.md +129 -0
  236. package/resources/customizations/.github/skills/validate-discovery-artifacts/SKILL.md +127 -0
  237. package/resources/lib/codex-routing/CodexDeployment.psm1 +5 -1
  238. package/resources/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
  239. package/resources/lib/codex-routing/CodexTopology.psm1 +25 -2
  240. package/resources/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
  241. package/resources/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
  242. package/resources/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
  243. package/resources/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
  244. package/resources/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
  245. package/resources/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
  246. package/resources/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
  247. package/resources/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
  248. package/resources/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
  249. package/resources/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
  250. package/resources/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
  251. package/resources/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
  252. package/resources/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
  253. package/resources/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
  254. package/resources/powershell/PoshQC/PoshQC.Parallel.psm1 +452 -0
  255. package/resources/powershell/PoshQC/PoshQC.Shard.psm1 +106 -8
  256. package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +12 -0
  257. package/resources/powershell/PoshQC/PoshQC.psd1 +6 -1
  258. package/resources/powershell/PoshQC/PoshQC.psm1 +7 -1
  259. package/resources/powershell/PoshQC/README.md +20 -1
  260. package/resources/templates/policy_audit/code-review.yyyy-MM-ddTHH-mm.md +4 -4
  261. package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +4 -4
@@ -26,6 +26,7 @@ Before proceeding, the orchestrator must:
26
26
  2. Read applicable `.claude/rules/` files for the languages in scope.
27
27
  3. Read the policy files listed in the compliance reading order section of `CLAUDE.md`.
28
28
  4. Read the `execution-environment` skill (`.claude/skills/execution-environment/SKILL.md`) before delegating any worker. Delegation prompts and plans reference that brief instead of restating tool routes, command-text restrictions, the batch budget, hook context, or CI shape.
29
+ 5. In a workspace with an active discovery activation, expect the native planning gate (`.claude/hooks/enforce-discovery-planning-gate.ps1`) on every `atomic-planner` or orchestrator delegation: it admits the launch only when the session holds a current `planning`-mode validation receipt satisfying the profile's `completion_gates.planning_prerequisite`. A `DISCOVERY_PLANNING_GATE_BLOCKED:` denial means the discovery criteria are not current; run `validate-all --mode planning` through the installed gateway and re-delegate rather than bypassing. Discovery criteria gate planning and never substitute for the plan's own tests (`docs/engineering/legacy-discovery-and-parity/enforcement.md`).
29
30
 
30
31
  ## Checkpoint Handling
31
32
 
@@ -192,12 +193,12 @@ PR creation and PR body edits are delegated work, not orchestrator work. The orc
192
193
 
193
194
  The mandatory sequence is:
194
195
 
195
- 1. The orchestrator first refreshes the PR-context artifact via `mcp__drm-copilot__collect_pr_context` (or the equivalent context-collection mechanism), which writes `artifacts/pr_context.summary.txt`.
196
+ 1. The orchestrator first refreshes the PR-context artifact via `mcp__drm-copilot__collect_pr_context` (or the equivalent context-collection mechanism), which writes `artifacts/pr_context.summary.txt`. It calls the tool with `workspace_root` set to the item worktree and `target_ref` set to the head branch, so the summary is written beneath the item worktree even when the orchestrator runs in a coordinator session.
196
197
  2. The orchestrator runs the orchestrator-state validator (`mcp__drm-copilot__validate_orchestration_artifacts` or the equivalent repository-local validator CLI documented in `.claude/rules/orchestrator-state.md`) against `artifacts/orchestration/orchestrator-state.json --require-pr-creation-ready` and records the pass/fail result under a new `pr_author_preflight` field in the checkpoint, alongside `pr_author_receipt`: `{status ("pass"|"fail"), checked_at (ISO-8601 UTC), checkpoint_path, validator_command, output_summary}`. The orchestrator must not delegate to `Agent(pr-author)` when this preflight fails. The validator's full-lifecycle completion flag (`ci_gate`/`pr_gate`/routing-contract receipts) remains reserved for the post-PR/CI completion context (Step S9 / PR Creation Gate condition 6), not this pre-PR-creation preflight, because those values cannot exist before the first `gh pr create` of a branch.
197
- 3. The orchestrator then delegates PR creation and any PR body edits to `Agent(pr-author)`. The `pr-author` agent runs the `pr-author` skill to author the body, writes the body file `artifacts/pr_body_<N>.md` and the sibling receipt `artifacts/pr_body_<N>.receipt.json` with the shape `{skill, pr_body_path, number, sha256 (lowercase hex of the body bytes), context_summary_path, created_at (ISO-8601 UTC, strictly newer than `artifacts/pr_context.summary.txt` last-write)}`, issues `gh pr create --body-file artifacts/pr_body_<N>.md` (or `gh pr edit --body-file ...`), and reports the resulting PR URL or PR number.
198
+ 3. The orchestrator then delegates PR creation and any PR body edits to `Agent(pr-author)`. The `pr-author` agent runs the `pr-author` skill to author the body, writes the body file `artifacts/pr_body_<N>.md` and the sibling receipt `artifacts/pr_body_<N>.receipt.json` with the shape `{skill, pr_body_path, number, sha256 (lowercase hex of the body bytes), context_summary_path, created_at (ISO-8601 UTC, strictly newer than `artifacts/pr_context.summary.txt` last-write)}`, issues `gh pr create --body-file artifacts/pr_body_<N>.md` (or `gh pr edit --body-file ...`), and reports the resulting PR URL or PR number. The delegation prompt MUST carry, on its own line, `Author-asserted autoclose issues: #<issue-num>`, where `<issue-num>` is the checkpoint `issue-num`, so the PR body emits `- Closes #<issue-num>` and the issue closes on merge. When the parallel kickoff that started this run carries a `Combined issues:` line (a combined parallel item, issue #1013), the same author-asserted line also lists every issue named on that `Combined issues:` line, after `#<issue-num>`, so the one PR closes every member issue. The line is omitted only when the checkpoint records no `issue-num`, or when `epic_mode` is true (an epic child whose integration PR owns the closing keyword). In every other case the `enforce-model-routing-receipt.ps1` Agent PreToolUse hook denies the `Agent(pr-author)` delegation with `MODEL_ROUTING_RECEIPT_BLOCKED: AUTHOR_ASSERTED_AUTOCLOSE_MISSING`.
198
199
  4. The orchestrator records `pr_author_receipt` in the checkpoint, citing the body-file path and the receipt path that were verified.
199
200
 
200
- When the pr-author agent runs outside the item worktree (its process directory is not the worktree that holds the item's `artifacts/` tree), it passes the absolute canonical path `<item worktree>/artifacts/pr_body_<N>.md` to `--body-file`. The `enforce-pr-author-skill.ps1` hook resolves the item worktree from `--head` and reads the PR context summary, the body, and the receipt beneath it; in that topology it denies a relative `--body-file` with `PR_BODY_PATH_NONCANONICAL`, because `gh` would read the relative path from its own process directory.
201
+ When the pr-author agent runs outside the item worktree (its process directory is not the worktree that holds the item's `artifacts/` tree), it passes the absolute canonical path `<item worktree>/artifacts/pr_body_<N>.md` to `--body-file`. The `enforce-pr-author-skill.ps1` hook resolves the item worktree from `--head` and reads the PR context summary, the body, and the receipt beneath it; in that topology it denies a relative `--body-file` with `PR_BODY_PATH_NONCANONICAL`, because `gh` would read the relative path from its own process directory. In this coordinator-session topology the delegation prompt carries the line `branch: <branch>` naming the head branch, and pr-author derives the item worktree root itself from `git worktree list --porcelain` (the prompt carries no absolute path), following the `## Coordinator-Session Topology (issue #1011)` section of the pr-author agent and skill. The delegation runs without worktree isolation, because an isolated agent worktree refuses command text that names another worktree.
201
202
 
202
203
  `Agent(pr-author)` is the mandatory delegate for PR creation and PR body edits. Direct `gh pr create`/`gh pr edit --body*` from the main thread is prohibited and is blocked by the hook. Before the five receipt checks, the `enforce-pr-author-skill.ps1` PreToolUse hook independently re-validates the orchestrator-state checkpoint against `--require-pr-creation-ready` (via an injectable `$Invoker` subprocess seam) and blocks with `ORCHESTRATOR_STATE_PREFLIGHT_FAILED` when the checkpoint is missing or invalid — this is the local, hook-level enforcement mechanism that closes the bypass path (it runs inside the same hook that already intercepts `gh pr create`/`gh pr edit`, not as a CI check). The PreToolUse hook then verifies the receipt in five ordered checks: canonical body-file path, receipt present, `number` match, `sha256` match against the body bytes, and `created_at` strictly newer than the context summary last-write.
203
204
 
@@ -293,7 +294,7 @@ Each such prompt also carries a `branch: <name>` label naming the branch checked
293
294
 
294
295
  The same two lines are required on every delegation to an implementation agent (`python-typed-engineer`, `powershell-typed-engineer`, `typescript-engineer`, `csharp-typed-engineer`, and `atomic-executor`) and on every `Agent(orchestrator)` delegation that carries no epic-mode, parallel-mode, or preparation-mode kickoff marker. `enforce-orchestration-preimplementation-gate.ps1` resolves such a delegation's worktree from these lines and denies it with `TARGET_WORKTREE_NOT_DERIVABLE` when neither line is present, or with `TARGET_WORKTREE_AMBIGUOUS` when the lines disagree or match more than one live worktree.
295
296
 
296
- If a subagent artifact references a different issue number, the orchestrator rejects it, requests correction, and records the discrepancy under `artifact_errors` in the checkpoint.
297
+ If a subagent artifact references a different issue number, the orchestrator rejects it, requests correction, and records the discrepancy under `artifact_errors` in the checkpoint. Issue numbers named on a `Combined issues:` line of a parallel kickoff (issue #1013) are permitted cross-references to the combined item's member issues, not discrepancies.
297
298
 
298
299
  ## Step S9 — CI Green Gate
299
300
 
@@ -312,6 +313,7 @@ S9 procedure:
312
313
  4. Poll with a bounded interval and a documented total timeout while `conclusion == "pending"`. When the timeout is exhausted, record the timeout as a finding with `Remediability: awaiting_ci` in `remediation-inputs.<timestamp>.md` and follow the wait branch in Post-Review Outcome Evaluation (`blocked_reason: "awaiting_ci"`, `next_step: "S9_ci_green"`); `step9_status` stays `pending`. A poll timeout does not enter the remediation loop.
313
314
  5. Write the `ci_gate` object and `last_verified_ci_sha` to the checkpoint, and set `step9_status` to `passed` only when `ci_gate.conclusion == "success"` AND `ci_gate.head_sha` equals the current PR head SHA.
314
315
  6. If the checkpoint's `epic_mode` is `true`, execute `gh pr merge --merge <PR>` merging the feature branch into `epic_context.integration_branch` (already the PR's base branch per the epic-mode `--base` override applied at S8). On success, record `epic_merge: { merge_commit_sha, target_branch, merged_at }` in the checkpoint. On failure due to merge conflict (non-mergeable PR), do not retry blindly: convert the conflict into a synthetic Blocking finding per "Merge-Conflict Remediation" below and re-enter the standard R1–R5 remediation loop; do not proceed to DONE. Merge confirmation (issue #952): a zero exit from `gh pr merge` does not prove a merge when the base branch uses a merge queue, so `epic_merge.merge_commit_sha` is recorded only after the merge is confirmed by polling and ancestry check. Read the pull-request state every 30 seconds, for at most 90 minutes, with the `gh api graphql` query and `.claude/lib/ci-gate/Invoke-MergeConfirmationParser.ps1` exactly as step 3 of `## Per-Item Merge to Main (Merge-on-Green)` in `.claude/skills/parallel-orchestrate/SKILL.md` defines them; on `merged`, run `git fetch origin <integration_branch>` and confirm that `git merge-base --is-ancestor <merge-commit-oid> origin/<integration_branch>` exits 0 before recording `epic_merge`. When the 90 minutes are exhausted, record a finding naming `awaiting_merge_queue` with `Remediability: awaiting_ci` in `remediation-inputs.<timestamp>.md` and follow the wait branch (`blocked_reason: "awaiting_ci"`, `next_step: "S9_ci_green"`). A `not_queued` outcome whose `mergeable` value is `CONFLICTING` follows "Merge-Conflict Remediation"; any other `not_queued` outcome enters `## Remediation Loop — CI-Failure Handling`; a `closed` outcome halts the run with a failure. `gh pr merge` is never re-issued in a loop after `not_queued`.
316
+ 7. Standalone merge-on-green (issue #997). This step applies only when the checkpoint's `epic_mode` is absent or `false`, no `Parallel mode: true` marker was supplied in the kickoff, the route requires S9 (the `preparation` route never merges), and the PR base branch is `main`. After step 5 records `step9_status: "passed"` and after every CI-dependent acceptance criterion is checked off and S9 has re-run against the final head, execute `gh pr merge --merge <PR> --match-head-commit <ci_gate.head_sha>`. The merge gate (`.claude/hooks/enforce-epic-merge-gate.ps1`) allows this command through its green-CI branch only when the checkpoint records `pr_gate.pr_number` equal to `<PR>` and the live PR head equals `ci_gate.head_sha`. A zero exit does not prove a merge: confirm it with the step 3 procedure of `## Per-Item Merge to Main (Merge-on-Green)` in `.claude/skills/parallel-orchestrate/SKILL.md` (the `gh api graphql` query and `.claude/lib/ci-gate/Invoke-MergeConfirmationParser.ps1` every 30 seconds for at most 90 minutes; on `merged`, `git fetch origin main` and `git merge-base --is-ancestor <merge-commit-oid> origin/main` exiting 0). Record `pr_merge: { merge_commit_sha, target_branch, merged_at }` in the checkpoint only after that confirmation. Exhausted polling, `not_queued`, and `closed` outcomes are handled as in step 6, and `gh pr merge` is never re-issued in a loop after `not_queued`. A parallel item never merges itself: the parallel parent performs every item merge, and the child records `parallel_mode: true` so the gate declines. The merge gate's parallel exclusion is best-effort, because the `Parallel mode: true` marker is not visible to a Bash hook, so this step relies on the kickoff marker as well as on the gate.
315
317
 
316
318
  CI-dependent acceptance criteria: when the item has acceptance criteria whose verification requires the result of CI on the PR head, the item's own orchestrator run owns their check-off, and a parent or coordinating session never commits them from its own root. After step 5 records `ci_gate.conclusion == "success"`, check off each CI-dependent criterion in the item's own worktree, commit, push to the PR branch, and re-run S9 from step 1 against the new head SHA, so that `ci_gate.head_sha` equals the final PR head before DONE. In epic mode this completes before step 6 merges. A failed re-run enters `## Remediation Loop — CI-Failure Handling` below; the shared `remediation_loop.completed_attempts` count and its halt after three completed attempts are unchanged.
317
319
 
@@ -333,6 +335,12 @@ The orchestrator checkpoint (`artifacts/orchestration/orchestrator-state.json`)
333
335
  - `merge_commit_sha` — the merge commit SHA produced by merging the feature branch into `epic_context.integration_branch`.
334
336
  - `target_branch` — the integration branch the feature branch was merged into.
335
337
  - `merged_at` — ISO-8601 timestamp of when S9 step 6 recorded the merge.
338
+ - a top-level `pr_merge` object (populated only by a standalone S9 step 7 merge, issue #997) containing:
339
+ - `merge_commit_sha` — the merge commit SHA confirmed on `main`.
340
+ - `target_branch` — the base branch the pull request merged into (`main`).
341
+ - `merged_at` — ISO-8601 timestamp of when S9 step 7 recorded the confirmed merge.
342
+
343
+ Like `epic_merge`, `pr_merge` is not read by any validator; it is an unvalidated record.
336
344
 
337
345
  Illustrative shape:
338
346
 
@@ -376,9 +384,9 @@ The orchestrator must not create a PR, push a branch for PR purposes, or report
376
384
  4. The checkpoint `next_step` is `S8_create_pr` (precondition to entering S9).
377
385
  5. PR body produced via the pr-author handoff: `artifacts/pr_body_<N>.md` exists with a matching `artifacts/pr_body_<N>.receipt.json`, created with `--body-file`.
378
386
  6. `ci_gate.conclusion == "success"` AND `ci_gate.head_sha == current head SHA of the PR branch`. DONE is not written while either sub-condition is false.
379
- 7. `epic_mode` is `false`, OR (`epic_mode` is `true` AND the integration-branch merge (`gh pr merge --merge`) has completed and `epic_merge.merge_commit_sha` is recorded in the checkpoint). `epic_merge.merge_commit_sha` is recorded only after the merge is confirmed by polling and ancestry check (S9 step 6).
387
+ 7. `epic_mode` is `false`, OR (`epic_mode` is `true` AND the integration-branch merge (`gh pr merge --merge`) has completed and `epic_merge.merge_commit_sha` is recorded in the checkpoint). `epic_merge.merge_commit_sha` is recorded only after the merge is confirmed by polling and ancestry check (S9 step 6). In a standalone run whose route requires S9 (issue #997), DONE additionally requires `pr_merge.merge_commit_sha`, recorded only after the S9 step 7 merge is confirmed; the `preparation` route never merges.
380
388
 
381
- This gate is non-negotiable. Each condition is independently verified before PR creation proceeds. Conditions 1-4 are unchanged from the prior contract; conditions 5-7 (receipt handoff, CI-green gate, and epic-mode merge-on-green gate) are additive.
389
+ This gate is non-negotiable. Each condition is independently verified before PR creation proceeds. Conditions 1-4 are unchanged from the prior contract; conditions 5-7 (receipt handoff, CI-green gate, and epic-mode merge-on-green gate, with the standalone merge of S9 step 7 for a standalone run) are additive.
382
390
 
383
391
  ## Step 6 Delegation — Prohibited Prompt Language
384
392
 
@@ -459,6 +467,6 @@ Example:
459
467
 
460
468
  The validator counts an MCP receipt as successful only when `tool` is a non-empty string, `ok` is exactly `true`, and `evidence` is a non-empty string. Every `required_mcp_tools` entry must have such a receipt unless a valid `issue_adoption` record waives it.
461
469
 
462
- When the GitHub issue already exists before orchestration starts (transferred, filed by hand, or created by epic decomposition) and has been verified read-only (`gh issue view`, a `gh api` GET, or a GitHub MCP issue read), do not call `potential_to_issue`. Record a top-level `issue_adoption` object in the checkpoint instead of a `potential_to_issue` receipt. It may waive only `potential_to_issue` and the checkpoint's promotion-entry tool (`new_potential_entry`, or `new_potential_bug_entry` for a bug-type checkpoint); `potential_to_issue` must always be listed. For a promotion-entry waiver, `potential_record` (a markdown path under `docs/features/potential/`) is required when `origin` is `epic_decomposition`, optional when `origin` is `transferred` or `filed_before_orchestration`, and validated whenever it is present. Every other required tool still needs a successful receipt. Any adoption error waives nothing. The field rules, the closed waivable set, and the error placement are defined in `.claude/rules/orchestrator-state.md` under `## Invariants (issue_adoption object)`.
470
+ When the GitHub issue already exists before orchestration starts (transferred, filed by hand, or created by epic decomposition) and has been verified read-only (`gh issue view`, a `gh api` GET, or a GitHub MCP issue read), do not call `potential_to_issue`. Record a top-level `issue_adoption` object in the checkpoint instead of a `potential_to_issue` receipt. It may waive only `potential_to_issue`, the checkpoint's promotion-entry tool (`new_potential_entry`, or `new_potential_bug_entry` for a bug-type checkpoint), and `new_active_feature_folder` with a valid `feature_folder_record` when the feature folder was already created and committed before this run (for example by a preparation child or an earlier session); `potential_to_issue` must always be listed. For a promotion-entry waiver, `potential_record` (a markdown path under `docs/features/potential/`) is required when `origin` is `epic_decomposition`, optional when `origin` is `transferred` or `filed_before_orchestration`, and validated whenever it is present. Every other required tool still needs a successful receipt. Any adoption error waives nothing. The field rules, the closed waivable set, and the error placement are defined in `.claude/rules/orchestrator-state.md` under `## Invariants (issue_adoption object)`.
463
471
 
464
472
  These three receipt arrays, populated with the retained required names of the selected route, are what allow the routing-contract validation under `require_complete: true` to pass.
@@ -29,6 +29,17 @@ this operation may and may not disturb. Read that section before applying anythi
29
29
  - `$ARGUMENTS` names exactly one item: a GitHub issue number or reference, or a path to an entry
30
30
  under `docs/features/potential/`. An argument naming more than one item is rejected; admit one
31
31
  item per invocation so each admission decision and its mutation entry stay attributable.
32
+ - The run-existence check is evaluated first, before any argument-shape check: a pending or
33
+ not-started run, and a run whose `parallel_slug` no checkpoint tracks, are rejected before the
34
+ argument is examined.
35
+ - On either run-existence rejection, change no state and emit the rejection signal defined in
36
+ `## Mutation Rejection Signal (issue #1012)` of `.claude/rules/parallel-orchestration.md`: when
37
+ the run's slug is known, put the line `parallel_slug: <slug>` before the signal, and end the
38
+ final output with the literal line `PARALLEL_MUTATION_REJECTED: run_not_started` as its last
39
+ line, with no formatting and no trailing text.
40
+ - A closed run and an argument naming more than one item are rejected only after the run-existence
41
+ check, while the run's checkpoint exists; each of these rejections emits no rejection signal, and
42
+ the stop validates against that checkpoint.
32
43
 
33
44
  ## Re-Derive Durable State Before Applying Anything
34
45
 
@@ -70,7 +81,10 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
70
81
  the issue was transferred), waiving potential_to_issue and the promotion-entry tool for the
71
82
  checkpoint's promotion-type. When a lifecycle record for the item exists under
72
83
  docs/features/potential/promoted/, cite it as potential_record.` The line is omitted for a
73
- potential-entry item, whose child promotes it.
84
+ potential-entry item, whose child promotes it. The preparation child creates and commits the
85
+ item's feature folder, so the item's later execution child records `feature_folder_record` for
86
+ that committed folder instead of calling `new_active_feature_folder` again, per
87
+ `/parallel-orchestrate` kickoff element 4.
74
88
 
75
89
  3. **Compute conflict edges over ALL items, including in-flight ones.** Invoke the scheduling
76
90
  entry point Get-BlastRadiusConflictEdge from the destination-runtime PowerShell port
@@ -103,7 +117,14 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
103
117
  unstarted subset only: an in-flight conflict is precisely what the admission decision turns on.
104
118
  A tolerated overlap is not an edge: the two items run in the same or adjacent cohorts without a
105
119
  barrier, and the later-merging item merges `origin/main` under the existing per-item
106
- merge-conflict handling and re-passes CI before it merges.
120
+ merge-conflict handling and re-passes CI before it merges. The entry point applies the aggregate
121
+ cost cap (issue #1013) inside the same call, so the edges this step records are capped edges.
122
+ After the edges are computed, call Get-BlastRadiusCombination from the same facade over the
123
+ candidate plus the unstarted items, with the same `-Config` and `-Relation`, and report each
124
+ qualifying pair that involves the candidate with the text
125
+ `qualifies for combination; not combined (combination applies at planning time only)`. This
126
+ step never combines items: it adds no checkpoint field and makes no `mutations[]` change for a
127
+ qualifying pair.
107
128
 
108
129
  4. **Decide admission.** Call the bundled entry point, which needs no Python interpreter:
109
130
 
@@ -209,6 +230,8 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
209
230
  - This operation never moves, restates, or re-derives an in-flight item's cohort or state.
210
231
  - This operation performs no destructive side effect: it closes no pull request and removes no
211
232
  worktree. Those belong to `/parallel-remove` with `--disposition abandon`.
233
+ - The step 5 stop and a failed preparation each emits no rejection signal: the run's checkpoint
234
+ already exists and state is already written, so the stop validates against that checkpoint.
212
235
 
213
236
  ## Completion Requirements
214
237
 
@@ -25,6 +25,14 @@ an `open`-mode run never auto-completes. Read that section before applying anyth
25
25
  - The run's `mode` is `open`. A `closed`-mode run completes through its completion predicate — every
26
26
  non-withdrawn item `merged` or `worktree_removed` — and needs no close. Report that and stop
27
27
  rather than closing a `closed`-mode run to force completion.
28
+ - The run-existence check is evaluated first. When no checkpoint tracks the `parallel_slug` named
29
+ in `$ARGUMENTS`, stop without changing state and emit the rejection signal defined in
30
+ `## Mutation Rejection Signal (issue #1012)` of `.claude/rules/parallel-orchestration.md`: put
31
+ the line `parallel_slug: <slug>` before the signal, and end the final output with the literal
32
+ line `PARALLEL_MUTATION_REJECTED: run_not_started` as its last line, with no formatting and no
33
+ trailing text.
34
+ - The `closed`-mode stop follows the run-existence check while the run's checkpoint exists, so it
35
+ emits no rejection signal and validates against that checkpoint.
28
36
 
29
37
  ## Re-Derive Durable State Before Applying Anything
30
38
 
@@ -56,7 +64,9 @@ which is exactly what the gate exists to prevent. The re-derivation is mandatory
56
64
  stderr line naming EVERY in-flight key, so the rejection names all the work that must finish
57
65
  first rather than one item at a time. On rejection: report the blocking keys and stop. A
58
66
  rejected close appends NO `mutations[]` entry and makes NO state change — do not record the
59
- attempt.
67
+ attempt. On that rejection, put the line `parallel_slug: <slug>` before the signal and end the
68
+ final output with the literal line `PARALLEL_MUTATION_REJECTED: items_in_flight` as its last
69
+ line, with no formatting and no trailing text, per `## Mutation Rejection Signal (issue #1012)`.
60
70
 
61
71
  3. **Append exactly one run-scoped `mutations[]` entry** for a successful close, built by the
62
72
  bundled entry point:
@@ -248,10 +248,19 @@ carries exactly these five elements.
248
248
  The token `Parallel mode: true` must appear exactly: it is the marker F7's Layer 1 barrier hook
249
249
  matches on. The clause `PR base branch MUST be main` is the child's explicit base-branch
250
250
  instruction, recorded as prompt text rather than left to a base-branch ancestry heuristic.
251
+ The prompt also instructs the child to record top-level `parallel_mode: true` and
252
+ `parallel_slug: <slug>` in its first per-feature checkpoint write (issue #997). Both keys are
253
+ unvalidated; the merge gate's green-CI branch declines a checkpoint that carries either, so a
254
+ parallel child that records them cannot merge its own pull request through that branch; the exclusion is best-effort when the keys are omitted.
251
255
  2. The item's active feature folder path, written literally as `docs/features/active/<basename>`.
252
256
  The child needs it for its own operation, and F7's Layer 1 hook resolves the target item by
253
257
  scanning the prompt for exactly that path shape, so the path is emitted as a bare path token.
254
258
  3. The canonical issue number line, which is the item key.
259
+ For a combined item (issue #1013), element 3 is followed by the line `Combined issues: #A #B`,
260
+ naming every other member issue of the combination recorded in the item's
261
+ `combined_issue_nums`, and the prompt instructs the child to carry every member on its pr-author
262
+ line, `Author-asserted autoclose issues: #A #B`, so the one pull request closes every member
263
+ issue. The added line is part of element 3, not a further element.
255
264
  4. The item's committed `plan-path`, together with the resume instruction: resume at atomic
256
265
  execution from that plan rather than re-running promotion, research, or planning. The item's
257
266
  prepared feature folder and approved atomic plan are already committed and preflight-clear on the
@@ -263,7 +272,12 @@ carries exactly these five elements.
263
272
  with origin `filed_before_orchestration` unless the issue was transferred, waiving
264
273
  `potential_to_issue` and the promotion-entry tool for the checkpoint's promotion-type. When a
265
274
  lifecycle record for the item exists under `docs/features/potential/promoted/`, the child cites
266
- it as `potential_record`.
275
+ it as `potential_record`. The preparation child already created and committed the item's feature
276
+ folder, so the prompt also instructs the execution child not to call
277
+ `new_active_feature_folder`, to confirm the folder read-only
278
+ (`git cat-file -t HEAD:<feature-folder>` prints `tree`), to add `new_active_feature_folder` to
279
+ `waived_tools`, and to record `issue_adoption.feature_folder_record` with `path` equal to the
280
+ checkpoint `feature-folder`, `verified_via` `git_cat_file_head`, `verified_at`, and `evidence`.
267
281
  5. The model-budget marker line `model_budget.fable_policy: <disabled|available|preferred>.`
268
282
 
269
283
  Spawn parameters, passed on the `Agent` call and never written into the prompt text:
@@ -358,9 +372,11 @@ delegations, not to fork-routed skill invocations.
358
372
  ## Per-Item Merge to Main (Merge-on-Green)
359
373
 
360
374
  The parent — `parallel-orchestrator` — performs each item's merge to `main`. The child contract is
361
- unchanged: `.claude/skills/orchestrate/SKILL.md` is **not modified by this feature**. There is no
362
- `parallel_mode` clause in its step 9, no `parallel_merge` object in the child checkpoint, and no
363
- additional condition on the child's PR Creation Gate.
375
+ unchanged: `.claude/skills/orchestrate/SKILL.md` is **not modified by this feature**.
376
+ Issue #997 amends `.claude/skills/orchestrate/SKILL.md` for standalone runs only: a standalone run with a green S9 gate merges its own pull request, and a parallel child never merges its own pull request.
377
+ Its step 9 mentions `parallel_mode` only to exclude a parallel child from that standalone merge.
378
+ There is no `parallel_merge` object in the child checkpoint and no parallel-specific condition on
379
+ the child's PR Creation Gate.
364
380
 
365
381
  Issue #744 later amended two parts of that child contract for CI-dependent acceptance criteria,
366
382
  whose verification requires the result of CI on the item's pull-request head: PR Creation Gate
@@ -416,20 +432,32 @@ Procedure, per item:
416
432
  `gh pr merge` spelling except a pure `--disable-auto`, and every `gh api` merge or enqueue
417
433
  mutation; issue #952) unless a checkpoint satisfies
418
434
  one of its allow conditions; its block reason is `EPIC_MERGE_GATE_BLOCKED`. The gate has
419
- four allow conditions
435
+ five allow conditions
420
436
  which it evaluates in this order: a per-feature checkpoint with `epic_mode == true` and
421
437
  `step9_status == "passed"`; an epic checkpoint whose `epic_merge_pr.ci_gate.conclusion` is
422
- `success` with a matching `pr_number`; the parallel condition described next; and a standalone
423
- merge authorization record, described after it. The parallel condition authorizes a per-item merge
438
+ `success` with a matching `pr_number`; the parallel condition described next; the green-CI
439
+ standalone condition (issue #997), evaluated after the parallel condition and before the
440
+ authorization record; and a standalone merge authorization record, described after it. The parallel condition authorizes a per-item merge
424
441
  when the parallel-orchestrator checkpoint has `route_id == "parallel"`, the target item's
425
442
  `merge_status == "ci_green"`, and, when a PR number is named, it matches the item's `pr_number`.
426
443
  Step 3 above is therefore permitted for a legitimate parallel merge; a missing, unreadable, or
427
444
  invalid parallel checkpoint, a target item whose `merge_status` is not `ci_green`, or a PR number
428
445
  that matches no item still fails closed with `EPIC_MERGE_GATE_BLOCKED`.
429
446
 
430
- The standalone condition (issue #670) is the only route for merging a pull request that is not a
431
- parallel item, such as a standalone fix that unblocks the run. It is evaluated last and never
432
- overrides the other three. Writer procedure for the coordinating session:
447
+ The green-CI condition (issue #997) lets a standalone run merge its own pull request after S9
448
+ step 7 of `.claude/skills/orchestrate/SKILL.md`: the command names the PR number, no epic or
449
+ parallel checkpoint records that number or the item worktree, the per-feature checkpoint carries
450
+ no `parallel_mode` or `parallel_slug` marker and records `step9_status == "passed"`,
451
+ `ci_gate.conclusion == "success"`, and a matching `pr_gate.pr_number`, and the live PR head
452
+ equals `ci_gate.head_sha` (and `--match-head-commit`, when passed). Its parallel exclusion is
453
+ best-effort: the `Parallel mode: true` marker is in the delegation prompt, not in a Bash payload,
454
+ so a parallel child whose PR number and worktree are not yet recorded by this checkpoint, and
455
+ which omits the `parallel_mode` key, is not excluded by the hook. A parallel child still never
456
+ merges its own pull request; that rule is enforced by the kickoff contract above.
457
+
458
+ The standalone authorization condition (issue #670) is the route for merging a pull request that
459
+ is not a parallel item and has no green S9 gate, such as a standalone fix that unblocks the run.
460
+ It is evaluated last and never overrides the other four. Writer procedure for the coordinating session:
433
461
 
434
462
  1. Write the record into a top-level `standalone_merge_authorizations` array in the
435
463
  parallel-orchestrator checkpoint (`artifacts/orchestration/parallel-orchestrator-state.json`);
@@ -460,6 +488,16 @@ unattended. When `main` uses a merge queue, the queue replaces that `gh pr updat
460
488
  step 3 enqueues each green pull request, the queue validates it against the latest `main`
461
489
  together with the entries ahead of it, and step 3's confirmation polling waits for the merge.
462
490
 
491
+ **Resolution telemetry write (issue #1013).** When step 4 records `merge_status: merged` for an
492
+ item that is the later-merging item of a tolerated pair (an entry of the checkpoint's
493
+ `tolerated_overlaps` whose peer is already `merged` or `worktree_removed`), complete that entry's
494
+ `observed_resolution` object in the same checkpoint write. When a conflict was detected for the
495
+ pair, set `resolved_at` to the first `ci_green` confirmation that followed the detection,
496
+ `resolution_minutes` to the whole minutes between `conflict_detected_at` and `resolved_at`, and
497
+ `recorded_at`. When no conflict occurred, set `later_item`, `conflicted: false`,
498
+ `conflict_detected_at` and `resolved_at` to null, `resolution_minutes: 0`, and `recorded_at`.
499
+ Nothing reads `observed_resolution`; it is recorded for measurement only.
500
+
463
501
  ## Per-Item Merge-Conflict Handling
464
502
 
465
503
  Remediation is child-owned and parent-initiated. The conflict is always between one item's own
@@ -528,11 +566,25 @@ blast radius under-reported, and this feature records the child's blocked or rem
528
566
  only, leaving drift recording in `drift_events[]`, quiesce of admission, conflict recomputation
529
567
  against the observed radius, and requeue of the later-started item to F8.
530
568
 
569
+ **Detection telemetry write (issue #1013).** When the item whose merge conflicted is the
570
+ later-merging item of a tolerated pair whose peer is already `merged` or `worktree_removed`, set
571
+ `later_item`, `conflicted: true`, and `conflict_detected_at` on that `tolerated_overlaps` entry's
572
+ `observed_resolution` object, unless they are already set. Attribution is non-exclusive: the one
573
+ conflict episode is recorded on every such tolerated pair. The resolution fields are written in
574
+ `## Per-Item Merge to Main (Merge-on-Green)`.
575
+
576
+ **Combined item remediation (issue #1013).** A combined item, whose checkpoint entry carries
577
+ `combined_issue_nums`, remediates as one unit: one child, one `remediation_loop`, and one pull
578
+ request. A combined item that fails review or CI is remediated within that one child and pull
579
+ request, never splits back into separate pull requests, and is merged, blocked, or removed as a
580
+ whole.
581
+
531
582
  ## Worktree Cleanup
532
583
 
533
584
  After an item reaches `merge_status: merged` and that state is durably confirmed by
534
- `gh pr view --json state,mergedAt,headRefOid`, the parent — running from the main repository
535
- checkout, never from inside a child worktree — issues `git worktree remove <worktree_path>`. On
585
+ `gh pr view --json state,mergedAt,headRefOid`, the parent removes the item's worktree through
586
+ substep 1 of `### Run Closing` below, which takes the absolute path from
587
+ `git worktree list --porcelain` rather than from the relative `items[].worktree_path`. On
536
588
  success it records `merge_status: worktree_removed` and `worktree_removed_at`, then regenerates
537
589
  `docs/features/parallel/<slug>/parallel-status.md`.
538
590
 
@@ -550,7 +602,56 @@ non-authorizing `merge_status` still denies on both branches. The coordination m
550
602
  `PreToolUse` denials are conjunctive: a new allow-hook alone could not have overridden the epic
551
603
  gate's independent deny, which is why the epic gate itself had to gain the parallel branch.
552
604
  The parallel-orchestrator-surface feature (F7) shipped no hook file and made no
553
- `.claude/settings.json` change of its own.
605
+ `.claude/settings.json` change of its own. Both gates compare a recorded `worktree_path` to the
606
+ removal target through `Test-WorktreeRunRecordedPathMatchesTarget`, so a relative record is joined
607
+ to the main checkout root and to the root that holds the checkpoint (issue #995).
608
+
609
+ ### Run Closing
610
+
611
+ Run Closing runs once per run, after every non-withdrawn item has `merge_status` of `merged` or
612
+ `worktree_removed` and before completion is reported (issue #995). It re-derives state from
613
+ `git worktree list --porcelain`, `git`, and `gh` rather than from the checkpoint, so it is safe to
614
+ repeat: a substep whose outcome already holds is skipped. The five substeps run in order.
615
+
616
+ 1. **Item worktrees.** For each item whose `merge_status` is `merged`, take the absolute worktree
617
+ path from `git worktree list --porcelain`, never from the relative `items[].worktree_path`. When
618
+ that registration is locked, run `git worktree unlock <path>` only when the lock reason names
619
+ the item's own agent; leave any other lock in place. Run `git worktree remove <path>` with no
620
+ force flag. On success, set `merge_status: worktree_removed` and `worktree_removed_at`. On
621
+ refusal, leave `merge_status: merged`, append a `completed_steps` entry naming the path and the
622
+ refusal reason as a deferral, and continue with the next item.
623
+ 2. **Final status.** Regenerate `docs/features/parallel/<slug>/parallel-status.md` so it shows the
624
+ closing state.
625
+ 3. **Run documents.** Stage the run folder and the promoted lifecycle files created for this run by
626
+ literal path only, in commands of the form
627
+ `git add -- docs/features/parallel/<slug>/parallel-status.md docs/features/potential/promoted/<promoted-file>.md`
628
+ and
629
+ `git commit -m "docs(parallel): close run <slug>" -- docs/features/parallel/<slug>/parallel-status.md docs/features/potential/promoted/<promoted-file>.md`,
630
+ in which every pathspec begins with `docs/features/`. The `artifacts/` tree is gitignored, so Run
631
+ Closing never stages it. Never use
632
+ `git add -A` or `git add .`, and never stage a `docs/features/active/<item>/` folder: each item
633
+ folder lands through that item's own pull request. Before pushing, require that
634
+ `git diff --name-only origin/main...HEAD` lists only `docs/` paths; when it lists any other
635
+ path, stop and report without forcing, rebasing, or splitting the branch. The coordinator holds
636
+ no `artifacts/orchestration/orchestrator-state.json`, so the existing documentation-only
637
+ exemptions apply to these commands. Push the branch, delegate the pull request to
638
+ `Agent(pr-author)` with a `branch:` label in place of an issue number, merge it with
639
+ `gh pr merge <PR> --merge` naming the pull request number, and confirm the merge with the step 3
640
+ procedure of `## Per-Item Merge to Main (Merge-on-Green)`.
641
+ 4. **Scratch worktrees.** After the merge of the run-document pull request is confirmed, run the
642
+ `cleanup-merged-worktrees` report with
643
+ `bash .claude/skills/cleanup-merged-worktrees/scripts/cleanup-worktrees.sh`. Run the same script
644
+ with `--apply` only when every row the report marks delete-eligible is a worktree this run
645
+ created: an item worktree, or a planner scratch worktree named in the run's manifest, kickoff,
646
+ or checkpoint. Otherwise apply nothing and report each remaining scratch worktree as a deferral,
647
+ because apply mode is repository-wide and can classify a concurrent session's clean,
648
+ zero-commit worktree as merged. Add no hook allow for scratch worktrees.
649
+ 5. **Report.** Report every deferral. The named deferral cases are LV1, an item worktree whose
650
+ removal was refused after unlock because the item's harness process still holds it; LV2, a
651
+ run-document pull request still open because the merge queue has not merged it or `origin/main`
652
+ was absent when the merge gate evaluated it; and LV3, a run-document pull request that needs
653
+ manual authoring because the `Agent(pr-author)` delegation without an issue number failed its
654
+ model-routing receipt check. Each scratch worktree left in place is also a deferral.
554
655
 
555
656
  ## Documentation Maintenance Boundaries
556
657
 
@@ -584,6 +685,11 @@ commit message, the pull-request body, and an evidence artifact at
584
685
  `docs/features/parallel/<slug>/evidence/other/mergeable-conflicts.<yyyy-MM-ddTHH-mm>.md` carrying
585
686
  `Timestamp`, `Command`, `EXIT_CODE`, and the script's JSON output verbatim.
586
687
 
688
+ The projection's `## Tolerated Overlaps` heading (issue #1013) renders `tolerated_overlaps[]`: one
689
+ row per entry with `a`, `b`, `reasons`, `cost`, `benefit`, and, from the entry's
690
+ `observed_resolution` object when present, `later_item`, `conflicted`, and `resolution_minutes`.
691
+ An entry without `observed_resolution` renders those three cells empty.
692
+
587
693
  Regeneration boundaries — regenerate at each of the following, not only at final completion:
588
694
 
589
695
  - Run kickoff, seeding the initial projection from the manifest and the seeded cohorts.
@@ -593,6 +699,7 @@ Regeneration boundaries — regenerate at each of the following, not only at fin
593
699
  - Every append to `mutations[]`.
594
700
  - Every append to `drift_events[]`.
595
701
  - Every append to an item's `mergeable_conflicts_resolved`.
702
+ - Every write of an `observed_resolution`.
596
703
  - Run completion in `closed` mode, or run close in `open` mode.
597
704
 
598
705
  Defining the `mutations[]` and `drift_events[]` appends as regeneration boundaries here means F6 and
@@ -660,6 +767,8 @@ hold:
660
767
  source files by that item's own run, per the `acceptance-criteria-tracking` skill.
661
768
  A CI-dependent criterion is checked off and pushed by that item's own run before its DONE, so
662
769
  the head the parent merges already contains the check-off; the parent never commits it.
770
+ 5. `### Run Closing` (under `## Worktree Cleanup`) has run, and its run-document pull request is
771
+ merged or reported as a deferral.
663
772
 
664
773
  In `open` mode there is no automatic completion. The run is a standing queue and terminates only via
665
774
  `/parallel-close`, which is owned by F6 and is neither specified nor shipped by this feature. Do not
@@ -667,7 +776,8 @@ synthesize a completion condition for an `open`-mode run.
667
776
 
668
777
  No completion condition involves a run-level pull request. There is no final integration pull
669
778
  request on this surface, so completion keys on the per-item terminal states above and on nothing
670
- else.
779
+ else. The Run Closing run-document pull request is a bookkeeping pull request that lands the run's
780
+ generated documents; it is not a run-level integration pull request and merges no item work.
671
781
 
672
782
  ## Mutation Protocol (F6)
673
783
 
@@ -140,7 +140,9 @@ the model-budget marker line, and is omitted for a potential-entry item, whose c
140
140
  The line carries no mode marker, no digits, and no active feature-folder path, so hook target
141
141
  resolution and mode classification are unchanged. The preparation checkpoint does not carry over
142
142
  to execution, so the execution child records its own adoption (see
143
- `.claude/skills/parallel-orchestrate/SKILL.md`, kickoff element 4).
143
+ `.claude/skills/parallel-orchestrate/SKILL.md`, kickoff element 4). Because the preparation child
144
+ creates and commits the feature folder, the execution child's adoption also waives
145
+ `new_active_feature_folder` and records `feature_folder_record` for that committed folder.
144
146
 
145
147
  **No edit to shared surfaces.** No edit is made to `.claude/skills/orchestrate/SKILL.md` or to
146
148
  `config/orchestration-routing.json`, including the `preparation` route. The route mechanism is
@@ -170,9 +172,32 @@ explicitly not an integration branch: no item branch ever merges into it, it nev
170
172
  item branch, and it holds only `docs/features/parallel/<slug>/**`, a subtree no item's blast radius
171
173
  may include. Each item opens its own pull request against `main`.
172
174
 
173
- **Read access.** Readers — validators and the future `parallel-orchestrator` — reach both artifact
174
- classes by ref: `git fetch origin <branch>` followed by `git show <ref>:<path>`, without checking
175
- the ref out, per the technique documented in `.claude/skills/epic-run/SKILL.md`.
175
+ **Plan-home checkout.** After the last preparation child has terminated (the re-plan delegations
176
+ for a V1 or V2 failure count as preparation children) and before `## Manifest Authoring`, the
177
+ planner prepares the plan-home branch in its own session checkout: it runs `git fetch origin main`
178
+ and then `git checkout -b parallel/<slug>-plan origin/main`. When the branch already exists, as on
179
+ a resumed run, it runs `git checkout parallel/<slug>-plan` instead of recreating it. If the
180
+ checkout is refused, stop planning and report the refusal; do not stash, force, or reset. The run
181
+ folder is written in place, committed through the pathspec-bearing forms of
182
+ `### Integration Commit Form (issue #539)`, and pushed with
183
+ `git push -u origin parallel/<slug>-plan`. The checkout stays on `parallel/<slug>-plan` for the
184
+ remainder of the run.
185
+
186
+ **Read access.** Readers — validators, the planner itself, and the future `parallel-orchestrator` —
187
+ reach both artifact classes by ref: `git fetch origin <branch>` followed by `git show <ref>:<path>`,
188
+ without checking the ref out, per the technique documented in `.claude/skills/epic-run/SKILL.md`.
189
+ The planner reads each item's approved plan text and `spec.md` text for `### Planner procedure`, and
190
+ performs the git-integrity check, with `git fetch origin <branch>` followed by
191
+ `git show origin/<branch>:<path>` or `git cat-file -e`; it never checks an item branch out.
192
+
193
+ **No planner worktrees.** The planner runs no `git worktree add` for any step of planning: it
194
+ authors `parallel/<slug>-plan` in its own session checkout and reads item text by ref. The only
195
+ worktrees created during planning are the preparation children's `isolation: "worktree"` worktrees,
196
+ and the Claude Code runtime creates and removes them: it removes one immediately when the child
197
+ leaves no changes, and otherwise through its periodic sweep once the commits are pushed and the
198
+ tree is clean. A worktree the planner creates itself is outside every record the removal gates read
199
+ and outside the runtime sweep, so it stays registered after the run closes and only the
200
+ repository-wide cleanup apply mode can remove it.
176
201
 
177
202
  Three residual risks are recorded rather than eliminated:
178
203
 
@@ -256,9 +281,11 @@ any work: the policy rules, the tier map, and the process artifacts. A citation
256
281
  paths is evidence that the author obeyed the reading order, not evidence that the change will write
257
282
  the file, so `derive_blast_radius` drops it from the harvest and `validate_blast_radius` drops it
258
283
  from its plan-side extraction, which keeps V1 and V2 self-consistent. The extractor likewise rejects
259
- three token shapes that were never write claims: a wildcard-free token naming a directory rather
260
- than a file, a `docs/features/` glob whose wildcard spans every feature folder, and a contract token
261
- carrying no ASCII letter. These exclusions are part of the landed contract, so the prohibition now
284
+ five token shapes that were never write claims: a wildcard-free token naming a directory rather
285
+ than a file, a `docs/features/` glob whose wildcard occupies or truncates the feature-folder
286
+ segment, a contract token carrying no ASCII letter, a token containing a placeholder or
287
+ interpolation marker, and a contract token that is a default spreadsheet sheet name. These
288
+ exclusions are part of the landed contract, so the prohibition now
262
289
  reads: do not narrow a radius beyond the configured exclusions in order to suppress a conflict edge.
263
290
 
264
291
  **Appending an excluded path is the planner's obligation, not an exception.** An exclusion describes
@@ -329,6 +356,41 @@ The kickoff artifact's `## Item Summary` `complexity` cell for the item equals i
329
356
  derivation. It is distinct from the deliberately absent worthiness verdict: assessing a band never
330
357
  admits, rejects, or reorders an item.
331
358
 
359
+ ## Issue Combination
360
+
361
+ Combination (issue #1013) runs once, at planning time, after every item is prepared, its radius is
362
+ declared, and its band is assigned, and before cohort seeding. The rules are stated in
363
+ `### Integration-cost scheduling (issue #722)` of `.claude/rules/parallel-orchestration.md`; this
364
+ section states the planner's steps.
365
+
366
+ 1. **Find combinations.** Call Get-BlastRadiusCombination from the facade `BlastRadius.psm1` with
367
+ `-Item` (each item's key, declared radius, and band), `-Config` (the parsed truth table), and
368
+ `-Relation ${function:Test-BlastRadiusConflict}`. Combination proceeds without operator
369
+ approval. It returns nothing when `conflict_tolerance` is absent or tolerance_percent is 0.
370
+ 2. **P6 skip.** If applying every combination would leave fewer than two items (ready-gate
371
+ invariant P6), apply none, and report each qualifying pair as not combined with the reason
372
+ "applying the combinations would leave fewer than two items".
373
+ 3. **Re-plan on the primary branch.** For each combination, issue one follow-up preparation-mode
374
+ delegation on the primary item's pushed branch, the same re-plan posture as a V1 or V2 failure.
375
+ The delegation carries the unchanged preparation kickoff line, followed by the line
376
+ `Combined issues: #A #B` naming each other member by issue number and by branch name only.
377
+ 4. **Child work.** The child imports each other member's committed feature folder by path from that
378
+ member's pushed branch ref (a path checkout, not a branch merge, so there is still no fan-in
379
+ merge), authors one atomic plan in the primary feature folder covering every member's spec,
380
+ re-runs preflight, commits, and pushes.
381
+ 5. **Fresh assessment.** Re-derive the combined item's declared radius from the combined plan, read
382
+ by ref as `**Read access.**` describes, and run a fresh `## Complexity Assessment` for it.
383
+ 6. **Record.** Remove the non-primary members from `items[]`, record `combined_issue_nums` (the other
384
+ members' issue numbers) on the primary item, and add the combination (members, primary, pairs
385
+ with cost and benefit, `estimated_savings`) to the checkpoint's `combinations` list.
386
+ 7. **Capped scheduling.** Only then run the scheduling entry point over the post-combination item
387
+ set; its aggregate cap applies to every remaining item.
388
+
389
+ Each combination re-plan delegation is a preparation child, so the `**Plan-home checkout.**` of
390
+ `## Artifact Home` follows its termination. The planner reads the combined plan by ref and never
391
+ checks an item branch out. The non-primary members' preparation branches stay in place and are
392
+ reported, the same residual as risk 2 in `## Artifact Home`.
393
+
332
394
  ## Cohort Seeding
333
395
 
334
396
  Reach cohort computation through the **destination-runtime bash entry point** under
@@ -671,6 +733,9 @@ The final report to the operator must include:
671
733
  gate the report, does not change the cohort table, and no finding is escalated to Blocking.
672
734
  - Both kickoff artifact paths: `artifacts/orchestration/parallel-kickoff-<slug>.md` and
673
735
  `docs/features/parallel/<slug>/parallel-kickoff.md`.
736
+ - The combination listing (issue #1013): each combination with its members, primary, qualifying
737
+ pairs with cost and benefit, the `combination_threshold_percent` applied, and
738
+ `estimated_savings`; and each qualifying pair that was not combined, with the reason.
674
739
 
675
740
  End with the statement that execution has NOT started and begins only when the operator runs
676
741
  `/parallel-run <slug>` or replays the kickoff prompt from the main session.
@@ -25,6 +25,15 @@ this operation may disturb. Read that section before applying anything here.
25
25
  tracks its `parallel_slug`.
26
26
  - `$ARGUMENTS` names exactly one item key — an integer `items[].issue_num`. Item keys are integers
27
27
  throughout this surface; there is no string key.
28
+ - The run-existence check is evaluated first. When no checkpoint tracks the run's `parallel_slug`,
29
+ stop without changing state and emit the rejection signal defined in
30
+ `## Mutation Rejection Signal (issue #1012)` of `.claude/rules/parallel-orchestration.md`: when
31
+ the run's slug is known, put the line `parallel_slug: <slug>` before the signal, and end the
32
+ final output with the literal line `PARALLEL_MUTATION_REJECTED: run_not_started` as its last
33
+ line, with no formatting and no trailing text.
34
+ - An argument that is not exactly one integer key is rejected only after the run-existence check,
35
+ while the run's checkpoint exists; that rejection emits no rejection signal and validates against
36
+ that checkpoint.
28
37
 
29
38
  ## Re-Derive Durable State Before Applying Anything
30
39
 
@@ -55,6 +64,12 @@ Implement this table exactly, one branch per row:
55
64
  An item already `withdrawn` or `blocked` is not a live removal target and is rejected as an unknown
56
65
  item.
57
66
 
67
+ On a rejected row, put the line `parallel_slug: <slug>` before the signal and end the final output
68
+ with one literal signal line as its last line, with no formatting and no trailing text, per
69
+ `## Mutation Rejection Signal (issue #1012)`: `PARALLEL_MUTATION_REJECTED: items_in_flight` for an
70
+ `in_flight` item without `--disposition`, and `PARALLEL_MUTATION_REJECTED: unknown_item` for an
71
+ unknown, `withdrawn`, or `blocked` item. The `merged` rejection emits no rejection signal.
72
+
58
73
  ## No Default Disposition
59
74
 
60
75
  Removing an item that is `in_flight` without an explicit `--disposition` is REJECTED. No default is
@@ -27,6 +27,12 @@ $ARGUMENTS
27
27
  - STOP without delegating anything when that path does not exist. Report that the run has no
28
28
  committed kickoff artifact: the user must run `/parallel-plan` first (or, for a run whose
29
29
  manifest was authored manually, invoke `/parallel-orchestrate <manifest-path>` directly).
30
+ - On that STOP, emit the rejection signal defined in `## Mutation Rejection Signal (issue #1012)`
31
+ of `.claude/rules/parallel-orchestration.md`: put the line `parallel_slug: <parallel-slug>`
32
+ before the signal, and end the final output with the literal line
33
+ `PARALLEL_MUTATION_REJECTED: kickoff_artifact_missing` as its last line, with no formatting and
34
+ no trailing text. No run checkpoint exists for this run, so the stop hook releases the stop on
35
+ that line.
30
36
  - Do not synthesize a kickoff prompt, do not fall back to the planner's working copy under
31
37
  `artifacts/orchestration/`, and do not launch a partial run in place of the STOP.
32
38
  3. Execute the kickoff artifact's `## Invocation Prompt` section as the run objective, applying the