@danmoisan/drm-copilot-mcp 0.0.1 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/out/mcp-server.js +5 -1
  2. package/package.json +21 -5
  3. package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +15 -3
  4. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_branch_base_check_unmerged_pr_deps.md +16 -0
  5. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_every_change_through_lifecycle.md +15 -0
  6. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_policy_compliance_not_optional.md +18 -0
  7. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_potential_to_issue_creates_github_issue.md +13 -0
  8. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_remediation_plan_em_dash_required.md +13 -0
  9. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_small_bug_uses_minor_audit.md +13 -0
  10. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_test_files_count_against_500_cap.md +13 -0
  11. package/resources/claude-customizations/.claude/agents/atomic-executor.md +7 -7
  12. package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +4 -5
  13. package/resources/claude-customizations/.claude/agents/feature-review.md +7 -3
  14. package/resources/claude-customizations/.claude/agents/orchestrator.md +16 -1
  15. package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +1 -1
  16. package/resources/claude-customizations/.claude/hooks/enforce-checkpoint-monotonic.ps1 +245 -0
  17. package/resources/claude-customizations/.claude/hooks/enforce-completion-consistency.ps1 +273 -0
  18. package/resources/claude-customizations/.claude/hooks/enforce-feature-folder-order.ps1 +148 -0
  19. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.ps1 +190 -0
  20. package/resources/claude-customizations/.claude/hooks/enforce-prd-feature-before-planner.ps1 +216 -0
  21. package/resources/claude-customizations/.claude/hooks/enforce-promotion-mcp-only.ps1 +84 -15
  22. package/resources/claude-customizations/.claude/hooks/validate-executor-output.ps1 +1 -1
  23. package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage.ps1 +75 -5
  24. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +93 -0
  25. package/resources/claude-customizations/.claude/hooks/validate-task-researcher-output.ps1 +68 -0
  26. package/resources/claude-customizations/.claude/rules/architecture-boundaries.md +46 -0
  27. package/resources/claude-customizations/.claude/rules/benchmark-baselines.md +35 -0
  28. package/resources/claude-customizations/.claude/rules/ci-workflows.md +36 -0
  29. package/resources/claude-customizations/.claude/rules/csharp.md +62 -16
  30. package/resources/claude-customizations/.claude/rules/general-code-change.md +12 -3
  31. package/resources/claude-customizations/.claude/rules/general-unit-test.md +47 -2
  32. package/resources/claude-customizations/.claude/rules/orchestrator-state.md +39 -0
  33. package/resources/claude-customizations/.claude/rules/powershell.md +5 -5
  34. package/resources/claude-customizations/.claude/rules/python.md +4 -3
  35. package/resources/claude-customizations/.claude/rules/quality-tiers.md +51 -0
  36. package/resources/claude-customizations/.claude/rules/typescript.md +37 -8
  37. package/resources/claude-customizations/.claude/settings.json +37 -12
  38. package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +2 -2
  39. package/resources/claude-customizations/.claude/skills/csharp-qa-gate/SKILL.md +25 -10
  40. package/resources/claude-customizations/.claude/skills/execute-hard-lock/SKILL.md +6 -6
  41. package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +8 -8
  42. package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +17 -6
  43. package/resources/claude-customizations/.claude/skills/human-exception-runbook/SKILL.md +52 -0
  44. package/resources/claude-customizations/.claude/skills/human-exception-runbook/example.runbook.md +36 -0
  45. package/resources/claude-customizations/.claude/skills/invoke-csharp-engineer/SKILL.md +4 -4
  46. package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +96 -3
  47. package/resources/claude-customizations/.claude/skills/policy-audit-template-usage/SKILL.md +3 -3
  48. package/resources/claude-customizations/.claude/skills/powershell-qa-gate/SKILL.md +4 -4
  49. package/resources/claude-customizations/.claude/skills/pr-base-branch-merge-base/SKILL.md +3 -3
  50. package/resources/claude-customizations/.claude/skills/python-qa-gate/SKILL.md +1 -1
  51. package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +90 -17
  52. package/resources/claude-dir-customizations/.mcp.json +3 -3
  53. package/resources/codex-and-agents-customizations/.agents/README.md +1 -1
  54. package/resources/codex-and-agents-customizations/.agents/skills/acceptance-criteria-tracking/SKILL.md +0 -5
  55. package/resources/codex-and-agents-customizations/.agents/skills/architecture-boundaries/SKILL.md +52 -0
  56. package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +16 -8
  57. package/resources/codex-and-agents-customizations/.agents/skills/benchmark-baselines/SKILL.md +44 -0
  58. package/resources/codex-and-agents-customizations/.agents/skills/ci-workflows/SKILL.md +45 -0
  59. package/resources/codex-and-agents-customizations/.agents/skills/commit-message/SKILL.md +3 -11
  60. package/resources/codex-and-agents-customizations/.agents/skills/csharp/SKILL.md +1 -5
  61. package/resources/codex-and-agents-customizations/.agents/skills/csharp-change-budget-router/SKILL.md +1 -6
  62. package/resources/codex-and-agents-customizations/.agents/skills/csharp-orchestration-state-machine/SKILL.md +0 -5
  63. package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +0 -5
  64. package/resources/codex-and-agents-customizations/.agents/skills/evidence-and-timestamp-conventions/SKILL.md +0 -5
  65. package/resources/codex-and-agents-customizations/.agents/skills/execute-hard-lock/SKILL.md +8 -17
  66. package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +13 -14
  67. package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +1 -6
  68. package/resources/codex-and-agents-customizations/.agents/skills/fill-feature-docs/SKILL.md +0 -5
  69. package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +86 -0
  70. package/resources/codex-and-agents-customizations/.agents/skills/general-unit-test/SKILL.md +111 -0
  71. package/resources/codex-and-agents-customizations/.agents/skills/human-exception-runbook/SKILL.md +57 -0
  72. package/resources/codex-and-agents-customizations/.agents/skills/human-exception-runbook/example.runbook.md +36 -0
  73. package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +0 -9
  74. package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +0 -9
  75. package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +0 -9
  76. package/resources/codex-and-agents-customizations/.agents/skills/make-skill-template/SKILL.md +0 -5
  77. package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +93 -8
  78. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-state/SKILL.md +48 -0
  79. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +61 -2
  80. package/resources/codex-and-agents-customizations/.agents/skills/policy-audit-template-usage/SKILL.md +3 -8
  81. package/resources/codex-and-agents-customizations/.agents/skills/policy-compliance-order/SKILL.md +0 -10
  82. package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +4 -8
  83. package/resources/codex-and-agents-customizations/.agents/skills/powershell-change-budget-router/SKILL.md +1 -6
  84. package/resources/codex-and-agents-customizations/.agents/skills/powershell-orchestration-state-machine/SKILL.md +0 -5
  85. package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +3 -9
  86. package/resources/codex-and-agents-customizations/.agents/skills/pr-author/SKILL.md +1 -9
  87. package/resources/codex-and-agents-customizations/.agents/skills/pr-base-branch-merge-base/SKILL.md +4 -9
  88. package/resources/codex-and-agents-customizations/.agents/skills/pr-context-artifacts/SKILL.md +0 -5
  89. package/resources/codex-and-agents-customizations/.agents/skills/python/SKILL.md +1 -5
  90. package/resources/codex-and-agents-customizations/.agents/skills/python-change-budget-router/SKILL.md +1 -6
  91. package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +0 -5
  92. package/resources/codex-and-agents-customizations/.agents/skills/python-suppressions/SKILL.md +2 -6
  93. package/resources/codex-and-agents-customizations/.agents/skills/quality-tiers/SKILL.md +57 -0
  94. package/resources/codex-and-agents-customizations/.agents/skills/remediation-handoff-atomic-planner/SKILL.md +0 -5
  95. package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/SKILL.md +91 -72
  96. package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/agents/openai.yaml +1 -1
  97. package/resources/codex-and-agents-customizations/.agents/skills/research-issue/SKILL.md +0 -10
  98. package/resources/codex-and-agents-customizations/.agents/skills/review-epic/SKILL.md +0 -5
  99. package/resources/codex-and-agents-customizations/.agents/skills/review-feature/SKILL.md +0 -5
  100. package/resources/codex-and-agents-customizations/.agents/skills/review-staged/SKILL.md +0 -5
  101. package/resources/codex-and-agents-customizations/.agents/skills/self-explanatory-code-commenting/SKILL.md +2 -6
  102. package/resources/codex-and-agents-customizations/.agents/skills/skill-canonical-location-audit/SKILL.md +0 -5
  103. package/resources/codex-and-agents-customizations/.agents/skills/tonality/SKILL.md +86 -0
  104. package/resources/codex-and-agents-customizations/.agents/skills/translate-claude-to-codex/SKILL.md +297 -0
  105. package/resources/codex-and-agents-customizations/.agents/skills/translate-copilot-to-claude/SKILL.md +0 -22
  106. package/resources/codex-and-agents-customizations/.agents/skills/typescript/SKILL.md +1 -5
  107. package/resources/codex-and-agents-customizations/.agents/skills/typescript-suppressions/SKILL.md +2 -6
  108. package/resources/codex-and-agents-customizations/.agents/skills/update-status/SKILL.md +0 -5
  109. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +5 -5
  110. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator.toml +91 -63
  111. package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-executor.toml +1 -1
  112. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +1 -1
  113. package/resources/codex-and-agents-customizations/.codex/config.toml +51 -136
  114. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-promotion-mcp-only.ps1 +1 -1
  115. package/resources/codex-and-agents-customizations/.codex/prompts/orchestrate-work.md +4 -3
  116. package/resources/codex-and-agents-customizations/.codex/scripts/post-codex-worktree-session.ps1 +5 -0
  117. package/resources/codex-and-agents-customizations/.github/workflows/_validate-orchestrator-state.yml +68 -0
  118. package/resources/codex-and-agents-customizations/.github/workflows/validate-orchestrator-state.yml +15 -0
  119. package/resources/config/orchestration-routing.json +84 -0
  120. package/resources/customizations/.github/agents/Powershell DI Unit Test Engineer.agent.md +1 -1
  121. package/resources/customizations/.github/agents/atomic_executor.agent.md +1 -1
  122. package/resources/customizations/.github/agents/atomic_planning.agent.md +10 -10
  123. package/resources/customizations/.github/agents/csharp-orchestrator.agent.md +6 -2
  124. package/resources/customizations/.github/agents/feature-review.agent.md +2 -2
  125. package/resources/customizations/.github/agents/orchestrator.agent.md +6 -2
  126. package/resources/customizations/.github/agents/powershell-atomic-executor.agent.md +4 -4
  127. package/resources/customizations/.github/agents/powershell-atomic-planning.agent.md +10 -10
  128. package/resources/customizations/.github/agents/powershell-orchestrator.agent.md +6 -2
  129. package/resources/customizations/.github/agents/powershell-typed-engineer.agent.md +2 -2
  130. package/resources/customizations/.github/agents/python-orchestrator.agent.md +6 -2
  131. package/resources/customizations/.github/agents/staged-review.agent.md +1 -1
  132. package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +6 -6
  133. package/resources/customizations/.github/prompts/generate-commit-message-repo.prompt.md +1 -1
  134. package/resources/customizations/.github/prompts/orchestrate-csharp-work.prompt.md +5 -3
  135. package/resources/customizations/.github/prompts/orchestrate-work.prompt.md +5 -3
  136. package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +14 -1
  137. package/resources/customizations/.github/skills/feature-promotion-lifecycle/SKILL.md +11 -7
  138. package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +10 -1
  139. package/resources/customizations/.github/skills/pr-base-branch-merge-base/SKILL.md +2 -2
  140. package/resources/customizations/.github/skills/remediation-handoff-atomic-planner/SKILL.md +5 -0
  141. package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +7 -0
  142. package/resources/scripts/dev_tools/_orchestrator_state_human_interaction.py +127 -0
  143. package/resources/scripts/dev_tools/_orchestrator_state_routing.py +216 -0
  144. package/resources/scripts/dev_tools/push_down_claude_customizations.py +191 -5
  145. package/resources/scripts/dev_tools/validate_orchestration_artifacts.py +103 -411
  146. package/resources/scripts/dev_tools/validate_orchestration_review_artifacts.py +107 -0
  147. package/resources/scripts/dev_tools/validate_orchestrator_state.py +428 -0
  148. package/resources/scripts/dev_tools/validate_policy_audit_artifact.py +448 -0
  149. package/resources/templates/push_down_claude_customizations.py +227 -6
  150. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_repo_root_is_source_of_truth.md +0 -11
  151. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_vsce_verify_package_location.md +0 -19
  152. package/resources/claude-customizations/.claude/agent-memory/orchestrator/project_extension_location.md +0 -11
  153. package/resources/claude-customizations/.claude/agent-memory/prd-feature/MEMORY.md +0 -1
  154. package/resources/claude-customizations/.claude/agent-memory/prd-feature/project_push_down_pattern.md +0 -13
  155. package/resources/claude-customizations/.claude/agent-memory/task-researcher/MEMORY.md +0 -3
  156. package/resources/claude-customizations/.claude/agent-memory/task-researcher/project_push_down_claude_dir.md +0 -11
@@ -109,6 +109,10 @@ Use these reusable skills to avoid duplicating shared operations:
109
109
  - `${feature-folder}`: created active feature folder path
110
110
  - `${plan-path}`: workspace-relative path to the single plan file that must be updated in-place across all planning/preflight iterations
111
111
 
112
+ 5) **No manual steps by default**
113
+ - Do not introduce manual bootstrap, human-operator validation, user-performed repro steps, or any other manual handoff unless the initial user request explicitly asked for manual orchestration from the beginning.
114
+ - If a delegated plan, review, or remediation flow proposes a new manual step without that explicit initial opt-in, reject it, request a revision, or record blocked automated state instead of asking the user to perform the step.
115
+
112
116
  # Workflow router
113
117
 
114
118
  ## Phase 0 — Intake and budget estimate (mandatory)
@@ -196,11 +200,11 @@ Hard enforcement for S4:
196
200
 
197
201
  ### Step S5 — Branch by bootstrap mode
198
202
 
199
- S5.1 If request is `manual bootstrap`:
203
+ S5.1 Only if the initial user request explicitly requested `manual bootstrap` from the beginning:
200
204
  - Save checkpoint with `next_step` at Phase 1 resume point.
201
205
  - Stop execution and return resume instructions.
202
206
 
203
- S5.2 If request is small development (not manual bootstrap):
207
+ S5.2 Otherwise continue automated small development:
204
208
  - Continue to Step S6.
205
209
 
206
210
  ### Step S6 — Delegate constrained small-path development
@@ -48,7 +48,7 @@ You MUST read and follow, in priority order:
48
48
 
49
49
  Policy Audit templates:
50
50
  - If and only if the user asked for a Policy Audit (this agent invocation counts), you MUST also follow:
51
- - MCP server `drmCopilotExtension` tool `resolve_policy_audit_template_asset` with the selector appropriate to the needed artifact:
51
+ - MCP server `drm-copilot` tool `resolve_policy_audit_template_asset` with the selector appropriate to the needed artifact:
52
52
  - `asset: template` for `policy-audit.yyyy-MM-ddTHH-mm.md`
53
53
  - `asset: code-review-template` for `code-review.yyyy-MM-ddTHH-mm.md`
54
54
  - `asset: feature-audit-template` for `feature-audit.yyyy-MM-ddTHH-mm.md`
@@ -21,20 +21,20 @@ If you encounter any conflicting instructions, **halt and notify the user.**
21
21
 
22
22
  **Agent execution requirement (explicit):**
23
23
 
24
- - Agents must use the MCP server functions: `mcp__drmCopilotExtension__run_poshqc_format`, `mcp__drmCopilotExtension__run_poshqc_analyze`, `mcp_drmcopilotext_run_poshqc_test`, and `mcp__drmCopilotExtension__run_poshqc_analyze_autofix`.
24
+ - Agents must use the MCP server functions: `mcp__drm-copilot__run_poshqc_format`, `mcp__drm-copilot__run_poshqc_analyze`, `mcp_drmcopilotext_run_poshqc_test`, and `mcp__drm-copilot__run_poshqc_analyze_autofix`.
25
25
  - Agents must **not** use VS Code task wrappers as a substitute.
26
26
 
27
27
  1) **Formatting - Invoke-Formatter**
28
28
 
29
29
  - Format all PowerShell files using the PoshQC formatter (Invoke-Formatter).
30
- - **Agent execution:** `mcp__drmCopilotExtension__run_poshqc_format`
30
+ - **Agent execution:** `mcp__drm-copilot__run_poshqc_format`
31
31
  - Do not hand-format; re-run the formatter whenever PSScriptAnalyzer would change whitespace/indentation.
32
32
 
33
33
  2) **Linting - PSScriptAnalyzer**
34
34
 
35
35
  - Run the PoshQC analyzer (PSScriptAnalyzer) with repo settings.
36
- - **Agent execution:** `mcp__drmCopilotExtension__run_poshqc_analyze`
37
- - Optional autofix: `mcp__drmCopilotExtension__run_poshqc_analyze_autofix`; review diffs after running.
36
+ - **Agent execution:** `mcp__drm-copilot__run_poshqc_analyze`
37
+ - Optional autofix: `mcp__drm-copilot__run_poshqc_analyze_autofix`; review diffs after running.
38
38
  - Fix **all** findings (Error/Warning/Information). No rule suppressions unless strictly necessary and localized with a comment.
39
39
 
40
40
  3) **Compatibility**
@@ -69,8 +69,8 @@ If you encounter any conflicting instructions, **halt and notify the user.**
69
69
 
70
70
  When PowerShell code changes, your toolchain loop must include:
71
71
 
72
- 1. Format: `mcp__drmCopilotExtension__run_poshqc_format`
73
- 2. Analyze: `mcp__drmCopilotExtension__run_poshqc_analyze`
72
+ 1. Format: `mcp__drm-copilot__run_poshqc_format`
73
+ 2. Analyze: `mcp__drm-copilot__run_poshqc_analyze`
74
74
  3. (Type checking is not applicable for PowerShell; skip to testing.)
75
75
  4. Test: `mcp_drmcopilotext_run_poshqc_test`
76
76
 
@@ -5,7 +5,7 @@ description: 'Standard loading prompt for completing partially filled user-story
5
5
 
6
6
  You are an expert Git commit message author operating in a professional, policy-driven repository.
7
7
 
8
- Your task is to generate **high-signal, conventional commit messages** based strictly on the supplied context file located at `/workspaces/transcript-etl-pipeline/artifacts/commit_context.txt`.
8
+ Your task is to generate **high-signal, conventional commit messages** based strictly on the supplied commit-context artifact path or pasted commit-context content provided by the caller.
9
9
  Assume no prior conversation history beyond what is explicitly provided.
10
10
 
11
11
  ---
@@ -17,6 +17,7 @@ Coordinate the user request from intake to completion using the correct path bas
17
17
  - **Likely affected files (optional):** any known production/test files
18
18
  - **Initial classification hint (optional):** `feature` or `bug`
19
19
  - **Constraints (optional):** APIs/paths/behavior that must remain unchanged
20
+ - **Manual orchestration opt-in (optional):** allowed only when the initial user request explicitly asked from the beginning for a manual bootstrap pause
20
21
 
21
22
  ## Required orchestration behavior
22
23
 
@@ -29,8 +30,8 @@ Coordinate the user request from intake to completion using the correct path bas
29
30
  4) Require `atomic_executor` preflight until `PREFLIGHT: ALL CLEAR`
30
31
  5) Delegate to `atomic_executor` to execute **Phase 0 only**
31
32
  6) Branch behavior:
32
- - manual bootstrap: save state and stop for manual resume
33
- - non-bootstrap small development: delegate constrained implementation to `csharp-typed-engineer`
33
+ - explicit initial manual bootstrap opt-in: save state and stop for manual resume
34
+ - otherwise continue automated small development and delegate constrained implementation to `csharp-typed-engineer`
34
35
  7) Delegate post-delivery validation to `atomic_executor` for validation against issue.md, using only the explicit `## Acceptance Criteria` section for minor-audit acceptance validation, and persist checklist/doc updates
35
36
  8) Run reduced small-path audit and remediation loop until ready-to-merge
36
37
  3. If budget is **>3 production C# files** or **>3 test C# files**:
@@ -48,6 +49,7 @@ Coordinate the user request from intake to completion using the correct path bas
48
49
  - Maintain orchestration state in `artifacts/orchestration/csharp-orchestrator-state.json`.
49
50
  - Resume from the next incomplete step if interrupted.
50
51
  - Do not end early while required downstream steps remain.
52
+ - Do not introduce manual validation or other human-operator steps later in the workflow unless the initial user request explicitly opted in from the beginning.
51
53
 
52
54
  ## Output expectations
53
55
 
@@ -62,5 +64,5 @@ On completion, report:
62
64
  For small path also report:
63
65
  - approved `plan-path`
64
66
  - preflight result (`PREFLIGHT: ALL CLEAR`)
65
- - whether `manual bootstrap` branch was taken
67
+ - whether an explicit initial manual-bootstrap opt-in was present and used
66
68
  - Phase 0 execution evidence and stored `next_step` for resume
@@ -17,6 +17,7 @@ Coordinate the user request from intake to completion using the correct path bas
17
17
  - **Likely affected files (optional):** any known production/test files
18
18
  - **Initial classification hint (optional):** `feature` or `bug`
19
19
  - **Constraints (optional):** APIs/paths/behavior that must remain unchanged
20
+ - **Manual orchestration opt-in (optional):** allowed only when the initial user request explicitly asked from the beginning for a manual bootstrap pause
20
21
 
21
22
  ## Required orchestration behavior
22
23
 
@@ -29,8 +30,8 @@ Coordinate the user request from intake to completion using the correct path bas
29
30
  4) Require `atomic_executor` preflight until `PREFLIGHT: ALL CLEAR`
30
31
  5) Delegate to `atomic_executor` to execute **Phase 0 only**
31
32
  6) Branch behavior:
32
- - manual bootstrap: save state and stop for manual resume
33
- - non-bootstrap small development: delegate constrained implementation to the small-path engineer
33
+ - explicit initial manual bootstrap opt-in: save state and stop for manual resume
34
+ - otherwise continue automated small development and delegate constrained implementation to the small-path engineer
34
35
  7) Delegate post-delivery validation to `atomic_executor` against `issue.md`, using only the explicit `## Acceptance Criteria` section for minor-audit acceptance validation, and persist checklist/doc updates
35
36
  8) Run reduced small-path audit and remediation loop until ready-to-merge
36
37
  3. If budget is **>3 production files** or **>3 test files**:
@@ -48,6 +49,7 @@ Coordinate the user request from intake to completion using the correct path bas
48
49
  - Maintain orchestration state in `artifacts/orchestration/orchestrator-state.json`.
49
50
  - Resume from the next incomplete step if interrupted.
50
51
  - Do not end early while required downstream steps remain.
52
+ - Do not introduce manual validation or other human-operator steps later in the workflow unless the initial user request explicitly opted in from the beginning.
51
53
 
52
54
  ## Output expectations
53
55
 
@@ -62,5 +64,5 @@ On completion, report:
62
64
  For small path also report:
63
65
  - approved `plan-path`
64
66
  - preflight result (`PREFLIGHT: ALL CLEAR`)
65
- - whether `manual bootstrap` branch was taken
67
+ - whether an explicit initial manual-bootstrap opt-in was present and used
66
68
  - Phase 0 execution evidence and stored `next_step` for resume
@@ -73,9 +73,22 @@ After preflight all-clear on the minimal-audit plan:
73
73
  - orchestrator MUST checkpoint Phase 0 evidence before branching.
74
74
 
75
75
  Branching after Phase 0:
76
- - `manual bootstrap` → save state and stop for manual resume,
76
+ - `manual bootstrap` → save state and stop for manual resume ONLY when the initial user request explicitly opted into manual orchestration from the beginning,
77
77
  - otherwise continue with constrained small-path development, then executor validation, then reduced audit/remediation loop.
78
78
 
79
+ ## No-Manual-Step Contract (Mandatory)
80
+
81
+ Unless the user's initial request explicitly opts into manual orchestration from the beginning, approved plans and remediation plans MUST remain fully automated.
82
+
83
+ This prohibition includes:
84
+
85
+ - manual bootstrap pauses,
86
+ - human-operator validation tasks,
87
+ - user-performed repro or QA steps,
88
+ - requests for screenshots, notes, or runtime evidence that the agent cannot collect itself.
89
+
90
+ When a fully automated equivalent is unavailable, the plan MUST fail closed by recording blocked or remediation-required automated state. It MUST NOT introduce a new manual step later in the workflow.
91
+
79
92
  ## Phase 0 Requirements
80
93
 
81
94
  Phase 0 must include tasks to read policy files in the order defined in `policy-compliance-order`.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: feature-promotion-lifecycle
3
- description: Deterministic promotion workflow from potential feature/bug entry to issue, branch, active feature folder, and downstream spec/research handoffs. Prefer MCP server (drmCopilotExtension) tool invocations when the MCP server is reachable; use underlying scripts only as fallback.
3
+ description: Deterministic promotion workflow from potential feature/bug entry to issue, branch, active feature folder, and downstream spec/research handoffs. Prefer MCP server (drm-copilot) tool invocations when the MCP server is reachable; use underlying scripts only as fallback.
4
4
  ---
5
5
 
6
6
  # Feature Promotion Lifecycle
@@ -17,13 +17,13 @@ Use this skill when:
17
17
 
18
18
  ## MCP-First Execution Rule
19
19
 
20
- When the MCP server (`drmCopilotExtension`) is reachable, execute the lifecycle through the MCP tool surface first.
20
+ When the MCP server (`drm-copilot`) is reachable, execute the lifecycle through the MCP tool surface first.
21
21
 
22
22
  Canonical MCP tool invocations:
23
- - feature potential entry: `mcp__drmCopilotExtension__new_potential_entry` with `{"short_name": "${short-name}"}`
24
- - bug potential entry: `mcp__drmCopilotExtension__new_potential_bug_entry` with `{"short_name": "${short-name}"}`
25
- - potential-to-issue promotion: `mcp__drmCopilotExtension__potential_to_issue` with `{"potential_path": "${relativeFile}", "promotion_type": "${promotion-type}", "work_mode": "${work-mode}"}`
26
- - active feature folder creation: `mcp__drmCopilotExtension__new_active_feature_folder` with `{"feature_name": "${long-name}", "type": "${promotion-type}", "issue_number": "${issue-num}", "work_mode": "${work-mode}"}`
23
+ - feature potential entry: `mcp__drm-copilot__new_potential_entry` with `{"short_name": "${short-name}"}`
24
+ - bug potential entry: `mcp__drm-copilot__new_potential_bug_entry` with `{"short_name": "${short-name}"}`
25
+ - potential-to-issue promotion: `mcp__drm-copilot__potential_to_issue` with `{"potential_path": "${relativeFile}", "promotion_type": "${promotion-type}", "work_mode": "${work-mode}"}`
26
+ - active feature folder creation: `mcp__drm-copilot__new_active_feature_folder` with `{"feature_name": "${long-name}", "type": "${promotion-type}", "issue_number": "${issue-num}", "work_mode": "${work-mode}"}`
27
27
 
28
28
  Documented alternatives:
29
29
  - VS Code extension commands (via `vscode/runCommand`): use when MCP server is unreachable but the VS Code extension command surface is available.
@@ -90,9 +90,13 @@ When orchestrator routing selects short path, promotion/folder initialization st
90
90
  6) Execute plan Phase 0 only via executor and checkpoint evidence.
91
91
 
92
92
  7) Branch:
93
- - manual bootstrap: save state and stop,
93
+ - manual bootstrap: save state and stop ONLY when the initial user request explicitly opted into manual orchestration from the beginning,
94
94
  - non-bootstrap: continue with constrained small-path development.
95
95
 
96
+ Automation rule:
97
+ - do not introduce manual bootstrap, human-operator validation, or any other manual handoff later in orchestration unless that initial explicit opt-in exists
98
+ - if automation cannot proceed, record blocked automated state instead of asking for manual intervention
99
+
96
100
  8) Validate delivery via executor against `issue.md`, then run reduced audit/remediation loop until ready-to-merge.
97
101
 
98
102
  ## Required Outputs for Downstream Handoffs
@@ -132,6 +132,14 @@ Always apply:
132
132
  9. **Finalize the review**
133
133
  - Verify every reported artifact exists on disk before reporting completion.
134
134
  - Report artifact paths and a concise go/no-go recommendation for PR readiness.
135
+ - End the final report with these exact single-line fields:
136
+ - `REVIEW_STATUS: PASS` or `REVIEW_STATUS: REMEDIATION_REQUIRED`
137
+ - `FEATURE_FOLDER: <path>`
138
+ - `POLICY_AUDIT: <path>`
139
+ - `CODE_REVIEW: <path>`
140
+ - `FEATURE_AUDIT: <path>`
141
+ - `REMEDIATION_INPUTS: <path-or-NONE>`
142
+ - `REMEDIATION_PLAN: <path-or-NONE>`
135
143
 
136
144
  ## Required Artifact Shapes
137
145
 
@@ -150,4 +158,5 @@ Always apply:
150
158
 
151
159
  - Prefer check-only commands.
152
160
  - Do not claim completion until every required artifact exists and its validator passes.
153
- - Use shared skills as the source of truth for policy order, base-branch resolution, PR-context handling, acceptance-criteria tracking, template usage, and remediation handoff.
161
+ - Use shared skills as the source of truth for policy order, base-branch resolution, PR-context handling, acceptance-criteria tracking, template usage, and remediation handoff.
162
+ - Do not omit any required final result field from the review report.
@@ -10,7 +10,7 @@ Deterministic branch-selection rules for PR context collection.
10
10
  ## When to Use This Skill
11
11
 
12
12
  Use this skill when:
13
- - running via MCP server `drmCopilotExtension` tool `collect_pr_context`,
13
+ - running via MCP server `drm-copilot` tool `collect_pr_context`,
14
14
  - delegating post-implementation review that depends on `PRBaseBranch`,
15
15
  - constructing PR context artifacts where the base must not be hard-coded.
16
16
 
@@ -44,7 +44,7 @@ Definition of correct base:
44
44
 
45
45
  When invoking PR context collection, pass the resolved base explicitly:
46
46
 
47
- - per `pr-context-artifacts` via MCP server `drmCopilotExtension` tool `collect_pr_context` with `base: ${resolved-PRBaseBranch}`
47
+ - per `pr-context-artifacts` via MCP server `drm-copilot` tool `collect_pr_context` with `base: ${resolved-PRBaseBranch}`
48
48
 
49
49
  ## Evidence Recommendation
50
50
 
@@ -33,6 +33,11 @@ Create `remediation-inputs.<timestamp>.md` with:
33
33
  - `${spec}` pointing to remediation inputs (authoritative)
34
34
  - `${file}` pointing to the remediation plan target file
35
35
  3) Require `atomic_planner` to output a deterministic, atomic plan with phases and `[P#-T#]` IDs.
36
+ 4) Require the same `${file}` path to be updated in place across all remediation-plan revisions in the same remediation loop.
37
+ 5) The caller owns the downstream clearance loop:
38
+ - hand the resulting remediation plan to `atomic_executor` in preflight-validation mode,
39
+ - if preflight returns `PREFLIGHT: REVISIONS REQUIRED`, re-delegate to `atomic_planner` against the same `${file}` path,
40
+ - execute the remediation plan only after `PREFLIGHT: ALL CLEAR`.
36
41
 
37
42
  ## Context Package (When Required)
38
43
 
@@ -26,6 +26,13 @@
26
26
  '.claude/hooks/check-powershell-test-purity.ps1'
27
27
  '.claude/hooks/enforce-python-batch-budget.ps1'
28
28
  '.claude/hooks/enforce-powershell-batch-budget.ps1'
29
+ # Issue #214 added/changed these four release scripts and provided dedicated
30
+ # Pester suites; they are measured here to produce real per-file changed-line
31
+ # coverage rather than relying on behavioral-only evidence.
32
+ 'scripts/powershell/Publish-DrmCopilotExtension.ps1'
33
+ 'scripts/dev-tools/Invoke-FullRelease.ps1'
34
+ 'scripts/dev-tools/Invoke-MarketplacePublish.ps1'
35
+ 'scripts/dev-tools/Invoke-ReleaseTagPush.ps1'
29
36
  )
30
37
  ExcludedPath = @(
31
38
  '.claude/hooks/validate-feature-review-coverage.ps1' # Feature-review wrapper around repository evidence; not deterministic in normal unit-test execution.
@@ -0,0 +1,127 @@
1
+ """Human-interaction invariants for orchestrator-state checkpoints.
2
+
3
+ Purpose:
4
+ Hold the optional ``human_interaction`` block constants and the
5
+ ``_validate_human_interaction`` helper so the primary validator module
6
+ (`scripts.dev_tools.validate_orchestrator_state`) can stay within the
7
+ repository's 500-line file limit while preserving the existing validator
8
+ contract.
9
+
10
+ Usage:
11
+ Import ``HUMAN_INTERACTION_KEY`` and ``_validate_human_interaction`` from
12
+ this module. The primary validator re-exports both symbols so existing
13
+ callers and tests continue to resolve them from
14
+ ``scripts.dev_tools.validate_orchestrator_state`` unchanged.
15
+
16
+ Invariants / Constraints:
17
+ - The three permitted ``response`` values are ``scope_change``,
18
+ ``exception``, and ``halt``.
19
+ - An ``exception`` response requires a non-empty ``runbook_path`` string.
20
+ - The validator never imports ``schemas/orchestrator-state.schema.json``;
21
+ the invariants are expressed directly here per
22
+ `.claude/rules/orchestrator-state.md`.
23
+
24
+ Side Effects:
25
+ None.
26
+ """
27
+
28
+ from __future__ import annotations
29
+
30
+ from typing import Any, cast
31
+
32
+ # Declare the module's intended exported surface. Listing ``_validate_human_
33
+ # interaction`` here marks it as a deliberate re-export consumed by
34
+ # ``validate_orchestrator_state``, so static analysis does not flag the helper
35
+ # as unused locally or as private-usage when imported across the module boundary.
36
+ __all__ = [
37
+ "HUMAN_INTERACTION_KEY",
38
+ "HUMAN_INTERACTION_REQUIREMENTS_KEY",
39
+ "HUMAN_INTERACTION_RESPONSE_ENUM",
40
+ "HUMAN_INTERACTION_EXCEPTION_RESPONSE",
41
+ "_validate_human_interaction",
42
+ ]
43
+
44
+ HUMAN_INTERACTION_KEY = "human_interaction"
45
+ HUMAN_INTERACTION_REQUIREMENTS_KEY = "requirements"
46
+ # The three permitted responses for an unautomatable requirement under the
47
+ # autonomous-execution mandate (see `.claude/skills/orchestrate/SKILL.md`).
48
+ HUMAN_INTERACTION_RESPONSE_ENUM = {"scope_change", "exception", "halt"}
49
+ HUMAN_INTERACTION_EXCEPTION_RESPONSE = "exception"
50
+
51
+
52
+ def _validate_human_interaction(human_interaction: object) -> list[str]:
53
+ """Validate the optional ``human_interaction`` block invariants.
54
+
55
+ Purpose:
56
+ Apply the autonomous-execution mandate invariants to the checkpoint's
57
+ optional top-level ``human_interaction`` object, mirroring the schema
58
+ invariants documented in `.claude/rules/orchestrator-state.md`. The
59
+ validator never imports `schemas/orchestrator-state.schema.json`; the
60
+ invariants are expressed directly here in the existing helper-plus-
61
+ error-list style.
62
+
63
+ Args:
64
+ human_interaction (object): The raw value of the checkpoint's top-level
65
+ ``human_interaction`` key. Callers invoke this helper only when the
66
+ key is present, so a non-object value is itself a malformed block.
67
+
68
+ Returns:
69
+ list[str]: One error string per violated invariant; an empty list when
70
+ the block is well-formed. The three invariants are: ``requirements`` is
71
+ present and is a list; each requirement is an object whose ``response``
72
+ is within the permitted enum; a requirement whose ``response`` is
73
+ ``exception`` carries a non-empty ``runbook_path`` string.
74
+
75
+ Raises:
76
+ None.
77
+
78
+ Side Effects:
79
+ None.
80
+ """
81
+
82
+ errors: list[str] = []
83
+
84
+ # A non-object human_interaction cannot carry a requirements list; the key
85
+ # was present, so this is a malformed block rather than an absent one.
86
+ if not isinstance(human_interaction, dict):
87
+ errors.append("Checkpoint human_interaction must be an object when present.")
88
+ return errors
89
+ human_interaction_map = cast("dict[str, Any]", human_interaction)
90
+
91
+ # Invariant 1: requirements must be present and a list.
92
+ requirements = human_interaction_map.get(HUMAN_INTERACTION_REQUIREMENTS_KEY)
93
+ if not isinstance(requirements, list):
94
+ errors.append("Checkpoint human_interaction.requirements must be a list.")
95
+ return errors
96
+ requirement_list = cast("list[object]", requirements)
97
+
98
+ # Validate each requirement independently so callers receive a complete
99
+ # error list instead of stopping at the first malformed requirement.
100
+ for index, requirement in enumerate(requirement_list):
101
+ if not isinstance(requirement, dict):
102
+ errors.append(
103
+ f"Checkpoint human_interaction.requirements #{index} must be an "
104
+ "object."
105
+ )
106
+ continue
107
+ requirement_map = cast("dict[str, Any]", requirement)
108
+
109
+ # Invariant 2: response must be within the permitted enum.
110
+ response = requirement_map.get("response")
111
+ if response not in HUMAN_INTERACTION_RESPONSE_ENUM:
112
+ errors.append(
113
+ f"Checkpoint human_interaction.requirements #{index} response "
114
+ f"must be one of scope_change, exception, halt; got: {response}"
115
+ )
116
+ continue
117
+
118
+ # Invariant 3: an exception response requires a non-empty runbook_path.
119
+ if response == HUMAN_INTERACTION_EXCEPTION_RESPONSE:
120
+ runbook_path = requirement_map.get("runbook_path")
121
+ if not isinstance(runbook_path, str) or not runbook_path.strip():
122
+ errors.append(
123
+ f"Checkpoint human_interaction.requirements #{index} "
124
+ "response is exception but runbook_path is missing or empty."
125
+ )
126
+
127
+ return errors
@@ -0,0 +1,216 @@
1
+ """Routing and mandatory handoff invariants for orchestrator checkpoints."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from pathlib import Path
7
+ from typing import Any, cast
8
+
9
+ ROUTING_MATRIX_PATH = (
10
+ Path(__file__).resolve().parents[2] / "config" / "orchestration-routing.json"
11
+ )
12
+
13
+
14
+ def load_routing_matrix(path: Path = ROUTING_MATRIX_PATH) -> dict[str, Any]:
15
+ """Load the repository routing matrix from disk."""
16
+
17
+ loaded: object = json.loads(path.read_text(encoding="utf-8"))
18
+ return cast("dict[str, Any]", loaded)
19
+
20
+
21
+ def _string_list(value: object) -> list[str] | None:
22
+ """Return a list of strings only when the value has that exact shape."""
23
+
24
+ if not isinstance(value, list):
25
+ return None
26
+ values = cast("list[object]", value)
27
+ if not all(isinstance(item, str) and item.strip() for item in values):
28
+ return None
29
+ return cast("list[str]", values)
30
+
31
+
32
+ def _route_list(route: dict[str, Any], key: str) -> list[str]:
33
+ """Read a required string-list field from one route entry."""
34
+
35
+ value = _string_list(route.get(key))
36
+ return [] if value is None else value
37
+
38
+
39
+ def _state_list(
40
+ state: dict[str, Any], key: str, route_id: str, expected: list[str]
41
+ ) -> list[str] | None:
42
+ """Validate a state list against the routing matrix list."""
43
+
44
+ value = _string_list(state.get(key))
45
+ if value is None:
46
+ return None
47
+ if value != expected:
48
+ return None
49
+ return value
50
+
51
+
52
+ def _list_receipts(receipts: object) -> list[dict[str, Any]]:
53
+ """Return legacy list delegation receipts as typed dictionaries."""
54
+
55
+ if not isinstance(receipts, list):
56
+ return []
57
+ receipt_list = cast("list[object]", receipts)
58
+ return [
59
+ cast("dict[str, Any]", item) for item in receipt_list if isinstance(item, dict)
60
+ ]
61
+
62
+
63
+ def _receipt_agents(state: dict[str, Any]) -> set[str]:
64
+ """Collect agent names from delegation receipts."""
65
+
66
+ agents: set[str] = set()
67
+ for receipt in _list_receipts(state.get("delegation_receipts")):
68
+ agent_name = receipt.get("agent_name")
69
+ if isinstance(agent_name, str) and agent_name.strip():
70
+ agents.add(agent_name)
71
+ return agents
72
+
73
+
74
+ def _receipt_skills(state: dict[str, Any]) -> set[str]:
75
+ """Collect acknowledged skill names from skill receipts."""
76
+
77
+ skills: set[str] = set()
78
+ receipts = state.get("skill_receipts")
79
+ if not isinstance(receipts, list):
80
+ return skills
81
+ for receipt in cast("list[object]", receipts):
82
+ if not isinstance(receipt, dict):
83
+ continue
84
+ receipt_map = cast("dict[str, object]", receipt)
85
+ skill = receipt_map.get("skill")
86
+ required = receipt_map.get("required")
87
+ evidence = receipt_map.get("evidence")
88
+ if (
89
+ isinstance(skill, str)
90
+ and skill.strip()
91
+ and required is True
92
+ and isinstance(evidence, str)
93
+ and evidence.strip()
94
+ ):
95
+ skills.add(skill)
96
+ return skills
97
+
98
+
99
+ def _mcp_tools(state: dict[str, Any]) -> set[str]:
100
+ """Collect successful MCP tool receipts from checkpoint state."""
101
+
102
+ tools: set[str] = set()
103
+ receipts = state.get("mcp_call_receipts")
104
+ if not isinstance(receipts, list):
105
+ return tools
106
+ for receipt in cast("list[object]", receipts):
107
+ if not isinstance(receipt, dict):
108
+ continue
109
+ receipt_map = cast("dict[str, object]", receipt)
110
+ tool = receipt_map.get("tool")
111
+ ok = receipt_map.get("ok")
112
+ evidence = receipt_map.get("evidence")
113
+ if (
114
+ isinstance(tool, str)
115
+ and tool.strip()
116
+ and ok is True
117
+ and isinstance(evidence, str)
118
+ and evidence.strip()
119
+ ):
120
+ tools.add(tool)
121
+ return tools
122
+
123
+
124
+ def _validate_empty_list_field(state: dict[str, Any], key: str) -> list[str]:
125
+ """Require a checkpoint field to exist as an empty list."""
126
+
127
+ value = state.get(key)
128
+ if not isinstance(value, list):
129
+ return [f"Checkpoint {key} must be an empty list at completion."]
130
+ if value:
131
+ return [f"Checkpoint {key} must be empty at completion."]
132
+ return []
133
+
134
+
135
+ def _validate_lifecycle_operations(state: dict[str, Any]) -> list[str]:
136
+ """Reject lifecycle-operation records that did not use MCP."""
137
+
138
+ operations = state.get("lifecycle_operations")
139
+ if operations is None:
140
+ return []
141
+ if not isinstance(operations, list):
142
+ return ["Checkpoint lifecycle_operations must be a list when present."]
143
+ errors: list[str] = []
144
+ for index, operation in enumerate(cast("list[object]", operations)):
145
+ if not isinstance(operation, dict):
146
+ errors.append(
147
+ f"Checkpoint lifecycle_operations #{index} must be an object."
148
+ )
149
+ continue
150
+ operation_map = cast("dict[str, object]", operation)
151
+ if operation_map.get("surface") != "mcp":
152
+ errors.append(
153
+ f"Checkpoint lifecycle_operations #{index} did not use MCP surface."
154
+ )
155
+ return errors
156
+
157
+
158
+ def validate_routing_contract(
159
+ state: dict[str, Any], *, routing_matrix: dict[str, Any] | None = None
160
+ ) -> list[str]:
161
+ """Validate mandatory route, handoff, skill, and MCP completion evidence."""
162
+
163
+ matrix = routing_matrix if routing_matrix is not None else load_routing_matrix()
164
+ raw_routes = matrix.get("routes")
165
+ if not isinstance(raw_routes, dict):
166
+ return ["Routing matrix missing routes object."]
167
+ routes = cast("dict[str, object]", raw_routes)
168
+
169
+ route_id = state.get("route_id", state.get("path_selected"))
170
+ if not isinstance(route_id, str) or not route_id.strip():
171
+ return ["Checkpoint route_id or path_selected must select a route."]
172
+ raw_route = routes.get(route_id)
173
+ if not isinstance(raw_route, dict):
174
+ return [f"Checkpoint selected route has no routing-matrix entry: {route_id}."]
175
+ route_map = cast("dict[str, Any]", raw_route)
176
+
177
+ errors: list[str] = []
178
+ required_agents = _route_list(route_map, "required_agents")
179
+ required_skills = _route_list(route_map, "required_skills")
180
+ required_mcp_tools = _route_list(route_map, "required_mcp_tools")
181
+
182
+ if _state_list(state, "required_agents", route_id, required_agents) is None:
183
+ errors.append(
184
+ "Checkpoint required_agents must match routing matrix for route "
185
+ f"{route_id}."
186
+ )
187
+ if _state_list(state, "required_skills", route_id, required_skills) is None:
188
+ errors.append(
189
+ "Checkpoint required_skills must match routing matrix for route "
190
+ f"{route_id}."
191
+ )
192
+ if _state_list(state, "required_mcp_tools", route_id, required_mcp_tools) is None:
193
+ errors.append(
194
+ "Checkpoint required_mcp_tools must match routing matrix for route "
195
+ f"{route_id}."
196
+ )
197
+
198
+ actual_agents = _receipt_agents(state)
199
+ for agent in required_agents:
200
+ if agent not in actual_agents:
201
+ errors.append(f"Checkpoint missing required agent receipt: {agent}.")
202
+
203
+ actual_skills = _receipt_skills(state)
204
+ for skill in required_skills:
205
+ if skill not in actual_skills:
206
+ errors.append(f"Checkpoint missing required skill receipt: {skill}.")
207
+
208
+ actual_tools = _mcp_tools(state)
209
+ for tool in required_mcp_tools:
210
+ if tool not in actual_tools:
211
+ errors.append(f"Checkpoint missing successful MCP receipt: {tool}.")
212
+
213
+ errors.extend(_validate_empty_list_field(state, "local_execution_overrides"))
214
+ errors.extend(_validate_empty_list_field(state, "delegation_bypasses"))
215
+ errors.extend(_validate_lifecycle_operations(state))
216
+ return errors