@danmoisan/drm-copilot-mcp 1.1.22 → 1.1.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/out/mcp-server.js +18758 -12030
- package/package.json +1 -1
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +1 -1
- package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_test_files_count_against_500_cap.md +4 -4
- package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +1 -1
- package/resources/claude-customizations/.claude/agents/discovery-capability-sentinel.md +34 -0
- package/resources/claude-customizations/.claude/agents/feature-review.md +8 -0
- package/resources/claude-customizations/.claude/agents/legacy-parity-analyst.md +101 -43
- package/resources/claude-customizations/.claude/agents/migration-coverage-reviewer.md +107 -43
- package/resources/claude-customizations/.claude/agents/orchestrator.md +1 -1
- package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +60 -6
- package/resources/claude-customizations/.claude/agents/parallel-planner.md +21 -1
- package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +1 -1
- package/resources/claude-customizations/.claude/agents/pr-author.md +48 -7
- package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +1 -1
- package/resources/claude-customizations/.claude/agents/requirements-reconciler.md +117 -42
- package/resources/claude-customizations/.claude/agents/runtime-characterization-analyst.md +103 -43
- package/resources/claude-customizations/.claude/hooks/discovery-capability-probe.ps1 +102 -0
- package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +69 -194
- package/resources/claude-customizations/.claude/hooks/enforce-discovery-planning-gate.ps1 +87 -0
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-green-ci.ps1 +325 -0
- package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +29 -7
- package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate-resolution.ps1 +23 -10
- package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate.ps1 +29 -21
- package/resources/claude-customizations/.claude/hooks/enforce-file-size-limit.ps1 +244 -0
- package/resources/claude-customizations/.claude/hooks/enforce-model-routing-receipt.ps1 +51 -0
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +168 -48
- package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate.ps1 +1 -1
- package/resources/claude-customizations/.claude/hooks/enforce-parallel-worktree-removal-gate.ps1 +22 -11
- package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +59 -20
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-command-allowlist.ps1 +51 -4
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill-helpers.ps1 +72 -11
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.current-branch.ps1 +149 -0
- package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.epic-base-branch.ps1 +4 -2
- package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +59 -20
- package/resources/claude-customizations/.claude/hooks/record-discovery-agent-start.ps1 +132 -0
- package/resources/claude-customizations/.claude/hooks/validate-discovery-artifact-gate.ps1 +56 -212
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-feature-folder.ps1 +146 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-rejection.ps1 +172 -0
- package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +34 -4
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadius.psm1 +9 -3
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusAggregate.psm1 +154 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusCombination.psm1 +228 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusExtraction.psm1 +1 -0
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusNormalization.psm1 +4 -2
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusScheduling.psm1 +63 -16
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusTokenShape.psm1 +56 -1
- package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusWriteIntent.psm1 +4 -1
- package/resources/claude-customizations/.claude/lib/cleanup-manifest/CleanupWorktreeManifest.psm1 +33 -6
- package/resources/claude-customizations/.claude/lib/codex-routing/CodexDeployment.psm1 +5 -1
- package/resources/claude-customizations/.claude/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
- package/resources/claude-customizations/.claude/lib/codex-routing/CodexTopology.psm1 +25 -2
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
- package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryValidation.psm1 +188 -341
- package/resources/claude-customizations/.claude/lib/file-size-policy/FileSizePolicy.psm1 +434 -0
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateFeatureFolderRecord.psm1 +166 -0
- package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateIssueAdoption.psm1 +8 -3
- package/resources/claude-customizations/.claude/lib/worktree-resolution/HookTargetWorktree.psm1 +391 -0
- package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunRecordPath.psm1 +185 -0
- package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunResolution.psm1 +11 -21
- package/resources/claude-customizations/.claude/rules/general-code-change.md +4 -1
- package/resources/claude-customizations/.claude/rules/orchestrator-state.md +29 -5
- package/resources/claude-customizations/.claude/rules/parallel-orchestration.md +152 -20
- package/resources/claude-customizations/.claude/rules/powershell.md +1 -1
- package/resources/claude-customizations/.claude/rules/shell.md +1 -1
- package/resources/claude-customizations/.claude/settings.json +36 -3
- package/resources/claude-customizations/.claude/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
- package/resources/claude-customizations/.claude/skills/characterize-runtime-behavior/SKILL.md +134 -0
- package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/SKILL.md +2 -2
- package/resources/claude-customizations/.claude/skills/discovery-behavior-reconciliation/SKILL.md +28 -47
- package/resources/claude-customizations/.claude/skills/discovery-coverage-ledger/SKILL.md +32 -48
- package/resources/claude-customizations/.claude/skills/discovery-parity-matrix/SKILL.md +28 -45
- package/resources/claude-customizations/.claude/skills/discovery-repo-inventory/SKILL.md +28 -62
- package/resources/claude-customizations/.claude/skills/discovery-runtime-characterization/SKILL.md +28 -45
- package/resources/claude-customizations/.claude/skills/discovery-validate-artifacts/SKILL.md +28 -61
- package/resources/claude-customizations/.claude/skills/discovery-workflow/SKILL.md +55 -139
- package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +25 -10
- package/resources/claude-customizations/.claude/skills/extract-feature-contract/SKILL.md +133 -0
- package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +1 -0
- package/resources/claude-customizations/.claude/skills/generate-acceptance-scenarios/SKILL.md +132 -0
- package/resources/claude-customizations/.claude/skills/initialize-discovery-workspace/SKILL.md +131 -0
- package/resources/claude-customizations/.claude/skills/inventory-legacy-system/SKILL.md +131 -0
- package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +15 -7
- package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +25 -2
- package/resources/claude-customizations/.claude/skills/parallel-close/SKILL.md +11 -1
- package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +124 -14
- package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +72 -7
- package/resources/claude-customizations/.claude/skills/parallel-remove/SKILL.md +15 -0
- package/resources/claude-customizations/.claude/skills/parallel-run/SKILL.md +6 -0
- package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +56 -9
- package/resources/claude-customizations/.claude/skills/reconcile-parity-matrix/SKILL.md +131 -0
- package/resources/claude-customizations/.claude/skills/review-discovery-coverage/SKILL.md +129 -0
- package/resources/claude-customizations/.claude/skills/validate-discovery-artifacts/SKILL.md +127 -0
- package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +1 -1
- package/resources/claude-customizations/config/blast-radius.json +6 -5
- package/resources/claude-customizations/config/orchestration-routing.json +61 -1
- package/resources/claude-customizations/pack-manifests/core.json +40 -1
- package/resources/codex-and-agents-customizations/.agents/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
- package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +7 -0
- package/resources/codex-and-agents-customizations/.agents/skills/characterize-runtime-behavior/SKILL.md +134 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-coverage-ledger/SKILL.md +50 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-parity-matrix/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-repo-inventory/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-runtime-characterization/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-validate-artifacts/SKILL.md +46 -0
- package/resources/codex-and-agents-customizations/.agents/skills/discovery-workflow/SKILL.md +62 -0
- package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +25 -10
- package/resources/codex-and-agents-customizations/.agents/skills/extract-feature-contract/SKILL.md +133 -0
- package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +8 -0
- package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +4 -1
- package/resources/codex-and-agents-customizations/.agents/skills/generate-acceptance-scenarios/SKILL.md +132 -0
- package/resources/codex-and-agents-customizations/.agents/skills/initialize-discovery-workspace/SKILL.md +131 -0
- package/resources/codex-and-agents-customizations/.agents/skills/inventory-legacy-system/SKILL.md +131 -0
- package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +8 -0
- package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +1 -1
- package/resources/codex-and-agents-customizations/.agents/skills/reconcile-parity-matrix/SKILL.md +131 -0
- package/resources/codex-and-agents-customizations/.agents/skills/review-discovery-coverage/SKILL.md +129 -0
- package/resources/codex-and-agents-customizations/.agents/skills/validate-discovery-artifacts/SKILL.md +127 -0
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/discovery-capability-sentinel.toml +51 -0
- package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +8 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c1.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c2.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3-elevated.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c4.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst.toml +148 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c1.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c2.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3-elevated.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c4.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer.toml +154 -0
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c1.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c2.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3-elevated.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c4.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler.toml +164 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c1.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c2.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3-elevated.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c4.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst.toml +150 -0
- package/resources/codex-and-agents-customizations/.codex/config.toml +39 -3
- package/resources/codex-and-agents-customizations/.codex/hooks/codex-agent-profile-attestation.ps1 +22 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/discovery-capability-probe.ps1 +97 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/discovery-start-attestation.ps1 +171 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-codex-model-routing.ps1 +4 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-artifact-gate.ps1 +187 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-planning-gate.ps1 +149 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-file-size-limit.ps1 +282 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +239 -2
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate.ps1 +6 -15
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +54 -15
- package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +54 -15
- package/resources/codex-and-agents-customizations/.codex/hooks/file-size-policy.ps1 +421 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/hook-target-worktree.ps1 +369 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/record-subagent-routing-attestation.ps1 +8 -0
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-codex-subagent-routing.ps1 +22 -1
- package/resources/codex-and-agents-customizations/.codex/hooks/validate-discovery-agent-output.ps1 +178 -0
- package/resources/codex-and-agents-customizations/.codex/scripts/Resolve-CodexTopology.ps1 +11 -1
- package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +1 -1
- package/resources/codex-and-agents-customizations/AGENTS.md +4 -1
- package/resources/codex-and-agents-customizations/pack-manifests/core.json +65 -1
- package/resources/config/orchestration-routing.json +61 -1
- package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
- package/resources/customizations/.github/agents/discovery-capability-sentinel.agent.md +34 -0
- package/resources/customizations/.github/agents/legacy-parity-analyst.agent.md +122 -0
- package/resources/customizations/.github/agents/migration-coverage-reviewer.agent.md +128 -0
- package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +1 -1
- package/resources/customizations/.github/agents/python-typed-engineer.agent.md +1 -1
- package/resources/customizations/.github/agents/requirements-reconciler.agent.md +138 -0
- package/resources/customizations/.github/agents/runtime-characterization-analyst.agent.md +124 -0
- package/resources/customizations/.github/hooks/discovery-agent-start.ps1 +139 -0
- package/resources/customizations/.github/hooks/discovery-agent-stop.ps1 +123 -0
- package/resources/customizations/.github/hooks/discovery-capability-probe.ps1 +98 -0
- package/resources/customizations/.github/hooks/discovery-planning.ps1 +91 -0
- package/resources/customizations/.github/hooks/discovery-pre-tool.ps1 +123 -0
- package/resources/customizations/.github/hooks/discovery.json +35 -0
- package/resources/customizations/.github/instructions/general-code-change.instructions.md +5 -2
- package/resources/customizations/.github/instructions/mermaid.instructions.md +85 -0
- package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +1 -1
- package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +105 -0
- package/resources/customizations/.github/prompts/remediate-comments.prompt.md +1 -1
- package/resources/customizations/.github/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
- package/resources/customizations/.github/skills/characterize-runtime-behavior/SKILL.md +134 -0
- package/resources/customizations/.github/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-coverage-ledger/SKILL.md +50 -0
- package/resources/customizations/.github/skills/discovery-parity-matrix/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-repo-inventory/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-runtime-characterization/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-validate-artifacts/SKILL.md +46 -0
- package/resources/customizations/.github/skills/discovery-workflow/SKILL.md +62 -0
- package/resources/customizations/.github/skills/execution-environment/SKILL.md +25 -10
- package/resources/customizations/.github/skills/extract-feature-contract/SKILL.md +133 -0
- package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +8 -0
- package/resources/customizations/.github/skills/generate-acceptance-scenarios/SKILL.md +132 -0
- package/resources/customizations/.github/skills/initialize-discovery-workspace/SKILL.md +131 -0
- package/resources/customizations/.github/skills/inventory-legacy-system/SKILL.md +131 -0
- package/resources/customizations/.github/skills/reconcile-parity-matrix/SKILL.md +131 -0
- package/resources/customizations/.github/skills/review-discovery-coverage/SKILL.md +129 -0
- package/resources/customizations/.github/skills/validate-discovery-artifacts/SKILL.md +127 -0
- package/resources/lib/codex-routing/CodexDeployment.psm1 +5 -1
- package/resources/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
- package/resources/lib/codex-routing/CodexTopology.psm1 +25 -2
- package/resources/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
- package/resources/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
- package/resources/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
- package/resources/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
- package/resources/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
- package/resources/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
- package/resources/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
- package/resources/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
- package/resources/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
- package/resources/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
- package/resources/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
- package/resources/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
- package/resources/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
- package/resources/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
- package/resources/powershell/PoshQC/PoshQC.Parallel.psm1 +452 -0
- package/resources/powershell/PoshQC/PoshQC.Shard.psm1 +106 -8
- package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +12 -0
- package/resources/powershell/PoshQC/PoshQC.psd1 +6 -1
- package/resources/powershell/PoshQC/PoshQC.psm1 +7 -1
- package/resources/powershell/PoshQC/README.md +20 -1
- package/resources/templates/policy_audit/code-review.yyyy-MM-ddTHH-mm.md +4 -4
- package/resources/templates/policy_audit/policy-audit.yyyy-MM-ddTHH-mm.md +4 -4
|
@@ -235,6 +235,8 @@ Total number of shards.
|
|
|
235
235
|
Optional path that receives the shard manifest JSON.
|
|
236
236
|
.PARAMETER WriteShardFileList
|
|
237
237
|
Seam that writes the manifest JSON; receives the path and the JSON text.
|
|
238
|
+
.PARAMETER ReadWeightsText
|
|
239
|
+
Optional seam passed to Get-PoshQCShardTestFileWeight that returns the weights-file text for RootPath, or $null (issue #1048).
|
|
238
240
|
#>
|
|
239
241
|
function Select-PoshQCShardTestFile {
|
|
240
242
|
[CmdletBinding()]
|
|
@@ -245,11 +247,17 @@ function Select-PoshQCShardTestFile {
|
|
|
245
247
|
[Parameter(Mandatory)][int] $ShardIndex,
|
|
246
248
|
[Parameter(Mandatory)][int] $ShardCount,
|
|
247
249
|
[string] $ShardFileListPath,
|
|
248
|
-
[Parameter(Mandatory)][scriptblock] $WriteShardFileList
|
|
250
|
+
[Parameter(Mandatory)][scriptblock] $WriteShardFileList,
|
|
251
|
+
[scriptblock] $ReadWeightsText
|
|
249
252
|
)
|
|
250
253
|
|
|
251
254
|
$paths = [string[]] @($TestFile | ForEach-Object { if ($_ -is [string]) { $_ } else { $_.FullName } })
|
|
252
|
-
|
|
255
|
+
# Issue #1048: the root lets the weight lookup read config/poshqc-shard-weights.json; a supplied reader replaces the default one.
|
|
256
|
+
$weightArguments = @{ TestFile = $TestFile; RootPath = $RootPath }
|
|
257
|
+
if ($PSBoundParameters.ContainsKey('ReadWeightsText')) {
|
|
258
|
+
$weightArguments['ReadWeightsText'] = $ReadWeightsText
|
|
259
|
+
}
|
|
260
|
+
$weights = [long[]] @(Get-PoshQCShardTestFileWeight @weightArguments)
|
|
253
261
|
$manifest = New-PoshQCShardManifest -RootPath $RootPath -TestFile $paths -ShardIndex $ShardIndex -ShardCount $ShardCount -Weight $weights
|
|
254
262
|
if (@($manifest.selected).Count -eq 0) {
|
|
255
263
|
throw "Shard $ShardIndex of $ShardCount selects no test file; $($paths.Count) test files cannot fill $ShardCount shards. Lower the shard count."
|
|
@@ -262,25 +270,115 @@ function Select-PoshQCShardTestFile {
|
|
|
262
270
|
|
|
263
271
|
<#
|
|
264
272
|
.SYNOPSIS
|
|
265
|
-
|
|
273
|
+
Parses and validates the text of config/poshqc-shard-weights.json (issue #1048).
|
|
266
274
|
.DESCRIPTION
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
275
|
+
The document must be a JSON object with version 1, unit 'ms', and a non-empty files map whose keys are
|
|
276
|
+
repository-relative forward-slash paths (no backslash, no leading slash, no colon) and whose values are
|
|
277
|
+
non-negative integers. Throws a message that names poshqc-shard-weights.json otherwise. Returns a dictionary
|
|
278
|
+
of milliseconds keyed by path, compared case-insensitively.
|
|
279
|
+
.PARAMETER Json
|
|
280
|
+
The text of the weights file.
|
|
281
|
+
#>
|
|
282
|
+
function ConvertFrom-PoshQCShardWeightJson {
|
|
283
|
+
[CmdletBinding()]
|
|
284
|
+
[OutputType([System.Collections.Generic.Dictionary[string, long]])]
|
|
285
|
+
param(
|
|
286
|
+
[Parameter(Mandatory)][AllowEmptyString()][string] $Json
|
|
287
|
+
)
|
|
288
|
+
|
|
289
|
+
$name = 'config/poshqc-shard-weights.json'
|
|
290
|
+
try {
|
|
291
|
+
$document = $Json | ConvertFrom-Json -ErrorAction Stop
|
|
292
|
+
} catch {
|
|
293
|
+
throw "$name is not valid JSON: $($_.Exception.Message)"
|
|
294
|
+
}
|
|
295
|
+
if ($null -eq $document -or $document -isnot [System.Management.Automation.PSCustomObject]) {
|
|
296
|
+
throw "$name must hold a JSON object."
|
|
297
|
+
}
|
|
298
|
+
$isInteger = { param($Value) $Value -is [int] -or $Value -is [long] }
|
|
299
|
+
$version = $document.PSObject.Properties['version']
|
|
300
|
+
if ($null -eq $version -or -not (& $isInteger $version.Value) -or $version.Value -ne 1) {
|
|
301
|
+
throw "$name must declare version 1."
|
|
302
|
+
}
|
|
303
|
+
$unit = $document.PSObject.Properties['unit']
|
|
304
|
+
if ($null -eq $unit -or [string] $unit.Value -cne 'ms') {
|
|
305
|
+
throw "$name must declare unit 'ms'."
|
|
306
|
+
}
|
|
307
|
+
$files = $document.PSObject.Properties['files']
|
|
308
|
+
if ($null -eq $files -or $files.Value -isnot [System.Management.Automation.PSCustomObject] -or @($files.Value.PSObject.Properties).Count -eq 0) {
|
|
309
|
+
throw "$name must list at least one file in a 'files' object."
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
$weights = New-Object 'System.Collections.Generic.Dictionary[string,long]' ([System.StringComparer]::OrdinalIgnoreCase)
|
|
313
|
+
# Validate each entry: a repository-relative forward-slash key and a non-negative integer of milliseconds.
|
|
314
|
+
foreach ($entry in $files.Value.PSObject.Properties) {
|
|
315
|
+
if ([string]::IsNullOrWhiteSpace($entry.Name) -or $entry.Name.Contains('\') -or $entry.Name.StartsWith('/') -or $entry.Name.Contains(':')) {
|
|
316
|
+
throw "$name lists '$($entry.Name)', which is not a repository-relative forward-slash path."
|
|
317
|
+
}
|
|
318
|
+
if (-not (& $isInteger $entry.Value) -or $entry.Value -lt 0) {
|
|
319
|
+
throw "$name gives '$($entry.Name)' the weight '$($entry.Value)'; weights must be non-negative integers."
|
|
320
|
+
}
|
|
321
|
+
$weights[$entry.Name] = [long] $entry.Value
|
|
322
|
+
}
|
|
323
|
+
# A dictionary is not enumerated by the pipeline, so it is returned as one object.
|
|
324
|
+
$weights
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
<#
|
|
328
|
+
.SYNOPSIS
|
|
329
|
+
Returns the shard weight of each enumerated test file (issue #953, CR-19; measured weights issue #1048).
|
|
330
|
+
.DESCRIPTION
|
|
331
|
+
When RootPath is supplied and ReadWeightsText returns text, the text is parsed with
|
|
332
|
+
ConvertFrom-PoshQCShardWeightJson and each test file weighs the milliseconds listed for its repository-relative
|
|
333
|
+
forward-slash path; a file without an entry weighs the median of all listed values, so bytes and milliseconds
|
|
334
|
+
are never mixed. Otherwise the size path runs: a FileInfo item weighs the UTF-8 byte count of its text after
|
|
335
|
+
every CRLF pair is replaced by LF, so a checkout with CRLF line endings computes the same weights, and therefore
|
|
336
|
+
the same shard assignment, as a checkout with LF line endings. Another object weighs its Length property when it
|
|
337
|
+
has one; a plain path string, or an object without a Length property, weighs 1. Returns one weight per item, in
|
|
338
|
+
input order.
|
|
271
339
|
.PARAMETER TestFile
|
|
272
340
|
Enumerated test files: FileInfo items, objects with FullName (and optionally Length), or path strings.
|
|
273
341
|
.PARAMETER ReadTestFileText
|
|
274
342
|
Seam that returns the text of a test file from its full path. Defaults to [System.IO.File]::ReadAllText.
|
|
343
|
+
.PARAMETER RootPath
|
|
344
|
+
Optional workspace root. Without it the size path runs.
|
|
345
|
+
.PARAMETER ReadWeightsText
|
|
346
|
+
Seam that receives RootPath and returns the text of RootPath/config/poshqc-shard-weights.json, or $null when the
|
|
347
|
+
file does not exist. Defaults to Test-Path and Get-Content -Raw.
|
|
275
348
|
#>
|
|
276
349
|
function Get-PoshQCShardTestFileWeight {
|
|
277
350
|
[CmdletBinding()]
|
|
278
351
|
[OutputType([long[]])]
|
|
279
352
|
param(
|
|
280
353
|
[Parameter(Mandatory)][AllowEmptyCollection()][object[]] $TestFile,
|
|
281
|
-
[scriptblock] $ReadTestFileText = { param([string] $Path) [System.IO.File]::ReadAllText($Path) }
|
|
354
|
+
[scriptblock] $ReadTestFileText = { param([string] $Path) [System.IO.File]::ReadAllText($Path) },
|
|
355
|
+
[string] $RootPath,
|
|
356
|
+
[scriptblock] $ReadWeightsText = {
|
|
357
|
+
param([string] $Root)
|
|
358
|
+
$weightsPath = Join-Path (Join-Path $Root 'config') 'poshqc-shard-weights.json'
|
|
359
|
+
if (Test-Path -LiteralPath $weightsPath) { Get-Content -Raw -LiteralPath $weightsPath } else { $null }
|
|
360
|
+
}
|
|
282
361
|
)
|
|
283
362
|
|
|
363
|
+
$weightsText = if ($RootPath) { & $ReadWeightsText $RootPath } else { $null }
|
|
364
|
+
if ($null -ne $weightsText) {
|
|
365
|
+
$measured = ConvertFrom-PoshQCShardWeightJson -Json ([string] $weightsText)
|
|
366
|
+
[long[]] $listed = @($measured.Values)
|
|
367
|
+
[System.Array]::Sort($listed)
|
|
368
|
+
$middle = [int] [math]::Floor($listed.Count / 2)
|
|
369
|
+
$median = if ($listed.Count % 2 -eq 1) { $listed[$middle] } else { [long] [math]::Floor(($listed[$middle - 1] + $listed[$middle]) / 2) }
|
|
370
|
+
$prefix = ($RootPath -replace '\\', '/').TrimEnd('/') + '/'
|
|
371
|
+
# Look up each file by its root-relative forward-slash path; an unlisted file weighs the median.
|
|
372
|
+
$measuredWeights = New-Object 'System.Collections.Generic.List[long]'
|
|
373
|
+
foreach ($item in $TestFile) {
|
|
374
|
+
$path = $(if ($item -is [string]) { $item } else { [string] $item.FullName }) -replace '\\', '/'
|
|
375
|
+
$relative = if ($path.StartsWith($prefix, [System.StringComparison]::OrdinalIgnoreCase)) { $path.Substring($prefix.Length) } else { $path }
|
|
376
|
+
$weight = [long] 0
|
|
377
|
+
if ($measured.TryGetValue($relative, [ref] $weight)) { $measuredWeights.Add($weight) } else { $measuredWeights.Add($median) }
|
|
378
|
+
}
|
|
379
|
+
return [long[]] $measuredWeights.ToArray()
|
|
380
|
+
}
|
|
381
|
+
|
|
284
382
|
$weights = New-Object 'System.Collections.Generic.List[long]'
|
|
285
383
|
foreach ($item in $TestFile) {
|
|
286
384
|
if ($item -is [System.IO.FileInfo]) {
|
|
@@ -158,6 +158,12 @@ Number of shards. When greater than 0, Run.Path is set to this shard's size-bala
|
|
|
158
158
|
Optional path that receives the shard manifest (shardIndex, shardCount, all, selected) as JSON.
|
|
159
159
|
.PARAMETER WriteShardFileList
|
|
160
160
|
Injectable seam that writes the shard manifest JSON. Defaults to Set-Content.
|
|
161
|
+
.PARAMETER TestResultPath
|
|
162
|
+
Optional JUnit output path that replaces the settings TestResult.OutputPath for this invocation, so concurrent
|
|
163
|
+
shards write distinct files (issue #1048). A relative path is resolved against Root. Omitted or blank keeps the settings value.
|
|
164
|
+
.PARAMETER CoverageOutputPath
|
|
165
|
+
Optional coverage output path that replaces the settings CodeCoverage.OutputPath for this invocation (issue #1048).
|
|
166
|
+
A relative path is resolved against Root. Omitted or blank keeps the settings value.
|
|
161
167
|
#>
|
|
162
168
|
function Invoke-PoshQCTest {
|
|
163
169
|
[CmdletBinding()]
|
|
@@ -171,6 +177,8 @@ function Invoke-PoshQCTest {
|
|
|
171
177
|
[int] $ShardIndex = 0,
|
|
172
178
|
[int] $ShardCount = 0,
|
|
173
179
|
[string] $ShardFileListPath,
|
|
180
|
+
[string] $TestResultPath,
|
|
181
|
+
[string] $CoverageOutputPath,
|
|
174
182
|
[scriptblock] $WriteShardFileList = { param([string] $Path, [string] $Json) Set-Content -LiteralPath $Path -Value $Json -Encoding utf8 },
|
|
175
183
|
[scriptblock] $EnsureModule = {
|
|
176
184
|
param([string] $Name, [string] $ErrorMessage, [string] $MinimumVersion, [string] $MaximumVersion)
|
|
@@ -325,6 +333,10 @@ function Invoke-PoshQCTest {
|
|
|
325
333
|
|
|
326
334
|
$settings = & $LoadSettings $SettingsPath
|
|
327
335
|
$config = & $BuildConfiguration $settings
|
|
336
|
+
# Issue #1048: per-invocation output paths, applied before EnsureResultPath and ExpandCoveragePaths so the
|
|
337
|
+
# relative-to-root resolution and directory creation also apply to them.
|
|
338
|
+
if (-not [string]::IsNullOrWhiteSpace($TestResultPath)) { $config.TestResult.OutputPath = $TestResultPath }
|
|
339
|
+
if (-not [string]::IsNullOrWhiteSpace($CoverageOutputPath) -and $config.CodeCoverage) { $config.CodeCoverage.OutputPath = $CoverageOutputPath }
|
|
328
340
|
$config = & $ExpandRunPaths $config $Root $ExcludeDirs
|
|
329
341
|
$config = & $EnsureResultPath $config $Root
|
|
330
342
|
$config = & $ExpandCoveragePaths $config $Root
|
|
@@ -22,7 +22,12 @@
|
|
|
22
22
|
'Get-PoshQCCoverageLineSummary',
|
|
23
23
|
'New-PoshQCShardManifest',
|
|
24
24
|
'Test-PoshQCShardCompleteness',
|
|
25
|
-
'Test-PoshQCShardTestCount'
|
|
25
|
+
'Test-PoshQCShardTestCount',
|
|
26
|
+
'Get-PoshQCParallelWorkerCount',
|
|
27
|
+
'Merge-PoshQCJunitReport',
|
|
28
|
+
'ConvertTo-PoshQCShardWeight',
|
|
29
|
+
'Export-PoshQCShardWeight',
|
|
30
|
+
'Invoke-PoshQCParallelTest'
|
|
26
31
|
)
|
|
27
32
|
CmdletsToExport = @()
|
|
28
33
|
VariablesToExport = @()
|
|
@@ -121,6 +121,7 @@ foreach ($subModuleName in @(
|
|
|
121
121
|
'PoshQC.Analyzer.psm1',
|
|
122
122
|
'PoshQC.Shard.psm1',
|
|
123
123
|
'PoshQC.CoverageMerge.psm1',
|
|
124
|
+
'PoshQC.Parallel.psm1',
|
|
124
125
|
'PoshQC.Testing.psm1'
|
|
125
126
|
)) {
|
|
126
127
|
$subModulePath = Join-Path $script:ModuleRoot $subModuleName
|
|
@@ -155,6 +156,11 @@ Export-ModuleMember -Function @(
|
|
|
155
156
|
'Get-PoshQCCoverageLineSummary',
|
|
156
157
|
'New-PoshQCShardManifest',
|
|
157
158
|
'Test-PoshQCShardCompleteness',
|
|
158
|
-
'Test-PoshQCShardTestCount'
|
|
159
|
+
'Test-PoshQCShardTestCount',
|
|
160
|
+
'Get-PoshQCParallelWorkerCount',
|
|
161
|
+
'Merge-PoshQCJunitReport',
|
|
162
|
+
'ConvertTo-PoshQCShardWeight',
|
|
163
|
+
'Export-PoshQCShardWeight',
|
|
164
|
+
'Invoke-PoshQCParallelTest'
|
|
159
165
|
) -Alias @('Install-PoshQCTools')
|
|
160
166
|
|
|
@@ -65,6 +65,10 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
65
65
|
- `Test-PoshQCShardTestCount`: throw unless the shard test counts sum to a discovery-pass test count.
|
|
66
66
|
- `Merge-PoshQCCoverageReport`: merge the CoverageGutters 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
|
+
- `Invoke-PoshQCParallelTest`: run the Pester suite as concurrent shard processes on one machine and merge the results (see Local concurrent runs below).
|
|
69
|
+
- `Get-PoshQCParallelWorkerCount`: return the default worker count, half the logical processors, at least 1 and at most 8.
|
|
70
|
+
- `Merge-PoshQCJunitReport`: merge the JUnit XML texts of the shards into one report (no file I/O).
|
|
71
|
+
- `ConvertTo-PoshQCShardWeight` / `Export-PoshQCShardWeight`: build the measured shard-weights document from JUnit reports, and write it to a file.
|
|
68
72
|
|
|
69
73
|
## Configuration
|
|
70
74
|
|
|
@@ -81,10 +85,25 @@ PoshQC is a lightweight PowerShell quality gate that wraps Invoke-Formatter, PSS
|
|
|
81
85
|
- An empty population disables coverage for that invocation, logs `Code coverage disabled for this invocation`, and still runs the tests.
|
|
82
86
|
- Each run logs `Code coverage population: source=<source>; files=<count>` before Pester starts.
|
|
83
87
|
- Sharded runs (issue #953): `Invoke-PoshQCTest -ShardIndex <n> -ShardCount <N>` runs only shard n of N.
|
|
84
|
-
- Test files are weighted by the UTF-8 size in bytes of their text with CRLF line endings counted as LF,
|
|
88
|
+
- Test files are weighted by measured duration first (issue #1048): when `config/poshqc-shard-weights.json` exists at the workspace root, a listed file weighs its milliseconds and a file without an entry weighs the median of all listed values, so bytes and milliseconds are never mixed. Without the weights file, test files are weighted by the UTF-8 size in bytes of their text with CRLF line endings counted as LF, so runners whose checkouts differ only in line-ending conversion compute the same assignment. Files are assigned heaviest first to the shard with the least assigned weight (ties: fewer files, then the lower shard index; equal weights are taken in ordinal path order).
|
|
89
|
+
- Weights file format: `{"version": 1, "unit": "ms", "files": {"<repository-relative forward-slash path>": <non-negative integer milliseconds>}}`. A document with another `version`, another `unit`, an empty `files` map, a non-relative key, or a negative or non-integer value is rejected with an error that names `poshqc-shard-weights.json`. Entries for files that no longer exist are ignored. The file is committed, so every CI shard computes the same assignment; stale or missing entries affect wall-clock time only, because the completeness and test-count checks still guard that every file runs once.
|
|
90
|
+
- Regenerate the weights from the shard JUnit files of a full CI run, not from a local run (local durations differ from the runner's). `Export-PoshQCShardWeight` maps each JUnit `testsuite` name, an absolute path on the runner, to the path from its first `tests` or `scripts` segment, sums seconds per file, and writes integer milliseconds with sorted keys:
|
|
91
|
+
|
|
92
|
+
```powershell
|
|
93
|
+
gh run download <run id> --pattern 'poshqc-test-results-shard-*' --dir <download dir>
|
|
94
|
+
Import-Module ./scripts/powershell/PoshQC/PoshQC.psd1
|
|
95
|
+
Export-PoshQCShardWeight -JunitPath (Get-ChildItem -LiteralPath <download dir> -Recurse -Filter pester-junit.xml).FullName -OutputPath config/poshqc-shard-weights.json
|
|
96
|
+
```
|
|
85
97
|
- `-ShardFileListPath <path>` writes the shard manifest (`shardIndex`, `shardCount`, `all`, `selected`) as JSON through the `-WriteShardFileList` seam.
|
|
86
98
|
- A shard that selects no test file (more shards than test files) stops with an error before Pester runs.
|
|
87
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
|
+
- 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.
|
|
102
|
+
- The worker count defaults to half the logical processor count, at least 1 and at most 8 (`Get-PoshQCParallelWorkerCount`); `-WorkerCount` overrides it.
|
|
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
|
+
- 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.
|
|
105
|
+
- The merged JUnit root carries the summed `tests`, `errors`, `failures`, and `disabled` counts, every shard's `testsuite` elements with `id` renumbered from 0, and a root `time` equal to the longest shard's root `time`: the shards run at the same time, so the longest shard is the wall-clock time of the run, not the sum of test time.
|
|
106
|
+
- The runner returns an object with `ExitCode`, `WorkerCount`, `WallClockSeconds`, and per-shard exit codes and log paths. `ExitCode` is 0 only when every shard exited 0, wrote all three outputs, passed the completeness check, and merged; otherwise it is 1 and no merged artifact is written, so a partial result never replaces a full one. The runner never calls `exit`; the VS Code task exits with the returned `ExitCode`.
|
|
88
107
|
|
|
89
108
|
## Typical workflow
|
|
90
109
|
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
> 2. Replace all placeholders with concrete branch, file, test, and evidence details.
|
|
10
10
|
> 3. Keep the sections that apply to the reviewed scope and delete inapplicable language subsections.
|
|
11
11
|
> 4. Base all findings on verified evidence: diff inspection, toolchain output, coverage data, and feature-folder artifacts.
|
|
12
|
-
> 5. Use severity labels consistently: `Blocker`, `Major`, `Minor`, `Nit`, `Info`.
|
|
12
|
+
> 5. Use severity labels consistently: `Blocker`, `Major`, `Minor`, `Nit`, `Info`, `Warning`. `Warning` is the non-blocking file-size advisory for a covered file at or above 700 logical lines; it names the file and its line count and is never carried into remediation inputs.
|
|
13
13
|
> 6. End with a clear readiness recommendation that matches the actual findings.
|
|
14
14
|
>
|
|
15
15
|
> **When to use:**
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
|
|
53
53
|
| Severity | File | Location | Finding | Recommendation | Rationale | Evidence |
|
|
54
54
|
|---|---|---|---|---|---|---|
|
|
55
|
-
| [Blocker/Major/Minor/Nit/Info] | `[path]` | `[line range / section / n/a]` | [Concrete issue] | [Concrete corrective action or note] | [Why it matters] | [Command output, artifact path, or inspected file reference] |
|
|
56
|
-
| [Blocker/Major/Minor/Nit/Info] | `[path]` | `[line range / section / n/a]` | [Concrete issue] | [Concrete corrective action or note] | [Why it matters] | [Command output, artifact path, or inspected file reference] |
|
|
55
|
+
| [Blocker/Major/Minor/Nit/Info/Warning] | `[path]` | `[line range / section / n/a]` | [Concrete issue] | [Concrete corrective action or note] | [Why it matters] | [Command output, artifact path, or inspected file reference] |
|
|
56
|
+
| [Blocker/Major/Minor/Nit/Info/Warning] | `[path]` | `[line range / section / n/a]` | [Concrete issue] | [Concrete corrective action or note] | [Why it matters] | [Command output, artifact path, or inspected file reference] |
|
|
57
57
|
|
|
58
58
|
[If applicable, add a short line such as `No Blockers or Major findings.`]
|
|
59
59
|
|
|
@@ -162,4 +162,4 @@
|
|
|
162
162
|
|
|
163
163
|
## Verdict
|
|
164
164
|
|
|
165
|
-
[Provide the final review conclusion in 1-2 paragraphs. State whether the change is ready for normal PR flow, ready after a specific follow-up, or blocked. Ensure this conclusion is consistent with the Findings Table and PR readiness recommendation above.]
|
|
165
|
+
[Provide the final review conclusion in 1-2 paragraphs. State whether the change is ready for normal PR flow, ready after a specific follow-up, or blocked. Ensure this conclusion is consistent with the Findings Table and PR readiness recommendation above.]
|
|
@@ -159,7 +159,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
159
159
|
| Requirement | Status | Evidence |
|
|
160
160
|
|------------|--------|----------|
|
|
161
161
|
| **Cohesive modules** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe the purpose and cohesion of each module/file. Note organization strategy.] |
|
|
162
|
-
| **
|
|
162
|
+
| **At or below the 800-line hard limit** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Report logical line counts for all covered files. FAIL for a file above 800 lines without a `config/file-size-baseline.json` entry, a baselined file that grew, or an added or increased baseline entry. Note each file at or above 700 lines as a non-blocking Warning. Note any exceptions.] |
|
|
163
163
|
| **Public vs internal** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe the public API surface. Note how internals are hidden.] |
|
|
164
164
|
| **No circular dependencies** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe the dependency graph. Confirm no circular dependencies exist.] |
|
|
165
165
|
|
|
@@ -253,7 +253,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
253
253
|
|
|
254
254
|
| Requirement | Status | Evidence |
|
|
255
255
|
|------------|--------|----------|
|
|
256
|
-
| **Cohesive and
|
|
256
|
+
| **Cohesive and at or below the 800-line hard limit** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Report logical line counts. FAIL for a file above 800 lines without a baseline entry or a baselined file that grew. Note each file at or above 700 lines as a non-blocking Warning.] |
|
|
257
257
|
| **Approved verbs** | [✅/❌/N/A] [PASS/FAIL/N/A] | [List all function names and confirm verbs are approved.] |
|
|
258
258
|
| **Comment why** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe commenting approach. Confirm focus on rationale.] |
|
|
259
259
|
|
|
@@ -285,7 +285,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
285
285
|
|------------|--------|----------|
|
|
286
286
|
| **Portable shebang** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Confirm `#!/usr/bin/env bash` or `#!/bin/bash` used.] |
|
|
287
287
|
| **Error handling** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Describe use of `set -e`, `set -u`, `set -o pipefail`, error traps.] |
|
|
288
|
-
| **
|
|
288
|
+
| **At or below the 800-line hard limit** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Report logical line counts. FAIL for a file above 800 lines without a baseline entry or a baselined file that grew. Note each file at or above 700 lines as a non-blocking Warning.] |
|
|
289
289
|
|
|
290
290
|
---
|
|
291
291
|
|
|
@@ -424,7 +424,7 @@ Repeat one bullet per in-scope language that has coverage requirements. Keep the
|
|
|
424
424
|
| Average Time per Test | [X]ms | [✅/❌] Fast/Slow |
|
|
425
425
|
| Discovery Time | [X]ms | [✅/❌] |
|
|
426
426
|
| Functions/Classes Tested | [N]/[M] ([X]%) | [✅/❌] |
|
|
427
|
-
| Test File Size | [N] lines | [✅/❌]
|
|
427
|
+
| Test File Size | [N] logical lines | [✅/❌] PASS at or below 800 lines, FAIL above 800 without a baseline entry; note a non-blocking Warning at or above 700 lines |
|
|
428
428
|
| Code Coverage (if applicable) | [X]% lines, [Y]% branches | [✅/❌] |
|
|
429
429
|
|
|
430
430
|
---
|