@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.
- package/out/mcp-server.js +18758 -12030
- package/package.json +1 -1
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +1 -1
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_test_files_count_against_500_cap.md +4 -4
- package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +1 -1
- package/resources/claude-customizations/.claude/agents/discovery-capability-sentinel.md +34 -0
- package/resources/claude-customizations/.claude/agents/feature-review.md +8 -0
- package/resources/claude-customizations/.claude/agents/legacy-parity-analyst.md +101 -43
- package/resources/claude-customizations/.claude/agents/migration-coverage-reviewer.md +107 -43
- package/resources/claude-customizations/.claude/agents/orchestrator.md +1 -1
- package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +60 -6
- package/resources/claude-customizations/.claude/agents/parallel-planner.md +21 -1
- package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +1 -1
- package/resources/claude-customizations/.claude/agents/pr-author.md +48 -7
- package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +1 -1
- package/resources/claude-customizations/.claude/agents/requirements-reconciler.md +117 -42
- package/resources/claude-customizations/.claude/agents/runtime-characterization-analyst.md +103 -43
- package/resources/claude-customizations/.claude/hooks/discovery-capability-probe.ps1 +102 -0
- package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +69 -194
- package/resources/claude-customizations/.claude/hooks/enforce-discovery-planning-gate.ps1 +87 -0
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-green-ci.ps1 +325 -0
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +29 -7
- package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate-resolution.ps1 +23 -10
- package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate.ps1 +29 -21
- package/resources/claude-customizations/.claude/hooks/enforce-file-size-limit.ps1 +244 -0
- package/resources/claude-customizations/.claude/hooks/enforce-model-routing-receipt.ps1 +51 -0
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +168 -48
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate.ps1 +1 -1
- package/resources/claude-customizations/.claude/hooks/enforce-parallel-worktree-removal-gate.ps1 +22 -11
- package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +59 -20
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-command-allowlist.ps1 +51 -4
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill-helpers.ps1 +72 -11
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.current-branch.ps1 +149 -0
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.epic-base-branch.ps1 +4 -2
- package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +59 -20
- package/resources/claude-customizations/.claude/hooks/record-discovery-agent-start.ps1 +132 -0
- package/resources/claude-customizations/.claude/hooks/validate-discovery-artifact-gate.ps1 +56 -212
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-feature-folder.ps1 +146 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-rejection.ps1 +172 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +34 -4
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadius.psm1 +9 -3
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusAggregate.psm1 +154 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusCombination.psm1 +228 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusExtraction.psm1 +1 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusNormalization.psm1 +4 -2
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusScheduling.psm1 +63 -16
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusTokenShape.psm1 +56 -1
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusWriteIntent.psm1 +4 -1
- package/resources/claude-customizations/.claude/lib/cleanup-manifest/CleanupWorktreeManifest.psm1 +33 -6
- package/resources/claude-customizations/.claude/lib/codex-routing/CodexDeployment.psm1 +5 -1
- package/resources/claude-customizations/.claude/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
- package/resources/claude-customizations/.claude/lib/codex-routing/CodexTopology.psm1 +25 -2
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryValidation.psm1 +188 -341
- package/resources/claude-customizations/.claude/lib/file-size-policy/FileSizePolicy.psm1 +434 -0
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateFeatureFolderRecord.psm1 +166 -0
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateIssueAdoption.psm1 +8 -3
- package/resources/claude-customizations/.claude/lib/worktree-resolution/HookTargetWorktree.psm1 +391 -0
- package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunRecordPath.psm1 +185 -0
- package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunResolution.psm1 +11 -21
- package/resources/claude-customizations/.claude/rules/general-code-change.md +4 -1
- package/resources/claude-customizations/.claude/rules/orchestrator-state.md +29 -5
- package/resources/claude-customizations/.claude/rules/parallel-orchestration.md +152 -20
- package/resources/claude-customizations/.claude/rules/powershell.md +1 -1
- package/resources/claude-customizations/.claude/rules/shell.md +1 -1
- package/resources/claude-customizations/.claude/settings.json +36 -3
- package/resources/claude-customizations/.claude/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
- package/resources/claude-customizations/.claude/skills/characterize-runtime-behavior/SKILL.md +134 -0
- package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/SKILL.md +2 -2
- package/resources/claude-customizations/.claude/skills/discovery-behavior-reconciliation/SKILL.md +28 -47
- package/resources/claude-customizations/.claude/skills/discovery-coverage-ledger/SKILL.md +32 -48
- package/resources/claude-customizations/.claude/skills/discovery-parity-matrix/SKILL.md +28 -45
- package/resources/claude-customizations/.claude/skills/discovery-repo-inventory/SKILL.md +28 -62
- package/resources/claude-customizations/.claude/skills/discovery-runtime-characterization/SKILL.md +28 -45
- package/resources/claude-customizations/.claude/skills/discovery-validate-artifacts/SKILL.md +28 -61
- package/resources/claude-customizations/.claude/skills/discovery-workflow/SKILL.md +55 -139
- package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +25 -10
- package/resources/claude-customizations/.claude/skills/extract-feature-contract/SKILL.md +133 -0
- package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +1 -0
- package/resources/claude-customizations/.claude/skills/generate-acceptance-scenarios/SKILL.md +132 -0
- package/resources/claude-customizations/.claude/skills/initialize-discovery-workspace/SKILL.md +131 -0
- package/resources/claude-customizations/.claude/skills/inventory-legacy-system/SKILL.md +131 -0
- package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +15 -7
- package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +25 -2
- package/resources/claude-customizations/.claude/skills/parallel-close/SKILL.md +11 -1
- package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +124 -14
- package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +72 -7
- package/resources/claude-customizations/.claude/skills/parallel-remove/SKILL.md +15 -0
- package/resources/claude-customizations/.claude/skills/parallel-run/SKILL.md +6 -0
- package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +56 -9
- package/resources/claude-customizations/.claude/skills/reconcile-parity-matrix/SKILL.md +131 -0
- package/resources/claude-customizations/.claude/skills/review-discovery-coverage/SKILL.md +129 -0
- package/resources/claude-customizations/.claude/skills/validate-discovery-artifacts/SKILL.md +127 -0
- package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +1 -1
- package/resources/claude-customizations/config/blast-radius.json +6 -5
- package/resources/claude-customizations/config/orchestration-routing.json +61 -1
- package/resources/claude-customizations/pack-manifests/core.json +40 -1
- package/resources/codex-and-agents-customizations/.agents/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +7 -0
- package/resources/codex-and-agents-customizations/.agents/skills/characterize-runtime-behavior/SKILL.md +134 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-coverage-ledger/SKILL.md +50 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-parity-matrix/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-repo-inventory/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-runtime-characterization/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-validate-artifacts/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-workflow/SKILL.md +62 -0
- package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +25 -10
- package/resources/codex-and-agents-customizations/.agents/skills/extract-feature-contract/SKILL.md +133 -0
- package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +8 -0
- package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +4 -1
- package/resources/codex-and-agents-customizations/.agents/skills/generate-acceptance-scenarios/SKILL.md +132 -0
- package/resources/codex-and-agents-customizations/.agents/skills/initialize-discovery-workspace/SKILL.md +131 -0
- package/resources/codex-and-agents-customizations/.agents/skills/inventory-legacy-system/SKILL.md +131 -0
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +8 -0
- package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/reconcile-parity-matrix/SKILL.md +131 -0
- package/resources/codex-and-agents-customizations/.agents/skills/review-discovery-coverage/SKILL.md +129 -0
- package/resources/codex-and-agents-customizations/.agents/skills/validate-discovery-artifacts/SKILL.md +127 -0
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/discovery-capability-sentinel.toml +51 -0
- package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +8 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c1.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c2.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3-elevated.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c4.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c1.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c2.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3-elevated.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c4.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c1.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c2.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3-elevated.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c4.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c1.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c2.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3-elevated.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c4.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/config.toml +39 -3
- package/resources/codex-and-agents-customizations/.codex/hooks/codex-agent-profile-attestation.ps1 +22 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/discovery-capability-probe.ps1 +97 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/discovery-start-attestation.ps1 +171 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-codex-model-routing.ps1 +4 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-artifact-gate.ps1 +187 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-planning-gate.ps1 +149 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-file-size-limit.ps1 +282 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +239 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate.ps1 +6 -15
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +54 -15
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +54 -15
- package/resources/codex-and-agents-customizations/.codex/hooks/file-size-policy.ps1 +421 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-target-worktree.ps1 +369 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/record-subagent-routing-attestation.ps1 +8 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-codex-subagent-routing.ps1 +22 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-discovery-agent-output.ps1 +178 -0
- package/resources/codex-and-agents-customizations/.codex/scripts/Resolve-CodexTopology.ps1 +11 -1
- package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/AGENTS.md +4 -1
- package/resources/codex-and-agents-customizations/pack-manifests/core.json +65 -1
- package/resources/config/orchestration-routing.json +61 -1
- package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
- package/resources/customizations/.github/agents/discovery-capability-sentinel.agent.md +34 -0
- package/resources/customizations/.github/agents/legacy-parity-analyst.agent.md +122 -0
- package/resources/customizations/.github/agents/migration-coverage-reviewer.agent.md +128 -0
- package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +1 -1
- package/resources/customizations/.github/agents/python-typed-engineer.agent.md +1 -1
- package/resources/customizations/.github/agents/requirements-reconciler.agent.md +138 -0
- package/resources/customizations/.github/agents/runtime-characterization-analyst.agent.md +124 -0
- package/resources/customizations/.github/hooks/discovery-agent-start.ps1 +139 -0
- package/resources/customizations/.github/hooks/discovery-agent-stop.ps1 +123 -0
- package/resources/customizations/.github/hooks/discovery-capability-probe.ps1 +98 -0
- package/resources/customizations/.github/hooks/discovery-planning.ps1 +91 -0
- package/resources/customizations/.github/hooks/discovery-pre-tool.ps1 +123 -0
- package/resources/customizations/.github/hooks/discovery.json +35 -0
- package/resources/customizations/.github/instructions/general-code-change.instructions.md +5 -2
- package/resources/customizations/.github/instructions/mermaid.instructions.md +85 -0
- package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +1 -1
- package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +105 -0
- package/resources/customizations/.github/prompts/remediate-comments.prompt.md +1 -1
- package/resources/customizations/.github/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
- package/resources/customizations/.github/skills/characterize-runtime-behavior/SKILL.md +134 -0
- package/resources/customizations/.github/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-coverage-ledger/SKILL.md +50 -0
- package/resources/customizations/.github/skills/discovery-parity-matrix/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-repo-inventory/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-runtime-characterization/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-validate-artifacts/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-workflow/SKILL.md +62 -0
- package/resources/customizations/.github/skills/execution-environment/SKILL.md +25 -10
- package/resources/customizations/.github/skills/extract-feature-contract/SKILL.md +133 -0
- package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +8 -0
- package/resources/customizations/.github/skills/generate-acceptance-scenarios/SKILL.md +132 -0
- package/resources/customizations/.github/skills/initialize-discovery-workspace/SKILL.md +131 -0
- package/resources/customizations/.github/skills/inventory-legacy-system/SKILL.md +131 -0
- package/resources/customizations/.github/skills/reconcile-parity-matrix/SKILL.md +131 -0
- package/resources/customizations/.github/skills/review-discovery-coverage/SKILL.md +129 -0
- package/resources/customizations/.github/skills/validate-discovery-artifacts/SKILL.md +127 -0
- package/resources/lib/codex-routing/CodexDeployment.psm1 +5 -1
- package/resources/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
- package/resources/lib/codex-routing/CodexTopology.psm1 +25 -2
- package/resources/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
- package/resources/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
- package/resources/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
- package/resources/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
- package/resources/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
- package/resources/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
- package/resources/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
- package/resources/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
- package/resources/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
- package/resources/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
- package/resources/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
- package/resources/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
- package/resources/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
- package/resources/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
- package/resources/powershell/PoshQC/PoshQC.Parallel.psm1 +452 -0
- package/resources/powershell/PoshQC/PoshQC.Shard.psm1 +106 -8
- package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +12 -0
- package/resources/powershell/PoshQC/PoshQC.psd1 +6 -1
- package/resources/powershell/PoshQC/PoshQC.psm1 +7 -1
- package/resources/powershell/PoshQC/README.md +20 -1
- package/resources/templates/policy_audit/code-review.yyyy-MM-ddTHH-mm.md +4 -4
- 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
|
|
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**.
|
|
362
|
-
`
|
|
363
|
-
|
|
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
|
-
|
|
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;
|
|
423
|
-
|
|
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
|
|
431
|
-
|
|
432
|
-
|
|
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
|
|
535
|
-
|
|
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
|
-
**
|
|
174
|
-
|
|
175
|
-
the
|
|
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
|
-
|
|
260
|
-
than a file, a `docs/features/` glob whose wildcard
|
|
261
|
-
carrying no ASCII letter
|
|
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
|