@danmoisan/drm-copilot-mcp 1.1.18 → 1.1.19
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 +989 -662
- package/package.json +3 -2
- package/resources/claude-customizations/.claude/agents/atomic-executor.md +11 -0
- package/resources/claude-customizations/.claude/agents/atomic-planner.md +10 -0
- package/resources/claude-customizations/.claude/agents/epic-orchestrator.md +12 -4
- package/resources/claude-customizations/.claude/agents/epic-planner.md +5 -4
- package/resources/claude-customizations/.claude/agents/feature-review.md +6 -4
- package/resources/claude-customizations/.claude/agents/orchestrator.md +5 -4
- package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +31 -13
- package/resources/claude-customizations/.claude/agents/parallel-planner.md +9 -6
- package/resources/claude-customizations/.claude/agents/pr-author.md +15 -2
- package/resources/claude-customizations/.claude/agents/prd-feature.md +1 -1
- package/resources/claude-customizations/.claude/hooks/check-powershell-test-purity.ps1 +7 -1
- package/resources/claude-customizations/.claude/hooks/check-python-test-purity.ps1 +7 -1
- package/resources/claude-customizations/.claude/hooks/enforce-checkpoint-monotonic.ps1 +7 -1
- package/resources/claude-customizations/.claude/hooks/enforce-completion-consistency.ps1 +111 -46
- package/resources/claude-customizations/.claude/hooks/enforce-completion-helpers.ps1 +105 -0
- package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +8 -1
- package/resources/claude-customizations/.claude/hooks/enforce-epic-invocation-origin.ps1 +7 -1
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-resolution.ps1 +116 -59
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +55 -23
- package/resources/claude-customizations/.claude/hooks/enforce-epic-wave-barrier.ps1 +74 -75
- package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate-resolution.ps1 +127 -35
- package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate.ps1 +61 -57
- package/resources/claude-customizations/.claude/hooks/enforce-evidence-locations.ps1 +7 -1
- package/resources/claude-customizations/.claude/hooks/enforce-feature-folder-order.ps1 +129 -39
- package/resources/claude-customizations/.claude/hooks/enforce-mermaid-validation.ps1 +7 -1
- package/resources/claude-customizations/.claude/hooks/enforce-model-routing-receipt.ps1 +9 -3
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +39 -51
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-helpers.ps1 +31 -58
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-modes.ps1 +63 -47
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-targets.ps1 +433 -0
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate.ps1 +17 -12
- package/resources/claude-customizations/.claude/hooks/enforce-parallel-abandon-gate.ps1 +9 -3
- package/resources/claude-customizations/.claude/hooks/enforce-parallel-cohort-barrier.ps1 +65 -50
- package/resources/claude-customizations/.claude/hooks/enforce-parallel-drift-gate.ps1 +49 -42
- package/resources/claude-customizations/.claude/hooks/enforce-parallel-worktree-removal-gate.ps1 +54 -72
- package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +8 -2
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-command-allowlist.ps1 +279 -0
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill-helpers.ps1 +129 -75
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.artifact-root.ps1 +233 -0
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.docs-only.ps1 +224 -0
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.ps1 +69 -24
- package/resources/claude-customizations/.claude/hooks/enforce-prd-feature-before-planner-helpers.ps1 +29 -18
- package/resources/claude-customizations/.claude/hooks/enforce-prd-feature-before-planner.ps1 +10 -4
- package/resources/claude-customizations/.claude/hooks/enforce-promotion-mcp-only.ps1 +14 -5
- package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +8 -2
- package/resources/claude-customizations/.claude/hooks/feature-folder-resolution.ps1 +373 -0
- package/resources/claude-customizations/.claude/hooks/feature-review-coverage-thresholds.ps1 +85 -0
- package/resources/claude-customizations/.claude/hooks/hook-command-heredoc.ps1 +119 -0
- package/resources/claude-customizations/.claude/hooks/hook-command-invocation-operands.ps1 +198 -0
- package/resources/claude-customizations/.claude/hooks/hook-command-invocation.ps1 +254 -255
- package/resources/claude-customizations/.claude/hooks/hook-command-payload-powershell.ps1 +201 -0
- package/resources/claude-customizations/.claude/hooks/hook-command-payload.ps1 +484 -0
- package/resources/claude-customizations/.claude/hooks/hook-command-scanner.ps1 +27 -110
- package/resources/claude-customizations/.claude/hooks/hook-dependency-guard.ps1 +114 -0
- package/resources/claude-customizations/.claude/hooks/hook-docs-only-diff.ps1 +493 -0
- package/resources/claude-customizations/.claude/hooks/subagentstop-envelope.ps1 +192 -0
- package/resources/claude-customizations/.claude/hooks/validate-bash.ps1 +9 -3
- package/resources/claude-customizations/.claude/hooks/validate-discovery-artifact-gate.ps1 +40 -42
- package/resources/claude-customizations/.claude/hooks/validate-executor-output.ps1 +66 -38
- package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-metrics.ps1 +180 -0
- package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-rules.ps1 +195 -0
- package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage.ps1 +141 -395
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-resolution.ps1 +311 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-routing.ps1 +170 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +115 -190
- package/resources/claude-customizations/.claude/hooks/validate-planner-output.ps1 +64 -32
- package/resources/claude-customizations/.claude/hooks/validate-pr-author-output.ps1 +39 -44
- package/resources/claude-customizations/.claude/hooks/validate-prd-feature-output.ps1 +43 -14
- package/resources/claude-customizations/.claude/hooks/validate-required-artifact-output.ps1 +66 -36
- package/resources/claude-customizations/.claude/hooks/validate-task-researcher-output.ps1 +31 -34
- package/resources/claude-customizations/.claude/lib/bash/mutate-parallel-run.sh +191 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-cohorts.sh +13 -3
- package/resources/claude-customizations/.claude/lib/bash/parallel-mutation-cli.sh +152 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-mutation-ops.sh +193 -0
- package/resources/claude-customizations/.claude/lib/bash/parallel-mutation.sh +322 -0
- package/resources/claude-customizations/.claude/lib/bash/remove-parallel-item.sh +146 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusExtraction.psm1 +23 -33
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusTokenShape.psm1 +86 -6
- package/resources/claude-customizations/.claude/lib/ci-gate/Invoke-CiGateParser.ps1 +91 -19
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateEpicWaveBarrier.psm1 +346 -0
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateIssueAdoption.psm1 +24 -3
- package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeItemResolution.psm1 +79 -2
- package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunResolution.psm1 +3 -3
- package/resources/claude-customizations/.claude/rules/architecture-boundaries.md +5 -5
- package/resources/claude-customizations/.claude/rules/csharp.md +2 -2
- package/resources/claude-customizations/.claude/rules/general-code-change.md +1 -1
- package/resources/claude-customizations/.claude/rules/general-unit-test.md +3 -2
- package/resources/claude-customizations/.claude/rules/orchestrator-state.md +37 -4
- package/resources/claude-customizations/.claude/rules/parallel-orchestration.md +50 -5
- package/resources/claude-customizations/.claude/rules/plan-acceptance-gates.md +47 -8
- package/resources/claude-customizations/.claude/rules/quality-tiers.md +11 -7
- package/resources/claude-customizations/.claude/rules/shell.md +10 -8
- package/resources/claude-customizations/.claude/rules/typescript.md +1 -1
- package/resources/claude-customizations/.claude/settings.json +3 -4
- package/resources/claude-customizations/.claude/skills/acceptance-criteria-tracking/SKILL.md +1 -1
- package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +5 -1
- package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_detached_lib.sh +1 -1
- package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_enumerate_lib.sh +2 -0
- package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_scan_helper.sh +2 -0
- package/resources/claude-customizations/.claude/skills/epic-orchestrate/SKILL.md +33 -6
- package/resources/claude-customizations/.claude/skills/epic-plan/SKILL.md +1 -1
- package/resources/claude-customizations/.claude/skills/evidence-and-timestamp-conventions/SKILL.md +10 -1
- package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +1 -1
- package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +4 -3
- package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +14 -6
- package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +52 -14
- package/resources/claude-customizations/.claude/skills/parallel-close/SKILL.md +22 -9
- package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +79 -16
- package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +63 -7
- package/resources/claude-customizations/.claude/skills/parallel-remove/SKILL.md +35 -12
- package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +3 -1
- package/resources/claude-customizations/.claude/skills/quota-throttling/SKILL.md +1 -1
- package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +2 -2
- package/resources/claude-customizations/pack-manifests/core.json +23 -0
- package/resources/codex-and-agents-customizations/.agents/skills/acceptance-criteria-tracking/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/architecture-boundaries/SKILL.md +5 -5
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-executor/SKILL.md +11 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +4 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +10 -0
- package/resources/codex-and-agents-customizations/.agents/skills/csharp/SKILL.md +2 -2
- package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +2 -2
- package/resources/codex-and-agents-customizations/.agents/skills/epic-orchestrate/SKILL.md +8 -0
- package/resources/codex-and-agents-customizations/.agents/skills/epic-plan/SKILL.md +17 -1
- package/resources/codex-and-agents-customizations/.agents/skills/epic-run/SKILL.md +2 -1
- package/resources/codex-and-agents-customizations/.agents/skills/evidence-and-timestamp-conventions/SKILL.md +10 -1
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +13 -5
- package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/general-unit-test/SKILL.md +3 -2
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +15 -6
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/quality-tiers/SKILL.md +11 -7
- package/resources/codex-and-agents-customizations/.agents/skills/translate-claude-to-codex/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp/SKILL.md +2 -2
- package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c1.toml +11 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c2.toml +11 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3-elevated.toml +11 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3.toml +11 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c4.toml +11 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +11 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c1.toml +10 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c2.toml +10 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3-elevated.toml +10 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3.toml +10 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c4.toml +10 -0
- package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +10 -0
- package/resources/codex-and-agents-customizations/.codex/agents/epic-orchestrator.toml +2 -1
- package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +6 -6
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c1.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c2.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c3-elevated.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c3.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c4.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/agents/orchestrator.toml +2 -2
- package/resources/codex-and-agents-customizations/.codex/codex-web-setup.sh +318 -273
- package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/check-powershell-test-purity.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/check-python-test-purity.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/codex-epic-child-launch-attestation.ps1 +1 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-checkpoint-monotonic.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-codex-model-routing.ps1 +8 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-completion-consistency.ps1 +97 -44
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-completion-helpers.ps1 +105 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-child-worktree-binding.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate.ps1 +37 -5
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-planning-only.ps1 +6 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-root-invocation.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-wave-barrier.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-worktree-removal-gate.ps1 +54 -41
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-evidence-locations.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +35 -14
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-helpers.ps1 +31 -58
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-modes.ps1 +63 -47
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-targets.ps1 +433 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate.ps1 +24 -11
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +8 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-promotion-mcp-only.ps1 +13 -4
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +8 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/feature-folder-resolution.ps1 +373 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/feature-review-coverage-thresholds.ps1 +85 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-heredoc.ps1 +119 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-invocation-operands.ps1 +198 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-invocation.ps1 +254 -255
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-payload-powershell.ps1 +201 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-payload.ps1 +484 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-scanner.ps1 +27 -110
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-dependency-guard.ps1 +114 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-docs-only-diff.ps1 +493 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-bash.ps1 +8 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-codex-subagent-routing.ps1 +7 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +24 -8
- package/resources/codex-and-agents-customizations/pack-manifests/core.json +9 -0
- package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +2 -2
- package/resources/customizations/.github/instructions/csharp-code-change.instructions.md +4 -4
- package/resources/customizations/.github/instructions/csharp-unit-test.instructions.md +2 -2
- package/resources/customizations/.github/skills/acceptance-criteria-tracking/SKILL.md +1 -1
- package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +4 -0
- package/resources/customizations/.github/skills/evidence-and-timestamp-conventions/SKILL.md +10 -1
- package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +1 -1
- package/resources/powershell/PoshQC/PoshQC.Coverage.psm1 +314 -0
- package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +25 -28
- package/resources/powershell/PoshQC/PoshQC.psm1 +1 -0
- package/resources/powershell/PoshQC/README.md +8 -2
- package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +2 -319
package/resources/claude-customizations/.claude/skills/evidence-and-timestamp-conventions/SKILL.md
CHANGED
|
@@ -46,7 +46,16 @@ Use this skill when:
|
|
|
46
46
|
Use `yyyy-MM-ddTHH-mm` for all audit, remediation, and evidence artifacts.
|
|
47
47
|
Example: `2026-02-06T14-30`.
|
|
48
48
|
|
|
49
|
-
The `Timestamp` value is
|
|
49
|
+
The `Timestamp` value is UTC read from the host system clock when the recorded command runs (for example `Get-Date -AsUTC -Format yyyy-MM-ddTHH-mm` in PowerShell 7, `(Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH-mm')` in Windows PowerShell 5.1, or `date -u +%Y-%m-%dT%H-%M` in a POSIX shell); the agent never composes or estimates it. The value is written without a zone suffix.
|
|
50
|
+
|
|
51
|
+
### Evidence Filename Timestamp
|
|
52
|
+
|
|
53
|
+
The stamp in the filename of every artifact under `<FEATURE>/evidence/<kind>/` is the UTC time at which that file is written, read from the host system clock immediately before the write, in the same `yyyy-MM-ddTHH-mm` shape with no zone suffix. It is never a plan-time stamp, a plan-cycle identifier, or any other value fixed before the write.
|
|
54
|
+
|
|
55
|
+
- Plans name such an artifact `<name>.<timestamp>.md`, and the executor substitutes the write time. A later loop pass writes a new file with a new stamp.
|
|
56
|
+
- A task that consumes an evidence artifact selects the lexicographically greatest file matching `<name>.*.md`. The fixed-width UTC shape sorts in chronological order, so that file is the most recently written one.
|
|
57
|
+
- Plan files (`plan.<timestamp>.md`, stamped by the feature-folder tooling in America/New_York) and the review artifact set (`policy-audit`, `code-review`, `feature-audit`, `remediation-inputs`, which share one stamp) are outside this rule.
|
|
58
|
+
- Existing evidence files whose names carry a plan-time stamp are not renamed.
|
|
50
59
|
|
|
51
60
|
## Canonical Evidence Locations
|
|
52
61
|
|
|
@@ -45,7 +45,7 @@ Note: VS Code command-palette commands may exist for interactive extension use,
|
|
|
45
45
|
When the GitHub issue already exists (it was transferred, filed before orchestration, or created by epic decomposition), do not call `potential_to_issue`: that tool creates a new issue and would duplicate the existing one. Instead:
|
|
46
46
|
|
|
47
47
|
1. Verify the issue read-only with `gh issue view`, a `gh api` GET request, or a GitHub MCP issue read, and use its number as `${issue-num}`.
|
|
48
|
-
2. Record a top-level `issue_adoption` object in the orchestrator checkpoint (`issue_num`, `issue_url`, `origin`, `verified_via`, `verified_at`, `evidence`, `waived_tools`, and
|
|
48
|
+
2. Record a top-level `issue_adoption` object in the orchestrator checkpoint (`issue_num`, `issue_url`, `origin`, `verified_via`, `verified_at`, `evidence`, `waived_tools`, and, when a promotion-entry tool is waived, `potential_record`). For that waiver `potential_record` is required when `origin` is `epic_decomposition`, optional when `origin` is `transferred` or `filed_before_orchestration`, and validated whenever it is present. A valid record waives the `potential_to_issue` receipt requirement at completion.
|
|
49
49
|
3. `delegation_receipts.promotion.issue` may be omitted, because no promotion receipt exists for an adopted issue.
|
|
50
50
|
|
|
51
51
|
The field rules, the closed set of waivable tools, and the fail-closed behavior are defined in `.claude/rules/orchestrator-state.md` under `## Invariants (issue_adoption object)`.
|
|
@@ -70,7 +70,7 @@ Always apply:
|
|
|
70
70
|
If the branch diff modifies any path matching `.github/workflows/**`, `scripts/benchmarks/**`, or `.github/actions/**`, the policy audit emits a Blocking finding unless evidence of a green workflow run against the branch head is present in the remediation inputs.
|
|
71
71
|
|
|
72
72
|
- The rule provides a second, independent line of defense for CI-gate-modifying features, separate from and prior to the orchestrator's S9 CI green gate.
|
|
73
|
-
- "Green workflow run against the branch head" means a workflow
|
|
73
|
+
- "Green workflow run against the branch head" means a run of the affected workflow whose conclusion is success and which satisfies either (a) or (b): (a) its head SHA equals the current branch head; or (b) all three predecessor-head conditions hold: (1) the run's head SHA is an ancestor of, or equal to, the current branch head and contains the latest commit that changes any path outside the active feature folder (`git merge-base --is-ancestor <commit> <run-sha>`); (2) every commit after the run's head SHA changes only paths inside the active feature folder (`git log <run-sha>..HEAD -- . ":!<feature-folder>"` returns no commits); (3) the policy audit states that the orchestrator's S9 CI green gate remains responsible for `ci_gate.conclusion == "success"` with `ci_gate.head_sha` equal to the final PR head before DONE. Condition (b) exists because an in-repo evidence artifact cannot name the SHA of the commit that contains it.
|
|
74
74
|
- A green `workflow_dispatch` run against the branch head also satisfies the rule, not only a PR-context run. This mitigates the chicken-and-egg case where a feature must land its CI gate before the gate can run in PR context (see spec.md Risks & Mitigations).
|
|
75
75
|
- When the rule fires and no qualifying green-run evidence is present, record a Blocking finding classified `awaiting_ci` (the remediation inputs carry `Remediability: awaiting_ci` and a `Remediability-Evidence:` line naming the awaited workflow) and route it to the wait path (`AWAITING_CI` when no other class is present) instead of the remediation handoff.
|
|
76
76
|
|
|
@@ -108,12 +108,13 @@ If the branch diff modifies any path matching `.github/workflows/**`, `scripts/b
|
|
|
108
108
|
- Python: `poetry run pytest --cov` → artifact: `artifacts/python/lcov.info`
|
|
109
109
|
- PowerShell: `mcp__drm-copilot__run_poshqc_test` → artifact: `artifacts/pester/powershell-coverage.xml`
|
|
110
110
|
- C#: `dotnet test --collect:"XPlat Code Coverage"` → artifact: `artifacts/csharp/coverage.xml`
|
|
111
|
-
- Coverage thresholds (
|
|
111
|
+
- Coverage thresholds (threshold precedence per `.claude/rules/quality-tiers.md` and `.claude/rules/general-unit-test.md`: when the repository's root `CLAUDE.md` states line or branch coverage thresholds, those thresholds govern; otherwise the default thresholds below govern; each metric falls back independently, so a root `CLAUDE.md` that states only one of the two thresholds governs only that metric). The branch threshold applies only to branch-capable languages — TypeScript, Python, and C#. PowerShell is a coverage language and is fully subject to the line threshold and the no-regression requirement, but Pester measures command (instruction) coverage and line coverage only, so no branch percentage exists to evaluate and no branch threshold applies to it (see `.claude/rules/powershell.md`). Do not flag a missing PowerShell branch figure as FAIL:
|
|
112
112
|
- New code files (added in this feature): line coverage >= 85%, and branch coverage >= 75% for branch-capable languages. Flag as FAIL otherwise.
|
|
113
113
|
- Modified files (changed but previously existing): line coverage >= 85%, branch coverage >= 75% for branch-capable languages, and no regression on changed lines relative to baseline. Flag as FAIL otherwise.
|
|
114
114
|
- Repo-wide per language: line coverage >= 85%, and branch coverage >= 75% for branch-capable languages. Flag as FAIL otherwise.
|
|
115
115
|
- If coverage artifacts already exist from the executor run, inspect them instead of re-running.
|
|
116
116
|
- If no coverage artifact exists for a language that has changed files, flag as FAIL — coverage verification is mandatory for all languages with changed files.
|
|
117
|
+
- Tier classification findings: report a missing or incomplete `quality-tiers.yml` only when the repository has adopted tiers, that is, when `quality-tiers.yml` exists at the repository root on the resolved base branch or the repository's CI runs a tier-classification check. Otherwise record tier classification as not applicable; it is not a finding.
|
|
117
118
|
- Run the smallest relevant subset first when the repo policy permits it.
|
|
118
119
|
- If a tool cannot run in the environment, mark the affected section unverified or partial with a concrete reason.
|
|
119
120
|
|
|
@@ -145,7 +146,7 @@ If the branch diff modifies any path matching `.github/workflows/**`, `scripts/b
|
|
|
145
146
|
- toolchain checks fail
|
|
146
147
|
- the code review contains blockers
|
|
147
148
|
- required acceptance criteria are FAIL or PARTIAL
|
|
148
|
-
- coverage
|
|
149
|
+
- coverage below the governing thresholds defined in step 5 (repo-wide per language, modified files including any regression on changed lines, or new files)
|
|
149
150
|
- coverage artifact absent for any language that has changed files
|
|
150
151
|
- Classify each blocking finding before triggering remediation: each receives one remediability class (`autonomous`, `external_dependency`, `policy_hold`, `awaiting_ci`, or `human_decision_required`; `autonomous` when no class is stated). A published MCP runtime that lags the repository contract is classified `external_dependency`.
|
|
151
152
|
- Trigger the remediation handoff only when at least one blocking finding is `autonomous`. When every blocking finding is non-remediable, write the remediation inputs with the `HALT_NON_REMEDIABLE` or `AWAITING_CI` verdict and create no remediation plan target.
|
|
@@ -34,6 +34,7 @@ On every invocation, the main session must:
|
|
|
34
34
|
2. If a valid checkpoint exists with a matching objective, resume from the recorded `next_step`.
|
|
35
35
|
3. If no checkpoint exists or the objective is new, begin the orchestration lifecycle from the start.
|
|
36
36
|
4. **Checkpoint hygiene (issue #673).** When the checkpoint at `artifacts/orchestration/orchestrator-state.json` records an `issue-num` other than the item this invocation is about, move it to `artifacts/orchestration/handoff/orchestrator-state.issue-<issue-num>.<yyyy-MM-ddTHH-mm>.json` before writing a new checkpoint, rather than overwriting it or leaving it in place. Apply the same move when this session hands an item whose checkpoint it holds to another session or worktree. A checkpoint left at a session root is read by gates that resolve against that root, so a foreign one there is state a gate can answer from.
|
|
37
|
+
5. **Required checkpoint keys (issue #798).** Every checkpoint write carries each top-level key listed in `.claude/rules/orchestrator-state.md` under `## Required Top-Level Keys`; plain validation reports each absent key as `Checkpoint missing required key: <key>` under every flag combination. The list includes `last_updated`, an ISO-8601 UTC date-time string (for example `2026-10-08T17:28:00Z`) that is rewritten on every checkpoint write: after every completed step and every state transition, including halts.
|
|
37
38
|
|
|
38
39
|
## Prepared-State Portable Handoff Intake
|
|
39
40
|
|
|
@@ -189,6 +190,8 @@ The mandatory sequence is:
|
|
|
189
190
|
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.
|
|
190
191
|
4. The orchestrator records `pr_author_receipt` in the checkpoint, citing the body-file path and the receipt path that were verified.
|
|
191
192
|
|
|
193
|
+
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.
|
|
194
|
+
|
|
192
195
|
`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.
|
|
193
196
|
|
|
194
197
|
The SHA-256 receipt is a policy-level integrity check, not a cryptographic or security boundary; any actor with `Write(/artifacts/**)` access can replace both the body file and its receipt together with a matching SHA-256. It binds the body bytes to the receipt, prevents accidental bypass, and requires a deliberate, documented act to circumvent.
|
|
@@ -267,7 +270,7 @@ Cycle accounting: a remediation attempt is complete when R3 execution finished (
|
|
|
267
270
|
|
|
268
271
|
## Issue Number Consistency
|
|
269
272
|
|
|
270
|
-
The canonical issue number is derived once from the active feature folder name: extract the trailing integer from the folder base name (e.g., `2026-04-26-push-down-claude-customizations-162` yields `162`). Record as `
|
|
273
|
+
The canonical issue number is derived once from the active feature folder name: extract the trailing integer from the folder base name (e.g., `2026-04-26-push-down-claude-customizations-162` yields `162`). Record as `issue-num` in the checkpoint; the hyphenated key is the one listed in `.claude/rules/orchestrator-state.md` under `## Required Top-Level Keys`.
|
|
271
274
|
|
|
272
275
|
Every delegation prompt to a receipt-gated subagent type — `atomic-planner`, `atomic-executor`, `feature-review`, `task-researcher`, `prd-feature`, and `pr-author` — must include the line:
|
|
273
276
|
|
|
@@ -286,8 +289,13 @@ If a subagent artifact references a different issue number, the orchestrator rej
|
|
|
286
289
|
S9 procedure:
|
|
287
290
|
|
|
288
291
|
1. Resolve the live PR head SHA for the feature branch (`gh pr view --json headRefOid` or equivalent).
|
|
289
|
-
2. Invoke `gh pr checks --
|
|
290
|
-
|
|
292
|
+
2. Invoke `gh pr checks --json bucket,name,state,link,workflow` (or an equivalent JSON-emitting command) against that head SHA. The query covers every check on the head SHA for every PR, whether or not branch protection marks the check as required. `gh` is the only sanctioned channel for querying GitHub Actions state.
|
|
293
|
+
|
|
294
|
+
No-checks rule: when `gh pr checks` fails with a `no checks reported` error, that error is never treated as green for any PR. On a non-epic PR the gate stays `pending` and step 4 continues the bounded poll. On an epic child, step 3 runs the parser with `-ChecksJson '[]'` and `-RequireWorkflow CI`, which returns `pending`. The parser is never run with `-ChecksJson '[]'` without `-RequireWorkflow CI`, because its default path returns `success` for an empty set.
|
|
295
|
+
|
|
296
|
+
Epic-child rule: when the PR base branch is an `epic/<slug>-integration` branch (checkpoint `epic_mode` is `true`), the step 2 query is the same unfiltered query; integration branches carry no required-status-check protection. An empty check list is not accepted as green for such a PR: the gate must observe at least one check whose `workflow` is `CI` against the child head SHA, and every observed `CI` check must succeed before `ci_gate.conclusion` is accepted as `success`. Every check returned by the unfiltered query counts: a failing or cancelled non-`CI` check fails the gate, and a pending one keeps it pending. Step 3 enforces this rule by passing `-RequireWorkflow CI` to the parser, which never returns `success` until at least one passing `CI` check is observed. When `gh pr checks` fails with a `no checks reported` error on the child branch, step 3 runs the parser with `-ChecksJson '[]'`; that error is never treated as green, and the parser returns `pending` for it.
|
|
297
|
+
|
|
298
|
+
3. Parse the JSON by running `pwsh -NoProfile -File .claude/lib/ci-gate/Invoke-CiGateParser.ps1 -ChecksJson <checks-json> -HeadSha <head-sha>`, appending `-RequireWorkflow CI` when `epic_mode` is `true`. The parser emits the `ci_gate` object defined below and derives `ci_gate.conclusion` over the queried checks (every check on the PR head SHA, for every PR): `success` when every queried check passed or was skipped, `failure` when any queried check failed or was cancelled, and `pending` when any queried check is still in progress. With `-RequireWorkflow CI`, the parser returns `pending` instead of `success` until at least one check whose `workflow` is `CI` has passed.
|
|
291
299
|
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.
|
|
292
300
|
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.
|
|
293
301
|
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.
|
|
@@ -301,7 +309,7 @@ DONE is not written while `step9_status` is anything other than `passed`.
|
|
|
301
309
|
The orchestrator checkpoint (`artifacts/orchestration/orchestrator-state.json`) is extended with:
|
|
302
310
|
|
|
303
311
|
- a top-level `ci_gate` object containing:
|
|
304
|
-
- `head_sha` — the PR head SHA that the
|
|
312
|
+
- `head_sha` — the PR head SHA that the queried checks were observed against.
|
|
305
313
|
- `pr_pipeline_run_id` — the GitHub Actions run id for the PR Pipeline.
|
|
306
314
|
- `pr_pipeline_run_url` — the URL of that run.
|
|
307
315
|
- `conclusion` — one of `success`, `failure`, `pending`.
|
|
@@ -336,7 +344,7 @@ A checkpoint that predates this schema and has no `ci_gate` object (or no `step9
|
|
|
336
344
|
|
|
337
345
|
## Remediation Loop — CI-Failure Handling
|
|
338
346
|
|
|
339
|
-
When S9 records `step9_status: "failed_remediation_required"` (a failed
|
|
347
|
+
When S9 records `step9_status: "failed_remediation_required"` (a failed check; a poll timeout follows the wait branch per S9 step 4):
|
|
340
348
|
|
|
341
349
|
1. The failed-check log from `gh run view <run-id> --log-failed` is written as `remediation-inputs.<timestamp>.md` in the active feature folder.
|
|
342
350
|
2. The failure is converted to a synthetic finding with severity `Blocking` that identifies the failing check by name and the failing job by URL.
|
|
@@ -438,6 +446,6 @@ Example:
|
|
|
438
446
|
|
|
439
447
|
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.
|
|
440
448
|
|
|
441
|
-
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
|
|
449
|
+
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)`.
|
|
442
450
|
|
|
443
451
|
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.
|
|
@@ -56,7 +56,21 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
|
|
|
56
56
|
contract for parallel admission. Preparation yields the item's DECLARED blast radius, and only
|
|
57
57
|
the planner-computed declared radius is authoritative for scheduling. The item's lifecycle
|
|
58
58
|
advances `proposed` -> `admitted` -> `prepared` during this step, recorded as item-state updates in
|
|
59
|
-
`items[]` with the checkpoint's lifecycle timestamps.
|
|
59
|
+
`items[]` with the checkpoint's lifecycle timestamps. After the admitted item's preflight
|
|
60
|
+
clearance, perform the `parallel-plan` skill's `## Complexity Assessment` procedure for it, and
|
|
61
|
+
record the resulting `complexity_band` on the admitted orchestrator-checkpoint item so step 3's
|
|
62
|
+
edge derivation and the parent's model routing read the same band.
|
|
63
|
+
The admitted item records `complexity_band` and no `model_routing_receipt`; the parent resolves
|
|
64
|
+
the item's model from that band at spawn time per `parallel-orchestrate` `## Model Selection`.
|
|
65
|
+
For an issue-number item, the preparation delegation prompt carries the issue-adoption line used
|
|
66
|
+
by `/parallel-plan` `## Preparation Fan-Out`, quoted verbatim: `Issue adoption: this item's GitHub
|
|
67
|
+
issue already exists. Verify it read-only (gh issue view), do not call potential_to_issue or the
|
|
68
|
+
promotion-entry tool, and record a top-level issue_adoption object in the checkpoint per
|
|
69
|
+
.claude/rules/orchestrator-state.md with origin filed_before_orchestration (or transferred when
|
|
70
|
+
the issue was transferred), waiving potential_to_issue and the promotion-entry tool for the
|
|
71
|
+
checkpoint's promotion-type. When a lifecycle record for the item exists under
|
|
72
|
+
docs/features/potential/promoted/, cite it as potential_record.` The line is omitted for a
|
|
73
|
+
potential-entry item, whose child promotes it.
|
|
60
74
|
|
|
61
75
|
3. **Compute conflict edges over ALL items, including in-flight ones.** Invoke the scheduling
|
|
62
76
|
entry point Get-BlastRadiusConflictEdge from the destination-runtime PowerShell port
|
|
@@ -91,17 +105,28 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
|
|
|
91
105
|
barrier, and the later-merging item merges `origin/main` under the existing per-item
|
|
92
106
|
merge-conflict handling and re-passes CI before it merges.
|
|
93
107
|
|
|
94
|
-
4. **Decide admission.** Call
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
-
|
|
108
|
+
4. **Decide admission.** Call the bundled entry point, which needs no Python interpreter:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
bash .claude/lib/bash/mutate-parallel-run.sh admit --candidate <key> --edges "<a>:<b> ..." --in-flight "<k> ..." --current-cohort-members "<k> ..."
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
`--edges` carries the step-3 conflict edges over ALL items, `--in-flight` the in-flight (pinned)
|
|
115
|
+
keys, and `--current-cohort-members` the full current-cohort membership. The command prints one
|
|
116
|
+
JSON object whose `outcome` field is one of:
|
|
117
|
+
- `admit_current_cohort` — the candidate shares no edge with any member of the current cohort,
|
|
98
118
|
pinned or unstarted. Admit it into the current cohort. NO recompute occurs and
|
|
99
119
|
`recolor_generation` is unchanged — precisely because the candidate conflicts with no
|
|
100
120
|
current-cohort member, so no cohort assignment needs to change.
|
|
101
|
-
- `
|
|
102
|
-
cohort, pinned or not-yet-launched. Defer it to a future cohort and recolor
|
|
103
|
-
|
|
104
|
-
|
|
121
|
+
- `defer_and_recolor` — the candidate shares an edge with at least one member of the current
|
|
122
|
+
cohort, pinned or not-yet-launched. Defer it to a future cohort and recolor through the
|
|
123
|
+
bundled entry point:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
bash .claude/lib/bash/mutate-parallel-run.sh recolor --unstarted "<k> ..." --edges "<a>:<b> ..." --pinned "<k> ..." --generation <g> --current-cohort <c> --highest-pinned-cohort <h>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
`--highest-pinned-cohort` is derived from re-verified durable state: the highest
|
|
105
130
|
current-generation cohort index occupied by any in-flight item.
|
|
106
131
|
The recolor is a recompute: `recolor_generation` increments by exactly one, and it places every
|
|
107
132
|
unstarted item at an index at or above `current_cohort`, strictly above
|
|
@@ -125,8 +150,9 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
|
|
|
125
150
|
with an unstarted item OUTSIDE the current cohort does not defer: the cohort barrier keeps the
|
|
126
151
|
two from running concurrently, so the coloring's existing separation already resolves it.
|
|
127
152
|
|
|
128
|
-
5. **Apply the recolor result.** Write `
|
|
129
|
-
the top-level `recolor_generation` to `
|
|
153
|
+
5. **Apply the recolor result.** Write the recolor output field `cohort_assignments` into
|
|
154
|
+
`cohorts[]` and set the top-level `recolor_generation` to the output field `generation`. The
|
|
155
|
+
result's key set equals the
|
|
130
156
|
unstarted set exactly and contains no pinned key: no in-flight item changes cohort or state as a
|
|
131
157
|
result of this admission. Verify that before writing, and stop rather than write a result that
|
|
132
158
|
names a pinned key. The admit branch performs no recolor at all, precisely because the candidate
|
|
@@ -141,8 +167,17 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
|
|
|
141
167
|
values to be unique (`scripts/dev_tools/_parallel_state_structures.py:282-305` — duplicate-index
|
|
142
168
|
detection at 282-293, error emission at 301-305).
|
|
143
169
|
|
|
144
|
-
6. **Append exactly one `mutations[]` entry**, at admission-decision time, built by
|
|
145
|
-
`
|
|
170
|
+
6. **Append exactly one `mutations[]` entry**, at admission-decision time, built by the bundled
|
|
171
|
+
entry point. Run the first line on the admit branch (`--deferred false`) and the second on the
|
|
172
|
+
defer branch (`--deferred true`):
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
bash .claude/lib/bash/mutate-parallel-run.sh add-entry --item <key> --deferred false --generation <g> --at <timestamp>
|
|
176
|
+
bash .claude/lib/bash/mutate-parallel-run.sh add-entry --item <key> --deferred true --generation <g> --at <timestamp>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`--generation` is the run's generation before this admission, read before any step-5 recolor;
|
|
180
|
+
the printed entry stamps it unchanged or plus one per the table below:
|
|
146
181
|
|
|
147
182
|
| Case | `op` | `item_key` | `prior_state` | `new_state` | `disposition` | `recolor_generation` |
|
|
148
183
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
@@ -152,7 +187,8 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
|
|
|
152
187
|
`prior_state` is null on BOTH add rows. The accompanying `prepared` -> `scheduled` transition is
|
|
153
188
|
not lost and is not recorded in the mutation entry: it is recorded as an item-state update in
|
|
154
189
|
`items[]`, the same mechanism that records `proposed` -> `admitted` -> `prepared` in step 2. The
|
|
155
|
-
`at` timestamp
|
|
190
|
+
`at` timestamp is supplied through `--at`; when `--at` is omitted the entry point stamps the
|
|
191
|
+
current UTC minute.
|
|
156
192
|
|
|
157
193
|
7. **Validate the checkpoint** before treating the admission as applied. Run the
|
|
158
194
|
`validate_orchestration_artifacts` MCP tool with `artifact_type:
|
|
@@ -168,6 +204,8 @@ re-derivation is mandatory and is not an optimization to skip when the checkpoin
|
|
|
168
204
|
and `benefit` (tolerated-not-validated, returned by the scheduling entry point), and no reason
|
|
169
205
|
member is added: the four `conflict_edges[].reason` members are unchanged. The nine parallel
|
|
170
206
|
enums are owned by `.claude/rules/parallel-orchestration.md` and are consumed, never extended.
|
|
207
|
+
The `complexity_band` recorded in step 2 is not a new field: it is an existing scheduling field
|
|
208
|
+
read by drift re-scheduling.
|
|
171
209
|
- This operation never moves, restates, or re-derives an in-flight item's cohort or state.
|
|
172
210
|
- This operation performs no destructive side effect: it closes no pull request and removes no
|
|
173
211
|
worktree. Those belong to `/parallel-remove` with `--disposition abandon`.
|
|
@@ -45,24 +45,37 @@ which is exactly what the gate exists to prevent. The re-derivation is mandatory
|
|
|
45
45
|
|
|
46
46
|
1. Re-derive durable state as above and resolve the run's `items[]`.
|
|
47
47
|
|
|
48
|
-
2. **Gate the close on no item being in flight.**
|
|
49
|
-
|
|
50
|
-
carrying EVERY in-flight key, so the rejection names all the work that must finish first rather
|
|
51
|
-
than one item at a time. On rejection: report the blocking keys and stop. A rejected close
|
|
52
|
-
appends NO `mutations[]` entry and makes NO state change — do not record the attempt.
|
|
48
|
+
2. **Gate the close on no item being in flight.** Pass every re-derived item, as one
|
|
49
|
+
`<key>:<state>` token each, to the bundled entry point, which needs no Python interpreter:
|
|
53
50
|
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
```bash
|
|
52
|
+
bash .claude/lib/bash/mutate-parallel-run.sh close --items "<k>:<state> ..."
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Exit 0 (stdout `{"close_permitted":true}`) permits the close. Exit 1 rejects it and prints one
|
|
56
|
+
stderr line naming EVERY in-flight key, so the rejection names all the work that must finish
|
|
57
|
+
first rather than one item at a time. On rejection: report the blocking keys and stop. A
|
|
58
|
+
rejected close appends NO `mutations[]` entry and makes NO state change — do not record the
|
|
59
|
+
attempt.
|
|
60
|
+
|
|
61
|
+
3. **Append exactly one run-scoped `mutations[]` entry** for a successful close, built by the
|
|
62
|
+
bundled entry point:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
bash .claude/lib/bash/mutate-parallel-run.sh close-entry --generation <g> --at <timestamp>
|
|
66
|
+
```
|
|
56
67
|
|
|
57
68
|
| Case | `op` | `item_key` | `prior_state` | `new_state` | `disposition` | `recolor_generation` |
|
|
58
69
|
| --- | --- | --- | --- | --- | --- | --- |
|
|
59
70
|
| Close | `close` | null (run-scoped) | null | null | null | `g` (unchanged) |
|
|
60
71
|
|
|
61
72
|
The entry is run-scoped, so `item_key` is null: the close acts on the run, not on an item. The
|
|
62
|
-
`at` timestamp
|
|
73
|
+
`at` timestamp is supplied through `--at`; when `--at` is omitted the entry point stamps the
|
|
74
|
+
current UTC minute.
|
|
63
75
|
|
|
64
76
|
4. **Do not recompute.** Run termination changes no cohort assignment, so `recolor_generation` is
|
|
65
|
-
UNCHANGED and `cohorts[]` is not rewritten.
|
|
77
|
+
UNCHANGED and `cohorts[]` is not rewritten.
|
|
78
|
+
Do not run the `recolor` subcommand as part of a close.
|
|
66
79
|
|
|
67
80
|
5. **Stop admitting.** After the close is recorded, the run accepts no further `/parallel-add`. The
|
|
68
81
|
close record is the run's final mutation; nothing may be appended to `mutations[]` after it.
|
|
@@ -256,12 +256,40 @@ carries exactly these five elements.
|
|
|
256
256
|
execution from that plan rather than re-running promotion, research, or planning. The item's
|
|
257
257
|
prepared feature folder and approved atomic plan are already committed and preflight-clear on the
|
|
258
258
|
item's own pushed feature branch.
|
|
259
|
+
The execution child starts a new checkpoint in its own worktree, and the preparation checkpoint
|
|
260
|
+
does not carry over, so the prompt also instructs the child to verify the item's GitHub issue
|
|
261
|
+
read-only (gh issue view), not to call `potential_to_issue` or the promotion-entry tool, and to
|
|
262
|
+
record its own top-level `issue_adoption` object per `.claude/rules/orchestrator-state.md`,
|
|
263
|
+
with origin `filed_before_orchestration` unless the issue was transferred, waiving
|
|
264
|
+
`potential_to_issue` and the promotion-entry tool for the checkpoint's promotion-type. When a
|
|
265
|
+
lifecycle record for the item exists under `docs/features/potential/promoted/`, the child cites
|
|
266
|
+
it as `potential_record`.
|
|
259
267
|
5. The model-budget marker line `model_budget.fable_policy: <disabled|available|preferred>.`
|
|
260
268
|
|
|
261
269
|
Spawn parameters, passed on the `Agent` call and never written into the prompt text:
|
|
262
270
|
`isolation: "worktree"`, `run_in_background: true`, branch base `origin/main`, and `model` equal to
|
|
263
271
|
that item's model routing receipt's resolved model.
|
|
264
272
|
|
|
273
|
+
**Band and receipt source.** The parent reads each item's `complexity_band` and
|
|
274
|
+
`model_routing_receipt` from the planner checkpoint `artifacts/orchestration/parallel-planner-state.json`.
|
|
275
|
+
When the planner checkpoint is unavailable, the committed kickoff artifact's `## Item Summary`
|
|
276
|
+
`complexity` column is the fallback band source. The parent passes `model` equal to the receipt's
|
|
277
|
+
`model` when the run's `fable_policy` equals the receipt's `fable_policy`; otherwise it re-resolves
|
|
278
|
+
with `Resolve-DelegationModel -Agent orchestrator -Band <band> -FablePolicy <run fable_policy>` and
|
|
279
|
+
passes that result.
|
|
280
|
+
An item admitted through `/parallel-add` appears neither in the planner checkpoint
|
|
281
|
+
`artifacts/orchestration/parallel-planner-state.json` `items[]` nor in the kickoff
|
|
282
|
+
`## Item Summary`; for such an item the band source is that item's `complexity_band` on the
|
|
283
|
+
orchestrator checkpoint `artifacts/orchestration/parallel-orchestrator-state.json` `items[]`. An
|
|
284
|
+
admitted item carries no `model_routing_receipt`, so the parent resolves `model` at spawn time as
|
|
285
|
+
`model_policy.complexity_to_model[<band>]` from `config/orchestration-routing.json` under the
|
|
286
|
+
run's `fable_policy`, with `fable` clamped to `opus` when `fable_policy` is `disabled`. That result
|
|
287
|
+
equals `Resolve-DelegationModel -Agent orchestrator -Band <band> -FablePolicy <run fable_policy>`
|
|
288
|
+
because `preferred_overlay.agents` does not include `orchestrator`. The parent passes that explicit
|
|
289
|
+
`model` on the spawn rather than relying on the frontmatter default, and it stops rather than
|
|
290
|
+
spawning without `model` when the admitted item has no `complexity_band` on the orchestrator
|
|
291
|
+
checkpoint.
|
|
292
|
+
|
|
265
293
|
Negative obligations on the prompt:
|
|
266
294
|
|
|
267
295
|
- It never carries `Preparation mode: true`. Preparation fan-out belongs to `parallel-planner` and
|
|
@@ -301,6 +329,27 @@ omitted `model` falls back to the delegate's frontmatter default, `opus`, which
|
|
|
301
329
|
`fable` resolution — and MUST NOT hard-code `model=opus` in a way that overrides the resolved
|
|
302
330
|
routing model.
|
|
303
331
|
|
|
332
|
+
The band and receipt for each item come from the planner checkpoint
|
|
333
|
+
`artifacts/orchestration/parallel-planner-state.json`: the parent reads the item's `complexity_band`
|
|
334
|
+
and `model_routing_receipt` there. When the planner checkpoint is unavailable, the committed kickoff
|
|
335
|
+
artifact's `## Item Summary` `complexity` column is the fallback band source. The parent passes
|
|
336
|
+
`model` equal to the receipt's `model` when the run's `fable_policy` equals the receipt's
|
|
337
|
+
`fable_policy`; otherwise it re-resolves with
|
|
338
|
+
`Resolve-DelegationModel -Agent orchestrator -Band <band> -FablePolicy <run fable_policy>` and
|
|
339
|
+
passes that result.
|
|
340
|
+
An item admitted through `/parallel-add` appears neither in the planner checkpoint
|
|
341
|
+
`artifacts/orchestration/parallel-planner-state.json` `items[]` nor in the kickoff
|
|
342
|
+
`## Item Summary`; for such an item the band source is that item's `complexity_band` on the
|
|
343
|
+
orchestrator checkpoint `artifacts/orchestration/parallel-orchestrator-state.json` `items[]`. An
|
|
344
|
+
admitted item carries no `model_routing_receipt`, so the parent resolves `model` at spawn time as
|
|
345
|
+
`model_policy.complexity_to_model[<band>]` from `config/orchestration-routing.json` under the
|
|
346
|
+
run's `fable_policy`, with `fable` clamped to `opus` when `fable_policy` is `disabled`. That result
|
|
347
|
+
equals `Resolve-DelegationModel -Agent orchestrator -Band <band> -FablePolicy <run fable_policy>`
|
|
348
|
+
because `preferred_overlay.agents` does not include `orchestrator`. The parent passes that explicit
|
|
349
|
+
`model` on the spawn rather than relying on the frontmatter default, and it stops rather than
|
|
350
|
+
spawning without `model` when the admitted item has no `complexity_band` on the orchestrator
|
|
351
|
+
checkpoint.
|
|
352
|
+
|
|
304
353
|
`route` is never an input to model selection. `route` remains file-count driven and governs only
|
|
305
354
|
agents, skills, and MCP tools. A skill whose frontmatter `context` field holds the value `fork`
|
|
306
355
|
inherits the parent model and ignores a model override, so model selection applies to agent
|
|
@@ -324,11 +373,16 @@ Procedure, per item:
|
|
|
324
373
|
1. The item's child orchestration runs unmodified, with `epic_mode` `false` or absent, and finishes
|
|
325
374
|
at its own DONE. The child's PR Creation Gate condition 6 already requires
|
|
326
375
|
`ci_gate.conclusion == "success"`, so at child DONE the item's pull request is open against
|
|
327
|
-
`main` and its
|
|
376
|
+
`main` and every check on its head SHA passed or was skipped. The child is never instructed to
|
|
377
|
+
merge its own pull request.
|
|
328
378
|
2. On child completion, durably confirm pull-request state and check conclusion with
|
|
329
|
-
`gh pr view --json state,mergedAt,headRefOid
|
|
330
|
-
|
|
331
|
-
`
|
|
379
|
+
`gh pr view --json state,mergedAt,headRefOid` and an unconditional re-read of every check on
|
|
380
|
+
that head, never from an in-memory completion notification or from the child's DONE report
|
|
381
|
+
alone. Run `gh pr checks <PR> --json bucket,name,state,link,workflow` and parse its output with
|
|
382
|
+
`pwsh -NoProfile -File .claude/lib/ci-gate/Invoke-CiGateParser.ps1 -ChecksJson <checks-json> -HeadSha <headRefOid>`.
|
|
383
|
+
Record `merge_status: ci_green` only when that parser conclusion is `success`; on `failure` or
|
|
384
|
+
`pending`, or when `gh pr checks` fails with a "no checks reported" error, do not record
|
|
385
|
+
`merge_status: ci_green` and do not run `gh pr merge`.
|
|
332
386
|
Before recording `merge_status: ci_green`, confirm that the `headRefOid` value equals the
|
|
333
387
|
`ci_gate.head_sha` the child reported at DONE and that the child reported no pending
|
|
334
388
|
CI-dependent acceptance criteria. When either check fails, do not record
|
|
@@ -613,9 +667,10 @@ Every mutation re-derives durable state (`git worktree list --porcelain`, `git b
|
|
|
613
667
|
`gh pr view`) before it is applied, because the checkpoint is a cache of durable state and not the
|
|
614
668
|
source of truth. A rejected mutation appends no entry and changes no state.
|
|
615
669
|
|
|
616
|
-
The decision logic for all three commands
|
|
617
|
-
`
|
|
618
|
-
|
|
670
|
+
The decision logic for all three commands runs through the bundled bash entry points, which need no
|
|
671
|
+
Python interpreter: `bash .claude/lib/bash/mutate-parallel-run.sh` for add, close, and requeue, and
|
|
672
|
+
`bash .claude/lib/bash/remove-parallel-item.sh` for remove. They decide; they never apply. Item
|
|
673
|
+
keys are integers (`items[].issue_num`) everywhere on this surface.
|
|
619
674
|
|
|
620
675
|
### Pinning invariant
|
|
621
676
|
|
|
@@ -719,8 +774,9 @@ lost and is not recorded in the mutation entry: it is recorded as an item-state
|
|
|
719
774
|
with the checkpoint's lifecycle timestamps, the same mechanism that records
|
|
720
775
|
`proposed` -> `admitted` -> `prepared` during preparation. `new_state` is null for `close` only, and
|
|
721
776
|
`item_key` is null for `close` only. `disposition` is non-null only on a `remove` entry whose
|
|
722
|
-
`prior_state` is `in_flight`. Every `at` timestamp
|
|
723
|
-
|
|
777
|
+
`prior_state` is `in_flight`. Every `at` timestamp is supplied by the caller through `--at`; an
|
|
778
|
+
entry point reads the clock only when `--at` is omitted, and then stamps the current UTC minute. No
|
|
779
|
+
field and no enum member is added to `mutations[]`; the nine
|
|
724
780
|
parallel enums of `.claude/rules/parallel-orchestration.md` are consumed, never extended.
|
|
725
781
|
|
|
726
782
|
Retrospective validation of the log is the helper
|
|
@@ -768,18 +824,25 @@ command to evade the match: that defeats the only mechanism protecting a destruc
|
|
|
768
824
|
### Drift-requeue append contract
|
|
769
825
|
|
|
770
826
|
Radius drift detection consumes this protocol rather than reimplementing it. When drift halts the
|
|
771
|
-
later-started item of a newly conflicting pair, the requeue is recorded through the
|
|
772
|
-
|
|
827
|
+
later-started item of a newly conflicting pair, the requeue is recorded through the `requeue-entry`
|
|
828
|
+
subcommand of the bundled entry point and the recolor through its `recolor` subcommand:
|
|
829
|
+
|
|
830
|
+
```bash
|
|
831
|
+
bash .claude/lib/bash/mutate-parallel-run.sh requeue-entry --item <key> --generation <g> --at <timestamp>
|
|
832
|
+
```
|
|
773
833
|
|
|
774
834
|
- Item state becomes `blocked` and per-item `merge_status` becomes `blocked_drift`.
|
|
775
835
|
- Exactly one `mutations[]` entry is appended with `op: requeue`, `prior_state: in_flight`,
|
|
776
836
|
`new_state: blocked`, `disposition: null`, and `recolor_generation` equal to `g` + 1 — the requeue
|
|
777
837
|
is a recompute.
|
|
778
|
-
- The recolor runs over the unstarted subgraph only, so no other in-flight item moves.
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
838
|
+
- The recolor runs over the unstarted subgraph only, so no other in-flight item moves. Run it as:
|
|
839
|
+
|
|
840
|
+
```bash
|
|
841
|
+
bash .claude/lib/bash/mutate-parallel-run.sh recolor --unstarted "<k> ..." --edges "<a>:<b> ..." --pinned "<k> ..." --generation <g> --current-cohort <c> --highest-pinned-cohort <h>
|
|
842
|
+
```
|
|
843
|
+
|
|
844
|
+
where `--current-cohort` and `--highest-pinned-cohort` are both required.
|
|
845
|
+
`--highest-pinned-cohort` is derived from re-verified durable state: the highest
|
|
783
846
|
current-generation cohort index occupied by any in-flight item.
|
|
784
847
|
|
|
785
848
|
The drift event itself is recorded in `drift_events[]`, which this protocol does not write. See
|
|
@@ -42,6 +42,11 @@ identical forms.
|
|
|
42
42
|
- **Promotion.** Unpromoted items are promoted by their own preparation-mode child, not by the
|
|
43
43
|
planner. The `preparation` route already carries the promotion MCP tools (`new_potential_entry`,
|
|
44
44
|
`potential_to_issue`, `new_active_feature_folder`).
|
|
45
|
+
- **Issue adoption.** Issue-number items are adopted, not promoted. The item's GitHub issue
|
|
46
|
+
already exists, so its preparation child verifies the issue read-only and records a top-level
|
|
47
|
+
`issue_adoption` object in its checkpoint instead of calling `potential_to_issue` or the
|
|
48
|
+
promotion-entry tool. The delegation prompt carries that instruction as the issue-adoption line
|
|
49
|
+
under `## Preparation Fan-Out`.
|
|
45
50
|
- **`issue_num` resolution.** `issue_num` is the primary key for every item reference. It is known
|
|
46
51
|
at intake for issue-number items. For potential-entry items, record negative placeholders in
|
|
47
52
|
intake order (`-1`, `-2`, ...) and back-fill the real number from each child's promotion receipt
|
|
@@ -102,11 +107,13 @@ invocations after the initial plan. Use `/parallel-plan` for intake and `/parall
|
|
|
102
107
|
admit an item into a run that is already in flight.
|
|
103
108
|
|
|
104
109
|
Each delegation prompt includes this literal kickoff line, followed by the model-budget marker
|
|
105
|
-
line:
|
|
110
|
+
line and, for an issue-number item only, the issue-adoption line:
|
|
106
111
|
|
|
107
112
|
> `Preparation mode: true. route_id: preparation. parallel_slug: <slug>. Perform promotion, research, feature documents (spec.md, user-story.md), atomic planning, and preflight clearance only. Atomic execution, PR authoring, and CI monitoring are out of scope for this run and are executed later by parallel-orchestrator. After the atomic-executor preflight returns PREFLIGHT: ALL CLEAR, commit the feature folder and plan to the current branch, push the current branch to origin, set out-of-scope step statuses to not-applicable, set next_step to S5_atomic_execution, and stop, reporting the plan-path and preflight status.`
|
|
108
113
|
>
|
|
109
114
|
> `model_budget.fable_policy: <disabled|available|preferred>.`
|
|
115
|
+
>
|
|
116
|
+
> `Issue adoption: this item's GitHub issue already exists. Verify it read-only (gh issue view), do not call potential_to_issue or the promotion-entry tool, and record a top-level issue_adoption object in the checkpoint per .claude/rules/orchestrator-state.md with origin filed_before_orchestration (or transferred when the issue was transferred), waiving potential_to_issue and the promotion-entry tool for the checkpoint's promotion-type. When a lifecycle record for the item exists under docs/features/potential/promoted/, cite it as potential_record.`
|
|
110
117
|
|
|
111
118
|
Properties of that line, each individually load-bearing:
|
|
112
119
|
|
|
@@ -128,6 +135,13 @@ does not apply to preparation. It contains no `Parallel mode: true`, so F7's fut
|
|
|
128
135
|
hook, which matches that marker, will not gate preparation either. Both omissions are intentional
|
|
129
136
|
and must be preserved verbatim when the line is emitted.
|
|
130
137
|
|
|
138
|
+
**Issue-adoption line.** The issue-adoption line is emitted only for an issue-number item, after
|
|
139
|
+
the model-budget marker line, and is omitted for a potential-entry item, whose child promotes it.
|
|
140
|
+
The line carries no mode marker, no digits, and no active feature-folder path, so hook target
|
|
141
|
+
resolution and mode classification are unchanged. The preparation checkpoint does not carry over
|
|
142
|
+
to execution, so the execution child records its own adoption (see
|
|
143
|
+
`.claude/skills/parallel-orchestrate/SKILL.md`, kickoff element 4).
|
|
144
|
+
|
|
131
145
|
**No edit to shared surfaces.** No edit is made to `.claude/skills/orchestrate/SKILL.md` or to
|
|
132
146
|
`config/orchestration-routing.json`, including the `preparation` route. The route mechanism is
|
|
133
147
|
marker-driven; the child contract's "commit ... to the current branch" wording is satisfied by a
|
|
@@ -135,8 +149,9 @@ branch created off `origin/main`; and `routes.preparation` declares no epic-spec
|
|
|
135
149
|
agent, skill, or MCP tool.
|
|
136
150
|
|
|
137
151
|
**Collected per child at termination:** `plan-path`, preflight status, the promotion receipt (the
|
|
138
|
-
`issue_num` back-fill source
|
|
139
|
-
|
|
152
|
+
`issue_num` back-fill source for a potential-entry item) or, for an issue-number item, the
|
|
153
|
+
`issue_adoption` record from the child checkpoint, the model-routing receipt with
|
|
154
|
+
`agent: "orchestrator"`, the topology receipt, `branch_name`, and `worktree_path`. There is no fan-in merge step: the planner
|
|
140
155
|
fetches and records each pushed item branch, back-fills `issue_num` into the manifest on
|
|
141
156
|
`parallel/<slug>-plan`, and updates the checkpoint.
|
|
142
157
|
|
|
@@ -276,6 +291,44 @@ concurrently.
|
|
|
276
291
|
Derivation, the V1-V3 rules, and the contention relation are implemented upstream. This skill calls
|
|
277
292
|
them; it defines none of them.
|
|
278
293
|
|
|
294
|
+
## Complexity Assessment
|
|
295
|
+
|
|
296
|
+
**Assessment point.** Assess each item's complexity band after the item is `prepared` — its
|
|
297
|
+
preflight status is `PREFLIGHT: ALL CLEAR` and its `declared` radius is V1/V2-clear — and before
|
|
298
|
+
cohort seeding, which consumes the band through the scheduling entry point. The parallel parent
|
|
299
|
+
reads the same band to choose the `model` of that item's `Agent(orchestrator)` spawn, so an item
|
|
300
|
+
without a band cannot be routed.
|
|
301
|
+
|
|
302
|
+
**Signals and scale.** Read the signal catalog and the band scale from `model_policy` in
|
|
303
|
+
`config/orchestration-routing.json`. Record every signal the item's approved plan and spec exhibit
|
|
304
|
+
in `signals_present`, then choose a band from the scale.
|
|
305
|
+
|
|
306
|
+
**Floor.** Compute the floor with `Get-ComplexityFloor -SignalsPresent <signals>` from
|
|
307
|
+
`.claude/lib/model-routing/ModelRouting.psm1` in PowerShell, or `compute_complexity_floor(signals)`
|
|
308
|
+
in Python. The chosen band must be at or above the floor; the floor is a lower bound only.
|
|
309
|
+
|
|
310
|
+
**Model resolution.** Resolve the child model with
|
|
311
|
+
`Resolve-DelegationModel -Agent orchestrator -Band <band> -FablePolicy <fable_policy>` from the same
|
|
312
|
+
module, or `resolve_delegation_model("orchestrator", band, fable_policy)` in Python, using the
|
|
313
|
+
run's `model_budget.fable_policy`.
|
|
314
|
+
|
|
315
|
+
**Per-item record.** Write three fields on the item:
|
|
316
|
+
|
|
317
|
+
- `complexity_band` — one of `C1`, `C2`, `C3`, `C4`.
|
|
318
|
+
- `complexity_assessment` — `{ band, floor, signals_present, rationale, assessed_at }`, where `band`
|
|
319
|
+
equals `complexity_band`, `floor` is the computed floor, `rationale` is a non-empty string, and
|
|
320
|
+
`assessed_at` is a non-empty ISO-8601 string.
|
|
321
|
+
- `model_routing_receipt` — `{ agent: "orchestrator", phase, complexity_band, fable_policy,
|
|
322
|
+
table_model, clamped_from, model }`, copied from the resolver output, with `complexity_band`
|
|
323
|
+
equal to the item's band.
|
|
324
|
+
|
|
325
|
+
The kickoff artifact's `## Item Summary` `complexity` cell for the item equals its
|
|
326
|
+
`complexity_band`.
|
|
327
|
+
|
|
328
|
+
**Routing input, not a verdict.** The band is a routing input for model selection and edge
|
|
329
|
+
derivation. It is distinct from the deliberately absent worthiness verdict: assessing a band never
|
|
330
|
+
admits, rejects, or reorders an item.
|
|
331
|
+
|
|
279
332
|
## Cohort Seeding
|
|
280
333
|
|
|
281
334
|
Reach cohort computation through the **destination-runtime bash entry point** under
|
|
@@ -448,7 +501,8 @@ Top-level fields: `objective`, `parallel_slug`, `parallel_manifest_path`, `mode`
|
|
|
448
501
|
`last_updated`. F3's landed required-key set (planner invariant P1) is a strict subset of this
|
|
449
502
|
list, and `plan_home_branch` is a permitted additional field.
|
|
450
503
|
|
|
451
|
-
Per item: `issue_num`, `feature_folder`, `kind`, `state`, `complexity_band`, `
|
|
504
|
+
Per item: `issue_num`, `feature_folder`, `kind`, `state`, `complexity_band`, `complexity_assessment`,
|
|
505
|
+
`preparation_status`,
|
|
452
506
|
`research_path`, `plan_path`, `preflight_status`, `branch_name`, `worktree_path`, `blast_radius`
|
|
453
507
|
(with `source: "declared"`), `radius_validation` (the `v1`, `v2`, and `v3` results with their
|
|
454
508
|
severities), `model_routing_receipt`, and `topology_receipt`.
|
|
@@ -461,8 +515,10 @@ blast-radius overlap.
|
|
|
461
515
|
`require_ready_for_execution` gate: at least two items (invariant P6); every item
|
|
462
516
|
`preparation_status: prepared` with `preflight_status` exactly `PREFLIGHT: ALL CLEAR`, non-empty
|
|
463
517
|
`research_path` and `plan_path`, and `blast_radius.source == "declared"` (P7); `next_step` exactly
|
|
464
|
-
the ready sentinel `PARALLEL_EXECUTION_READY` (P8);
|
|
465
|
-
`artifacts/orchestration/parallel-kickoff-<slug>.md` (P9)
|
|
518
|
+
the ready sentinel `PARALLEL_EXECUTION_READY` (P8); `kickoff_prompt_path` exactly
|
|
519
|
+
`artifacts/orchestration/parallel-kickoff-<slug>.md` (P9); and every item carries a valid
|
|
520
|
+
`complexity_band`, a `complexity_assessment`, and a `model_routing_receipt` with
|
|
521
|
+
`agent: "orchestrator"` that agree with the band (P10).
|
|
466
522
|
|
|
467
523
|
**Git integrity is F4-owned.** F3's `require_ready_for_execution` gate is structural only, so
|
|
468
524
|
verifying that each item's committed plan blob exists on that item's pushed branch ref — and that
|
|
@@ -595,7 +651,7 @@ With no ready feature checkpoint, the exemption admits two attribution-trailer f
|
|
|
595
651
|
- The trailer option: `git commit -m 'docs: plan' --trailer 'Co-Authored-By: Name <email>' --trailer 'Claude-Session: <url>' -- <exempt paths>`. The separate-value form and the `--trailer=<value>` form are both admitted, any number of times, on `git commit` only; `git add --trailer` and a trailer option with no value are denied. Git writes every trailer value into one trailer block.
|
|
596
652
|
- The one-paragraph multi-message form: the subject in the first `-m` and every trailer in one single-quoted second `-m` value, separated by a literal newline. Each `-m` value becomes its own paragraph and git parses only the last paragraph as the trailer block, so trailers split across separate `-m` values do not form one trailer block.
|
|
597
653
|
|
|
598
|
-
Quoting rules: `$` and backtick are literal and admitted inside single quotes, and denied outside quotes and inside double quotes, where the shell expands them. `<` and `>` are admitted inside single or double quotes and denied outside quotes. An unquoted `#` is denied anywhere, because it starts a shell comment that the exemption does not model; a `#` inside quotes is admitted. A typographic quote character (U+2018 to U+201E) anywhere in the command line is denied, because a PowerShell host reads it as a quote.
|
|
654
|
+
Quoting rules: `$` and backtick are literal and admitted inside single quotes, and denied outside quotes and inside double quotes, where the shell expands them. `<` and `>` are admitted inside single or double quotes and denied outside quotes. An unquoted `#` is denied anywhere, because it starts a shell comment that the exemption does not model; a `#` inside quotes is admitted. A typographic quote character (U+2018 to U+201E) anywhere in the command line is denied, because a PowerShell host reads it as a quote. Because the executing shell is undetermined (issue #735), a shape whose meaning differs between a POSIX shell and PowerShell is denied: a backslash anywhere in the command line is denied, and `{`, `}`, `,`, `(`, `)`, and `@` are denied outside quotes. Every staging operand must be a plain forward-slash repository-relative path that uses only the characters `A-Z a-z 0-9 . _ / -`.
|
|
599
655
|
|
|
600
656
|
Not admitted: heredoc-fed messages, including `git commit -m "$(cat <<'EOF' ... EOF)"` and `git commit -F - <<'EOF'`, and message files supplied through `-F <file>` or `--file=<file>`. Use one of the two forms above instead.
|
|
601
657
|
|