@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.
Files changed (261) hide show
  1. package/out/mcp-server.js +18758 -12030
  2. package/package.json +1 -1
  3. package/resources/claude-customizations/.claude/agent-memory/orchestrator/MEMORY.md +1 -1
  4. package/resources/claude-customizations/.claude/agent-memory/orchestrator/feedback_test_files_count_against_500_cap.md +4 -4
  5. package/resources/claude-customizations/.claude/agents/csharp-typed-engineer.md +1 -1
  6. package/resources/claude-customizations/.claude/agents/discovery-capability-sentinel.md +34 -0
  7. package/resources/claude-customizations/.claude/agents/feature-review.md +8 -0
  8. package/resources/claude-customizations/.claude/agents/legacy-parity-analyst.md +101 -43
  9. package/resources/claude-customizations/.claude/agents/migration-coverage-reviewer.md +107 -43
  10. package/resources/claude-customizations/.claude/agents/orchestrator.md +1 -1
  11. package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +60 -6
  12. package/resources/claude-customizations/.claude/agents/parallel-planner.md +21 -1
  13. package/resources/claude-customizations/.claude/agents/powershell-typed-engineer.md +1 -1
  14. package/resources/claude-customizations/.claude/agents/pr-author.md +48 -7
  15. package/resources/claude-customizations/.claude/agents/python-typed-engineer.md +1 -1
  16. package/resources/claude-customizations/.claude/agents/requirements-reconciler.md +117 -42
  17. package/resources/claude-customizations/.claude/agents/runtime-characterization-analyst.md +103 -43
  18. package/resources/claude-customizations/.claude/hooks/discovery-capability-probe.ps1 +102 -0
  19. package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +69 -194
  20. package/resources/claude-customizations/.claude/hooks/enforce-discovery-planning-gate.ps1 +87 -0
  21. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-green-ci.ps1 +325 -0
  22. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +29 -7
  23. package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate-resolution.ps1 +23 -10
  24. package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate.ps1 +29 -21
  25. package/resources/claude-customizations/.claude/hooks/enforce-file-size-limit.ps1 +244 -0
  26. package/resources/claude-customizations/.claude/hooks/enforce-model-routing-receipt.ps1 +51 -0
  27. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +168 -48
  28. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate.ps1 +1 -1
  29. package/resources/claude-customizations/.claude/hooks/enforce-parallel-worktree-removal-gate.ps1 +22 -11
  30. package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +59 -20
  31. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-command-allowlist.ps1 +51 -4
  32. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill-helpers.ps1 +72 -11
  33. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.current-branch.ps1 +149 -0
  34. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.epic-base-branch.ps1 +4 -2
  35. package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +59 -20
  36. package/resources/claude-customizations/.claude/hooks/record-discovery-agent-start.ps1 +132 -0
  37. package/resources/claude-customizations/.claude/hooks/validate-discovery-artifact-gate.ps1 +56 -212
  38. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-feature-folder.ps1 +146 -0
  39. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-rejection.ps1 +172 -0
  40. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +34 -4
  41. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadius.psm1 +9 -3
  42. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusAggregate.psm1 +154 -0
  43. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusCombination.psm1 +228 -0
  44. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusExtraction.psm1 +1 -0
  45. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusNormalization.psm1 +4 -2
  46. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusScheduling.psm1 +63 -16
  47. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusTokenShape.psm1 +56 -1
  48. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusWriteIntent.psm1 +4 -1
  49. package/resources/claude-customizations/.claude/lib/cleanup-manifest/CleanupWorktreeManifest.psm1 +33 -6
  50. package/resources/claude-customizations/.claude/lib/codex-routing/CodexDeployment.psm1 +5 -1
  51. package/resources/claude-customizations/.claude/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
  52. package/resources/claude-customizations/.claude/lib/codex-routing/CodexTopology.psm1 +25 -2
  53. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
  54. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
  55. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
  56. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
  57. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
  58. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
  59. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
  60. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
  61. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
  62. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
  63. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
  64. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
  65. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
  66. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
  67. package/resources/claude-customizations/.claude/lib/discovery-validation/DiscoveryValidation.psm1 +188 -341
  68. package/resources/claude-customizations/.claude/lib/file-size-policy/FileSizePolicy.psm1 +434 -0
  69. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateFeatureFolderRecord.psm1 +166 -0
  70. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateIssueAdoption.psm1 +8 -3
  71. package/resources/claude-customizations/.claude/lib/worktree-resolution/HookTargetWorktree.psm1 +391 -0
  72. package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunRecordPath.psm1 +185 -0
  73. package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunResolution.psm1 +11 -21
  74. package/resources/claude-customizations/.claude/rules/general-code-change.md +4 -1
  75. package/resources/claude-customizations/.claude/rules/orchestrator-state.md +29 -5
  76. package/resources/claude-customizations/.claude/rules/parallel-orchestration.md +152 -20
  77. package/resources/claude-customizations/.claude/rules/powershell.md +1 -1
  78. package/resources/claude-customizations/.claude/rules/shell.md +1 -1
  79. package/resources/claude-customizations/.claude/settings.json +36 -3
  80. package/resources/claude-customizations/.claude/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
  81. package/resources/claude-customizations/.claude/skills/characterize-runtime-behavior/SKILL.md +134 -0
  82. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/SKILL.md +2 -2
  83. package/resources/claude-customizations/.claude/skills/discovery-behavior-reconciliation/SKILL.md +28 -47
  84. package/resources/claude-customizations/.claude/skills/discovery-coverage-ledger/SKILL.md +32 -48
  85. package/resources/claude-customizations/.claude/skills/discovery-parity-matrix/SKILL.md +28 -45
  86. package/resources/claude-customizations/.claude/skills/discovery-repo-inventory/SKILL.md +28 -62
  87. package/resources/claude-customizations/.claude/skills/discovery-runtime-characterization/SKILL.md +28 -45
  88. package/resources/claude-customizations/.claude/skills/discovery-validate-artifacts/SKILL.md +28 -61
  89. package/resources/claude-customizations/.claude/skills/discovery-workflow/SKILL.md +55 -139
  90. package/resources/claude-customizations/.claude/skills/execution-environment/SKILL.md +25 -10
  91. package/resources/claude-customizations/.claude/skills/extract-feature-contract/SKILL.md +133 -0
  92. package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +1 -0
  93. package/resources/claude-customizations/.claude/skills/generate-acceptance-scenarios/SKILL.md +132 -0
  94. package/resources/claude-customizations/.claude/skills/initialize-discovery-workspace/SKILL.md +131 -0
  95. package/resources/claude-customizations/.claude/skills/inventory-legacy-system/SKILL.md +131 -0
  96. package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +15 -7
  97. package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +25 -2
  98. package/resources/claude-customizations/.claude/skills/parallel-close/SKILL.md +11 -1
  99. package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +124 -14
  100. package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +72 -7
  101. package/resources/claude-customizations/.claude/skills/parallel-remove/SKILL.md +15 -0
  102. package/resources/claude-customizations/.claude/skills/parallel-run/SKILL.md +6 -0
  103. package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +56 -9
  104. package/resources/claude-customizations/.claude/skills/reconcile-parity-matrix/SKILL.md +131 -0
  105. package/resources/claude-customizations/.claude/skills/review-discovery-coverage/SKILL.md +129 -0
  106. package/resources/claude-customizations/.claude/skills/validate-discovery-artifacts/SKILL.md +127 -0
  107. package/resources/claude-customizations/.claude-variants/csharp-legacy/agents/csharp-typed-engineer.md +1 -1
  108. package/resources/claude-customizations/config/blast-radius.json +6 -5
  109. package/resources/claude-customizations/config/orchestration-routing.json +61 -1
  110. package/resources/claude-customizations/pack-manifests/core.json +40 -1
  111. package/resources/codex-and-agents-customizations/.agents/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
  112. package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +7 -0
  113. package/resources/codex-and-agents-customizations/.agents/skills/characterize-runtime-behavior/SKILL.md +134 -0
  114. package/resources/codex-and-agents-customizations/.agents/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
  115. package/resources/codex-and-agents-customizations/.agents/skills/discovery-coverage-ledger/SKILL.md +50 -0
  116. package/resources/codex-and-agents-customizations/.agents/skills/discovery-parity-matrix/SKILL.md +46 -0
  117. package/resources/codex-and-agents-customizations/.agents/skills/discovery-repo-inventory/SKILL.md +46 -0
  118. package/resources/codex-and-agents-customizations/.agents/skills/discovery-runtime-characterization/SKILL.md +46 -0
  119. package/resources/codex-and-agents-customizations/.agents/skills/discovery-validate-artifacts/SKILL.md +46 -0
  120. package/resources/codex-and-agents-customizations/.agents/skills/discovery-workflow/SKILL.md +62 -0
  121. package/resources/codex-and-agents-customizations/.agents/skills/execution-environment/SKILL.md +25 -10
  122. package/resources/codex-and-agents-customizations/.agents/skills/extract-feature-contract/SKILL.md +133 -0
  123. package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +1 -1
  124. package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +8 -0
  125. package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +4 -1
  126. package/resources/codex-and-agents-customizations/.agents/skills/generate-acceptance-scenarios/SKILL.md +132 -0
  127. package/resources/codex-and-agents-customizations/.agents/skills/initialize-discovery-workspace/SKILL.md +131 -0
  128. package/resources/codex-and-agents-customizations/.agents/skills/inventory-legacy-system/SKILL.md +131 -0
  129. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +8 -0
  130. package/resources/codex-and-agents-customizations/.agents/skills/powershell/SKILL.md +1 -1
  131. package/resources/codex-and-agents-customizations/.agents/skills/reconcile-parity-matrix/SKILL.md +131 -0
  132. package/resources/codex-and-agents-customizations/.agents/skills/review-discovery-coverage/SKILL.md +129 -0
  133. package/resources/codex-and-agents-customizations/.agents/skills/validate-discovery-artifacts/SKILL.md +127 -0
  134. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c1.toml +1 -1
  135. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c2.toml +1 -1
  136. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3-elevated.toml +1 -1
  137. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c3.toml +1 -1
  138. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer-c4.toml +1 -1
  139. package/resources/codex-and-agents-customizations/.codex/agents/csharp-typed-engineer.toml +1 -1
  140. package/resources/codex-and-agents-customizations/.codex/agents/discovery-capability-sentinel.toml +51 -0
  141. package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +8 -0
  142. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c1.toml +148 -0
  143. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c2.toml +148 -0
  144. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3-elevated.toml +148 -0
  145. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c3.toml +148 -0
  146. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst-c4.toml +148 -0
  147. package/resources/codex-and-agents-customizations/.codex/agents/legacy-parity-analyst.toml +148 -0
  148. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c1.toml +154 -0
  149. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c2.toml +154 -0
  150. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3-elevated.toml +154 -0
  151. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c3.toml +154 -0
  152. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer-c4.toml +154 -0
  153. package/resources/codex-and-agents-customizations/.codex/agents/migration-coverage-reviewer.toml +154 -0
  154. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c1.toml +1 -1
  155. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c2.toml +1 -1
  156. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3-elevated.toml +1 -1
  157. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c3.toml +1 -1
  158. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer-c4.toml +1 -1
  159. package/resources/codex-and-agents-customizations/.codex/agents/powershell-typed-engineer.toml +1 -1
  160. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c1.toml +1 -1
  161. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c2.toml +1 -1
  162. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3-elevated.toml +1 -1
  163. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c3.toml +1 -1
  164. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer-c4.toml +1 -1
  165. package/resources/codex-and-agents-customizations/.codex/agents/python-typed-engineer.toml +1 -1
  166. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c1.toml +164 -0
  167. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c2.toml +164 -0
  168. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3-elevated.toml +164 -0
  169. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c3.toml +164 -0
  170. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler-c4.toml +164 -0
  171. package/resources/codex-and-agents-customizations/.codex/agents/requirements-reconciler.toml +164 -0
  172. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c1.toml +150 -0
  173. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c2.toml +150 -0
  174. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3-elevated.toml +150 -0
  175. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c3.toml +150 -0
  176. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst-c4.toml +150 -0
  177. package/resources/codex-and-agents-customizations/.codex/agents/runtime-characterization-analyst.toml +150 -0
  178. package/resources/codex-and-agents-customizations/.codex/config.toml +39 -3
  179. package/resources/codex-and-agents-customizations/.codex/hooks/codex-agent-profile-attestation.ps1 +22 -0
  180. package/resources/codex-and-agents-customizations/.codex/hooks/discovery-capability-probe.ps1 +97 -0
  181. package/resources/codex-and-agents-customizations/.codex/hooks/discovery-start-attestation.ps1 +171 -0
  182. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-codex-model-routing.ps1 +4 -1
  183. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-artifact-gate.ps1 +187 -0
  184. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-discovery-planning-gate.ps1 +149 -0
  185. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-file-size-limit.ps1 +282 -0
  186. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +239 -2
  187. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate.ps1 +6 -15
  188. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +54 -15
  189. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +54 -15
  190. package/resources/codex-and-agents-customizations/.codex/hooks/file-size-policy.ps1 +421 -0
  191. package/resources/codex-and-agents-customizations/.codex/hooks/hook-target-worktree.ps1 +369 -0
  192. package/resources/codex-and-agents-customizations/.codex/hooks/record-subagent-routing-attestation.ps1 +8 -0
  193. package/resources/codex-and-agents-customizations/.codex/hooks/validate-codex-subagent-routing.ps1 +22 -1
  194. package/resources/codex-and-agents-customizations/.codex/hooks/validate-discovery-agent-output.ps1 +178 -0
  195. package/resources/codex-and-agents-customizations/.codex/scripts/Resolve-CodexTopology.ps1 +11 -1
  196. package/resources/codex-and-agents-customizations/.codex-variants/csharp-legacy/agents/csharp-typed-engineer.toml +1 -1
  197. package/resources/codex-and-agents-customizations/AGENTS.md +4 -1
  198. package/resources/codex-and-agents-customizations/pack-manifests/core.json +65 -1
  199. package/resources/config/orchestration-routing.json +61 -1
  200. package/resources/customizations/.github/agents/commentary-remediation.agent.md +1 -1
  201. package/resources/customizations/.github/agents/discovery-capability-sentinel.agent.md +34 -0
  202. package/resources/customizations/.github/agents/legacy-parity-analyst.agent.md +122 -0
  203. package/resources/customizations/.github/agents/migration-coverage-reviewer.agent.md +128 -0
  204. package/resources/customizations/.github/agents/python-execution-only-typed.agent.md +1 -1
  205. package/resources/customizations/.github/agents/python-typed-engineer.agent.md +1 -1
  206. package/resources/customizations/.github/agents/requirements-reconciler.agent.md +138 -0
  207. package/resources/customizations/.github/agents/runtime-characterization-analyst.agent.md +124 -0
  208. package/resources/customizations/.github/hooks/discovery-agent-start.ps1 +139 -0
  209. package/resources/customizations/.github/hooks/discovery-agent-stop.ps1 +123 -0
  210. package/resources/customizations/.github/hooks/discovery-capability-probe.ps1 +98 -0
  211. package/resources/customizations/.github/hooks/discovery-planning.ps1 +91 -0
  212. package/resources/customizations/.github/hooks/discovery-pre-tool.ps1 +123 -0
  213. package/resources/customizations/.github/hooks/discovery.json +35 -0
  214. package/resources/customizations/.github/instructions/general-code-change.instructions.md +5 -2
  215. package/resources/customizations/.github/instructions/mermaid.instructions.md +85 -0
  216. package/resources/customizations/.github/instructions/powershell-code-change.instructions.md +1 -1
  217. package/resources/customizations/.github/prompts/execute-hard-lock.prompt.md +105 -0
  218. package/resources/customizations/.github/prompts/remediate-comments.prompt.md +1 -1
  219. package/resources/customizations/.github/skills/adjudicate-unspecified-behavior/SKILL.md +135 -0
  220. package/resources/customizations/.github/skills/characterize-runtime-behavior/SKILL.md +134 -0
  221. package/resources/customizations/.github/skills/discovery-behavior-reconciliation/SKILL.md +46 -0
  222. package/resources/customizations/.github/skills/discovery-coverage-ledger/SKILL.md +50 -0
  223. package/resources/customizations/.github/skills/discovery-parity-matrix/SKILL.md +46 -0
  224. package/resources/customizations/.github/skills/discovery-repo-inventory/SKILL.md +46 -0
  225. package/resources/customizations/.github/skills/discovery-runtime-characterization/SKILL.md +46 -0
  226. package/resources/customizations/.github/skills/discovery-validate-artifacts/SKILL.md +46 -0
  227. package/resources/customizations/.github/skills/discovery-workflow/SKILL.md +62 -0
  228. package/resources/customizations/.github/skills/execution-environment/SKILL.md +25 -10
  229. package/resources/customizations/.github/skills/extract-feature-contract/SKILL.md +133 -0
  230. package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +8 -0
  231. package/resources/customizations/.github/skills/generate-acceptance-scenarios/SKILL.md +132 -0
  232. package/resources/customizations/.github/skills/initialize-discovery-workspace/SKILL.md +131 -0
  233. package/resources/customizations/.github/skills/inventory-legacy-system/SKILL.md +131 -0
  234. package/resources/customizations/.github/skills/reconcile-parity-matrix/SKILL.md +131 -0
  235. package/resources/customizations/.github/skills/review-discovery-coverage/SKILL.md +129 -0
  236. package/resources/customizations/.github/skills/validate-discovery-artifacts/SKILL.md +127 -0
  237. package/resources/lib/codex-routing/CodexDeployment.psm1 +5 -1
  238. package/resources/lib/codex-routing/CodexDiscoveryRouting.psm1 +161 -0
  239. package/resources/lib/codex-routing/CodexTopology.psm1 +25 -2
  240. package/resources/lib/discovery-validation/DiscoveryAuthority.psd1 +90 -0
  241. package/resources/lib/discovery-validation/DiscoveryAuthority.psm1 +493 -0
  242. package/resources/lib/discovery-validation/DiscoveryAuthorization.psm1 +479 -0
  243. package/resources/lib/discovery-validation/DiscoveryCapability.psm1 +468 -0
  244. package/resources/lib/discovery-validation/DiscoveryEncoding.psm1 +156 -0
  245. package/resources/lib/discovery-validation/DiscoveryManifest.psm1 +384 -0
  246. package/resources/lib/discovery-validation/DiscoveryObservation.psm1 +217 -0
  247. package/resources/lib/discovery-validation/DiscoveryPayload.psm1 +276 -0
  248. package/resources/lib/discovery-validation/DiscoveryPlanning.psm1 +336 -0
  249. package/resources/lib/discovery-validation/DiscoveryRootGrant.psm1 +164 -0
  250. package/resources/lib/discovery-validation/DiscoveryStart.psm1 +440 -0
  251. package/resources/lib/discovery-validation/DiscoveryStartRecord.psm1 +296 -0
  252. package/resources/lib/discovery-validation/DiscoveryStop.psm1 +336 -0
  253. package/resources/lib/discovery-validation/DiscoveryToolRouting.psm1 +228 -0
  254. package/resources/powershell/PoshQC/PoshQC.Parallel.psm1 +452 -0
  255. package/resources/powershell/PoshQC/PoshQC.Shard.psm1 +106 -8
  256. package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +12 -0
  257. package/resources/powershell/PoshQC/PoshQC.psd1 +6 -1
  258. package/resources/powershell/PoshQC/PoshQC.psm1 +7 -1
  259. package/resources/powershell/PoshQC/README.md +20 -1
  260. package/resources/templates/policy_audit/code-review.yyyy-MM-ddTHH-mm.md +4 -4
  261. 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
- $weights = [long[]] @(Get-PoshQCShardTestFileWeight -TestFile $TestFile)
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
- Returns the shard weight of each enumerated test file (issue #953, CR-19).
273
+ Parses and validates the text of config/poshqc-shard-weights.json (issue #1048).
266
274
  .DESCRIPTION
267
- A FileInfo item weighs the UTF-8 byte count of its text after every CRLF pair is replaced by LF, so a checkout
268
- with CRLF line endings computes the same weights, and therefore the same shard assignment, as a checkout with
269
- LF line endings. Another object weighs its Length property when it has one; a plain path string, or an object
270
- without a Length property, weighs 1. Returns one weight per item, in input order.
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, and assigned heaviest first to the shard with the least assigned weight (ties: fewer files, then the lower shard index; equal sizes are taken in ordinal path order), so runners whose checkouts differ only in line-ending conversion compute the same assignment.
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
- | **Under 500 lines** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Report line counts for all files. Note any exceptions and justifications.] |
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 under 500 lines** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Report file line counts. Confirm all under limit.] |
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
- | **Under 500 lines** | [✅/❌/N/A] [PASS/FAIL/N/A] | [Report file line counts.] |
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 | [✅/❌] Maintainable |
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
  ---