@danmoisan/drm-copilot-mcp 1.1.20 → 1.1.22

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 (99) hide show
  1. package/out/mcp-server.js +7 -7
  2. package/package.json +1 -1
  3. package/resources/claude-customizations/.claude/hooks/enforce-completion-consistency.ps1 +4 -3
  4. package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +2 -1
  5. package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +2 -1
  6. package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +2 -1
  7. package/resources/claude-customizations/.claude/lib/codex-routing/CodexDeployment.psm1 +10 -10
  8. package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +2 -1
  9. package/resources/claude-customizations/config/orchestration-routing.json +7 -7
  10. package/resources/claude-customizations/pack-manifests/core.json +7 -0
  11. package/resources/codex-and-agents-customizations/.agents/skills/codex-model-routing/SKILL.md +6 -6
  12. package/resources/codex-and-agents-customizations/.agents/skills/epic-orchestrate/SKILL.md +7 -7
  13. package/resources/codex-and-agents-customizations/.agents/skills/epic-plan/SKILL.md +2 -2
  14. package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +2 -1
  15. package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +4 -4
  16. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +1 -1
  17. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c1.toml +1 -1
  18. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c2.toml +1 -1
  19. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3-elevated.toml +1 -1
  20. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3.toml +1 -1
  21. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c4.toml +1 -1
  22. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +1 -1
  23. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c1.toml +1 -1
  24. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c2.toml +1 -1
  25. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3-elevated.toml +1 -1
  26. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3.toml +1 -1
  27. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c4.toml +1 -1
  28. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +1 -1
  29. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward-c1.toml +1 -1
  30. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward-c2.toml +1 -1
  31. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward-c3-elevated.toml +1 -1
  32. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward-c3.toml +1 -1
  33. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward-c4.toml +1 -1
  34. package/resources/codex-and-agents-customizations/.codex/agents/commit-steward.toml +1 -1
  35. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +1 -1
  36. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +1 -1
  37. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +1 -1
  38. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +1 -1
  39. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +1 -1
  40. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +1 -1
  41. package/resources/codex-and-agents-customizations/.codex/agents/epic-orchestrator.toml +2 -2
  42. package/resources/codex-and-agents-customizations/.codex/agents/epic-planner.toml +2 -2
  43. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c1.toml +1 -1
  44. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c2.toml +1 -1
  45. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c3-elevated.toml +1 -1
  46. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c3.toml +1 -1
  47. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c4.toml +1 -1
  48. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer.toml +1 -1
  49. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c1.toml +3 -3
  50. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c2.toml +3 -3
  51. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c3-elevated.toml +3 -3
  52. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c3.toml +3 -3
  53. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c4.toml +3 -3
  54. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator.toml +3 -3
  55. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +1 -1
  56. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +1 -1
  57. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +1 -1
  58. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +1 -1
  59. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +1 -1
  60. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +1 -1
  61. package/resources/codex-and-agents-customizations/.codex/agents/pr-author-c1.toml +1 -1
  62. package/resources/codex-and-agents-customizations/.codex/agents/pr-author-c2.toml +1 -1
  63. package/resources/codex-and-agents-customizations/.codex/agents/pr-author-c3-elevated.toml +1 -1
  64. package/resources/codex-and-agents-customizations/.codex/agents/pr-author-c3.toml +1 -1
  65. package/resources/codex-and-agents-customizations/.codex/agents/pr-author-c4.toml +1 -1
  66. package/resources/codex-and-agents-customizations/.codex/agents/pr-author.toml +1 -1
  67. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature-c1.toml +1 -1
  68. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature-c2.toml +1 -1
  69. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature-c3-elevated.toml +1 -1
  70. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature-c3.toml +1 -1
  71. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature-c4.toml +1 -1
  72. package/resources/codex-and-agents-customizations/.codex/agents/prd-feature.toml +1 -1
  73. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +1 -1
  74. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +1 -1
  75. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +1 -1
  76. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +1 -1
  77. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +1 -1
  78. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +1 -1
  79. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher-c1.toml +1 -1
  80. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher-c2.toml +1 -1
  81. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher-c3-elevated.toml +1 -1
  82. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher-c3.toml +1 -1
  83. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher-c4.toml +1 -1
  84. package/resources/codex-and-agents-customizations/.codex/agents/task-researcher.toml +1 -1
  85. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer-c1.toml +1 -1
  86. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer-c2.toml +1 -1
  87. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer-c3-elevated.toml +1 -1
  88. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer-c3.toml +1 -1
  89. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer-c4.toml +1 -1
  90. package/resources/codex-and-agents-customizations/.codex/agents/typescript-engineer.toml +1 -1
  91. package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
  92. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +2 -1
  93. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +2 -1
  94. package/resources/codex-and-agents-customizations/.codex/hooks/record-subagent-routing-attestation.ps1 +82 -70
  95. package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +1 -1
  96. package/resources/codex-and-agents-customizations/pack-manifests/core.json +1 -0
  97. package/resources/config/orchestration-routing.json +7 -7
  98. package/resources/customizations/.github/skills/execution-environment/SKILL.md +2 -1
  99. package/resources/lib/codex-routing/CodexDeployment.psm1 +10 -10
package/out/mcp-server.js CHANGED
@@ -25001,39 +25001,39 @@ var LOGICAL_AGENT_ALIASES = {
25001
25001
  var BASE_PROFILES = {
25002
25002
  C1: {
25003
25003
  suffix: "c1",
25004
- model: "gpt-5.6-luna",
25004
+ model: "gpt-6-luna",
25005
25005
  model_reasoning_effort: "low"
25006
25006
  },
25007
25007
  C2: {
25008
25008
  suffix: "c2",
25009
- model: "gpt-5.6-terra",
25009
+ model: "gpt-6.1-sol",
25010
25010
  model_reasoning_effort: "medium"
25011
25011
  },
25012
25012
  C3: {
25013
25013
  suffix: "c3",
25014
- model: "gpt-5.6-terra",
25014
+ model: "gpt-6.1-sol",
25015
25015
  model_reasoning_effort: "high"
25016
25016
  },
25017
25017
  C4: {
25018
25018
  suffix: "c4",
25019
- model: "gpt-5.6-sol",
25019
+ model: "gpt-6-astra",
25020
25020
  model_reasoning_effort: "max"
25021
25021
  }
25022
25022
  };
25023
25023
  var C3_ELEVATED_PROFILE = {
25024
25024
  suffix: "c3-elevated",
25025
- model: "gpt-5.6-sol",
25025
+ model: "gpt-6-astra",
25026
25026
  model_reasoning_effort: "high"
25027
25027
  };
25028
25028
  var FORCED_PERSONA_PROFILES = {
25029
25029
  "epic-planner": {
25030
25030
  suffix: "",
25031
- model: "gpt-5.6-sol",
25031
+ model: "gpt-6-astra",
25032
25032
  model_reasoning_effort: "ultra"
25033
25033
  },
25034
25034
  "epic-orchestrator": {
25035
25035
  suffix: "",
25036
- model: "gpt-5.6-sol",
25036
+ model: "gpt-6-astra",
25037
25037
  model_reasoning_effort: "ultra"
25038
25038
  }
25039
25039
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danmoisan/drm-copilot-mcp",
3
- "version": "1.1.20",
3
+ "version": "1.1.22",
4
4
  "description": "Stdio MCP server exposing drm-copilot repo-automation tools.",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
@@ -50,9 +50,9 @@ $script:HookDependencyGuardLoadFailed = $false; try { . (Join-Path $PSScriptRoot
50
50
 
51
51
 
52
52
  try { Import-Module (Join-Path $PSScriptRoot '../lib/hook-payload/HookPayload.psm1') -Force -ErrorAction Stop } catch { Add-HookDependencyFailure -Name 'HookPayload.psm1' -ErrorRecord $_ }
53
- # Dot-source the shared validation helpers. Guarded so a missing file produces a
54
- # clear error and so dot-sourcing this hook in tests loads the helpers too.
55
- try { . (Join-Path $PSScriptRoot 'enforce-completion-helpers.ps1') } catch { Add-HookDependencyFailure -Name 'enforce-completion-helpers.ps1' -ErrorRecord $_ }
53
+ # Dot-source the shared validation helpers (handler H9, issue #984). A failed load is recorded in
54
+ # $script:CompletionHelpersImportFailure and denies only checkpoint writes; other paths are allowed.
55
+ $script:CompletionHelpersImportFailure = $null; try { . (Join-Path $PSScriptRoot 'enforce-completion-helpers.ps1') } catch { $script:CompletionHelpersImportFailure = 'enforce-completion-helpers.ps1' }
56
56
 
57
57
  function ConvertFrom-CheckpointJson {
58
58
  <#
@@ -402,6 +402,7 @@ function Invoke-CompletionConsistencyDecision {
402
402
  if (-not (Test-IsCheckpointPath -NormalizedPath $normalized)) {
403
403
  return [ordered]@{ hookSpecificOutput = [ordered]@{ hookEventName = 'PreToolUse'; permissionDecision = 'allow' } }
404
404
  }
405
+ if ($script:CompletionHelpersImportFailure) { return ConvertTo-CompletionDenyDecision -Reason "COMPLETION_CONSISTENCY_BLOCKED: the shared helpers '$($script:CompletionHelpersImportFailure)' failed to load, so the canonical checkpoint cannot be validated; the gate fails closed." }
405
406
 
406
407
  # Write tool: a present content property is validated directly, and empty
407
408
  # content is denied. Edit tool: no content property is supplied, so read the
@@ -36,7 +36,7 @@ $script:HookDependencyGuardLoadFailed = $false; try { . (Join-Path $PSScriptRoot
36
36
 
37
37
 
38
38
  try { Import-Module (Join-Path $PSScriptRoot '../lib/hook-payload/HookPayload.psm1') -Force -ErrorAction Stop } catch { Add-HookDependencyFailure -Name 'HookPayload.psm1' -ErrorRecord $_ }
39
- try { Import-Module (Join-Path $PSScriptRoot '../lib/discovery-validation/DiscoveryValidation.psm1') -Force -Global -ErrorAction Stop } catch { Add-HookDependencyFailure -Name 'DiscoveryValidation.psm1' -ErrorRecord $_ }
39
+ $script:DiscoveryValidationImportFailure = $null; try { Import-Module (Join-Path $PSScriptRoot '../lib/discovery-validation/DiscoveryValidation.psm1') -Force -Global -ErrorAction Stop } catch { $script:DiscoveryValidationImportFailure = 'DiscoveryValidation.psm1' }
40
40
  function Invoke-DiscoveryValidatorExe {
41
41
  <#
42
42
  .SYNOPSIS
@@ -201,6 +201,7 @@ function Invoke-DiscoveryArtifactGateDecision {
201
201
  if (-not $artifactType) {
202
202
  return [ordered]@{ hookSpecificOutput = [ordered]@{ hookEventName = 'PreToolUse'; permissionDecision = 'allow' } }
203
203
  }
204
+ if ($script:DiscoveryValidationImportFailure) { return [ordered]@{ hookSpecificOutput = [ordered]@{ hookEventName = 'PreToolUse'; permissionDecision = 'deny'; permissionDecisionReason = "DISCOVERY_ARTIFACT_GATE_BLOCKED: the validation module '$($script:DiscoveryValidationImportFailure)' failed to load, so the $artifactType artifact cannot be validated; the gate fails closed." } } }
204
205
 
205
206
  $requiredDeclaration = & $RequiredArtifactReader
206
207
  if (-not $requiredDeclaration.Present) {
@@ -61,7 +61,7 @@ $script:HookDependencyGuardLoadFailed = $false; try { . (Join-Path $PSScriptRoot
61
61
 
62
62
 
63
63
  try { Import-Module (Join-Path $PSScriptRoot '../lib/hook-payload/HookPayload.psm1') -Force -ErrorAction Stop } catch { Add-HookDependencyFailure -Name 'HookPayload.psm1' -ErrorRecord $_ }
64
- try { . (Join-Path $PSScriptRoot 'enforce-batch-budget-route.ps1') } catch { Add-HookDependencyFailure -Name 'enforce-batch-budget-route.ps1' -ErrorRecord $_ }
64
+ $script:PowerShellBatchBudgetRouteImportFailure = $null; try { . (Join-Path $PSScriptRoot 'enforce-batch-budget-route.ps1') } catch { $script:PowerShellBatchBudgetRouteImportFailure = 'enforce-batch-budget-route.ps1' }
65
65
 
66
66
  function Test-PowerShellBatchBudgetPathInRoot {
67
67
  <#
@@ -371,6 +371,7 @@ function Invoke-PowerShellBatchBudgetHook {
371
371
  if ($normalized -notmatch '\.(ps1|psm1|psd1)$') {
372
372
  return [ordered]@{ hookSpecificOutput = [ordered]@{ hookEventName = 'PreToolUse'; permissionDecision = 'allow' } }
373
373
  }
374
+ if ($script:PowerShellBatchBudgetRouteImportFailure) { return Get-PowerShellBatchBudgetBlockDecision -Reason "POWERSHELL_LARGE_PATH_REQUIRED: the route helper '$($script:PowerShellBatchBudgetRouteImportFailure)' failed to load, so the batch budget for '$normalized' cannot be evaluated; the gate fails closed." }
374
375
 
375
376
  $stateDir = Join-Path -Path $Root -ChildPath '.claude/state'
376
377
 
@@ -61,7 +61,7 @@ $script:HookDependencyGuardLoadFailed = $false; try { . (Join-Path $PSScriptRoot
61
61
 
62
62
 
63
63
  try { Import-Module (Join-Path $PSScriptRoot '../lib/hook-payload/HookPayload.psm1') -Force -ErrorAction Stop } catch { Add-HookDependencyFailure -Name 'HookPayload.psm1' -ErrorRecord $_ }
64
- try { . (Join-Path $PSScriptRoot 'enforce-batch-budget-route.ps1') } catch { Add-HookDependencyFailure -Name 'enforce-batch-budget-route.ps1' -ErrorRecord $_ }
64
+ $script:PythonBatchBudgetRouteImportFailure = $null; try { . (Join-Path $PSScriptRoot 'enforce-batch-budget-route.ps1') } catch { $script:PythonBatchBudgetRouteImportFailure = 'enforce-batch-budget-route.ps1' }
65
65
 
66
66
  function Test-PythonBatchBudgetPathInRoot {
67
67
  <#
@@ -374,6 +374,7 @@ function Invoke-PythonBatchBudgetHook {
374
374
  if ($normalized -notmatch '\.py$') {
375
375
  return [ordered]@{ hookSpecificOutput = [ordered]@{ hookEventName = 'PreToolUse'; permissionDecision = 'allow' } }
376
376
  }
377
+ if ($script:PythonBatchBudgetRouteImportFailure) { return Get-PythonBatchBudgetBlockDecision -Reason "PYTHON_LARGE_PATH_REQUIRED: the route helper '$($script:PythonBatchBudgetRouteImportFailure)' failed to load, so the batch budget for '$normalized' cannot be evaluated; the gate fails closed." }
377
378
 
378
379
  $stateDir = Join-Path -Path $Root -ChildPath '.claude/state'
379
380
 
@@ -7,9 +7,9 @@
7
7
  `scripts/dev_tools/resolve_codex_deployment.py`. It resolves the exact Codex
8
8
  deployment agent, model, and reasoning effort for one delegation from the
9
9
  logical agent, the assessed complexity band, the execution context, and the
10
- orchestration complexity ceiling. C3 defaults to Terra/high and elevates to
11
- Sol/high only for an epic child or a C4 orchestration ceiling; the epic
12
- planner and epic orchestrator personas are always forced to Sol/ultra. No
10
+ orchestration complexity ceiling. C3 defaults to Sol/high and elevates to
11
+ Astra/high only for an epic child or a C4 orchestration ceiling; the epic
12
+ planner and epic orchestrator personas are always forced to Astra/ultra. No
13
13
  model alias and no silent fallback is accepted.
14
14
 
15
15
  SINGLE-IMPLEMENTATION RULE. The orchestrator-state U6.X checks
@@ -81,20 +81,20 @@ $script:LOGICAL_AGENT_ALIASES = @{ 'feature-review' = 'feature-reviewer' }
81
81
 
82
82
  # The per-band deployment profiles (suffix, model, reasoning effort).
83
83
  $script:BASE_PROFILES = @{
84
- C1 = @{ suffix = 'c1'; model = 'gpt-5.6-luna'; model_reasoning_effort = 'low' }
85
- C2 = @{ suffix = 'c2'; model = 'gpt-5.6-terra'; model_reasoning_effort = 'medium' }
86
- C3 = @{ suffix = 'c3'; model = 'gpt-5.6-terra'; model_reasoning_effort = 'high' }
87
- C4 = @{ suffix = 'c4'; model = 'gpt-5.6-sol'; model_reasoning_effort = 'max' }
84
+ C1 = @{ suffix = 'c1'; model = 'gpt-6-luna'; model_reasoning_effort = 'low' }
85
+ C2 = @{ suffix = 'c2'; model = 'gpt-6.1-sol'; model_reasoning_effort = 'medium' }
86
+ C3 = @{ suffix = 'c3'; model = 'gpt-6.1-sol'; model_reasoning_effort = 'high' }
87
+ C4 = @{ suffix = 'c4'; model = 'gpt-6-astra'; model_reasoning_effort = 'max' }
88
88
  }
89
89
 
90
90
  # The profile a C3 delegation elevates to when the overlay applies.
91
- $script:C3_ELEVATED_PROFILE = @{ suffix = 'c3-elevated'; model = 'gpt-5.6-sol'; model_reasoning_effort = 'high' }
91
+ $script:C3_ELEVATED_PROFILE = @{ suffix = 'c3-elevated'; model = 'gpt-6-astra'; model_reasoning_effort = 'high' }
92
92
 
93
93
  # The personas whose profile is forced regardless of band, context, or ceiling.
94
94
  # Their deployment agent is the logical agent itself (empty suffix).
95
95
  $script:FORCED_PERSONA_PROFILES = @{
96
- 'epic-planner' = @{ suffix = ''; model = 'gpt-5.6-sol'; model_reasoning_effort = 'ultra' }
97
- 'epic-orchestrator' = @{ suffix = ''; model = 'gpt-5.6-sol'; model_reasoning_effort = 'ultra' }
96
+ 'epic-planner' = @{ suffix = ''; model = 'gpt-6-astra'; model_reasoning_effort = 'ultra' }
97
+ 'epic-orchestrator' = @{ suffix = ''; model = 'gpt-6-astra'; model_reasoning_effort = 'ultra' }
98
98
  }
99
99
 
100
100
 
@@ -60,7 +60,7 @@ Two separate mechanisms restrict Bash command text. They are kept apart here bec
60
60
  - `.github/workflows/ci.yml` triggers on `push` to `main` and `development`, on `pull_request` to `main`, `development`, and `epic/**`, on `workflow_dispatch`, and on `merge_group` (`types: [checks_requested]`, added by issue #952), with no path filters. When the merge queue on `main` is enabled, every required check is produced by a `merge_group` run of `ci.yml` as well as by the pull-request run; `.github/workflows/README.md` (`## Triggers`) records the trigger set.
61
61
  - Jobs in `ci.yml` and their check names: `Change scope` (job `changes`, the change-scope decision below); `CI full run` (job `full-run-marker`, which runs only on a full run, marks that run as a valid base for later decisions, and is not a required check); `quality-checks7 / Code Quality & Tests (<python-version>)` on Python 3.10, 3.11, 3.12, and 3.13 (`_quality-checks.yml`: Black check, Ruff, Pyright, the Codex generator `--check`, the tier classification, Pytest with line and branch coverage, and the coverage-threshold check on the JSON report totals); `security-scan / Security Scanning` (its `safety check` step carries `continue-on-error: true` and does not fail the check); `docs-validation / Documentation Validation`; `build-check / Build Package`; `shell-coverage / Shell Coverage (Bats + kcov)`; `drm-copilot-extension-tests / drm-copilot Extension Tests (<os>)` on `ubuntu-latest` and `windows-latest`; `root-typescript-tests / Root TypeScript Tests (<os>)` on `ubuntu-latest` and `windows-latest`; `NPM Audit Gate / npm audit (<manifest>)` (the calling job carries the name `NPM Audit Gate`); and the `poshqc` group below.
62
62
  - PowerShell CI (`_poshqc.yml`): `poshqc / PowerShell QC static` (format and analyze on `windows-latest`); the shard matrix `poshqc / PowerShell QC shard 1`, `shard 2`, and `shard 3` (`Invoke-PoshQCTest -ShardIndex -ShardCount` over the scan folders of `config/poshqc-scan.json`, with coverage, on `windows-latest`); the aggregator `poshqc / PowerShell QC`, which requires the static and shard jobs to succeed, verifies shard completeness against a Pester discovery count, and merges shard coverage; and `poshqc / PowerShell hook suites (Linux)`, which runs only `tests/scripts/claude-hooks` and `tests/scripts/codex-hooks` on `ubuntu-latest` with coverage disabled. A new test file under a scanned folder is assigned to a shard automatically and is counted by the completeness check.
63
- - Change-scope decision (issue #962): the `Change scope` job runs `scripts/ci/Invoke-CiChangeScope.ps1` and publishes the job output `code`. The decision is `code=false` (docs-only) only on a `pull_request` event from this repository when every file changed since the newest successful `ci.yml` run on the pull-request branch whose `CI full run` job succeeded, and whose head commit is an ancestor of the current head, is on the allowlist `config/ci-docs-only-paths.json`. A path is allowlisted when it starts with `docs/features/active/`, `docs/features/completed/`, `docs/features/potential/`, or `docs/research/`, does not start with `docs/features/templates/` or `docs/features/potential/template.md`, and ends in `.md`, `.txt`, `.log`, `.json`, or `.xml`; the allowlist file itself is not allowlisted. Every other case is a full run (`code=true`): `push`, `merge_group`, and `workflow_dispatch` events, a fork pull request, unreadable run or job data, no earlier full green run, a missing or non-ancestor base, an empty diff, any path outside the allowlist, and any error. The decision step carries `continue-on-error: true` and the callers compare the output with `!= 'false'`, so a failed or missing decision also gives a full run.
63
+ - Change-scope decision (issue #962): the `Change scope` job runs `scripts/ci/Invoke-CiChangeScope.ps1` and publishes the job output `code`. The decision is `code=false` (docs-only) only on a `pull_request` event from this repository, through one of two comparisons. Green-run base: every file changed since the newest successful `ci.yml` run on the pull-request branch whose `CI full run` job succeeded, and whose head commit is present and an ancestor of the current head, is on the allowlist `config/ci-docs-only-paths.json`; the reason is `DOCS_ONLY_SINCE_<green head sha>`. Merge-base fallback (issue #973): when the green-run step ends with no earlier full green run (`NO_FULL_GREEN_RUN`), a missing base (`BASE_NOT_PRESENT`), or a non-ancestor base (`BASE_NOT_ANCESTOR`), and the pull request's base ref is exactly `main`, the script computes `git merge-base` of the payload base SHA (`BASE_SHA`, from `github.event.pull_request.base.sha`; the base ref arrives as `BASE_REF`) and the head, lists the files changed since that merge base with the same diff arguments, and decides `DOCS_ONLY_SINCE_MERGE_BASE_<merge base sha>` when every changed file is allowlisted. Both comparisons run the diff with rename detection off, so both the old and the new path of a rename are classified. A path is allowlisted when it starts with `docs/features/active/`, `docs/features/archive/`, `docs/features/completed/`, `docs/features/epics/`, `docs/features/parallel/`, `docs/features/potential/`, or `docs/research/`, does not start with `docs/features/templates/` or `docs/features/potential/template.md`, and ends in `.md`, `.txt`, `.log`, `.json`, or `.xml`; the allowlist file itself is not allowlisted. Every other case is a full run (`code=true`): `push`, `merge_group`, and `workflow_dispatch` events, a fork pull request, unreadable run or job data, no earlier full green run or a missing or non-ancestor base when the base ref is not `main`, a merge base that cannot be resolved (`MERGE_BASE_UNRESOLVED`, for example a blank base SHA or a base commit missing from the checkout), a failed ancestry check, an empty diff, any path outside the allowlist, and any error. The decision step carries `continue-on-error: true` and the callers compare the output with `!= 'false'`, so a failed or missing decision also gives a full run.
64
64
  - Docs-only behavior (`code=false`): `ci.yml` passes `run-heavy: false` to `_quality-checks.yml`, `_security-scan.yml`, `_build-check.yml`, `_poshqc.yml`, `_shell-coverage.yml`, and `_drm-copilot-extension-tests.yml`. Each required job still starts under its full-run check name with every step skipped, so every required context reports `success` without running its suite. In `_poshqc.yml` the aggregator `poshqc / PowerShell QC` runs with every step gated, and `poshqc / PowerShell QC static`, the shard jobs, and `poshqc / PowerShell hook suites (Linux)` are skipped at job level. `docs-validation / Documentation Validation` runs in full. `root-typescript-tests`, `NPM Audit Gate`, and `CI full run` are skipped at job level. A `success` on a docs-only commit is therefore not evidence that the heavy suites pass for that commit; that evidence is the newest run whose `CI full run` job succeeded.
65
65
  - A commit that changes any path outside the allowlist (any code, workflow, configuration, script, test, or customization file) runs the full set of jobs, and its `CI full run` job marks it as a base for later docs-only decisions. A standalone `workflow_dispatch` of a reusable workflow, or a caller that omits `run-heavy`, also runs in full. `.github/workflows/README.md` (`## Change-Scope Decision (Issue #962)`) records the reason codes and the per-context behavior table.
66
66
  - Required contexts of ruleset 15241672, confirmed by the orchestrator through `gh api` on 2026-10-16: `drm-copilot-extension-tests / drm-copilot Extension Tests (ubuntu-latest)`, `drm-copilot-extension-tests / drm-copilot Extension Tests (windows-latest)`, `docs-validation / Documentation Validation`, `poshqc / PowerShell QC`, `shell-coverage / Shell Coverage (Bats + kcov)`, `security-scan / Security Scanning`, `quality-checks7 / Code Quality & Tests (3.10)`, `quality-checks7 / Code Quality & Tests (3.11)`, `quality-checks7 / Code Quality & Tests (3.12)`, `quality-checks7 / Code Quality & Tests (3.13)`, `build-check / Build Package`.
@@ -83,6 +83,7 @@ Run these after editing any mirrored or bundled file; each is under `tests/scrip
83
83
 
84
84
  - `test_push_down_claude_resource_contracts.py` and `test_push_down_codex_and_agents_resource_contracts.py`: every distributable `.claude`, `.agents`, and `.codex` file exists in the bundle with equal text.
85
85
  - `test_push_down_claude_pack_manifest_completeness.py` and `test_push_down_codex_and_agents_pack_manifest_completeness.py`: every bundled file is listed in a pack manifest.
86
+ - `test_push_down_pack_manifest_dependency_closure.py`: every `$PSScriptRoot` dependency of a manifested PowerShell file, and every hook script named by `.claude/settings.json`, manifested agent frontmatter, or `.codex/config.toml`, is in core plus the owning pack.
86
87
  - The Codex generator check: `scripts/dev_tools/generate_codex_agent_variants.py` run in module form with `--check` (base agents are hand-edited; variants, bundle copies, and the Codex `core.json` are generated).
87
88
  - `test_codex_agent_wrapper_contracts.py` and `test_codex_handoff_contract_parity.py`: pinned Codex agent fragments and handoff parity.
88
89
  - `test_claude_rules_frontmatter.py`: rule `paths:` scopes and that every preloaded skill exists.
@@ -289,28 +289,28 @@
289
289
  "complexity_to_profile": {
290
290
  "C1": {
291
291
  "suffix": "c1",
292
- "model": "gpt-5.6-luna",
292
+ "model": "gpt-6-luna",
293
293
  "model_reasoning_effort": "low"
294
294
  },
295
295
  "C2": {
296
296
  "suffix": "c2",
297
- "model": "gpt-5.6-terra",
297
+ "model": "gpt-6.1-sol",
298
298
  "model_reasoning_effort": "medium"
299
299
  },
300
300
  "C3": {
301
301
  "suffix": "c3",
302
- "model": "gpt-5.6-terra",
302
+ "model": "gpt-6.1-sol",
303
303
  "model_reasoning_effort": "high"
304
304
  },
305
305
  "C4": {
306
306
  "suffix": "c4",
307
- "model": "gpt-5.6-sol",
307
+ "model": "gpt-6-astra",
308
308
  "model_reasoning_effort": "max"
309
309
  }
310
310
  },
311
311
  "c3_elevated_profile": {
312
312
  "suffix": "c3-elevated",
313
- "model": "gpt-5.6-sol",
313
+ "model": "gpt-6-astra",
314
314
  "model_reasoning_effort": "high",
315
315
  "activation": {
316
316
  "operator": "any",
@@ -329,12 +329,12 @@
329
329
  "forced_personas": {
330
330
  "epic-planner": {
331
331
  "suffix": "",
332
- "model": "gpt-5.6-sol",
332
+ "model": "gpt-6-astra",
333
333
  "model_reasoning_effort": "ultra"
334
334
  },
335
335
  "epic-orchestrator": {
336
336
  "suffix": "",
337
- "model": "gpt-5.6-sol",
337
+ "model": "gpt-6-astra",
338
338
  "model_reasoning_effort": "ultra"
339
339
  }
340
340
  },
@@ -16,15 +16,19 @@
16
16
  ".claude/agents/orchestrator.md",
17
17
  ".claude/agents/parallel-orchestrator.md",
18
18
  ".claude/agents/parallel-planner.md",
19
+ ".claude/agents/pr-author.md",
19
20
  ".claude/agents/prd-feature.md",
20
21
  ".claude/agents/requirements-reconciler.md",
21
22
  ".claude/agents/runtime-characterization-analyst.md",
22
23
  ".claude/agents/staged-review.md",
23
24
  ".claude/agents/status-updater.md",
24
25
  ".claude/agents/task-researcher.md",
26
+ ".claude/hooks/check-powershell-test-purity.ps1",
27
+ ".claude/hooks/check-python-test-purity.ps1",
25
28
  ".claude/hooks/enforce-batch-budget-route.ps1",
26
29
  ".claude/hooks/enforce-checkpoint-monotonic.ps1",
27
30
  ".claude/hooks/enforce-completion-consistency.ps1",
31
+ ".claude/hooks/enforce-completion-helpers.ps1",
28
32
  ".claude/hooks/enforce-discovery-artifact-gate.ps1",
29
33
  ".claude/hooks/enforce-epic-invocation-origin.ps1",
30
34
  ".claude/hooks/enforce-epic-merge-gate.ps1",
@@ -48,6 +52,7 @@
48
52
  ".claude/hooks/enforce-parallel-drift-gate.ps1",
49
53
  ".claude/hooks/enforce-parallel-drift-gate-helpers.ps1",
50
54
  ".claude/hooks/enforce-parallel-worktree-removal-gate.ps1",
55
+ ".claude/hooks/enforce-powershell-batch-budget.ps1",
51
56
  ".claude/hooks/enforce-pr-author-command-allowlist.ps1",
52
57
  ".claude/hooks/enforce-pr-author-skill.artifact-root.ps1",
53
58
  ".claude/hooks/enforce-pr-author-skill.docs-only.ps1",
@@ -57,6 +62,7 @@
57
62
  ".claude/hooks/enforce-prd-feature-before-planner-helpers.ps1",
58
63
  ".claude/hooks/enforce-prd-feature-before-planner.ps1",
59
64
  ".claude/hooks/enforce-promotion-mcp-only.ps1",
65
+ ".claude/hooks/enforce-python-batch-budget.ps1",
60
66
  ".claude/hooks/feature-folder-resolution.ps1",
61
67
  ".claude/hooks/feature-review-coverage-thresholds.ps1",
62
68
  ".claude/hooks/hook-command-heredoc.ps1",
@@ -80,6 +86,7 @@
80
86
  ".claude/hooks/validate-orchestrator-output-routing.ps1",
81
87
  ".claude/hooks/validate-orchestrator-output.ps1",
82
88
  ".claude/hooks/validate-planner-output.ps1",
89
+ ".claude/hooks/validate-pr-author-output.ps1",
83
90
  ".claude/hooks/validate-prd-feature-output.ps1",
84
91
  ".claude/hooks/validate-required-artifact-output.ps1",
85
92
  ".claude/hooks/validate-task-researcher-output.ps1",
@@ -81,13 +81,13 @@ receipt's logical agent name.
81
81
 
82
82
  ## Fixed routing outcomes
83
83
 
84
- - C1: `gpt-5.6-luna`, low reasoning.
85
- - C2: `gpt-5.6-terra`, medium reasoning.
86
- - C3 standalone with a C3 ceiling: `gpt-5.6-terra`, high reasoning.
84
+ - C1: `gpt-6-luna`, low reasoning.
85
+ - C2: `gpt-6.1-sol`, medium reasoning.
86
+ - C3 standalone with a C3 ceiling: `gpt-6.1-sol`, high reasoning.
87
87
  - C3 in either epic-child context, or C3 under a C4 ceiling:
88
- `gpt-5.6-sol`, high reasoning through the `-c3-elevated` profile.
89
- - C4: `gpt-5.6-sol`, max reasoning.
90
- - `epic-planner` and `epic-orchestrator`: always `gpt-5.6-sol`, ultra
88
+ `gpt-6-astra`, high reasoning through the `-c3-elevated` profile.
89
+ - C4: `gpt-6-astra`, max reasoning.
90
+ - `epic-planner` and `epic-orchestrator`: always `gpt-6-astra`, ultra
91
91
  reasoning.
92
92
 
93
93
  If the exact model is unavailable, record `model_unavailable`, leave the work
@@ -79,7 +79,7 @@ issue number for it. Run at most one main-sync child per wave, then re-fetch the
79
79
  Launch all ready children in one bounded parallel wave. Before each launch, persist the
80
80
  epic-child topology receipt, reviewed complexity assessment, delegation receipt, and Codex
81
81
  model-routing receipt with the same `delegation_id`, then select the generated deployment agent.
82
- C3 epic children use the elevated Sol/High profile. The child prompt contains:
82
+ C3 epic children use the elevated Astra/High profile. The child prompt contains:
83
83
 
84
84
  > `Epic mode: true. epic_feature_folder: <epic-slug>. integration_branch: epic/<epic-slug>-integration. epic_checkpoint_path: artifacts/orchestration/epic-orchestrator-state.json. PR base branch MUST be <integration_branch>, not main; pass --base <integration_branch> to gh pr create.`
85
85
 
@@ -137,12 +137,12 @@ remove its worktree. The worktree-removal hook denies removal before the matchin
137
137
  Route selection and model selection are independent. The deterministic file-count or marker
138
138
  route selects topology; the C1-C4 assessment selects a checked-in Codex deployment profile.
139
139
 
140
- - C1: `gpt-5.6-luna`, low.
141
- - C2: `gpt-5.6-terra`, medium.
142
- - standalone C3 with ceiling C3: `gpt-5.6-terra`, high.
143
- - epic C3 or C3 with a C4 sibling: `gpt-5.6-sol`, high.
144
- - C4: `gpt-5.6-sol`, max.
145
- - `epic-orchestrator`: `gpt-5.6-sol`, ultra.
140
+ - C1: `gpt-6-luna`, low.
141
+ - C2: `gpt-6.1-sol`, medium.
142
+ - standalone C3 with ceiling C3: `gpt-6.1-sol`, high.
143
+ - epic C3 or C3 with a C4 sibling: `gpt-6-astra`, high.
144
+ - C4: `gpt-6-astra`, max.
145
+ - `epic-orchestrator`: `gpt-6-astra`, ultra.
146
146
 
147
147
  Persist the topology and model-routing receipts before every child or `pr-author` delegation. The
148
148
  deployed agent type and actual model must match its receipts and start attestation. If the
@@ -97,7 +97,7 @@ the prepared worktree. Write one immutable launch specification under
97
97
  `wave_number: 0`, the planner checkpoint path, integration branch, bounded maximum, and one
98
98
  launch record per child. Every record supplies the unique launch/delegation ids, prepared
99
99
  worktree and branch, generated `orchestrator-cN` profile, exact model/reasoning/permissions, and
100
- prompt. C3 epic children use the elevated Sol/High profile. Monitor the returned durable status
100
+ prompt. C3 epic children use the elevated Astra/High profile. Monitor the returned durable status
101
101
  path; a nonzero child exit or missing completion status blocks fan-in.
102
102
 
103
103
  The launch specification schema is:
@@ -118,7 +118,7 @@ The launch specification schema is:
118
118
  "feature_folder": "<final-active-feature-folder>",
119
119
  "issue_num": 123,
120
120
  "deployment_agent": "orchestrator-c3-elevated",
121
- "model": "gpt-5.6-sol",
121
+ "model": "gpt-6-astra",
122
122
  "model_reasoning_effort": "high",
123
123
  "permissions": "orchestrator-workspace",
124
124
  "execution_context": "epic_preparation_child",
@@ -60,7 +60,7 @@ Two separate mechanisms restrict Bash command text. They are kept apart here bec
60
60
  - `.github/workflows/ci.yml` triggers on `push` to `main` and `development`, on `pull_request` to `main`, `development`, and `epic/**`, on `workflow_dispatch`, and on `merge_group` (`types: [checks_requested]`, added by issue #952), with no path filters. When the merge queue on `main` is enabled, every required check is produced by a `merge_group` run of `ci.yml` as well as by the pull-request run; `.github/workflows/README.md` (`## Triggers`) records the trigger set.
61
61
  - Jobs in `ci.yml` and their check names: `Change scope` (job `changes`, the change-scope decision below); `CI full run` (job `full-run-marker`, which runs only on a full run, marks that run as a valid base for later decisions, and is not a required check); `quality-checks7 / Code Quality & Tests (<python-version>)` on Python 3.10, 3.11, 3.12, and 3.13 (`_quality-checks.yml`: Black check, Ruff, Pyright, the Codex generator `--check`, the tier classification, Pytest with line and branch coverage, and the coverage-threshold check on the JSON report totals); `security-scan / Security Scanning` (its `safety check` step carries `continue-on-error: true` and does not fail the check); `docs-validation / Documentation Validation`; `build-check / Build Package`; `shell-coverage / Shell Coverage (Bats + kcov)`; `drm-copilot-extension-tests / drm-copilot Extension Tests (<os>)` on `ubuntu-latest` and `windows-latest`; `root-typescript-tests / Root TypeScript Tests (<os>)` on `ubuntu-latest` and `windows-latest`; `NPM Audit Gate / npm audit (<manifest>)` (the calling job carries the name `NPM Audit Gate`); and the `poshqc` group below.
62
62
  - PowerShell CI (`_poshqc.yml`): `poshqc / PowerShell QC static` (format and analyze on `windows-latest`); the shard matrix `poshqc / PowerShell QC shard 1`, `shard 2`, and `shard 3` (`Invoke-PoshQCTest -ShardIndex -ShardCount` over the scan folders of `config/poshqc-scan.json`, with coverage, on `windows-latest`); the aggregator `poshqc / PowerShell QC`, which requires the static and shard jobs to succeed, verifies shard completeness against a Pester discovery count, and merges shard coverage; and `poshqc / PowerShell hook suites (Linux)`, which runs only `tests/scripts/claude-hooks` and `tests/scripts/codex-hooks` on `ubuntu-latest` with coverage disabled. A new test file under a scanned folder is assigned to a shard automatically and is counted by the completeness check.
63
- - Change-scope decision (issue #962): the `Change scope` job runs `scripts/ci/Invoke-CiChangeScope.ps1` and publishes the job output `code`. The decision is `code=false` (docs-only) only on a `pull_request` event from this repository when every file changed since the newest successful `ci.yml` run on the pull-request branch whose `CI full run` job succeeded, and whose head commit is an ancestor of the current head, is on the allowlist `config/ci-docs-only-paths.json`. A path is allowlisted when it starts with `docs/features/active/`, `docs/features/completed/`, `docs/features/potential/`, or `docs/research/`, does not start with `docs/features/templates/` or `docs/features/potential/template.md`, and ends in `.md`, `.txt`, `.log`, `.json`, or `.xml`; the allowlist file itself is not allowlisted. Every other case is a full run (`code=true`): `push`, `merge_group`, and `workflow_dispatch` events, a fork pull request, unreadable run or job data, no earlier full green run, a missing or non-ancestor base, an empty diff, any path outside the allowlist, and any error. The decision step carries `continue-on-error: true` and the callers compare the output with `!= 'false'`, so a failed or missing decision also gives a full run.
63
+ - Change-scope decision (issue #962): the `Change scope` job runs `scripts/ci/Invoke-CiChangeScope.ps1` and publishes the job output `code`. The decision is `code=false` (docs-only) only on a `pull_request` event from this repository, through one of two comparisons. Green-run base: every file changed since the newest successful `ci.yml` run on the pull-request branch whose `CI full run` job succeeded, and whose head commit is present and an ancestor of the current head, is on the allowlist `config/ci-docs-only-paths.json`; the reason is `DOCS_ONLY_SINCE_<green head sha>`. Merge-base fallback (issue #973): when the green-run step ends with no earlier full green run (`NO_FULL_GREEN_RUN`), a missing base (`BASE_NOT_PRESENT`), or a non-ancestor base (`BASE_NOT_ANCESTOR`), and the pull request's base ref is exactly `main`, the script computes `git merge-base` of the payload base SHA (`BASE_SHA`, from `github.event.pull_request.base.sha`; the base ref arrives as `BASE_REF`) and the head, lists the files changed since that merge base with the same diff arguments, and decides `DOCS_ONLY_SINCE_MERGE_BASE_<merge base sha>` when every changed file is allowlisted. Both comparisons run the diff with rename detection off, so both the old and the new path of a rename are classified. A path is allowlisted when it starts with `docs/features/active/`, `docs/features/archive/`, `docs/features/completed/`, `docs/features/epics/`, `docs/features/parallel/`, `docs/features/potential/`, or `docs/research/`, does not start with `docs/features/templates/` or `docs/features/potential/template.md`, and ends in `.md`, `.txt`, `.log`, `.json`, or `.xml`; the allowlist file itself is not allowlisted. Every other case is a full run (`code=true`): `push`, `merge_group`, and `workflow_dispatch` events, a fork pull request, unreadable run or job data, no earlier full green run or a missing or non-ancestor base when the base ref is not `main`, a merge base that cannot be resolved (`MERGE_BASE_UNRESOLVED`, for example a blank base SHA or a base commit missing from the checkout), a failed ancestry check, an empty diff, any path outside the allowlist, and any error. The decision step carries `continue-on-error: true` and the callers compare the output with `!= 'false'`, so a failed or missing decision also gives a full run.
64
64
  - Docs-only behavior (`code=false`): `ci.yml` passes `run-heavy: false` to `_quality-checks.yml`, `_security-scan.yml`, `_build-check.yml`, `_poshqc.yml`, `_shell-coverage.yml`, and `_drm-copilot-extension-tests.yml`. Each required job still starts under its full-run check name with every step skipped, so every required context reports `success` without running its suite. In `_poshqc.yml` the aggregator `poshqc / PowerShell QC` runs with every step gated, and `poshqc / PowerShell QC static`, the shard jobs, and `poshqc / PowerShell hook suites (Linux)` are skipped at job level. `docs-validation / Documentation Validation` runs in full. `root-typescript-tests`, `NPM Audit Gate`, and `CI full run` are skipped at job level. A `success` on a docs-only commit is therefore not evidence that the heavy suites pass for that commit; that evidence is the newest run whose `CI full run` job succeeded.
65
65
  - A commit that changes any path outside the allowlist (any code, workflow, configuration, script, test, or customization file) runs the full set of jobs, and its `CI full run` job marks it as a base for later docs-only decisions. A standalone `workflow_dispatch` of a reusable workflow, or a caller that omits `run-heavy`, also runs in full. `.github/workflows/README.md` (`## Change-Scope Decision (Issue #962)`) records the reason codes and the per-context behavior table.
66
66
  - Required contexts of ruleset 15241672, confirmed by the orchestrator through `gh api` on 2026-10-16: `drm-copilot-extension-tests / drm-copilot Extension Tests (ubuntu-latest)`, `drm-copilot-extension-tests / drm-copilot Extension Tests (windows-latest)`, `docs-validation / Documentation Validation`, `poshqc / PowerShell QC`, `shell-coverage / Shell Coverage (Bats + kcov)`, `security-scan / Security Scanning`, `quality-checks7 / Code Quality & Tests (3.10)`, `quality-checks7 / Code Quality & Tests (3.11)`, `quality-checks7 / Code Quality & Tests (3.12)`, `quality-checks7 / Code Quality & Tests (3.13)`, `build-check / Build Package`.
@@ -83,6 +83,7 @@ Run these after editing any mirrored or bundled file; each is under `tests/scrip
83
83
 
84
84
  - `test_push_down_claude_resource_contracts.py` and `test_push_down_codex_and_agents_resource_contracts.py`: every distributable `.claude`, `.agents`, and `.codex` file exists in the bundle with equal text.
85
85
  - `test_push_down_claude_pack_manifest_completeness.py` and `test_push_down_codex_and_agents_pack_manifest_completeness.py`: every bundled file is listed in a pack manifest.
86
+ - `test_push_down_pack_manifest_dependency_closure.py`: every `$PSScriptRoot` dependency of a manifested PowerShell file, and every hook script named by `.claude/settings.json`, manifested agent frontmatter, or `.codex/config.toml`, is in core plus the owning pack.
86
87
  - The Codex generator check: `scripts/dev_tools/generate_codex_agent_variants.py` run in module form with `--check` (base agents are hand-edited; variants, bundle copies, and the Codex `core.json` are generated).
87
88
  - `test_codex_agent_wrapper_contracts.py` and `test_codex_handoff_contract_parity.py`: pinned Codex agent fragments and handoff parity.
88
89
  - `test_claude_rules_frontmatter.py`: rule `paths:` scopes and that every preloaded skill exists.
@@ -102,8 +102,8 @@ Apply the deterministic production-file axis before model selection:
102
102
  closed to the large orchestrator topology.
103
103
  - Outside the applicable budget, cross-cutting, mixed-language, or unsupported: deploy
104
104
  `orchestrator-<profile>` and let that agent run the large path.
105
- - Epic planning: deploy the forced `epic-planner` Sol/Ultra persona.
106
- - Prepared or manual epic execution: deploy the forced `epic-orchestrator` Sol/Ultra persona.
105
+ - Epic planning: deploy the forced `epic-planner` Astra/Ultra persona.
106
+ - Prepared or manual epic execution: deploy the forced `epic-orchestrator` Astra/Ultra persona.
107
107
 
108
108
  Only the production-file limit selects inside versus outside the language topology budget. The
109
109
  test-file estimate remains in the receipt and governs typed-engineer batching; it does not change
@@ -158,8 +158,8 @@ checked-in Codex deployment agent. Before every delegation:
158
158
  5. Require the `SubagentStart` model attestation to match the receipt before accepting mutation
159
159
  or completion.
160
160
 
161
- C3 defaults to Terra/High when it is the standalone orchestration ceiling. It elevates to
162
- Sol/High only for epic preparation/execution children or when a C4 sibling sets the ceiling to
161
+ C3 defaults to Sol/High when it is the standalone orchestration ceiling. It elevates to
162
+ Astra/High only for epic preparation/execution children or when a C4 sibling sets the ceiling to
163
163
  C4. If the required model/profile is unavailable, record `model_unavailable` and stop without a
164
164
  silent fallback.
165
165
 
@@ -275,7 +275,7 @@ If an exact signal or required path field is missing, set the relevant step to `
275
275
  8. Keep topology routing separate from C1-C4 model routing. Persist both topology and
276
276
  model-routing receipts and select the exact generated Codex deployment agent before every
277
277
  delegation.
278
- 9. Use Terra/High for standalone ceiling-C3 work. Use Sol/High for C3 epic children or C3 work in
278
+ 9. Use Sol/High for standalone ceiling-C3 work. Use Astra/High for C3 epic children or C3 work in
279
279
  an orchestration whose monotonic ceiling is C4. Do not infer this overlay from file count.
280
280
 
281
281
  ## Small Path
@@ -1,6 +1,6 @@
1
1
  name = "atomic-executor-c1"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-luna"
3
+ model = "gpt-6-luna"
4
4
  model_reasoning_effort = "low"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-executor-c2"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "medium"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-executor-c3-elevated"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-sol"
3
+ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "high"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-executor-c3"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "high"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-executor-c4"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-sol"
3
+ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "max"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-executor"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "high"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-planner-c1"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-luna"
3
+ model = "gpt-6-luna"
4
4
  model_reasoning_effort = "low"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-planner-c2"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "medium"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-planner-c3-elevated"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-sol"
3
+ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "high"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-planner-c3"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "high"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-planner-c4"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-sol"
3
+ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "max"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "atomic-planner"
2
2
  description = "Converted subagent"
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "high"
5
5
  developer_instructions = '''
6
6
  Applied rewrites:
@@ -1,6 +1,6 @@
1
1
  name = "commit-steward-c1"
2
2
  description = "Generate a high-signal conventional commit message for the current repository based on staged changes only."
3
- model = "gpt-5.6-luna"
3
+ model = "gpt-6-luna"
4
4
  model_reasoning_effort = "low"
5
5
 
6
6
  developer_instructions = """
@@ -1,6 +1,6 @@
1
1
  name = "commit-steward-c2"
2
2
  description = "Generate a high-signal conventional commit message for the current repository based on staged changes only."
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "medium"
5
5
 
6
6
  developer_instructions = """
@@ -1,6 +1,6 @@
1
1
  name = "commit-steward-c3-elevated"
2
2
  description = "Generate a high-signal conventional commit message for the current repository based on staged changes only."
3
- model = "gpt-5.6-sol"
3
+ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "high"
5
5
 
6
6
  developer_instructions = """
@@ -1,6 +1,6 @@
1
1
  name = "commit-steward-c3"
2
2
  description = "Generate a high-signal conventional commit message for the current repository based on staged changes only."
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "high"
5
5
 
6
6
  developer_instructions = """
@@ -1,6 +1,6 @@
1
1
  name = "commit-steward-c4"
2
2
  description = "Generate a high-signal conventional commit message for the current repository based on staged changes only."
3
- model = "gpt-5.6-sol"
3
+ model = "gpt-6-astra"
4
4
  model_reasoning_effort = "max"
5
5
 
6
6
  developer_instructions = """
@@ -1,6 +1,6 @@
1
1
  name = "commit-steward"
2
2
  description = "Generate a high-signal conventional commit message for the current repository based on staged changes only."
3
- model = "gpt-5.6-terra"
3
+ model = "gpt-6.1-sol"
4
4
  model_reasoning_effort = "high"
5
5
 
6
6
  developer_instructions = """