@danmoisan/drm-copilot-mcp 1.1.26 → 1.1.27

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 (159) hide show
  1. package/out/mcp-server.js +170 -52
  2. package/package.json +1 -1
  3. package/resources/claude-customizations/.claude/agents/atomic-executor.md +3 -3
  4. package/resources/claude-customizations/.claude/agents/atomic-planner.md +2 -2
  5. package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +7 -7
  6. package/resources/claude-customizations/.claude/agents/feature-review.md +6 -3
  7. package/resources/claude-customizations/.claude/agents/orchestrator.md +11 -7
  8. package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +7 -7
  9. package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +6 -6
  10. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-review.ps1 +699 -0
  11. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +16 -1
  12. package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-rules.ps1 +50 -16
  13. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorState.psm1 +6 -1
  14. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateCompletion.psm1 +4 -2
  15. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateCompletionChecks.psm1 +51 -2
  16. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateReceipts.psm1 +5 -2
  17. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateRemediationAccounting.psm1 +116 -4
  18. package/resources/claude-customizations/.claude/rules/csharp.md +8 -8
  19. package/resources/claude-customizations/.claude/rules/orchestrator-state.md +28 -2
  20. package/resources/claude-customizations/.claude/rules/powershell.md +2 -2
  21. package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +8 -12
  22. package/resources/claude-customizations/.claude/skills/csharp-qa-gate/SKILL.md +14 -15
  23. package/resources/claude-customizations/.claude/skills/epic-progress-report/SKILL.md +338 -0
  24. package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Logic.ps1 +248 -0
  25. package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Metrics.ps1 +232 -0
  26. package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.Render.ps1 +196 -0
  27. package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.State.ps1 +286 -0
  28. package/resources/claude-customizations/.claude/skills/epic-progress-report/scripts/Get-EpicProgressReport.ps1 +475 -0
  29. package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +18 -13
  30. package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +21 -9
  31. package/resources/claude-customizations/.claude/skills/invoke-csharp-engineer/SKILL.md +5 -5
  32. package/resources/claude-customizations/.claude/skills/invoke-powershell-engineer/SKILL.md +4 -4
  33. package/resources/claude-customizations/.claude/skills/invoke-python-engineer/SKILL.md +4 -4
  34. package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +24 -2
  35. package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +8 -0
  36. package/resources/claude-customizations/.claude/skills/powershell-qa-gate/SKILL.md +16 -17
  37. package/resources/claude-customizations/.claude/skills/python-qa-gate/SKILL.md +15 -16
  38. package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +1 -1
  39. package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +6 -6
  40. package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +13 -14
  41. package/resources/claude-customizations/.claude-variants/csharp-legacy/skills/invoke-csharp-engineer/SKILL.md +4 -4
  42. package/resources/claude-customizations/pack-manifests/core.json +7 -0
  43. package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +8 -12
  44. package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +1 -1
  45. package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +13 -14
  46. package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +18 -13
  47. package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +5 -1
  48. package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +18 -5
  49. package/resources/codex-and-agents-customizations/.agents/skills/invoke-csharp-engineer/SKILL.md +4 -4
  50. package/resources/codex-and-agents-customizations/.agents/skills/invoke-powershell-engineer/SKILL.md +4 -4
  51. package/resources/codex-and-agents-customizations/.agents/skills/invoke-python-engineer/SKILL.md +4 -4
  52. package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +24 -2
  53. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-state/SKILL.md +16 -1
  54. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +3 -3
  55. package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +2 -2
  56. package/resources/codex-and-agents-customizations/.agents/skills/powershell-qa-gate/SKILL.md +15 -16
  57. package/resources/codex-and-agents-customizations/.agents/skills/python-qa-gate/SKILL.md +14 -15
  58. package/resources/codex-and-agents-customizations/.agents/skills/repo-automation-adapter/SKILL.md +2 -0
  59. package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +13 -14
  60. package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/invoke-csharp-engineer/SKILL.md +4 -4
  61. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c1.toml +3 -3
  62. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c2.toml +3 -3
  63. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3-elevated.toml +3 -3
  64. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3.toml +3 -3
  65. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c4.toml +3 -3
  66. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +3 -3
  67. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c1.toml +2 -2
  68. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c2.toml +2 -2
  69. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3-elevated.toml +2 -2
  70. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3.toml +2 -2
  71. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c4.toml +2 -2
  72. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +2 -2
  73. package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-executor.toml +2 -2
  74. package/resources/codex-and-agents-customizations/.codex/agents/csharp-atomic-planning.toml +1 -1
  75. package/resources/codex-and-agents-customizations/.codex/agents/csharp-orchestrator.toml +1 -1
  76. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +6 -6
  77. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +6 -6
  78. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +6 -6
  79. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +6 -6
  80. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +6 -6
  81. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +6 -6
  82. package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +2 -2
  83. package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-executor.toml +2 -2
  84. package/resources/codex-and-agents-customizations/.codex/agents/powershell-atomic-planning.toml +1 -1
  85. package/resources/codex-and-agents-customizations/.codex/agents/powershell-di-unit-test-engineer.toml +1 -1
  86. package/resources/codex-and-agents-customizations/.codex/agents/powershell-orchestrator.toml +1 -1
  87. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +7 -7
  88. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +7 -7
  89. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +7 -7
  90. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +7 -7
  91. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +7 -7
  92. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +7 -7
  93. package/resources/codex-and-agents-customizations/.codex/agents/pytest-unit-test-coding.toml +1 -1
  94. package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-executor.toml +2 -2
  95. package/resources/codex-and-agents-customizations/.codex/agents/python-atomic-planning.toml +1 -1
  96. package/resources/codex-and-agents-customizations/.codex/agents/python-execution-only-typed.toml +1 -1
  97. package/resources/codex-and-agents-customizations/.codex/agents/python-orchestrator.toml +1 -1
  98. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +6 -6
  99. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +6 -6
  100. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +6 -6
  101. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +6 -6
  102. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +6 -6
  103. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +6 -6
  104. package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
  105. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate-review.ps1 +699 -0
  106. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate.ps1 +29 -2
  107. package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +51 -4
  108. package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +6 -6
  109. package/resources/codex-and-agents-customizations/pack-manifests/core.json +1 -0
  110. package/resources/customizations/.github/agents/5.1-Beast-adjusted.agent.md +1 -1
  111. package/resources/customizations/.github/agents/Powershell DI Unit Test Engineer.agent.md +20 -26
  112. package/resources/customizations/.github/agents/atomic_executor.agent.md +4 -4
  113. package/resources/customizations/.github/agents/atomic_planning.agent.md +4 -4
  114. package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
  115. package/resources/customizations/.github/agents/commit-steward.agent.md +1 -1
  116. package/resources/customizations/.github/agents/csharp-atomic-executor.agent.md +14 -14
  117. package/resources/customizations/.github/agents/csharp-atomic-planning.agent.md +2 -2
  118. package/resources/customizations/.github/agents/csharp-orchestrator.agent.md +4 -4
  119. package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +19 -22
  120. package/resources/customizations/.github/agents/epic-review.agent.md +1 -1
  121. package/resources/customizations/.github/agents/gpt-5-beast-mode.agent.md +3 -3
  122. package/resources/customizations/.github/agents/orchestrator.agent.md +8 -8
  123. package/resources/customizations/.github/agents/powershell-atomic-executor.agent.md +12 -12
  124. package/resources/customizations/.github/agents/powershell-atomic-planning.agent.md +4 -4
  125. package/resources/customizations/.github/agents/powershell-orchestrator.agent.md +6 -6
  126. package/resources/customizations/.github/agents/powershell-typed-engineer.agent.md +21 -24
  127. package/resources/customizations/.github/agents/pytest-unit-test-coding.agent.md +13 -17
  128. package/resources/customizations/.github/agents/python-atomic-executor.agent.md +11 -11
  129. package/resources/customizations/.github/agents/python-atomic-planning.agent.md +2 -2
  130. package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +14 -17
  131. package/resources/customizations/.github/agents/python-orchestrator.agent.md +7 -7
  132. package/resources/customizations/.github/agents/python-typed-engineer.agent.md +17 -20
  133. package/resources/customizations/.github/agents/staged-review.agent.md +2 -2
  134. package/resources/customizations/.github/agents/tdd-green.agent.md +1 -1
  135. package/resources/customizations/.github/agents/tdd-red.agent.md +3 -3
  136. package/resources/customizations/.github/agents/tdd-refactor.agent.md +2 -2
  137. package/resources/customizations/.github/agents/typescript-engineer.agent.md +3 -3
  138. package/resources/customizations/.github/codex/execute-hard-lock.prompt.md +3 -3
  139. package/resources/customizations/.github/instructions/general-code-change.instructions.md +1 -1
  140. package/resources/customizations/.github/instructions/powershell-unit-test.instructions.md +1 -1
  141. package/resources/customizations/.github/instructions/python-code-change.instructions.md +5 -5
  142. package/resources/customizations/.github/instructions/python-suppressions.instructions.md +3 -3
  143. package/resources/customizations/.github/instructions/python-unit-test.instructions.md +1 -1
  144. package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +2 -2
  145. package/resources/customizations/.github/prompts/generate-commit-message-repo.prompt.md +2 -2
  146. package/resources/customizations/.github/prompts/remediate-comments.prompt.md +2 -2
  147. package/resources/customizations/.github/prompts/review-feature.prompt.md +1 -1
  148. package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +8 -12
  149. package/resources/customizations/.github/skills/execution-environment/SKILL.md +18 -13
  150. package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +15 -2
  151. package/resources/feature-templates/bug/plan.yyyy-MM-ddTHH-mm.md +4 -4
  152. package/resources/feature-templates/feature/plan.yyyy-MM-ddTHH-mm.md +3 -3
  153. package/resources/feature-templates/refactor/plan.yyyy-MM-ddTHH-mm.md +2 -2
  154. package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +2 -2
  155. package/resources/powershell/PoshQC/PoshQC.psm1 +3 -3
  156. package/resources/powershell/PoshQC/README.md +8 -8
  157. package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +2 -2
  158. package/resources/templates/policy_audit/AGENTS.md +9 -10
  159. package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +19 -20
@@ -32,7 +32,7 @@ Rules:
32
32
  - **Tool routes are not restated.** Tool routes, launchers, wrapper scripts, command-text restrictions, the batch budget, hook context, and CI shape are owned by the `execution-environment` skill. A plan references that skill instead of restating its content.
33
33
  - **Changed existing behavior names its asserting tests.** A task that changes the observable behavior of an existing function, script, fixture, or test stub (its signature, argv, output, exit status, or the files it writes) names every existing test that asserts that behavior and states each test's disposition: unchanged because it is unaffected, or updated, with the reason for the update. The tests are found by searching the test tree for the symbol, the file name, and the asserted output. A test that asserts the current behavior and is outside the task's file set fails once the change lands, and the plan's own acceptance condition then cannot be met. The planner's adversarial self-review includes this search for every task that changes existing behavior.
34
34
  - **Size guideline.** A plan stays within 40 canonical tasks and 400 physical lines. A plan that needs more carries a `## Size Justification` section with at least one line stating why the size is necessary (validator rule G13). Files produced by one generator run count as one generator task.
35
- - **Pre-Mortem.** Every plan carries a `## Pre-Mortem` section with one bullet beginning with each of the seven labels `Review checklists`, `Coverage`, `Mirror parity`, `File size`, `Test isolation`, `CI-only behavior`, and `Evidence`. Each bullet states how the plan prevents that failure class, or states "not applicable" followed by the reason. The `Test isolation` bullet names the isolation runs the plan performs: a seeded shuffled Jest run with the seed recorded, a reversed-order run of the new or changed Python test modules, and a seeded shuffled file-order run of the touched Pester suites with at least three seeds, each seed recorded. The `Mirror parity` bullet also covers the execution-environment brief: a plan that alters a fact the brief states (for example, it adds or renames a CI job, changes a required status context, a tool route, or a batch-budget rule) includes a task that updates the brief in the same change, in all six byte-identical copies, and the bullet names that task. Without that task the brief states a superseded fact once the change lands, which breaks the brief's own maintenance rule. The planner SubagentStop hook blocks a plan without a complete section.
35
+ - **Pre-Mortem.** Every plan carries a `## Pre-Mortem` section with one bullet beginning with each of the seven labels `Review checklists`, `Coverage`, `Mirror parity`, `File size`, `Test isolation`, `CI-only behavior`, and `Evidence`. Each bullet states how the plan prevents that failure class, or states "not applicable" followed by the reason. The `Test isolation` bullet names the parallel gates the plan uses: one `Invoke-PoshQCParallelTest` run, one `pytest -n auto` run, and Jest through its normal parallel workers, each re-run only after a fix. The `Mirror parity` bullet also covers the execution-environment brief: a plan that alters a fact the brief states (for example, it adds or renames a CI job, changes a required status context, a tool route, or a batch-budget rule) includes a task that updates the brief in the same change, in all six byte-identical copies, and the bullet names that task. Without that task the brief states a superseded fact once the change lands, which breaks the brief's own maintenance rule. The planner SubagentStop hook blocks a plan without a complete section.
36
36
  - **Final-phase self-review.** The final phase of every plan contains a self-review task that walks the policy-audit, code-review, and feature-audit templates under `docs/features/templates/policy_audit/` against the branch diff from the merge base and writes `<FEATURE>/evidence/qa-gates/self-review.<timestamp>.md` with one PASS, FAIL, or N/A row per checklist item. A FAIL row is fixed and the QA loop is re-run before the self-review is rewritten; the plan does not complete with a FAIL row.
37
37
 
38
38
  This section takes precedence over the literal-quoting rules of `## Wrap-Tolerant Assertion Authoring (Mandatory)`: those rules govern the asserted value of an acceptance condition, not context.
@@ -43,12 +43,11 @@ When orchestration selects short path, a minimal plan is still mandatory and mus
43
43
 
44
44
  1) Baseline capture block
45
45
  - policy reads in required order,
46
- - baseline toolchain/test state capture for each language that has explicit baseline command tasks in the plan.
46
+ - static baseline capture (format, lint, type check, and analyzer findings) for each language that has explicit baseline command tasks in the plan; no test suite runs in this block.
47
47
  - required artifacts:
48
48
  - a Phase 0 policy-read evidence artifact in the canonical evidence location defined by `evidence-and-timestamp-conventions`
49
49
  - one baseline artifact per baseline command step (no aggregate-only baseline artifact)
50
50
  - each baseline step artifact MUST include: `Timestamp:`, `Command:`, `EXIT_CODE:`, `Output Summary:`
51
- - baseline test-step artifacts for languages with mandatory coverage policy MUST include numeric coverage headline values in `Output Summary:` (baseline percent and, when applicable, targeted module/new-code percent).
52
51
 
53
52
  2) Delegated implementation block
54
53
  - explicit handoff task to the small-path implementation engineer,
@@ -59,7 +58,7 @@ When orchestration selects short path, a minimal plan is still mandatory and mus
59
58
  - rerun behavior when any step changes files or fails.
60
59
  - one final-QC artifact per QC command step (no aggregate-only final-QC artifact)
61
60
  - each final-QC step artifact MUST include: `Timestamp:`, `Command:`, `EXIT_CODE:`, `Output Summary:`
62
- - final-QC test commands for languages with mandatory coverage policy MUST run in coverage mode and record numeric post-change coverage values in `Output Summary:`.
61
+ - final-QC test commands for languages with mandatory coverage policy MUST run in coverage mode and record numeric coverage values from the single gate run in `Output Summary:`.
63
62
  - final-QC command tasks that are present in the approved plan MUST execute their stated commands; `SKIPPED` is invalid unless the task text itself explicitly authorizes a skip condition.
64
63
 
65
64
  4) Reduced audit block
@@ -109,7 +108,7 @@ When a fully automated equivalent is unavailable, the plan MUST fail closed by r
109
108
 
110
109
  Phase 0 must include tasks to read policy files in the order defined in `policy-compliance-order`.
111
110
 
112
- Phase 0 must also capture baseline toolchain results for the languages touched. Baseline artifact conventions (location + required fields) are defined in `evidence-and-timestamp-conventions`.
111
+ Phase 0 must also capture static baselines (format, lint, type check, and analyzer findings) for the languages touched, and no test suite runs in it. Baseline artifact conventions (location + required fields) are defined in `evidence-and-timestamp-conventions`.
113
112
 
114
113
  For short-path/minimal-audit plans, Phase 0 evidence is incomplete unless both artifacts exist:
115
114
  - `phase0-instructions-read.md` with at least: `Timestamp:`, `Policy Order:`, and explicit list of files read.
@@ -126,12 +125,9 @@ Plans name evidence artifacts `<name>.<timestamp>.md` and never fix a plan-time
126
125
 
127
126
  For any language in scope where repository policy requires coverage validation:
128
127
 
129
- - The approved plan MUST include explicit baseline and final-QC coverage capture tasks.
130
- - Baseline and final-QC artifacts MUST record numeric coverage values (not placeholders such as `UNVERIFIED`).
131
- - Where policy requires no-regression and new-code thresholds, the plan MUST include a delta/threshold verification task that reports:
132
- - baseline coverage,
133
- - post-change coverage,
134
- - new/changed-code coverage.
128
+ - The approved plan MUST include an explicit final-QC coverage capture task.
129
+ - The final-QC artifact MUST record numeric coverage values (not placeholders such as `UNVERIFIED`).
130
+ - The plan MUST include a threshold task that reports each changed file from the single gate run against the coverage thresholds. New behavior is tested. No earlier figure is compared.
135
131
  - If required coverage values are unavailable, the plan outcome MUST be remediation-required and MUST NOT be reported as PASS.
136
132
 
137
133
  ## Final QA Loop (Required for Code/Test Changes)
@@ -218,7 +214,7 @@ When a plan is generated or validated from a feature folder, resolve selected mo
218
214
 
219
215
  ## Mode-Specific Mandatory Plan Gates
220
216
 
221
- - `minor-audit` plans MUST include baseline evidence tasks, targeted verification evidence tasks, and end-state evidence tasks.
217
+ - `minor-audit` plans MUST include static baseline evidence tasks, targeted verification evidence tasks read from the gate run, and end-state evidence tasks.
222
218
  - `minor-audit` plans MUST require `${feature-folder}/issue.md` to contain an explicit `## Acceptance Criteria` section; do not infer acceptance criteria from other `issue.md` sections.
223
219
  - `minor-audit` plans MUST NOT treat missing `spec.md` or `user-story.md` as automatic blockers.
224
220
  - `minor-audit` execution/validation/audit MUST fail closed when `spec.md` or `user-story.md` exists unexpectedly in the active folder, when the explicit `## Acceptance Criteria` section is missing from `issue.md`, when required Phase 0 artifacts are missing, or when checklist state contradicts evidence on disk.
@@ -13,9 +13,9 @@ Maintenance rule: this brief is updated in the same change that alters any fact
13
13
 
14
14
  ## Development Toolchain Baseline
15
15
 
16
- The host manifest, both devcontainer Dockerfiles, and development CI use Python 3.13.17, Node.js 26.13.0/npm 11.20.0, PowerShell 7.6.9, and Poetry 2.3.2. Shell validation pins shfmt 3.14.1, ShellCheck 0.11.0, and actionlint 1.7.12. Host bootstrap treats manifest versions as minima and preserves equal/newer installations; the container verifier accepts later Python patches within 3.13 and checks the other selected pins.
16
+ The host manifest, both devcontainer Dockerfiles, and development CI select Python 3.13.18, Node.js 26.13.0/npm 11.20.0, PowerShell 7.6.9, and Poetry 2.5.1. Both images use `mcr.microsoft.com/devcontainers/python:3.3.2-3.13-bookworm`, require Git >=2.56.0, and install GitHub CLI 2.103.3, .NET SDK 10.0.403, uv 0.13.7, Claude Code 2.1.318, claude-swap 0.29.0, and Codex 0.166.0. Shell validation pins shfmt 3.14.1, ShellCheck 0.11.0, actionlint 1.7.12, and kcov v43. PowerShell selects Pester 6.2.0 and PSScriptAnalyzer 1.25.0. The images also retain Graphite 1.7.14, GitHub Copilot CLI 0.0.377, Bats, and bashdb. Host bootstrap treats manifest versions as minima and preserves equal/newer installations; the container verifier accepts later Python patches within 3.13 and later Git versions, and checks the other selected pins.
17
17
 
18
- The devcontainer minor image can lag the Python patch, so both Dockerfiles copy the verified official Python runtime stage and select it and NodeSource ahead of older base-feature shims. Full configuration builds include the selected devcontainer features; a raw Dockerfile image alone does not prove feature-provided commands. Runtime verification uses an isolated Linux virtual environment rather than the host Windows environment.
18
+ The pinned base supplies Python and Git; image-managed CLI installs take precedence on PATH. Full configuration builds include the selected devcontainer features. Local Docker retains the Docker outside-of-Docker feature; floating Git/GitHub CLI features do not replace image pins. Both configurations run the same shared post-create script and mandatory verifier. Local source is a live host bind mount with four `volume-nocopy` Linux dependency volumes for `.venv` and the root, extension, and MCP `node_modules`; setup prepares only their mount roots. A container-only Git environment override disables the host Windows fsmonitor without changing host configuration. The former workspace volume is retained for recovery. Runtime verification uses the Linux environment rather than host Windows dependencies. Codex includes its native optional package, disables the startup update prompt through root-owned system settings, and uses the file credential store; the image does not populate user authentication state. Python bytecode stays under `/tmp/pycache`.
19
19
 
20
20
  Python 3.11/3.12 compatibility jobs, consumer package engines, and independent release-publishing runtime pins remain unchanged. The shared version predicate lives in `scripts/bash/container_versions.sh`; `.devcontainer/verify-container.sh` resolves it relative to its own repository location.
21
21
 
@@ -39,7 +39,8 @@ Two separate mechanisms restrict Bash command text. They are kept apart here bec
39
39
 
40
40
  - PoshQC MCP results carry no output. The summary string is composed from a fixed template before the child process runs (`runPoshQcWorkflow` in `extensions/drm-copilot/src/repo-automation-service.ts`), and `RepoAutomationExecutionResult` has no exit-code or output field. An `ok: true` result proves only that the tool was invoked.
41
41
  - Counts, percentages, and findings therefore come from files or direct runs: pass and fail counts from `artifacts/pester/pester-junit.xml`, line coverage from `artifacts/pester/powershell-coverage.xml`, and analyzer findings from a direct `Invoke-ScriptAnalyzer` run with `scripts/powershell/PoshQC/settings/pssa.settings.psd1`.
42
- - The MCP test tool reads the installed extension's settings. Branch-current Pester runs import `scripts/powershell/PoshQC/PoshQC.psd1` and call `Invoke-PoshQCTest` from a `sh`-launched PowerShell 7. The coverage population is derived by `Invoke-PoshQCTest` from `config/poshqc-coverage.json`; there is no hand-maintained coverage path list.
42
+ - The MCP test tool reads the installed extension's settings. Branch-current Pester runs import `scripts/powershell/PoshQC/PoshQC.psd1` and call `Invoke-PoshQCParallelTest` from a `sh`-launched PowerShell 7. The coverage population is derived by `Invoke-PoshQCTest`, which each shard runs, from `config/poshqc-coverage.json`; there is no hand-maintained coverage path list.
43
+ - `Invoke-PoshQCParallelTest` returns an object whose `ExitCode` is read first, and the launcher exits with that value. Merged JUnit and coverage exist only after a fully green run, and a failed run can leave older merged files in place. Failure detail is under `artifacts/pester/parallel/shard-<i>/`.
43
44
  - `Invoke-Pester` without `-EnableExit` (or `Run.Exit`) exits 0 when tests fail; read the JUnit file rather than the exit code of such a run.
44
45
 
45
46
  ## Batch Budget
@@ -88,7 +89,7 @@ Two separate mechanisms restrict Bash command text. They are kept apart here bec
88
89
  - `_shell-coverage.yml` checks out at depth one, so `origin/main` does not exist in that job; no test may diff against it.
89
90
  - The Linux hook-suite job runs `tests/scripts/claude-hooks` and `tests/scripts/codex-hooks` on a case-sensitive file system: use `Join-Path`, forward-slash relative paths, exact file-name case, and no drive letters or backslash literals.
90
91
  - The `.gitattributes` rule `* text=auto eol=lf` normalizes line endings on checkout, so a CRLF fixture committed as text is not CRLF in CI.
91
- - Shard and single-process Pester runs expose module-scope import visibility and leaked state that per-suite local runs hide.
92
+ - Files in one shard share a process, so a leak surfaces when shard contents change.
92
93
 
93
94
  ## Contract Tests That Pin Mirrored Files
94
95
 
@@ -105,6 +106,7 @@ Run these after editing any mirrored or bundled file; each is under `tests/scrip
105
106
  - `test_push_down_issue_824_follow_ups.py`: pushed rules and skills name no consuming product.
106
107
  - `test_typescript_toolchain_instruction_contracts.py`: no reference to another test framework, and every backticked npm script token in the pinned mirrors exists in the root `package.json`.
107
108
  - `tests/scripts/claude-runtime/claude-architecture-doc.Tests.ps1` and `tests/scripts/claude-runtime/hook-dependency-guard-completeness.Tests.ps1`: agent tool names in the architecture document and the guarded dot-source pattern in hooks.
109
+ - `tests/scripts/claude-runtime/parallel-gate-wording.Tests.ps1`: per-file required and forbidden gate wording in the mirrored skills, agents, and templates, and the sweep of those surfaces for removed test-suite baseline wording.
108
110
 
109
111
  ## Preflight Defect Classes the Validator Cannot See
110
112
 
@@ -135,6 +137,7 @@ These pass every validator rule and are found only by reading the plan against t
135
137
  - Python: measure a module with `--cov=<dotted.module>`, `--cov-branch`, `--cov-report=term-missing`, and `--cov-report=json:<path>`; read branch figures from the JSON report.
136
138
  - TypeScript: a new production file needs its own entry in the `coverageThreshold` map of `extensions/drm-copilot/jest.config.cjs`; Jest runs through `node run-jest.cjs` in `extensions/drm-copilot/`.
137
139
  - PowerShell: per-file line coverage is read from `artifacts/pester/powershell-coverage.xml` written by the self-hosted PoshQC module.
140
+ - Per-file figures are read from the single gate run, and no earlier figure is compared.
138
141
  - File size follows three tiers for production, test, and reusable script files, counted in logical lines (a trailing terminator adds no line): at 500 lines look for a logical split (guidance); at 700 lines split more aggressively, and reviewers report a non-blocking Warning (advisory); above 800 lines a split is enforced regardless of logical separability (hard limit; exactly 800 passes). The hard limit is enforced by `tests/scripts/ci/FileSizePolicy.RepoGate.Tests.ps1` in the existing PowerShell shards against `config/file-size-baseline.json`, where legacy files above 800 may shrink (with the entry tightened) or stay equal but may not grow, and by the PreToolUse hook `.claude/hooks/enforce-file-size-limit.ps1` (`.codex/hooks/enforce-file-size-limit.ps1`). New logic in a file near a tier goes into a new module and a new test file. Markdown is exempt.
139
142
 
140
143
  ## Test Runtime
@@ -144,17 +147,19 @@ These pass every validator rule and are found only by reading the plan against t
144
147
  - Fix repeated production work first. An immutable structure, such as a schema registry that is rebuilt and re-verified on every call, is built once per owning instance. This speeds up the runtime as well as the tests.
145
148
  - Second, build an expensive immutable fixture once per session and hand each test its own copy wherever a test could mutate it, so test independence is unchanged.
146
149
  - Parallel workers reduce wall-clock time only: they are capped by the slowest test and leave the cost in the product.
147
- - pytest: pass `-n auto` (pytest-xdist) on the command line of the CI step `Run tests with Pytest` and of the parallel VS Code tasks, never in `addopts`, because the VS Code Test Explorer keys results to the wrong file when `addopts` carries it. `-n auto` counts physical cores, so a runner can start fewer workers than it has vCPUs; measure it against an explicit count such as `-n 4` before keeping it. pytest-cov combines the worker coverage into one report, and the serial `poetry run pytest` command remains the isolation reference.
148
- - Pester: Pester 5 has no in-process parallel mode, so parallel Pester runs are process-per-shard: `Invoke-PoshQCTest -ShardIndex -ShardCount` on the CI runners and `Invoke-PoshQCParallelTest` locally. Read the per-file `time` of the JUnit `testsuite` elements before changing the shard count or the weights in `config/poshqc-shard-weights.json`.
150
+ - pytest: pass `-n auto` (pytest-xdist) on the command line of the CI step `Run tests with Pytest` and of the parallel VS Code tasks, never in `addopts`, because the VS Code Test Explorer keys results to the wrong file when `addopts` carries it. `-n auto` counts physical cores, so a runner can start fewer workers than it has vCPUs; measure it against an explicit count such as `-n 4` before keeping it. pytest-cov combines the worker coverage into one report.
151
+ - Pester: parallel validation uses separate Pester 6 processes: `Invoke-PoshQCTest -ShardIndex -ShardCount` on the CI runners and `Invoke-PoshQCParallelTest` locally. Read the per-file `time` of the JUnit `testsuite` elements before changing the shard count or the weights in `config/poshqc-shard-weights.json`.
149
152
  - A candidate fix can be measured before the tree is edited by loading a pytest plugin module from `SCRATCH` with `-p <module>` and `PYTHONPATH`.
150
153
 
151
154
  ## Test Isolation Checks
152
155
 
153
156
  - Tests create no temporary files; file and transcript reads go through injected seams with in-memory content.
154
- - Before review, run each isolation check and record it under `<FEATURE>/evidence/regression-testing/`:
155
- - a seeded shuffled Jest run (`node run-jest.cjs --randomize --seed=<n>` in `extensions/drm-copilot/`) with the seed recorded;
156
- - a reversed-order run of the new or changed Python test modules in one process;
157
- - a seeded shuffled file-order run of the touched Pester suites in one process, with at least three seeds and each seed and its file order recorded;
158
- - a fresh single-process Pester run over `tests/scripts`, which is the CI shape;
159
- - in addition to the serial runs, a concurrent-shard Pester run through `Invoke-PoshQCParallelTest` and a `pytest -n auto` run, both with zero failures.
160
- - An order dependence found by any run is fixed on both sides: the suite that leaves state behind (globals, functions, environment variables, mocks, imported modules, script-scope state) and the suite that assumes prior state. Every seed is then re-run.
157
+ - The test gates are parallel:
158
+ - the Pester gate is one `Invoke-PoshQCParallelTest` run;
159
+ - the pytest gate is one `pytest -n auto` run;
160
+ - Jest runs through its normal parallel workers.
161
+ - Each gate reaches zero failures and is re-run only after a fix.
162
+ - A focused run of one test file to debug a specific failure is debugging only; it is never a gate or evidence.
163
+ - Serial tasks remain for debugging one failure and are not gates.
164
+ - A leak found by a gate is fixed on both sides: the suite that leaves state behind (globals, functions, environment variables, mocks, imported modules, script-scope state) and the suite that assumes prior state.
165
+ - The parallel gates govern where a policy file names a toolchain test command.
@@ -42,12 +42,21 @@ Always apply:
42
42
  - `code-review-template` for `code-review.<timestamp>.md`
43
43
  - `feature-audit-template` for `feature-audit.<timestamp>.md`
44
44
  - The MCP-resolved asset is the authoritative template source for review artifacts in this workflow.
45
+ - When an installed template older than this change carries baseline fields, each baseline field is recorded as `N/A - no pre-change run`, and the comparison line reads `Baseline: N/A - no pre-change run -> Post-change: <percent>. Change: N/A.`
45
46
 
46
47
  ### No silent fixes
47
48
 
48
49
  - Do not clean up code during review.
49
50
  - If checks fail, document the failure and include exact remediation guidance.
50
51
 
52
+ ### Process-reduction ledger
53
+
54
+ - This rule applies only when `docs/engineering/process-reductions/` exists, so a repository without that folder is unaffected.
55
+ - A change that reduces evidence, plan tasks, gates, or review process adds its ledger entry in the same commit, in the format of that folder's `README.md`.
56
+ - A branch diff that makes such a reduction with no entry is a Blocking finding.
57
+ - The reviewer confirms from the branch log that each reduction is its own commit, with the `reduction: NNNN` token in its subject.
58
+ - One-off waivers for a single item are not entries.
59
+
51
60
  ### Work-mode acceptance-criteria contract
52
61
 
53
62
  - Read the persisted marker from `issue.md` using one of:
@@ -92,7 +101,7 @@ Always apply:
92
101
  2. lint check
93
102
  3. type check
94
103
  4. tests
95
- - Run the smallest relevant subset first when the repo policy permits it.
104
+ - A focused run of one test file to debug a specific failure is debugging only; a review check does not rest on it.
96
105
  - If a tool cannot run in the environment, mark the affected section unverified or partial with a concrete reason.
97
106
 
98
107
  6. **Produce the code review**
@@ -123,7 +132,11 @@ Always apply:
123
132
  - toolchain checks fail
124
133
  - the code review contains blockers
125
134
  - required acceptance criteria are FAIL or PARTIAL
126
- - coverage below the governing thresholds (the root `CLAUDE.md` thresholds when stated, otherwise the defaults: line 85%, branch 75% for branch-capable languages; repo-wide per language, modified files including any regression on changed lines, or new files)
135
+ - coverage below the governing thresholds (the root `CLAUDE.md` thresholds when stated, otherwise the defaults: line 85%, branch 75% for branch-capable languages; repo-wide per language, modified files, or new files)
136
+ - Choose the remediation path. Write one line `Remediation-Path: light` or `Remediation-Path: full` into the remediation inputs, and inside each blocking finding block one line `Finding-Scope: contained` or `Finding-Scope: design`. A missing path line reads as `full`, and a missing scope line reads as `design`. These lines never contain the substrings the orchestrator counts.
137
+ - Write `Remediation-Path: light` only when all of these hold: at most 3 blocking findings, every one `autonomous` with `Finding-Scope: contained`; no change to a spec acceptance criterion, a public interface, or the file inventory beyond the branch diff plus tests and mirrors; no change to a validator contract, hook decision, or production logic beyond the finding's named location; the cycle is opened by a review; and the prior cycle was not light. Otherwise write `Remediation-Path: full`. The orchestrator may move a cycle to a heavier path and never to a lighter one.
138
+ - With `Remediation-Path: light`, also write a `## Light Fix Tasks` section: one canonical `- [ ] [P0-T1] ...` line per fix, numbered in order, each naming the file and the finding it fixes. Write no checkbox line anywhere else in the file, because the executor stop hook counts every checkbox line of the file it executes.
139
+ - The remediation plan target stays for both paths, because this review contract requires it.
127
140
  - Create `remediation-inputs.<timestamp>.md` first.
128
141
  - Create the target remediation plan file from the canonical plan template.
129
142
  - Hand off plan creation through `remediation-handoff-atomic-planner`.
@@ -7,7 +7,7 @@
7
7
  - **Status:** <template>
8
8
  - **Version:** <version_number>
9
9
 
10
- **Fail-closed evidence rule:** Include explicit baseline artifact tasks, final-QA artifact tasks, and coverage-comparison tasks for each in-scope language when policy requires coverage. If any required baseline artifact, QA artifact, or coverage-comparison artifact is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
10
+ **Fail-closed evidence rule:** Include explicit static baseline tasks, final-QA tasks, and a per-file threshold task for each in-scope language when policy requires coverage. If any required static baseline artifact, QA artifact, or per-file coverage figure is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
11
11
 
12
12
  **Evidence accounting rule:** Record the expected artifact path or location in each evidence-producing task. Do not mark evidence-backed work complete without the artifact.
13
13
 
@@ -33,15 +33,15 @@
33
33
 
34
34
  **Phase 2 — Regression Test (must fail first)**
35
35
  - [ ] [P2-T1] [expect-fail] Add a small, deterministic regression test in the standard module file (use `tests/bugs/<YYYY>/<issue>-<desc>.py` only if no clear home exists)
36
- - [ ] [P2-T2] [expect-fail] Run the regression to confirm it fails and captures the repro
36
+ - [ ] [P2-T2] [expect-fail] Run the parallel test gate to confirm the new regression test fails and captures the repro
37
37
 
38
38
  **Phase 3 — Minimal Fix**
39
39
  - [ ] [P3-T1] Apply the smallest change needed to make the regression test pass; avoid opportunistic refactors
40
40
 
41
41
  **Phase 4 — Verification Loop**
42
- - [ ] [P4-T1] Re-run repro and regression test to confirm expected behavior
42
+ - [ ] [P4-T1] Re-run the repro to confirm expected behavior
43
43
  - [ ] [P4-T2] Run formatter → linter → type checker → tests; restart loop if any step changes files or fails
44
- - [ ] [P4-T3] Record baseline, post-change, and comparison artifact paths for each in-scope language where coverage is required
44
+ - [ ] [P4-T3] Record the static baseline and final-QA artifact paths and the per-file threshold results for each in-scope language where coverage is required
45
45
 
46
46
  **Phase 5 — Documentation & Status**
47
47
  - [ ] [P5-T1] Update spec/issue with outcomes, decisions, and any deviations from scope
@@ -23,9 +23,9 @@
23
23
  > - Start every task with a **strong verb** (Implement, Create, Update, Verify).
24
24
  > - No "bucket" tasks like "Refactor module" or "Write tests"; split them into specific, verifiable steps.
25
25
  > - **Self-Validating Phases:** Include necessary test creation/update tasks *within* the phase that implements the code. Do not defer verification to a final "Testing" phase.
26
- > - Include explicit baseline artifact tasks, final-QA artifact tasks, and coverage-comparison tasks for every language in scope when policy requires coverage.
26
+ > - Include explicit static baseline tasks, final-QA tasks, and a per-file threshold task for every language in scope when policy requires coverage.
27
27
  > - Name the expected artifact path or location in each evidence-producing task's acceptance criteria.
28
- > - If any required baseline artifact, QA artifact, or coverage-comparison artifact is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
28
+ > - If any required static baseline artifact, QA artifact, or per-file coverage figure is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
29
29
 
30
30
  ### Phase 0: Compliance & Context
31
31
  - [ ] [P0-T1] Confirm alignment with repo policies by reading `.github/instructions/general-code-change.instructions.md`, `.github/instructions/python-code-change.instructions.md`, `.github/instructions/general-unit-test.instructions.md`, and `.github/instructions/python-unit-test.instructions.md` before touching code
@@ -57,7 +57,7 @@
57
57
  - Unit: ...
58
58
  - Integration: ...
59
59
  - Manual/CLI: ...
60
- - Coverage evidence: list baseline artifact paths, post-change artifact paths, and comparison artifact paths for each in-scope language
60
+ - Coverage evidence: list the static baseline artifact paths, the final-QA artifact paths, and the per-file threshold results from the single gate run for each in-scope language
61
61
 
62
62
  ## Open Questions / Notes
63
63
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  Brief approach to reach the target structure while keeping behavior stable.
18
18
 
19
- Fail-closed evidence rule: include explicit baseline artifact tasks, final-QA artifact tasks, and coverage-comparison tasks for each in-scope language when policy requires coverage. If any required baseline artifact, QA artifact, or coverage-comparison artifact is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
19
+ Fail-closed evidence rule: include explicit static baseline tasks, final-QA tasks, and a per-file threshold task for each in-scope language when policy requires coverage. If any required static baseline artifact, QA artifact, or per-file coverage figure is missing, the audit verdict must be BLOCKED or INCOMPLETE, never PASS.
20
20
 
21
21
  Evidence accounting rule: record the expected artifact path or location in each evidence-producing task. Do not mark evidence-backed work complete without the artifact.
22
22
 
@@ -52,7 +52,7 @@ Evidence accounting rule: record the expected artifact path or location in each
52
52
  - Unit/Integration: impacted modules and any regression tests for invariants
53
53
  - CLI/Workflow: end-to-end commands/tasks expected to remain stable
54
54
  - Tooling: lint/type checks after path updates
55
- - Coverage evidence: list baseline artifact paths, post-change artifact paths, and comparison artifact paths for each in-scope language
55
+ - Coverage evidence: list the static baseline artifact paths, the final-QA artifact paths, and the per-file threshold results from the single gate run for each in-scope language
56
56
 
57
57
  ## Rollback / Contingency
58
58
 
@@ -183,7 +183,7 @@ function Invoke-PoshQCTest {
183
183
  [scriptblock] $EnsureModule = {
184
184
  param([string] $Name, [string] $ErrorMessage, [string] $MinimumVersion, [string] $MaximumVersion)
185
185
  # Issue #953 (CR-1): only an installed version inside the supported range counts as present, so a host
186
- # whose only Pester is 6.x or the inbox 3.4.0 receives the actionable message instead of an import error.
186
+ # whose only Pester is 7.x or the inbox 3.4.0 receives the actionable message instead of an import error.
187
187
  if (-not (Get-Module -ListAvailable -FullyQualifiedName @{ ModuleName = $Name; ModuleVersion = $MinimumVersion; MaximumVersion = $MaximumVersion })) { throw $ErrorMessage }
188
188
  # Import globally so Pester's Describe/It/Mock resolve in test containers. Under the default
189
189
  # $InvokePester trampoline, test code runs in this module's session state, not the global
@@ -327,7 +327,7 @@ function Invoke-PoshQCTest {
327
327
  $Root = [IO.Path]::GetFullPath([IO.Path]::Combine($PWD.ProviderPath, $Root))
328
328
  }
329
329
 
330
- & $EnsureModule 'Pester' "Pester is not installed in the supported range (5.9.0 to 5.99.99). Run Install-PoshQCTool (alias Install-PoshQCTools) first." '5.9.0' '5.99.99'
330
+ & $EnsureModule 'Pester' "Pester is not installed in the supported range (6.2.0 to 6.99.99). Run Install-PoshQCTool (alias Install-PoshQCTools) first." '6.2.0' '6.99.99'
331
331
 
332
332
  if (-not (& $TestPathExists $SettingsPath)) {
333
333
  throw "Settings not found: $SettingsPath"
@@ -53,9 +53,9 @@ function Install-PoshQCTool {
53
53
  }
54
54
 
55
55
  $requiredModules = @(
56
- @{ Name = 'PSScriptAnalyzer'; Version = '1.22.0' },
57
- # Issue #953 (D8): UpperBound is exclusive; an installed Pester 6.x does not satisfy the requirement.
58
- @{ Name = 'Pester'; Version = '5.9.0'; UpperBound = '6.0.0' }
56
+ @{ Name = 'PSScriptAnalyzer'; Version = '1.25.0' },
57
+ # The selected Pester 6 range excludes the next major until separately validated (issue #1082).
58
+ @{ Name = 'Pester'; Version = '6.2.0'; UpperBound = '7.0.0' }
59
59
  )
60
60
 
61
61
  # Issue #953 (CR-3): one version-range predicate serves the present check and the post-install check.
@@ -6,14 +6,14 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
6
6
 
7
7
  - Formats PowerShell code with consistent indentation and pipeline alignment.
8
8
  - Lints with PSScriptAnalyzer using a strict, dual-runtime ruleset.
9
- - Runs Pester tests with code coverage (CoverageGutters output), plus an optional Koverage-friendly copy.
9
+ - Runs Pester tests with code coverage (JaCoCo output), plus an optional Koverage-friendly copy.
10
10
  - Provides a single suite entry point that can format, analyze, and test a selected workspace scope.
11
11
  - Provides a one-time dependency installer for PSScriptAnalyzer and Pester.
12
12
 
13
13
  ## Requirements
14
14
 
15
15
  - PowerShell 5.1 or 7.6+
16
- - Modules: PSScriptAnalyzer 1.22.0, Pester 5.9.0 or later, below 6.0 (installed automatically via the helper if missing)
16
+ - Modules: PSScriptAnalyzer 1.25.0, Pester 6.2.0 or later, below 7.0 (installed automatically via the helper if missing)
17
17
 
18
18
  ## Getting started
19
19
 
@@ -48,7 +48,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
48
48
  ```
49
49
 
50
50
  - Writes JUnit XML to `artifacts/pester/pester-junit.xml`.
51
- - Writes CoverageGutters XML to `artifacts/pester/powershell-coverage.xml`.
51
+ - Writes JaCoCo XML to `artifacts/pester/powershell-coverage.xml`.
52
52
  - Also emits `*.koverage.xml` (relative paths) for VS Code Coverage Gutters and Koverage. Disable with `-DisableKoverageCopy` or override the path with `-KoverageOutputPath`.
53
53
 
54
54
  ## Functions
@@ -63,7 +63,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
63
63
  - `New-PoshQCShardManifest`: build the in-memory shard manifest (`shardIndex`, `shardCount`, `all`, `selected`, `selectedFullPath`).
64
64
  - `Test-PoshQCShardCompleteness`: throw unless a set of shard manifests selects every test file exactly once.
65
65
  - `Test-PoshQCShardTestCount`: throw unless the shard test counts sum to a discovery-pass test count.
66
- - `Merge-PoshQCCoverageReport`: merge the CoverageGutters XML texts of the shards at LINE granularity (no file I/O, no threshold).
66
+ - `Merge-PoshQCCoverageReport`: merge the JaCoCo XML texts of the shards at LINE granularity (no file I/O, no threshold).
67
67
  - `Get-PoshQCCoverageLineSummary`: return covered, missed, total, and percent from a report's LINE counter.
68
68
  - `Invoke-PoshQCParallelTest`: run the Pester suite as concurrent shard processes on one machine and merge the results (see Local concurrent runs below).
69
69
  - `Get-PoshQCParallelWorkerCount`: return the default worker count, half the logical processors, at least 1 and at most 8.
@@ -75,8 +75,8 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
75
75
  - PSScriptAnalyzer settings: `./settings/pssa.settings.psd1`
76
76
  - Enforces compatible syntax for 5.1 and 7.6, 4-space indentation, ShouldProcess for state-changing functions, and safety guards (no Invoke-Expression, no global vars, etc.).
77
77
  - Pester settings: `./settings/pester.runsettings.psd1`
78
- - Runs tests under `scripts` and `tests/powershell`, outputs JUnit XML and CoverageGutters coverage, and enables coverage. The shipped runsettings carry no `CodeCoverage.Path` list; `Invoke-PoshQCTest` derives the coverage population from the workspace (see Coverage population below).
79
- - Coverage uses Pester's profiler-based mode (`CodeCoverage.UseBreakpoints = $false`, issue #953), which needs Pester 5.4 or later and is faster than breakpoint mode on the same coverage population. The PoshQC suites target PowerShell 7; profiler mode under Windows PowerShell 5.1 is not exercised in CI. To use breakpoint mode, pass a settings file with `UseBreakpoints = $true` through `-SettingsPath`.
78
+ - Runs tests under `scripts` and `tests/powershell`, outputs JUnit XML and JaCoCo coverage, and enables coverage. The shipped runsettings carry no `CodeCoverage.Path` list; `Invoke-PoshQCTest` derives the coverage population from the workspace (see Coverage population below).
79
+ - Coverage uses Pester's profiler-based mode (`CodeCoverage.UseBreakpoints = $false`, issue #953), which needs Pester 6.2 or later and is faster than breakpoint mode on the same coverage population. The PoshQC suites target PowerShell 7; profiler mode under Windows PowerShell 5.1 is not exercised in CI. To use breakpoint mode, pass a settings file with `UseBreakpoints = $true` through `-SettingsPath`.
80
80
  - When `-ScanFolders` is supplied to `Invoke-PoshQCSuite` or the lower-level commands, the suite narrows discovery to those workspace-relative or workspace-contained folders.
81
81
  - Coverage population (issue #527): `Invoke-PoshQCTest` measures the same file set for the same workspace whichever module copy is loaded.
82
82
  - Workspace configuration: `config/poshqc-coverage.json` with the schema `{"version": 1, "roots": [...]}`. Each root is a workspace-relative folder. The file is validated fail-fast, and every error names `config/poshqc-coverage.json`: empty content, invalid JSON, a `version` other than 1, a missing or non-array `roots`, and a blank, absolute, or `..`-segment entry are rejected. An empty `roots` array yields an empty population.
@@ -98,7 +98,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
98
98
  - A shard that selects no test file (more shards than test files) stops with an error before Pester runs.
99
99
  - `Merge-PoshQCCoverageReport` merges the shard reports with `ci = max(ci)` per line and recomputes the LINE and INSTRUCTION counters, so the merged LINE figures are exact. It omits `class` and `method` elements and METHOD and CLASS counters, because those cannot be recomputed from line hits.
100
100
  - Output-path parameters (issue #1048): `Invoke-PoshQCTest -TestResultPath <path> -CoverageOutputPath <path>` replace the JUnit and coverage output paths of the settings file for one invocation; a relative path is resolved against `-Root`. When a parameter is omitted or blank, the settings value is used.
101
- - Local concurrent runs (issue #1048): `Invoke-PoshQCParallelTest -Root . [-WorkerCount <n>]` runs the suite as concurrent shard processes on one machine. Pester 5 has no in-process parallel mode, so each shard is a separate `pwsh` process; the VS Code task `PoshQC: 4 test (Pester, parallel)` runs it.
101
+ - Local concurrent runs (issue #1048): `Invoke-PoshQCParallelTest -Root . [-WorkerCount <n>]` runs the suite as concurrent shard processes on one machine. Each shard runs Pester 6 in a separate `pwsh` process; the VS Code task `PoshQC: 4 test (Pester, parallel)` runs it.
102
102
  - The worker count defaults to half the logical processor count, at least 1 and at most 8 (`Get-PoshQCParallelWorkerCount`); `-WorkerCount` overrides it.
103
103
  - Each shard runs `Invoke-PoshQCTest -ShardIndex <i> -ShardCount <N>` with its JUnit, coverage, and manifest files and its console log (`shard.log`, standard error in `shard.log.err`) under `artifacts/pester/parallel/shard-<i>/`.
104
104
  - After every shard has exited, the runner checks the manifests with `Test-PoshQCShardCompleteness`, merges the JUnit reports with `Merge-PoshQCJunitReport` and the coverage reports with `Merge-PoshQCCoverageReport`, and writes `artifacts/pester/pester-junit.xml`, `artifacts/pester/powershell-coverage.xml`, and the `powershell-coverage.koverage.xml` copy.
@@ -109,7 +109,7 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
109
109
 
110
110
  - Day-to-day: run `Invoke-PoshQCFormat`, `Invoke-PoshQCAnalyze`, then `Invoke-PoshQCTest` before committing.
111
111
  - Bundled / scoped: run `Invoke-PoshQCSuite -Root . -ScanFolders @('scripts', 'tests/powershell')` when you want the suite to focus on selected workspace folders.
112
- - CI: call `Invoke-PoshQCTest` to get tests + coverage and consume JUnit/CoverageGutters artifacts.
112
+ - CI: call `Invoke-PoshQCTest` to get tests + coverage and consume JUnit/JaCoCo artifacts.
113
113
 
114
114
  ## Notes for standalone use
115
115
 
@@ -16,9 +16,9 @@
16
16
  }
17
17
  CodeCoverage = @{
18
18
  Enabled = $true
19
- # Use Pester's CoverageGutters format so VS Code Coverage Gutters
19
+ # Use Pester's JaCoCo format so VS Code Coverage Gutters
20
20
  # can map file paths correctly.
21
- OutputFormat = 'CoverageGutters'
21
+ OutputFormat = 'JaCoCo'
22
22
  OutputPath = 'artifacts/pester/powershell-coverage.xml'
23
23
  # Issue #527: no Path list. Invoke-PoshQCTest derives the coverage population from the
24
24
  # workspace (config/poshqc-coverage.json, else the effective test scan folders); see README.md.
@@ -42,9 +42,8 @@ When performing a policy audit:
42
42
  When asked to perform a Policy Audit for a component, branch, or PR:
43
43
 
44
44
  1. **Identify scope**
45
- - Determine what is being audited (e.g., "fix-all.ps1 unit tests", "Lexile scoring pipeline refactor", "new Python module X").
45
+ - Determine what is being audited (e.g., "fix-all.ps1 unit tests", "scoring pipeline refactor", "new Python module X").
46
46
  - Identify the relevant code files and test files.
47
- - **Document baseline coverage BEFORE making changes** (if development has not yet started, or shelve changes temporarily to establish baseline).
48
47
 
49
48
  2. **Create an audit document**
50
49
  - Generate a timestamp in ISO-8601 format `yyyy-MM-ddTHH-mm` (e.g., "2026-01-08T14-30" for Jan 8, 2026 at 2:30 PM).
@@ -57,7 +56,7 @@ When asked to perform a Policy Audit for a component, branch, or PR:
57
56
  - Fill in the Coverage Metrics by Language table with one row per language.
58
57
  - Complete all applicable language sections (3A, 3B, 3C, 3D for code; 4A, 4B for tests).
59
58
  - Delete sections for languages NOT involved in this change.
60
- - **Fill in baseline coverage metrics** from pre-development measurement (per language that has coverage).
59
+ - Record each retained baseline field as `N/A - no pre-change run`.
61
60
  - Add one per-language comparison bullet for every in-scope language that has coverage requirements.
62
61
 
63
62
  3. **Evaluate policy compliance**
@@ -69,17 +68,17 @@ When asked to perform a Policy Audit for a component, branch, or PR:
69
68
  - Record **status** (`✅ PASS`, `⚠️ PARTIAL`, `❌ FAIL`, `N/A`) and **evidence** in the appropriate table rows.
70
69
  - **For multi-language changes:**
71
70
  - Run each language's toolchain separately and document results in its section.
72
- - **Python:** Black → Ruff → Pyright → Pytest (with coverage)
73
- - **PowerShell:** Invoke-PoshQCFormat → Invoke-PoshQCAnalyze → Invoke-PoshQCTest (with coverage)
71
+ - **Python:** Black → Ruff → Pyright → `poetry run pytest -n auto` (with coverage)
72
+ - **PowerShell:** Invoke-PoshQCFormat → Invoke-PoshQCAnalyze → Invoke-PoshQCParallelTest (with coverage)
74
73
  - **Bash:** shfmt → shellcheck → bats (coverage N/A)
75
74
  - **JSON:** format_json → validate_json (coverage N/A)
76
75
  - **For coverage metrics (Python and PowerShell only):**
77
- - Compare post-change coverage to baseline to verify no regression (per language).
76
+ - Read each changed file from the single gate run and compare it with the coverage thresholds (per language).
78
77
  - Isolate and measure coverage of new/modified code only (must be ≥90% per language).
79
- - Use concrete examples showing calculations: "Baseline: 85.2% → Post-change: 87.1% (+1.9%) ✅"
78
+ - Use concrete examples showing calculations: "Post-change: 87.1% against the 85% line threshold ✅"
80
79
  - **Fail-closed evidence handling:**
81
- - No policy audit may report PASS unless it includes numeric baseline and post-change coverage metrics for every language in scope, plus changed/new-code coverage when required.
82
- - If any required baseline artifact, QA artifact, or coverage-comparison artifact is missing, the verdict must be BLOCKED or INCOMPLETE, never PASS.
80
+ - No policy audit may report PASS unless it includes numeric post-change coverage metrics for every language in scope, plus changed/new-code coverage when required.
81
+ - If any required QA artifact or post-change coverage metric is missing, the verdict must be BLOCKED or INCOMPLETE, never PASS.
83
82
  - Do not synthesize or backfill missing audit evidence from memory or inference.
84
83
  - If evidence is missing, stop and report the exact missing artifact paths.
85
84
  - **For scenario testing:**
@@ -105,7 +104,7 @@ When asked to perform a Policy Audit for a component, branch, or PR:
105
104
  6. **Summarize and recommend**
106
105
  - Complete the summary sections at the end of the template:
107
106
  - Policy-by-policy summary
108
- - Metrics summary (with deterministic baseline/post-change/new code coverage)
107
+ - Metrics summary (with deterministic post-change and new code coverage)
109
108
  - Recommendation (`Ready for merge`, `Needs revision`, or `Blocked`)
110
109
  - Ensure the final audit document is consistent with the underlying evidence and toolchain output.
111
110
 
@@ -30,8 +30,8 @@
30
30
 
31
31
  | Language | Files Changed | Tests | Test Result | Baseline Coverage | Post-Change Coverage | New Code Coverage |
32
32
  |----------|--------------|-------|-------------|-------------------|---------------------|-------------------|
33
- | Python | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail | [N]% lines, [N]% funcs | [N]% lines, [N]% funcs | [N]% |
34
- | PowerShell | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail | [N]% cmds, [N]% funcs | [N]% cmds, [N]% funcs | [N]% |
33
+ | Python | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail | N/A - no pre-change run | [N]% lines, [N]% funcs | [N]% |
34
+ | PowerShell | [N] files | [N] tests | [✅/❌] [N] pass, [N] fail | N/A - no pre-change run | [N]% cmds, [N]% funcs | [N]% |
35
35
  | Bash | [N] files | [N/A] tests | [✅/❌/N/A] | N/A (no coverage) | N/A (no coverage) | N/A |
36
36
  | JSON | [N] files | N/A | [✅/❌] validation | N/A (config files) | N/A (config files) | N/A |
37
37
 
@@ -39,15 +39,15 @@
39
39
 
40
40
  ### Coverage Evidence Checklist
41
41
 
42
- - TypeScript baseline coverage artifact: [path or `N/A - out of scope`]
42
+ - TypeScript baseline coverage artifact: N/A - no pre-change run
43
43
  - TypeScript post-change coverage artifact: [path or `N/A - out of scope`]
44
- - PowerShell baseline coverage artifact: [path or `N/A - out of scope`]
44
+ - PowerShell baseline coverage artifact: N/A - no pre-change run
45
45
  - PowerShell post-change coverage artifact: [path or `N/A - out of scope`]
46
46
  - Per-language comparison summary: [section reference or artifact path]
47
47
 
48
- **Non-negotiable verdict rule:** No policy audit may report PASS unless it includes numeric baseline and post-change coverage metrics for every language in scope, plus changed/new-code coverage when required.
48
+ **Non-negotiable verdict rule:** No policy audit may report PASS unless it includes numeric post-change coverage metrics for every language in scope, plus changed/new-code coverage when required.
49
49
 
50
- **Fail-closed rule:** If any required baseline artifact, QA artifact, or coverage-comparison artifact is missing, the verdict must be BLOCKED or INCOMPLETE, never PASS.
50
+ **Fail-closed rule:** If any required QA artifact or post-change coverage metric is missing, the verdict must be BLOCKED or INCOMPLETE, never PASS.
51
51
 
52
52
  **Evidence rule:** Do not synthesize or backfill missing audit evidence from memory or inference. If evidence is missing, stop and list the exact missing artifact paths.
53
53
 
@@ -94,8 +94,7 @@
94
94
 
95
95
  | Requirement | Status | Evidence |
96
96
  |------------|--------|----------|
97
- | **Baseline Coverage Documented** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Baseline (pre-development):** [N]% lines, [N]% functions<br>**Command:** `[coverage command]`<br>**Timestamp:** [YYYY-MM-DD HH:MM]<br>**Note:** Document baseline BEFORE making changes to avoid re-computation during audit. |
98
- | **No Coverage Regression** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Post-change coverage:** [N]% lines, [N]% functions<br>**Change:** [+/-N]% lines, [+/-N]% functions<br>**Status:** [No regression / Regression detected: justification]<br>**Example:** "Baseline: 85.2% → Post-change: 87.1% (+1.9%) ✅ PASS" |
97
+ | **Changed Files Meet Thresholds** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Post-change coverage:** [N]% lines, [N]% functions, read from the single gate run<br>**Thresholds:** [line and branch thresholds that apply]<br>**Status:** [All changed files meet the thresholds / Files below a threshold: list]<br>**Example:** "Post-change: 87.1% against the 85% line threshold ✅ PASS" |
99
98
  | **New Code Coverage ≥90%** | [✅/❌/N/A] [PASS/FAIL/N/A] | **New/modified files:** [list files]<br>**New code coverage:** [N]% (must be ≥90%)<br>**Calculation method:** [describe how new code was isolated for measurement]<br>**Example:** "New module `foo.py`: 127/135 lines covered = 94.1% ✅ PASS" |
100
99
  | **Comprehensive Coverage** | [✅/❌/N/A] [PASS/FAIL/N/A] | **All functions/classes tested:**<br>- `function_name()` (lines X-Y): [N] tests<br>- `ClassName` (lines A-B): [N] tests<br>**Untested code:** [list with justification]<br>**Example:**<br>- `parse_config()` (lines 45-67): 3 tests<br>- `ConfigLoader` (lines 100-150): 5 tests<br>- Untested: `__repr__()` (trivial representation, no business logic) |
101
100
  | **Positive Flows** - Valid inputs | [✅/❌/N/A] [PASS/FAIL/N/A] | **All positive scenarios tested:**<br>- `test_function_with_valid_string`: Tests normal string input → returns expected output<br>- `test_function_with_valid_number`: Tests numeric input in valid range → performs calculation<br>- `test_function_with_default_params`: Tests function with default parameters → uses correct defaults<br>**Total positive tests:** [N] |
@@ -109,7 +108,7 @@
109
108
 
110
109
  Repeat one bullet per in-scope language that has coverage requirements. Keep the checklist above even when a language is out of scope, but use `N/A - out of scope` for the artifact path.
111
110
 
112
- - [Language]: Baseline: [N]% [unit] -> Post-change: [N]% [unit]. Change: [+/-N]% [unit delta]. New/changed-code coverage: [N]% or `N/A - out of scope`. Disposition: [PASS/FAIL/N/A]. Evidence: [artifact path(s)].
111
+ - [Language]: Baseline: N/A - no pre-change run -> Post-change: [N]% [unit]. Change: N/A. New/changed-code coverage: [N]% or `N/A - out of scope`. Disposition: [PASS/FAIL/N/A]. Evidence: [artifact path(s)].
113
112
 
114
113
  ### 1.3 Test Structure and Diagnostics
115
114
 
@@ -208,7 +207,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
208
207
  | **Formatting with Black** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run black .`<br>**Result:** [Describe result] |
209
208
  | **Linting with Ruff** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run ruff check`<br>**Result:** [Describe result] |
210
209
  | **Type checking with Pyright** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pyright`<br>**Result:** [Describe result] |
211
- | **Testing with Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest`<br>**Result:** [Describe result] |
210
+ | **Testing with Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest -n auto`<br>**Result:** [Describe result] |
212
211
 
213
212
  #### 3A.2 Python Design & Typing
214
213
 
@@ -342,7 +341,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
342
341
 
343
342
  | Requirement | Status | Evidence |
344
343
  |------------|--------|----------|
345
- | **Use Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest`<br>**Result:** [Describe test results] |
344
+ | **Use Pytest** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `poetry run pytest -n auto`<br>**Result:** [Describe test results] |
346
345
  | **No Alternative Test Runners** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Confirm only Pytest is used.] |
347
346
 
348
347
  ---
@@ -353,8 +352,8 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
353
352
 
354
353
  | Requirement | Status | Evidence |
355
354
  |------------|--------|----------|
356
- | **Use Pester v5.x** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe Pester v5 features used (BeforeAll, BeforeEach, Describe/Context/It, modern Should syntax).] |
357
- | **Use PoshQC Configuration** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-PoshQCTest -Root .`<br>**Config:** `scripts/powershell/PoshQC/settings/pester.runsettings.psd1`<br>[Describe configuration updates if any.] |
355
+ | **Use Pester v6.x** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe Pester v6 features used (BeforeAll, BeforeEach, Describe/Context/It, modern Should syntax).] |
356
+ | **Use PoshQC Configuration** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-PoshQCParallelTest -Root .`<br>**Config:** `scripts/powershell/PoshQC/settings/pester.runsettings.psd1`<br>[Describe configuration updates if any.] |
358
357
  | **PowerShell 5.1 & 7.6+ Compatible** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe compatibility testing. Note any version-specific features.] |
359
358
 
360
359
  #### 4B.2 Test Style and Structure
@@ -379,7 +378,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
379
378
 
380
379
  | Requirement | Status | Evidence |
381
380
  |------------|--------|----------|
382
- | **Use PoshQCTest Command** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-PoshQCTest -Root .`<br>**Result:** [Describe test results] |
381
+ | **Use PoshQCTest Command** | [✅/❌/N/A] [PASS/FAIL/N/A] | **Command:** `Invoke-PoshQCParallelTest -Root .`<br>**Result:** [Describe test results] |
383
382
  | **No Alternative Test Runners** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Confirm only Pester is used through PoshQC.] |
384
383
 
385
384
  ---
@@ -438,7 +437,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
438
437
  | Black Formatting | `poetry run black .` | [result] | [✅/❌] |
439
438
  | Ruff Linting | `poetry run ruff check` | [result] | [✅/❌] |
440
439
  | Pyright Type Checking | `poetry run pyright` | [result] | [✅/❌] |
441
- | Pytest Tests | `poetry run pytest` | [result] | [✅/❌] |
440
+ | Pytest Tests | `poetry run pytest -n auto` | [result] | [✅/❌] |
442
441
 
443
442
  **For PowerShell:**
444
443
 
@@ -446,7 +445,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
446
445
  |-------|---------|--------|--------|
447
446
  | Invoke-Formatter | `Invoke-PoshQCFormat -Root .` | [result] | [✅/❌] |
448
447
  | PSScriptAnalyzer | `Invoke-PoshQCAnalyze -Root .` | [result] | [✅/❌] |
449
- | Pester Tests | `Invoke-PoshQCTest -Root .` | [result] | [✅/❌] |
448
+ | Pester Tests | `Invoke-PoshQCParallelTest -Root .` | [result] | [✅/❌] |
450
449
 
451
450
  **Notes:**
452
451
  [Document any pre-existing failures unrelated to this work. Explain any deviations from clean runs.]
@@ -515,7 +514,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
515
514
 
516
515
  [Provide a brief summary of overall compliance status and any major findings.]
517
516
 
518
- **Fail-closed reminder:** Do not mark the audit PASS, fully compliant, or ready for merge when any required baseline artifact, QA artifact, coverage metric, or coverage-comparison artifact is missing.
517
+ **Fail-closed reminder:** Do not mark the audit PASS, fully compliant, or ready for merge when any required QA artifact or post-change coverage metric is missing.
519
518
 
520
519
  ---
521
520
 
@@ -626,8 +625,8 @@ poetry run ruff check --fix # auto-fix
626
625
  poetry run pyright
627
626
 
628
627
  # Testing
629
- poetry run pytest
630
- poetry run pytest --cov=src/[package] --cov-report=term-missing
628
+ poetry run pytest -n auto
629
+ poetry run pytest -n auto --cov=src/[package] --cov-report=term-missing
631
630
  ```
632
631
 
633
632
  **For PowerShell:**
@@ -639,7 +638,7 @@ Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCFormat -Root .
639
638
  Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCAnalyze -Root .
640
639
 
641
640
  # Testing
642
- Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCTest -Root .
641
+ Import-Module ./scripts/powershell/PoshQC; Invoke-PoshQCParallelTest -Root .
643
642
  ```
644
643
 
645
644
  ---