@danmoisan/drm-copilot-mcp 1.1.17 → 1.1.19

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 (225) hide show
  1. package/out/mcp-server.js +1405 -684
  2. package/package.json +6 -4
  3. package/resources/claude-customizations/.claude/agents/atomic-executor.md +11 -0
  4. package/resources/claude-customizations/.claude/agents/atomic-planner.md +10 -0
  5. package/resources/claude-customizations/.claude/agents/epic-orchestrator.md +12 -4
  6. package/resources/claude-customizations/.claude/agents/epic-planner.md +5 -4
  7. package/resources/claude-customizations/.claude/agents/feature-review.md +16 -5
  8. package/resources/claude-customizations/.claude/agents/orchestrator.md +21 -7
  9. package/resources/claude-customizations/.claude/agents/parallel-orchestrator.md +37 -13
  10. package/resources/claude-customizations/.claude/agents/parallel-planner.md +9 -6
  11. package/resources/claude-customizations/.claude/agents/pr-author.md +15 -2
  12. package/resources/claude-customizations/.claude/agents/prd-feature.md +1 -1
  13. package/resources/claude-customizations/.claude/hooks/check-powershell-test-purity.ps1 +7 -1
  14. package/resources/claude-customizations/.claude/hooks/check-python-test-purity.ps1 +7 -1
  15. package/resources/claude-customizations/.claude/hooks/enforce-checkpoint-monotonic.ps1 +7 -1
  16. package/resources/claude-customizations/.claude/hooks/enforce-completion-consistency.ps1 +111 -46
  17. package/resources/claude-customizations/.claude/hooks/enforce-completion-helpers.ps1 +105 -0
  18. package/resources/claude-customizations/.claude/hooks/enforce-discovery-artifact-gate.ps1 +8 -1
  19. package/resources/claude-customizations/.claude/hooks/enforce-epic-invocation-origin.ps1 +7 -1
  20. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate-resolution.ps1 +116 -59
  21. package/resources/claude-customizations/.claude/hooks/enforce-epic-merge-gate.ps1 +55 -23
  22. package/resources/claude-customizations/.claude/hooks/enforce-epic-wave-barrier.ps1 +74 -75
  23. package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate-resolution.ps1 +127 -35
  24. package/resources/claude-customizations/.claude/hooks/enforce-epic-worktree-removal-gate.ps1 +61 -57
  25. package/resources/claude-customizations/.claude/hooks/enforce-evidence-locations.ps1 +7 -1
  26. package/resources/claude-customizations/.claude/hooks/enforce-feature-folder-order.ps1 +129 -39
  27. package/resources/claude-customizations/.claude/hooks/enforce-mermaid-validation.ps1 +7 -1
  28. package/resources/claude-customizations/.claude/hooks/enforce-model-routing-receipt.ps1 +9 -3
  29. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +39 -51
  30. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-helpers.ps1 +31 -58
  31. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-modes.ps1 +63 -47
  32. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate-targets.ps1 +433 -0
  33. package/resources/claude-customizations/.claude/hooks/enforce-orchestration-preimplementation-gate.ps1 +17 -12
  34. package/resources/claude-customizations/.claude/hooks/enforce-parallel-abandon-gate.ps1 +9 -3
  35. package/resources/claude-customizations/.claude/hooks/enforce-parallel-cohort-barrier.ps1 +65 -50
  36. package/resources/claude-customizations/.claude/hooks/enforce-parallel-drift-gate.ps1 +49 -42
  37. package/resources/claude-customizations/.claude/hooks/enforce-parallel-worktree-removal-gate.ps1 +54 -72
  38. package/resources/claude-customizations/.claude/hooks/enforce-powershell-batch-budget.ps1 +8 -2
  39. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-command-allowlist.ps1 +279 -0
  40. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill-helpers.ps1 +129 -75
  41. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.artifact-root.ps1 +233 -0
  42. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.docs-only.ps1 +224 -0
  43. package/resources/claude-customizations/.claude/hooks/enforce-pr-author-skill.ps1 +69 -24
  44. package/resources/claude-customizations/.claude/hooks/enforce-prd-feature-before-planner-helpers.ps1 +29 -18
  45. package/resources/claude-customizations/.claude/hooks/enforce-prd-feature-before-planner.ps1 +10 -4
  46. package/resources/claude-customizations/.claude/hooks/enforce-promotion-mcp-only.ps1 +14 -5
  47. package/resources/claude-customizations/.claude/hooks/enforce-python-batch-budget.ps1 +8 -2
  48. package/resources/claude-customizations/.claude/hooks/feature-folder-resolution.ps1 +373 -0
  49. package/resources/claude-customizations/.claude/hooks/feature-review-coverage-thresholds.ps1 +85 -0
  50. package/resources/claude-customizations/.claude/hooks/hook-command-heredoc.ps1 +119 -0
  51. package/resources/claude-customizations/.claude/hooks/hook-command-invocation-operands.ps1 +198 -0
  52. package/resources/claude-customizations/.claude/hooks/hook-command-invocation.ps1 +254 -255
  53. package/resources/claude-customizations/.claude/hooks/hook-command-payload-powershell.ps1 +201 -0
  54. package/resources/claude-customizations/.claude/hooks/hook-command-payload.ps1 +484 -0
  55. package/resources/claude-customizations/.claude/hooks/hook-command-scanner.ps1 +27 -110
  56. package/resources/claude-customizations/.claude/hooks/hook-dependency-guard.ps1 +114 -0
  57. package/resources/claude-customizations/.claude/hooks/hook-docs-only-diff.ps1 +493 -0
  58. package/resources/claude-customizations/.claude/hooks/subagentstop-envelope.ps1 +192 -0
  59. package/resources/claude-customizations/.claude/hooks/validate-bash.ps1 +9 -3
  60. package/resources/claude-customizations/.claude/hooks/validate-discovery-artifact-gate.ps1 +40 -42
  61. package/resources/claude-customizations/.claude/hooks/validate-executor-output.ps1 +66 -38
  62. package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-metrics.ps1 +180 -0
  63. package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage-rules.ps1 +195 -0
  64. package/resources/claude-customizations/.claude/hooks/validate-feature-review-coverage.ps1 +141 -395
  65. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-resolution.ps1 +311 -0
  66. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output-routing.ps1 +170 -0
  67. package/resources/claude-customizations/.claude/hooks/validate-orchestrator-output.ps1 +115 -190
  68. package/resources/claude-customizations/.claude/hooks/validate-planner-output.ps1 +64 -32
  69. package/resources/claude-customizations/.claude/hooks/validate-pr-author-output.ps1 +39 -44
  70. package/resources/claude-customizations/.claude/hooks/validate-prd-feature-output.ps1 +43 -14
  71. package/resources/claude-customizations/.claude/hooks/validate-required-artifact-output.ps1 +66 -36
  72. package/resources/claude-customizations/.claude/hooks/validate-task-researcher-output.ps1 +31 -34
  73. package/resources/claude-customizations/.claude/lib/bash/mutate-parallel-run.sh +191 -0
  74. package/resources/claude-customizations/.claude/lib/bash/parallel-cohorts.sh +13 -3
  75. package/resources/claude-customizations/.claude/lib/bash/parallel-lane-assertion.sh +4 -2
  76. package/resources/claude-customizations/.claude/lib/bash/parallel-mutation-cli.sh +152 -0
  77. package/resources/claude-customizations/.claude/lib/bash/parallel-mutation-ops.sh +193 -0
  78. package/resources/claude-customizations/.claude/lib/bash/parallel-mutation.sh +322 -0
  79. package/resources/claude-customizations/.claude/lib/bash/remove-parallel-item.sh +146 -0
  80. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusExtraction.psm1 +23 -33
  81. package/resources/claude-customizations/.claude/lib/blast-radius/BlastRadiusTokenShape.psm1 +86 -6
  82. package/resources/claude-customizations/.claude/lib/ci-gate/Invoke-CiGateParser.ps1 +91 -19
  83. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorState.psm1 +6 -13
  84. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateEpicWaveBarrier.psm1 +346 -0
  85. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateIssueAdoption.psm1 +396 -0
  86. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateReceipts.psm1 +22 -15
  87. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateRemediationAccounting.psm1 +337 -0
  88. package/resources/claude-customizations/.claude/lib/orchestrator-state/OrchestratorStateRoutingContract.psm1 +9 -1
  89. package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeItemResolution.psm1 +79 -2
  90. package/resources/claude-customizations/.claude/lib/worktree-resolution/WorktreeRunResolution.psm1 +3 -3
  91. package/resources/claude-customizations/.claude/rules/architecture-boundaries.md +5 -5
  92. package/resources/claude-customizations/.claude/rules/csharp.md +2 -2
  93. package/resources/claude-customizations/.claude/rules/general-code-change.md +1 -1
  94. package/resources/claude-customizations/.claude/rules/general-unit-test.md +3 -2
  95. package/resources/claude-customizations/.claude/rules/orchestrator-state.md +153 -4
  96. package/resources/claude-customizations/.claude/rules/parallel-orchestration.md +50 -5
  97. package/resources/claude-customizations/.claude/rules/plan-acceptance-gates.md +47 -8
  98. package/resources/claude-customizations/.claude/rules/quality-tiers.md +11 -7
  99. package/resources/claude-customizations/.claude/rules/shell.md +10 -8
  100. package/resources/claude-customizations/.claude/rules/typescript.md +1 -1
  101. package/resources/claude-customizations/.claude/settings.json +3 -4
  102. package/resources/claude-customizations/.claude/skills/acceptance-criteria-tracking/SKILL.md +9 -1
  103. package/resources/claude-customizations/.claude/skills/atomic-plan-contract/SKILL.md +7 -1
  104. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/SKILL.md +11 -3
  105. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup-worktrees.sh +11 -2
  106. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_detached_lib.sh +1 -1
  107. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_enumerate_lib.sh +171 -5
  108. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_preserve_lib.sh +1 -1
  109. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_report_records_lib.sh +6 -43
  110. package/resources/claude-customizations/.claude/skills/cleanup-merged-worktrees/scripts/cleanup_worktrees_scan_helper.sh +6 -15
  111. package/resources/claude-customizations/.claude/skills/epic-orchestrate/SKILL.md +45 -11
  112. package/resources/claude-customizations/.claude/skills/epic-plan/SKILL.md +1 -1
  113. package/resources/claude-customizations/.claude/skills/evidence-and-timestamp-conventions/SKILL.md +13 -0
  114. package/resources/claude-customizations/.claude/skills/feature-promotion-lifecycle/SKILL.md +10 -0
  115. package/resources/claude-customizations/.claude/skills/feature-review-workflow/SKILL.md +7 -4
  116. package/resources/claude-customizations/.claude/skills/orchestrate/SKILL.md +42 -16
  117. package/resources/claude-customizations/.claude/skills/parallel-add/SKILL.md +52 -14
  118. package/resources/claude-customizations/.claude/skills/parallel-close/SKILL.md +22 -9
  119. package/resources/claude-customizations/.claude/skills/parallel-orchestrate/SKILL.md +97 -19
  120. package/resources/claude-customizations/.claude/skills/parallel-plan/SKILL.md +63 -7
  121. package/resources/claude-customizations/.claude/skills/parallel-remove/SKILL.md +35 -12
  122. package/resources/claude-customizations/.claude/skills/pr-author/SKILL.md +3 -1
  123. package/resources/claude-customizations/.claude/skills/quota-throttling/SKILL.md +1 -1
  124. package/resources/claude-customizations/.claude/skills/remediation-handoff-atomic-planner/SKILL.md +7 -3
  125. package/resources/claude-customizations/pack-manifests/core.json +25 -0
  126. package/resources/codex-and-agents-customizations/.agents/skills/acceptance-criteria-tracking/SKILL.md +9 -1
  127. package/resources/codex-and-agents-customizations/.agents/skills/architecture-boundaries/SKILL.md +5 -5
  128. package/resources/codex-and-agents-customizations/.agents/skills/atomic-executor/SKILL.md +11 -0
  129. package/resources/codex-and-agents-customizations/.agents/skills/atomic-plan-contract/SKILL.md +4 -0
  130. package/resources/codex-and-agents-customizations/.agents/skills/atomic-planner/SKILL.md +10 -0
  131. package/resources/codex-and-agents-customizations/.agents/skills/csharp/SKILL.md +2 -2
  132. package/resources/codex-and-agents-customizations/.agents/skills/csharp-qa-gate/SKILL.md +2 -2
  133. package/resources/codex-and-agents-customizations/.agents/skills/epic-orchestrate/SKILL.md +13 -3
  134. package/resources/codex-and-agents-customizations/.agents/skills/epic-plan/SKILL.md +17 -1
  135. package/resources/codex-and-agents-customizations/.agents/skills/epic-run/SKILL.md +2 -1
  136. package/resources/codex-and-agents-customizations/.agents/skills/evidence-and-timestamp-conventions/SKILL.md +13 -0
  137. package/resources/codex-and-agents-customizations/.agents/skills/feature-promotion-lifecycle/SKILL.md +1 -1
  138. package/resources/codex-and-agents-customizations/.agents/skills/feature-review/SKILL.md +30 -6
  139. package/resources/codex-and-agents-customizations/.agents/skills/feature-review-workflow/SKILL.md +16 -6
  140. package/resources/codex-and-agents-customizations/.agents/skills/general-code-change/SKILL.md +1 -1
  141. package/resources/codex-and-agents-customizations/.agents/skills/general-unit-test/SKILL.md +3 -2
  142. package/resources/codex-and-agents-customizations/.agents/skills/orchestrate/SKILL.md +43 -11
  143. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-state/SKILL.md +41 -2
  144. package/resources/codex-and-agents-customizations/.agents/skills/orchestrator-workflow/SKILL.md +19 -4
  145. package/resources/codex-and-agents-customizations/.agents/skills/quality-tiers/SKILL.md +11 -7
  146. package/resources/codex-and-agents-customizations/.agents/skills/remediation-handoff-atomic-planner/SKILL.md +2 -0
  147. package/resources/codex-and-agents-customizations/.agents/skills/translate-claude-to-codex/SKILL.md +1 -1
  148. package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp/SKILL.md +2 -2
  149. package/resources/codex-and-agents-customizations/.agents-variants/csharp-legacy/skills/csharp-qa-gate/SKILL.md +2 -2
  150. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c1.toml +11 -0
  151. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c2.toml +11 -0
  152. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3-elevated.toml +11 -0
  153. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c3.toml +11 -0
  154. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor-c4.toml +11 -0
  155. package/resources/codex-and-agents-customizations/.codex/agents/atomic-executor.toml +11 -0
  156. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c1.toml +10 -0
  157. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c2.toml +10 -0
  158. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3-elevated.toml +10 -0
  159. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c3.toml +10 -0
  160. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner-c4.toml +10 -0
  161. package/resources/codex-and-agents-customizations/.codex/agents/atomic-planner.toml +10 -0
  162. package/resources/codex-and-agents-customizations/.codex/agents/epic-orchestrator.toml +2 -1
  163. package/resources/codex-and-agents-customizations/.codex/agents/feature-review.toml +6 -6
  164. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c1.toml +1 -0
  165. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c2.toml +1 -0
  166. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c3-elevated.toml +1 -0
  167. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c3.toml +1 -0
  168. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer-c4.toml +1 -0
  169. package/resources/codex-and-agents-customizations/.codex/agents/feature-reviewer.toml +1 -0
  170. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c1.toml +3 -3
  171. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c2.toml +3 -3
  172. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c3-elevated.toml +3 -3
  173. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c3.toml +3 -3
  174. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator-c4.toml +3 -3
  175. package/resources/codex-and-agents-customizations/.codex/agents/orchestrator.toml +3 -3
  176. package/resources/codex-and-agents-customizations/.codex/codex-web-setup.sh +318 -273
  177. package/resources/codex-and-agents-customizations/.codex/config.toml +1 -1
  178. package/resources/codex-and-agents-customizations/.codex/hooks/check-powershell-test-purity.ps1 +7 -1
  179. package/resources/codex-and-agents-customizations/.codex/hooks/check-python-test-purity.ps1 +7 -1
  180. package/resources/codex-and-agents-customizations/.codex/hooks/codex-epic-child-launch-attestation.ps1 +1 -1
  181. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-checkpoint-monotonic.ps1 +7 -1
  182. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-codex-model-routing.ps1 +8 -2
  183. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-completion-consistency.ps1 +97 -44
  184. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-completion-helpers.ps1 +105 -0
  185. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-child-worktree-binding.ps1 +7 -1
  186. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-merge-gate.ps1 +37 -5
  187. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-planning-only.ps1 +6 -0
  188. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-root-invocation.ps1 +7 -1
  189. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-wave-barrier.ps1 +7 -1
  190. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-epic-worktree-removal-gate.ps1 +54 -41
  191. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-evidence-locations.ps1 +7 -1
  192. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-epic-scope.ps1 +35 -14
  193. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-helpers.ps1 +31 -58
  194. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-modes.ps1 +63 -47
  195. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate-targets.ps1 +433 -0
  196. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-orchestration-preimplementation-gate.ps1 +24 -11
  197. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-powershell-batch-budget.ps1 +8 -2
  198. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-promotion-mcp-only.ps1 +13 -4
  199. package/resources/codex-and-agents-customizations/.codex/hooks/enforce-python-batch-budget.ps1 +8 -2
  200. package/resources/codex-and-agents-customizations/.codex/hooks/feature-folder-resolution.ps1 +373 -0
  201. package/resources/codex-and-agents-customizations/.codex/hooks/feature-review-coverage-thresholds.ps1 +85 -0
  202. package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-heredoc.ps1 +119 -0
  203. package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-invocation-operands.ps1 +198 -0
  204. package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-invocation.ps1 +254 -255
  205. package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-payload-powershell.ps1 +201 -0
  206. package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-payload.ps1 +484 -0
  207. package/resources/codex-and-agents-customizations/.codex/hooks/hook-command-scanner.ps1 +27 -110
  208. package/resources/codex-and-agents-customizations/.codex/hooks/hook-dependency-guard.ps1 +114 -0
  209. package/resources/codex-and-agents-customizations/.codex/hooks/hook-docs-only-diff.ps1 +493 -0
  210. package/resources/codex-and-agents-customizations/.codex/hooks/validate-bash.ps1 +8 -2
  211. package/resources/codex-and-agents-customizations/.codex/hooks/validate-codex-subagent-routing.ps1 +7 -1
  212. package/resources/codex-and-agents-customizations/.codex/hooks/validate-feature-review-coverage.ps1 +24 -8
  213. package/resources/codex-and-agents-customizations/pack-manifests/core.json +9 -0
  214. package/resources/customizations/.github/agents/csharp-typed-engineer.agent.md +2 -2
  215. package/resources/customizations/.github/instructions/csharp-code-change.instructions.md +4 -4
  216. package/resources/customizations/.github/instructions/csharp-unit-test.instructions.md +2 -2
  217. package/resources/customizations/.github/skills/acceptance-criteria-tracking/SKILL.md +9 -1
  218. package/resources/customizations/.github/skills/atomic-plan-contract/SKILL.md +4 -0
  219. package/resources/customizations/.github/skills/evidence-and-timestamp-conventions/SKILL.md +13 -0
  220. package/resources/customizations/.github/skills/feature-review-workflow/SKILL.md +1 -1
  221. package/resources/powershell/PoshQC/PoshQC.Coverage.psm1 +314 -0
  222. package/resources/powershell/PoshQC/PoshQC.Testing.psm1 +25 -28
  223. package/resources/powershell/PoshQC/PoshQC.psm1 +1 -0
  224. package/resources/powershell/PoshQC/README.md +8 -2
  225. package/resources/powershell/PoshQC/settings/pester.runsettings.psd1 +2 -315
@@ -0,0 +1,396 @@
1
+ <#
2
+ .SYNOPSIS
3
+ Issue-adoption record validation and receipt waivers (inventory row C6.15).
4
+
5
+ .DESCRIPTION
6
+ Destination-runtime PowerShell port of `resolve_issue_adoption` in
7
+ `scripts/dev_tools/_orchestrator_state_issue_adoption.py`. The optional
8
+ checkpoint object `issue_adoption` records that the orchestration adopted a
9
+ GitHub issue that existed before orchestration started. A valid record
10
+ waives the successful-receipt requirement for `potential_to_issue` and,
11
+ optionally, for the checkpoint's promotion-entry tool.
12
+
13
+ Invariants:
14
+ - When the `issue_adoption` member is absent, no error is produced and no
15
+ tool is waived, so existing checkpoints validate exactly as before.
16
+ - Errors accumulate in the fixed rule order of the feature specification.
17
+ - Fail-closed: WaivedTools is empty whenever Errors is non-empty.
18
+ - Every string comparison is ordinal and case-sensitive.
19
+ - Messages interpolate only non-blank `waived_tools` entries and the route id.
20
+
21
+ Every function is pure: it reads no file, starts no process, and never mutates
22
+ its input.
23
+ CONVENTION: this module fails fast at module scope and imports its siblings with -ErrorAction Stop.
24
+ #>
25
+
26
+ Set-StrictMode -Version Latest
27
+ $ErrorActionPreference = 'Stop'
28
+
29
+ # Import the shared checkpoint-value primitives, resolved relative to this
30
+ # module's directory so the import travels with the pushed-down pack.
31
+ Import-Module (Join-Path -Path $PSScriptRoot -ChildPath 'OrchestratorStateCheckpointValue.psm1') -Force -ErrorAction Stop
32
+
33
+ $script:ISSUE_ADOPTION_KEY = 'issue_adoption'
34
+ $script:POTENTIAL_TO_ISSUE_TOOL = 'potential_to_issue'
35
+ $script:FEATURE_PROMOTION_ENTRY_TOOL = 'new_potential_entry'
36
+ $script:BUG_PROMOTION_ENTRY_TOOL = 'new_potential_bug_entry'
37
+ $script:ORIGIN_VALUES = [string[]]@('transferred', 'filed_before_orchestration', 'epic_decomposition')
38
+ $script:VERIFIED_VIA_VALUES = [string[]]@('gh_issue_view', 'gh_api_get', 'github_mcp_issue_read')
39
+
40
+ # The closed set of tools an adoption record may waive: the issue-creation tool
41
+ # and the two promotion-type-specific promotion-entry tools.
42
+ $script:WAIVABLE_TOOLS = [string[]]@($script:POTENTIAL_TO_ISSUE_TOOL, $script:FEATURE_PROMOTION_ENTRY_TOOL, $script:BUG_PROMOTION_ENTRY_TOOL)
43
+ $script:PROMOTION_ENTRY_TOOLS = [string[]]@($script:FEATURE_PROMOTION_ENTRY_TOOL, $script:BUG_PROMOTION_ENTRY_TOOL)
44
+ $script:POTENTIAL_RECORD_PREFIX = 'docs/features/potential/'
45
+ $script:POTENTIAL_RECORD_SUFFIX = '.md'
46
+ # Origins whose promotion-entry waiver may omit the potential_record key (rule 9).
47
+ $script:RECORD_OPTIONAL_ORIGINS = [string[]]@('transferred', 'filed_before_orchestration')
48
+ $script:ISSUE_NUM_PATTERN = '\A[1-9][0-9]*\z'
49
+
50
+ $script:ERROR_NOT_OBJECT = 'Checkpoint issue_adoption must be an object when present.'
51
+ $script:ERROR_ISSUE_NUM_FORMAT = 'Checkpoint issue_adoption.issue_num must be a string of decimal digits without a leading zero.'
52
+ $script:ERROR_ISSUE_NUM_MISMATCH = 'Checkpoint issue_adoption.issue_num must equal the checkpoint issue-num.'
53
+ $script:ERROR_ISSUE_URL = 'Checkpoint issue_adoption.issue_url must end with /issues/ followed by issue_num.'
54
+ $script:ERROR_ORIGIN = 'Checkpoint issue_adoption.origin must be one of transferred, filed_before_orchestration, epic_decomposition.'
55
+ $script:ERROR_VERIFIED_VIA = 'Checkpoint issue_adoption.verified_via must be one of gh_issue_view, gh_api_get, github_mcp_issue_read.'
56
+ $script:ERROR_VERIFIED_AT = 'Checkpoint issue_adoption.verified_at must be present.'
57
+ $script:ERROR_EVIDENCE = 'Checkpoint issue_adoption.evidence must be a non-empty string.'
58
+ $script:ERROR_WAIVED_TOOLS_SHAPE = 'Checkpoint issue_adoption.waived_tools must be a non-empty list of tool names.'
59
+ $script:ERROR_WAIVED_TOOLS_INCLUDE = 'Checkpoint issue_adoption.waived_tools must include potential_to_issue.'
60
+
61
+
62
+ function Test-AdoptionNonBlankString {
63
+ <#
64
+ .SYNOPSIS
65
+ Report whether a value is a string with non-whitespace content.
66
+ .PARAMETER Value
67
+ The deserialized JSON value to inspect. May be $null.
68
+ .OUTPUTS
69
+ System.Boolean
70
+ #>
71
+ [CmdletBinding()]
72
+ [OutputType([bool])]
73
+ param(
74
+ [Parameter(Mandatory = $true)]
75
+ [AllowNull()]
76
+ [object] $Value
77
+ )
78
+
79
+ return (($Value -is [string]) -and -not [string]::IsNullOrWhiteSpace([string]$Value))
80
+ }
81
+
82
+ function Get-AdoptionIssueIdentityError {
83
+ <#
84
+ .SYNOPSIS
85
+ Validate issue_num and issue_url (rules 2 and 3).
86
+ .PARAMETER Adoption
87
+ The issue_adoption object.
88
+ .PARAMETER State
89
+ The parsed checkpoint object, read for its hyphenated issue-num key.
90
+ .OUTPUTS
91
+ System.String[] - zero or more error strings.
92
+ #>
93
+ [CmdletBinding()]
94
+ [OutputType([string[]])]
95
+ param(
96
+ [Parameter(Mandatory = $true)]
97
+ [psobject] $Adoption,
98
+
99
+ [Parameter(Mandatory = $true)]
100
+ [psobject] $State
101
+ )
102
+
103
+ $errors = [System.Collections.Generic.List[string]]::new()
104
+ $rawIssueNum = (Get-CheckpointObjectMember -Owner $Adoption -Name 'issue_num').Value
105
+ $issueNum = $null
106
+ if (($rawIssueNum -is [string]) -and ([string]$rawIssueNum -cmatch $script:ISSUE_NUM_PATTERN)) {
107
+ $issueNum = [string]$rawIssueNum
108
+ }
109
+
110
+ if ($null -ceq $issueNum) {
111
+ $errors.Add($script:ERROR_ISSUE_NUM_FORMAT)
112
+ }
113
+ else {
114
+ # The equality check applies only when the checkpoint records its own
115
+ # issue number as a string; other shapes are validated elsewhere.
116
+ $checkpointIssueNum = (Get-CheckpointObjectMember -Owner $State -Name 'issue-num').Value
117
+ if (($checkpointIssueNum -is [string]) -and -not [string]::Equals([string]$checkpointIssueNum, $issueNum, [System.StringComparison]::Ordinal)) {
118
+ $errors.Add($script:ERROR_ISSUE_NUM_MISMATCH)
119
+ }
120
+ }
121
+
122
+ $issueUrl = (Get-CheckpointObjectMember -Owner $Adoption -Name 'issue_url').Value
123
+ $urlIsValid = ($null -cne $issueNum) -and ($issueUrl -is [string]) -and ([string]$issueUrl).EndsWith("/issues/$issueNum", [System.StringComparison]::Ordinal)
124
+ if (-not $urlIsValid) {
125
+ $errors.Add($script:ERROR_ISSUE_URL)
126
+ }
127
+ return $errors.ToArray()
128
+ }
129
+
130
+ function Get-AdoptionProvenanceError {
131
+ <#
132
+ .SYNOPSIS
133
+ Validate origin, verified_via, verified_at, and evidence (rules 4 to 7).
134
+ .PARAMETER Adoption
135
+ The issue_adoption object.
136
+ .OUTPUTS
137
+ System.String[] - zero or more error strings.
138
+ #>
139
+ [CmdletBinding()]
140
+ [OutputType([string[]])]
141
+ param(
142
+ [Parameter(Mandatory = $true)]
143
+ [psobject] $Adoption
144
+ )
145
+
146
+ $errors = [System.Collections.Generic.List[string]]::new()
147
+
148
+ $origin = (Get-CheckpointObjectMember -Owner $Adoption -Name 'origin').Value
149
+ if (-not (($origin -is [string]) -and ($script:ORIGIN_VALUES -ccontains [string]$origin))) {
150
+ $errors.Add($script:ERROR_ORIGIN)
151
+ }
152
+
153
+ $verifiedVia = (Get-CheckpointObjectMember -Owner $Adoption -Name 'verified_via').Value
154
+ if (-not (($verifiedVia -is [string]) -and ($script:VERIFIED_VIA_VALUES -ccontains [string]$verifiedVia))) {
155
+ $errors.Add($script:ERROR_VERIFIED_VIA)
156
+ }
157
+
158
+ # Presence-only: any non-null value other than a blank string passes,
159
+ # including a System.DateTime produced by ConvertFrom-Json.
160
+ $verifiedAt = (Get-CheckpointObjectMember -Owner $Adoption -Name 'verified_at').Value
161
+ if (($null -ceq $verifiedAt) -or (($verifiedAt -is [string]) -and [string]::IsNullOrWhiteSpace([string]$verifiedAt))) {
162
+ $errors.Add($script:ERROR_VERIFIED_AT)
163
+ }
164
+
165
+ if (-not (Test-AdoptionNonBlankString -Value (Get-CheckpointObjectMember -Owner $Adoption -Name 'evidence').Value)) {
166
+ $errors.Add($script:ERROR_EVIDENCE)
167
+ }
168
+ return $errors.ToArray()
169
+ }
170
+
171
+ function Get-AdoptionWaivedToolList {
172
+ <#
173
+ .SYNOPSIS
174
+ Return the waived tools when they form a non-empty list of non-blank strings.
175
+ .PARAMETER Value
176
+ The deserialized waived_tools value. May be $null.
177
+ .OUTPUTS
178
+ System.Collections.Hashtable with keys Ok (bool) and Value (string[]).
179
+ #>
180
+ [CmdletBinding()]
181
+ [OutputType([hashtable])]
182
+ param(
183
+ [Parameter(Mandatory = $true)]
184
+ [AllowNull()]
185
+ [object] $Value
186
+ )
187
+
188
+ if (-not (Test-CheckpointListValue -Value $Value)) {
189
+ return @{ Ok = $false; Value = [string[]]@() }
190
+ }
191
+ $items = @($Value)
192
+ if ($items.Count -ceq 0) {
193
+ return @{ Ok = $false; Value = [string[]]@() }
194
+ }
195
+ foreach ($item in $items) {
196
+ if (-not (Test-AdoptionNonBlankString -Value $item)) {
197
+ return @{ Ok = $false; Value = [string[]]@() }
198
+ }
199
+ }
200
+ return @{ Ok = $true; Value = [string[]]$items }
201
+ }
202
+
203
+ function Get-AdoptionWaivedToolError {
204
+ <#
205
+ .SYNOPSIS
206
+ Validate each waived tool entry and the mandatory issue-creation waiver (rule 8).
207
+ .PARAMETER WaivedTool
208
+ The well-formed waived tool list, in checkpoint order.
209
+ .PARAMETER RouteId
210
+ The selected route id, interpolated into route errors.
211
+ .PARAMETER RequiredMcpTool
212
+ The route's required MCP tools after promotion-type resolution.
213
+ .PARAMETER SuccessfulTool
214
+ Tools that hold a successful MCP receipt.
215
+ .OUTPUTS
216
+ System.String[] - zero or more error strings.
217
+ #>
218
+ [CmdletBinding()]
219
+ [OutputType([string[]])]
220
+ param(
221
+ [Parameter(Mandatory = $true)]
222
+ [string[]] $WaivedTool,
223
+
224
+ [Parameter(Mandatory = $true)]
225
+ [string] $RouteId,
226
+
227
+ [Parameter(Mandatory = $true)]
228
+ [AllowEmptyCollection()]
229
+ [string[]] $RequiredMcpTool,
230
+
231
+ [Parameter(Mandatory = $true)]
232
+ [AllowEmptyCollection()]
233
+ [string[]] $SuccessfulTool
234
+ )
235
+
236
+ $errors = [System.Collections.Generic.List[string]]::new()
237
+ $seen = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::Ordinal)
238
+ foreach ($tool in $WaivedTool) {
239
+ # Each entry receives only the first rule it violates, in rule order.
240
+ if ($seen.Contains($tool)) {
241
+ $errors.Add("Checkpoint issue_adoption.waived_tools lists a tool more than once: $tool.")
242
+ }
243
+ elseif ($script:WAIVABLE_TOOLS -cnotcontains $tool) {
244
+ $errors.Add("Checkpoint issue_adoption.waived_tools names a tool that cannot be waived: $tool.")
245
+ }
246
+ elseif ($RequiredMcpTool -cnotcontains $tool) {
247
+ $errors.Add("Checkpoint issue_adoption.waived_tools names a tool that is not required by route ${RouteId}: $tool.")
248
+ }
249
+ elseif ($SuccessfulTool -ccontains $tool) {
250
+ $errors.Add("Checkpoint issue_adoption.waived_tools names a tool that has a successful MCP receipt: $tool.")
251
+ }
252
+ [void]$seen.Add($tool)
253
+ }
254
+
255
+ if (-not $seen.Contains($script:POTENTIAL_TO_ISSUE_TOOL)) {
256
+ $errors.Add($script:ERROR_WAIVED_TOOLS_INCLUDE)
257
+ }
258
+ return $errors.ToArray()
259
+ }
260
+
261
+ function Get-AdoptionPotentialRecordError {
262
+ <#
263
+ .SYNOPSIS
264
+ Require a potential record when a promotion-entry tool is waived (rule 9).
265
+ .PARAMETER WaivedTool
266
+ The well-formed waived tool list, in checkpoint order.
267
+ .PARAMETER PotentialRecord
268
+ The deserialized potential_record value. May be $null.
269
+ .PARAMETER Origin
270
+ The deserialized origin value. May be $null. When the potential_record
271
+ key is absent and the origin is transferred or filed_before_orchestration,
272
+ nothing is reported.
273
+ .PARAMETER RecordPresent
274
+ Whether the potential_record key is present. A present record, including
275
+ $null, is always validated.
276
+ .OUTPUTS
277
+ System.String[] - zero or more error strings.
278
+ #>
279
+ [CmdletBinding()]
280
+ [OutputType([string[]])]
281
+ param(
282
+ [Parameter(Mandatory = $true)]
283
+ [string[]] $WaivedTool,
284
+
285
+ [Parameter(Mandatory = $true)]
286
+ [AllowNull()]
287
+ [object] $PotentialRecord,
288
+
289
+ [Parameter()]
290
+ [AllowNull()]
291
+ [object] $Origin,
292
+
293
+ [Parameter(Mandatory = $true)]
294
+ [bool] $RecordPresent
295
+ )
296
+
297
+ if (-not $RecordPresent -and ($Origin -is [string]) -and ($script:RECORD_OPTIONAL_ORIGINS -ccontains [string]$Origin)) {
298
+ return [string[]]@()
299
+ }
300
+
301
+ $recordIsValid = $false
302
+ if ($PotentialRecord -is [string]) {
303
+ $record = [string]$PotentialRecord
304
+ $recordIsValid = $record.StartsWith($script:POTENTIAL_RECORD_PREFIX, [System.StringComparison]::Ordinal) -and $record.EndsWith($script:POTENTIAL_RECORD_SUFFIX, [System.StringComparison]::Ordinal)
305
+ }
306
+ if ($recordIsValid) { return [string[]]@() }
307
+
308
+ $errors = [System.Collections.Generic.List[string]]::new()
309
+ $reported = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::Ordinal)
310
+ foreach ($tool in $WaivedTool) {
311
+ if (($script:PROMOTION_ENTRY_TOOLS -ccontains $tool) -and -not $reported.Contains($tool)) {
312
+ $errors.Add("Checkpoint issue_adoption.potential_record must name a markdown file under docs/features/potential/ when waiving $tool.")
313
+ [void]$reported.Add($tool)
314
+ }
315
+ }
316
+ return $errors.ToArray()
317
+ }
318
+
319
+ function Get-OrchestratorStateIssueAdoptionResult {
320
+ <#
321
+ .SYNOPSIS
322
+ Validate the checkpoint's issue_adoption record and resolve its waivers.
323
+ .DESCRIPTION
324
+ Public entry mirroring resolve_issue_adoption. Absent key: no errors and
325
+ no waivers. A present value that is not an object (null included) yields
326
+ only the not-an-object error. Otherwise rules 2 to 9 accumulate errors in
327
+ order, and the waived-tool set is populated only when no error was found.
328
+ .PARAMETER State
329
+ The parsed checkpoint object.
330
+ .PARAMETER RouteId
331
+ The selected route id, interpolated into route errors.
332
+ .PARAMETER RequiredMcpTool
333
+ The route's required MCP tools after promotion-type resolution.
334
+ .PARAMETER SuccessfulTool
335
+ Tools that hold a successful MCP receipt in the checkpoint.
336
+ .OUTPUTS
337
+ System.Collections.Hashtable with keys Errors (string[]) and WaivedTools (string[]).
338
+ #>
339
+ [CmdletBinding()]
340
+ [OutputType([hashtable])]
341
+ param(
342
+ [Parameter(Mandatory = $true)]
343
+ [psobject] $State,
344
+
345
+ [Parameter(Mandatory = $true)]
346
+ [string] $RouteId,
347
+
348
+ [Parameter(Mandatory = $true)]
349
+ [AllowEmptyCollection()]
350
+ [string[]] $RequiredMcpTool,
351
+
352
+ [Parameter(Mandatory = $true)]
353
+ [AllowEmptyCollection()]
354
+ [string[]] $SuccessfulTool
355
+ )
356
+
357
+ $member = Get-CheckpointObjectMember -Owner $State -Name $script:ISSUE_ADOPTION_KEY
358
+ if (-not $member.Present) {
359
+ return @{ Errors = [string[]]@(); WaivedTools = [string[]]@() }
360
+ }
361
+
362
+ $adoption = $member.Value
363
+ if (-not (Test-CheckpointObjectValue -Value $adoption)) {
364
+ return @{ Errors = [string[]]@($script:ERROR_NOT_OBJECT); WaivedTools = [string[]]@() }
365
+ }
366
+
367
+ $errors = [System.Collections.Generic.List[string]]::new()
368
+ $errors.AddRange([string[]]@(Get-AdoptionIssueIdentityError -Adoption $adoption -State $State))
369
+ $errors.AddRange([string[]]@(Get-AdoptionProvenanceError -Adoption $adoption))
370
+
371
+ $waived = Get-AdoptionWaivedToolList -Value (Get-CheckpointObjectMember -Owner $adoption -Name 'waived_tools').Value
372
+ if (-not $waived.Ok) {
373
+ # A malformed list stops rule 8 and skips rule 9 entirely.
374
+ $errors.Add($script:ERROR_WAIVED_TOOLS_SHAPE)
375
+ return @{ Errors = $errors.ToArray(); WaivedTools = [string[]]@() }
376
+ }
377
+
378
+ $errors.AddRange([string[]]@(Get-AdoptionWaivedToolError -WaivedTool $waived.Value -RouteId $RouteId -RequiredMcpTool $RequiredMcpTool -SuccessfulTool $SuccessfulTool))
379
+ $recordMember = Get-CheckpointObjectMember -Owner $adoption -Name 'potential_record'
380
+ $origin = (Get-CheckpointObjectMember -Owner $adoption -Name 'origin').Value
381
+ $errors.AddRange([string[]]@(Get-AdoptionPotentialRecordError -WaivedTool $waived.Value -PotentialRecord $recordMember.Value -Origin $origin -RecordPresent $recordMember.Present))
382
+
383
+ if ($errors.Count -gt 0) {
384
+ return @{ Errors = $errors.ToArray(); WaivedTools = [string[]]@() }
385
+ }
386
+
387
+ # The waived-tool set is the distinct entries in first-occurrence order.
388
+ $distinct = [System.Collections.Generic.List[string]]::new()
389
+ foreach ($tool in $waived.Value) {
390
+ if (-not $distinct.Contains($tool)) { $distinct.Add($tool) }
391
+ }
392
+ return @{ Errors = [string[]]@(); WaivedTools = $distinct.ToArray() }
393
+ }
394
+
395
+ # Only the family entry point is exported; the rule helpers stay private.
396
+ Export-ModuleMember -Function Get-OrchestratorStateIssueAdoptionResult
@@ -37,6 +37,7 @@ $ErrorActionPreference = 'Stop'
37
37
  # module's directory so the import travels with the pushed-down pack regardless
38
38
  # of the consumer repository's working directory.
39
39
  Import-Module (Join-Path -Path $PSScriptRoot -ChildPath 'OrchestratorStateCheckpointValue.psm1') -Force -ErrorAction Stop
40
+ Import-Module (Join-Path -Path $PSScriptRoot -ChildPath 'OrchestratorStateRemediationAccounting.psm1') -Force -ErrorAction Stop
40
41
 
41
42
  # The eight keys every list-form delegation receipt must carry. Pinned to
42
43
  # REQUIRED_RECEIPT_KEYS in scripts/dev_tools/validate_orchestrator_state.py.
@@ -290,12 +291,15 @@ function Get-RemediationCycleError {
290
291
  function Get-OrchestratorStateRemediationLoopError {
291
292
  <#
292
293
  .SYNOPSIS
293
- Return the remediation_loop errors (inventory rows U6.R1-U6.R4).
294
+ Return the remediation_loop errors (inventory rows U6.R1-U6.R4, R5-R11).
294
295
  .DESCRIPTION
295
296
  Public entry mirroring _validate_remediation_loop. A non-object
296
- remediation_loop, or a cycles value that is not a list, carries no cycles
297
- to validate and deliberately yields ZERO errors, matching the Python
298
- tolerance rather than fabricating a structural error.
297
+ remediation_loop deliberately yields ZERO errors, matching the Python
298
+ tolerance rather than fabricating a structural error. When cycles is a
299
+ list each cycle is validated independently (U6.R1-U6.R4); the issue #484
300
+ review-outcome and accounting invariants R5-R11 then run through
301
+ Get-OrchestratorStateRemediationAccountingError with the cycle list, or
302
+ $null when cycles is absent or not a list.
299
303
  .PARAMETER Value
300
304
  The raw deserialized value of the checkpoint's remediation_loop key.
301
305
  .OUTPUTS
@@ -313,21 +317,24 @@ function Get-OrchestratorStateRemediationLoopError {
313
317
 
314
318
  if (-not (Test-CheckpointObjectValue -Value $Value)) { return $errors.ToArray() }
315
319
  $cycles = (Get-CheckpointObjectMember -Owner $Value -Name $script:REMEDIATION_CYCLES_KEY).Value
316
- if (-not (Test-CheckpointListValue -Value $cycles)) { return $errors.ToArray() }
317
-
318
- # Validate each cycle independently so a malformed entry does not mask the
319
- # errors of the cycles that follow it.
320
- $index = 0
321
- foreach ($cycle in @($cycles)) {
322
- if (-not (Test-CheckpointObjectValue -Value $cycle)) {
323
- $errors.Add("Checkpoint remediation cycle #$index must be an object.")
320
+ $cycleList = $null
321
+ if (Test-CheckpointListValue -Value $cycles) {
322
+ $cycleList = $cycles
323
+ # Validate each cycle independently so a malformed entry does not mask the
324
+ # errors of the cycles that follow it.
325
+ $index = 0
326
+ foreach ($cycle in @($cycles)) {
327
+ if (-not (Test-CheckpointObjectValue -Value $cycle)) {
328
+ $errors.Add("Checkpoint remediation cycle #$index must be an object.")
329
+ $index++
330
+ continue
331
+ }
332
+ $errors.AddRange([string[]]@(Get-RemediationCycleError -Index $index -Cycle $cycle))
324
333
  $index++
325
- continue
326
334
  }
327
- $errors.AddRange([string[]]@(Get-RemediationCycleError -Index $index -Cycle $cycle))
328
- $index++
329
335
  }
330
336
 
337
+ $errors.AddRange([string[]]@(Get-OrchestratorStateRemediationAccountingError -RemediationLoop $Value -Cycle $cycleList))
331
338
  return $errors.ToArray()
332
339
  }
333
340