pi-dev-team 0.2.0

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 (780) hide show
  1. package/LICENSE +21 -0
  2. package/PORTING.md +134 -0
  3. package/README.md +207 -0
  4. package/UPSTREAM.json +64 -0
  5. package/agents/Explore.md +15 -0
  6. package/agents/a11y-review.md +118 -0
  7. package/agents/adr-author.md +70 -0
  8. package/agents/ai-provenance-review.md +120 -0
  9. package/agents/angular-reactivity-review.md +95 -0
  10. package/agents/arch-review.md +135 -0
  11. package/agents/architect.md +78 -0
  12. package/agents/autoship-batch-proposer.md +69 -0
  13. package/agents/claude-setup-review.md +136 -0
  14. package/agents/codebase-recon.md +184 -0
  15. package/agents/component-architecture-review.md +119 -0
  16. package/agents/concurrency-review.md +109 -0
  17. package/agents/correctness-review.md +290 -0
  18. package/agents/data-flow-tracer.md +120 -0
  19. package/agents/doc-review.md +165 -0
  20. package/agents/domain-review.md +136 -0
  21. package/agents/general-purpose.md +10 -0
  22. package/agents/gherkin-quality-critic.md +113 -0
  23. package/agents/js-fp-review.md +114 -0
  24. package/agents/mutation-kill.md +684 -0
  25. package/agents/naming-review.md +142 -0
  26. package/agents/orchestrator.md +339 -0
  27. package/agents/performance-review.md +105 -0
  28. package/agents/plan-review-acceptance.md +115 -0
  29. package/agents/plan-review-design.md +90 -0
  30. package/agents/plan-review-parallelization.md +84 -0
  31. package/agents/plan-review-strategic.md +96 -0
  32. package/agents/plan-review-ux.md +110 -0
  33. package/agents/platform-engineer.md +64 -0
  34. package/agents/product-manager.md +68 -0
  35. package/agents/progress-guardian.md +79 -0
  36. package/agents/qa-engineer.md +289 -0
  37. package/agents/quality-reviewer.md +132 -0
  38. package/agents/react-reactivity-review.md +102 -0
  39. package/agents/refactor-opportunity-review.md +128 -0
  40. package/agents/security-engineer.md +60 -0
  41. package/agents/security-review.md +218 -0
  42. package/agents/session-analysis.md +95 -0
  43. package/agents/software-engineer.md +105 -0
  44. package/agents/spec-compliance-review.md +100 -0
  45. package/agents/spec-reviewer.md +114 -0
  46. package/agents/structure-review.md +146 -0
  47. package/agents/tech-writer.md +84 -0
  48. package/agents/test-review.md +246 -0
  49. package/agents/test-smell-review.md +188 -0
  50. package/agents/token-efficiency-review.md +139 -0
  51. package/agents/ui-ux-designer.md +54 -0
  52. package/agents/vue-reactivity-review.md +95 -0
  53. package/bin/__pycache__/claudecpython-314.pyc +0 -0
  54. package/bin/claude +258 -0
  55. package/docs/upstream/.pages +1 -0
  56. package/docs/upstream/CHANGELOG.md +2586 -0
  57. package/docs/upstream/README.md +155 -0
  58. package/docs/upstream/agent-architecture.md +214 -0
  59. package/docs/upstream/agent_info.md +187 -0
  60. package/docs/upstream/artifact-migration.md +124 -0
  61. package/docs/upstream/code-intelligence-nudge.md +149 -0
  62. package/docs/upstream/code-review-process.md +294 -0
  63. package/docs/upstream/concurrent-use.md +73 -0
  64. package/docs/upstream/context-management.md +111 -0
  65. package/docs/upstream/developer-notes.md +280 -0
  66. package/docs/upstream/diagrams/architecture-overview.svg +101 -0
  67. package/docs/upstream/diagrams/review-dispatch.svg +139 -0
  68. package/docs/upstream/diagrams/team-agents.svg +128 -0
  69. package/docs/upstream/diagrams/test-improve-flow.svg +166 -0
  70. package/docs/upstream/diagrams/workflow-linear.svg +66 -0
  71. package/docs/upstream/diagrams/workflow-three-phase.svg +200 -0
  72. package/docs/upstream/eval-maintenance.md +95 -0
  73. package/docs/upstream/eval-running-guide.md +147 -0
  74. package/docs/upstream/eval-system.md +291 -0
  75. package/docs/upstream/session-review-oss-complements.md +75 -0
  76. package/docs/upstream/session-review.md +212 -0
  77. package/docs/upstream/skills.md +188 -0
  78. package/docs/upstream/team-structure.md +21 -0
  79. package/docs/upstream/telemetry-ci-access.md +129 -0
  80. package/docs/upstream/telemetry-repo-security.md +120 -0
  81. package/docs/upstream/test-evaluation.md +277 -0
  82. package/docs/upstream/test-improve.md +154 -0
  83. package/docs/upstream/triage-workflow.md +282 -0
  84. package/docs/upstream/workflows.md +289 -0
  85. package/extensions/dev-team/index.ts +539 -0
  86. package/extensions/dev-team/lib/agents.ts +272 -0
  87. package/extensions/dev-team/lib/ai-credits.ts +92 -0
  88. package/extensions/dev-team/lib/autocompact.ts +81 -0
  89. package/extensions/dev-team/lib/child-run.ts +102 -0
  90. package/extensions/dev-team/lib/config.ts +236 -0
  91. package/extensions/dev-team/lib/gh-command.ts +103 -0
  92. package/extensions/dev-team/lib/github-style.ts +307 -0
  93. package/extensions/dev-team/lib/hooks.ts +350 -0
  94. package/extensions/dev-team/lib/metrics.ts +115 -0
  95. package/extensions/dev-team/lib/safe-read.ts +49 -0
  96. package/extensions/dev-team/lib/session-files.ts +57 -0
  97. package/extensions/dev-team/lib/session-spend.ts +123 -0
  98. package/extensions/dev-team/lib/shell-scan.ts +205 -0
  99. package/extensions/dev-team/lib/skills.ts +213 -0
  100. package/extensions/dev-team/lib/subagent-render.ts +245 -0
  101. package/extensions/dev-team/lib/subagent-types.ts +164 -0
  102. package/extensions/dev-team/lib/subagent.ts +596 -0
  103. package/extensions/dev-team/lib/terminal-text.ts +54 -0
  104. package/extensions/dev-team/lib/tools-misc.ts +152 -0
  105. package/extensions/dev-team/lib/transcript.ts +110 -0
  106. package/extensions/dev-team/lib/trust.ts +52 -0
  107. package/extensions/dev-team/lib/usage-breakdown.ts +176 -0
  108. package/extensions/dev-team/lib/usage-chart.ts +153 -0
  109. package/extensions/dev-team/lib/usage-command.ts +107 -0
  110. package/extensions/dev-team/lib/usage-history.ts +203 -0
  111. package/extensions/dev-team/lib/usage-render.ts +225 -0
  112. package/extensions/dev-team/lib/usage-split-bar.ts +127 -0
  113. package/extensions/dev-team/lib/usage-state.ts +116 -0
  114. package/extensions/dev-team/lib/usage-text.ts +159 -0
  115. package/extensions/dev-team/lib/usage-view.ts +109 -0
  116. package/hooks/__pycache__/refactor_test_freeze_guard.cpython-314.pyc +0 -0
  117. package/hooks/agent_dispatch_ledger.py +190 -0
  118. package/hooks/autocompact_setup_nudge.py +99 -0
  119. package/hooks/bash_retry_guard.py +228 -0
  120. package/hooks/boundary_events_write_guard.py +352 -0
  121. package/hooks/code_intelligence_nudge.py +293 -0
  122. package/hooks/code_intelligence_turn_mark.py +317 -0
  123. package/hooks/codegraph_bootstrap.py +139 -0
  124. package/hooks/contract_version_guard.py +362 -0
  125. package/hooks/cost_meter.py +106 -0
  126. package/hooks/destructive-commands.json +62 -0
  127. package/hooks/destructive_guard.py +477 -0
  128. package/hooks/eval_compliance_check.py +440 -0
  129. package/hooks/guards.json +17 -0
  130. package/hooks/hooks.json +323 -0
  131. package/hooks/internal_double_gate.py +296 -0
  132. package/hooks/js_fp_review.py +212 -0
  133. package/hooks/knowledge_index.py +119 -0
  134. package/hooks/lib/__pycache__/artifact_paths.cpython-314.pyc +0 -0
  135. package/hooks/lib/__pycache__/atomic_state.cpython-314.pyc +0 -0
  136. package/hooks/lib/__pycache__/autocompact_config.cpython-314.pyc +0 -0
  137. package/hooks/lib/__pycache__/boundary_events.cpython-314.pyc +0 -0
  138. package/hooks/lib/__pycache__/doc_classification.cpython-314.pyc +0 -0
  139. package/hooks/lib/__pycache__/gh_pr_create_detect.cpython-314.pyc +0 -0
  140. package/hooks/lib/__pycache__/git_safe_diff.cpython-314.pyc +0 -0
  141. package/hooks/lib/__pycache__/instrument_log.cpython-314.pyc +0 -0
  142. package/hooks/lib/__pycache__/metrics_query.cpython-314.pyc +0 -0
  143. package/hooks/lib/__pycache__/plugin_version.cpython-314.pyc +0 -0
  144. package/hooks/lib/__pycache__/pre_commit_doc_classifier.cpython-314.pyc +0 -0
  145. package/hooks/lib/__pycache__/review_agent_registry.cpython-314.pyc +0 -0
  146. package/hooks/lib/__pycache__/review_gate_corroboration.cpython-314.pyc +0 -0
  147. package/hooks/lib/__pycache__/review_gate_hash.cpython-314.pyc +0 -0
  148. package/hooks/lib/__pycache__/review_verdicts.cpython-314.pyc +0 -0
  149. package/hooks/lib/__pycache__/stdin_json.cpython-314.pyc +0 -0
  150. package/hooks/lib/__pycache__/stryker_invocation.cpython-314.pyc +0 -0
  151. package/hooks/lib/__pycache__/telemetry_consent.cpython-314.pyc +0 -0
  152. package/hooks/lib/__pycache__/test_file_classify.cpython-314.pyc +0 -0
  153. package/hooks/lib/__pycache__/token_efficiency_limits.cpython-314.pyc +0 -0
  154. package/hooks/lib/__pycache__/verify_guard_state.cpython-314.pyc +0 -0
  155. package/hooks/lib/__pycache__/xunit_v3_operator_gate.cpython-314.pyc +0 -0
  156. package/hooks/lib/agent_skill_hints.py +74 -0
  157. package/hooks/lib/artifact_paths.py +263 -0
  158. package/hooks/lib/atomic_state.py +557 -0
  159. package/hooks/lib/autocompact_config.py +103 -0
  160. package/hooks/lib/autoship_log.py +106 -0
  161. package/hooks/lib/banned_scripts_policy.py +51 -0
  162. package/hooks/lib/boundary_events.py +436 -0
  163. package/hooks/lib/build_knowledge_index.py +504 -0
  164. package/hooks/lib/build_skills_index.py +361 -0
  165. package/hooks/lib/build_state.py +116 -0
  166. package/hooks/lib/classify_ship_outcome.py +126 -0
  167. package/hooks/lib/config_changelog_schema.py +115 -0
  168. package/hooks/lib/cost_meter.py +955 -0
  169. package/hooks/lib/doc_classification.py +116 -0
  170. package/hooks/lib/gh_pr_create_detect.py +136 -0
  171. package/hooks/lib/git_safe_diff.py +123 -0
  172. package/hooks/lib/instrument_log.py +66 -0
  173. package/hooks/lib/iteration_journal_gate.py +197 -0
  174. package/hooks/lib/knowledge_index_paths.py +88 -0
  175. package/hooks/lib/mcp_json_repowise.py +177 -0
  176. package/hooks/lib/metrics_query.py +202 -0
  177. package/hooks/lib/minimal_yaml.py +434 -0
  178. package/hooks/lib/plugin_version.py +142 -0
  179. package/hooks/lib/pre_commit_detect.py +537 -0
  180. package/hooks/lib/pre_commit_doc_classifier.py +126 -0
  181. package/hooks/lib/pricing.py +118 -0
  182. package/hooks/lib/report_pdf.py +371 -0
  183. package/hooks/lib/review_agent_registry.py +142 -0
  184. package/hooks/lib/review_dispatch_ledger.py +101 -0
  185. package/hooks/lib/review_gate_corroboration.py +521 -0
  186. package/hooks/lib/review_gate_hash.py +252 -0
  187. package/hooks/lib/review_gate_normalized_hash.py +1115 -0
  188. package/hooks/lib/review_verdicts.py +301 -0
  189. package/hooks/lib/run_report.py +160 -0
  190. package/hooks/lib/skill_categories.yaml +125 -0
  191. package/hooks/lib/stdin_json.py +57 -0
  192. package/hooks/lib/stryker_invocation.py +102 -0
  193. package/hooks/lib/telemetry_consent.py +41 -0
  194. package/hooks/lib/telemetry_report.py +108 -0
  195. package/hooks/lib/test_file_classify.py +160 -0
  196. package/hooks/lib/token_efficiency_limits.py +51 -0
  197. package/hooks/lib/turn_identity.py +77 -0
  198. package/hooks/lib/verify_guard_state.py +110 -0
  199. package/hooks/lib/workflow_state.py +206 -0
  200. package/hooks/lib/xunit_v3_operator_gate.py +596 -0
  201. package/hooks/mcp_json_repowise_nudge.py +74 -0
  202. package/hooks/mutation_adapters/__init__.py +7 -0
  203. package/hooks/mutation_adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  204. package/hooks/mutation_adapters/__pycache__/lib.cpython-314.pyc +0 -0
  205. package/hooks/mutation_adapters/__pycache__/mutmut.cpython-314.pyc +0 -0
  206. package/hooks/mutation_adapters/__pycache__/pitest.cpython-314.pyc +0 -0
  207. package/hooks/mutation_adapters/__pycache__/stryker.cpython-314.pyc +0 -0
  208. package/hooks/mutation_adapters/__pycache__/stryker_net.cpython-314.pyc +0 -0
  209. package/hooks/mutation_adapters/lib.py +478 -0
  210. package/hooks/mutation_adapters/mutmut.py +188 -0
  211. package/hooks/mutation_adapters/pitest.py +266 -0
  212. package/hooks/mutation_adapters/stryker.py +157 -0
  213. package/hooks/mutation_adapters/stryker_net.py +264 -0
  214. package/hooks/mutation_gate.py +193 -0
  215. package/hooks/mutation_testing_smoke_gate.py +371 -0
  216. package/hooks/pending_review_notify.py +121 -0
  217. package/hooks/phase_marker.py +138 -0
  218. package/hooks/post_compact_state_reinject.py +180 -0
  219. package/hooks/post_format.py +115 -0
  220. package/hooks/pre_commit_knowledge_index.py +128 -0
  221. package/hooks/pre_commit_review.py +66 -0
  222. package/hooks/pre_pr_review.py +694 -0
  223. package/hooks/pre_tool_guard.py +405 -0
  224. package/hooks/py.sh +73 -0
  225. package/hooks/refactor-bash-write-patterns.json +29 -0
  226. package/hooks/refactor_test_bash_guard.py +253 -0
  227. package/hooks/refactor_test_freeze_guard.py +139 -0
  228. package/hooks/refactor_test_revert_guard.py +186 -0
  229. package/hooks/repo_review_nudge.py +287 -0
  230. package/hooks/review_verdict_recorder.py +464 -0
  231. package/hooks/scan_bash_command_for_banned_scripts.py +428 -0
  232. package/hooks/scan_worktree_for_banned_scripts.py +238 -0
  233. package/hooks/session_learning_trigger.py +248 -0
  234. package/hooks/skills_index.py +126 -0
  235. package/hooks/stryker_xunit_shim_guard.py +571 -0
  236. package/hooks/subagent_completion_guard.py +309 -0
  237. package/hooks/subagent_skill_context.py +139 -0
  238. package/hooks/task_completion_metrics.py +216 -0
  239. package/hooks/tdd_guard.py +229 -0
  240. package/hooks/telemetry.py +341 -0
  241. package/hooks/token_efficiency_review.py +194 -0
  242. package/hooks/verify_guard.py +183 -0
  243. package/hooks/verify_guard_edit_marker.py +73 -0
  244. package/hooks/version_check.py +173 -0
  245. package/knowledge/accepted-risks-schema.md +98 -0
  246. package/knowledge/adr-decision-criteria.md +64 -0
  247. package/knowledge/adversarial-review-protocol.md +139 -0
  248. package/knowledge/agent-registry.md +228 -0
  249. package/knowledge/agent-review-methodology.md +80 -0
  250. package/knowledge/ai-friendly-repo-guidelines.md +67 -0
  251. package/knowledge/architecture-assessment.md +96 -0
  252. package/knowledge/artifact-lifecycle.md +57 -0
  253. package/knowledge/cd-maturity-model.md +82 -0
  254. package/knowledge/cd-test-architecture.md +190 -0
  255. package/knowledge/ci-cd-file-scope.md +24 -0
  256. package/knowledge/codegraph-vs-graphify.md +192 -0
  257. package/knowledge/component-test-patterns.md +139 -0
  258. package/knowledge/database-change-management.md +80 -0
  259. package/knowledge/database-test-patterns.md +79 -0
  260. package/knowledge/decision-defaults.md +88 -0
  261. package/knowledge/dependency-breaking-techniques.md +116 -0
  262. package/knowledge/deployment-pipeline.md +86 -0
  263. package/knowledge/design-smells.md +122 -0
  264. package/knowledge/directory-enumeration.md +38 -0
  265. package/knowledge/domain-modeling.md +123 -0
  266. package/knowledge/evidence-bundle.md +90 -0
  267. package/knowledge/exploratory-testing-field-guide.md +122 -0
  268. package/knowledge/failure-routing.md +28 -0
  269. package/knowledge/fixture-construction.md +56 -0
  270. package/knowledge/frontend-component-architecture.md +139 -0
  271. package/knowledge/gherkin-quality-review-dispatch.md +135 -0
  272. package/knowledge/index.json +6766 -0
  273. package/knowledge/internal-collaborator-doubling.md +101 -0
  274. package/knowledge/legacy-test-strategy.md +71 -0
  275. package/knowledge/long-run-waiting.md +66 -0
  276. package/knowledge/microservice-testing.md +71 -0
  277. package/knowledge/model-pricing.json +23 -0
  278. package/knowledge/mutation-score-formulas.md +60 -0
  279. package/knowledge/object-calisthenics.md +147 -0
  280. package/knowledge/oracle-provenance.md +94 -0
  281. package/knowledge/orchestrator-script-implementation.md +185 -0
  282. package/knowledge/owasp-detection.md +148 -0
  283. package/knowledge/plan-review-rubric.md +56 -0
  284. package/knowledge/proxy-connectivity.md +62 -0
  285. package/knowledge/reactive-effect-patterns.md +73 -0
  286. package/knowledge/recon-inventory-excludes.txt +32 -0
  287. package/knowledge/references/bdd-value-guide.md +61 -0
  288. package/knowledge/references/csharp-http-client-testing.md +264 -0
  289. package/knowledge/release-strategies.md +74 -0
  290. package/knowledge/report-output-location.md +117 -0
  291. package/knowledge/report-pdf-integration.md +63 -0
  292. package/knowledge/report-print.css +129 -0
  293. package/knowledge/report-template.md +114 -0
  294. package/knowledge/report-to-pdf.md +69 -0
  295. package/knowledge/request-processing-flow.md +63 -0
  296. package/knowledge/result-verification.md +52 -0
  297. package/knowledge/review-agent-output-contract.md +121 -0
  298. package/knowledge/review-lens-classification.md +113 -0
  299. package/knowledge/review-rubric.md +62 -0
  300. package/knowledge/review-template.md +104 -0
  301. package/knowledge/rule-fixtures/A02.insecure-random-js/negative.js +1 -0
  302. package/knowledge/rule-fixtures/A02.insecure-random-js/positive.js +1 -0
  303. package/knowledge/rule-fixtures/A02.weak-hashing-md5/negative.py +1 -0
  304. package/knowledge/rule-fixtures/A02.weak-hashing-md5/positive.py +1 -0
  305. package/knowledge/rule-fixtures/A03.command-injection/negative.js +1 -0
  306. package/knowledge/rule-fixtures/A03.command-injection/positive.js +1 -0
  307. package/knowledge/rule-fixtures/A03.sql-injection/negative.js +1 -0
  308. package/knowledge/rule-fixtures/A03.sql-injection/positive.js +1 -0
  309. package/knowledge/rule-fixtures/A03.xss-innerhtml/negative.js +1 -0
  310. package/knowledge/rule-fixtures/A03.xss-innerhtml/positive.js +1 -0
  311. package/knowledge/rule-fixtures/A05.cors-wildcard/negative.js +1 -0
  312. package/knowledge/rule-fixtures/A05.cors-wildcard/positive.js +1 -0
  313. package/knowledge/rule-fixtures/A05.default-credentials/negative.js +1 -0
  314. package/knowledge/rule-fixtures/A05.default-credentials/positive.js +1 -0
  315. package/knowledge/rule-fixtures/A07.jwt-alg-none/negative.js +1 -0
  316. package/knowledge/rule-fixtures/A07.jwt-alg-none/positive.js +1 -0
  317. package/knowledge/rule-fixtures/A08.binary-formatter/negative.cs +1 -0
  318. package/knowledge/rule-fixtures/A08.binary-formatter/positive.cs +1 -0
  319. package/knowledge/rule-fixtures/A08.js-eval/negative.js +1 -0
  320. package/knowledge/rule-fixtures/A08.js-eval/positive.js +1 -0
  321. package/knowledge/rule-fixtures/A08.object-input-stream/negative.java +1 -0
  322. package/knowledge/rule-fixtures/A08.object-input-stream/positive.java +1 -0
  323. package/knowledge/schemas/disposition-register-v1.json +65 -0
  324. package/knowledge/schemas/recon-envelope-v1.json +198 -0
  325. package/knowledge/schemas/unified-finding-v1.json +72 -0
  326. package/knowledge/security-primitives-contract.md +301 -0
  327. package/knowledge/security-review-rule-map.yaml +107 -0
  328. package/knowledge/skills-registry.md +72 -0
  329. package/knowledge/task-size-classifier.md +103 -0
  330. package/knowledge/telemetry-schema.md +881 -0
  331. package/knowledge/test-automation-maturity.md +56 -0
  332. package/knowledge/test-automation-principles.md +71 -0
  333. package/knowledge/test-cadence-tradeoffs.md +68 -0
  334. package/knowledge/test-doubles.md +105 -0
  335. package/knowledge/test-file-indicators.md +22 -0
  336. package/knowledge/test-layer-gates.md +35 -0
  337. package/knowledge/test-matrix-examples/django-batch.md +24 -0
  338. package/knowledge/test-matrix-examples/dotnet-grpc-fronting-api.md +90 -0
  339. package/knowledge/test-matrix-examples/dotnet-http-consumer.md +131 -0
  340. package/knowledge/test-matrix-examples/react-node-spa.md +24 -0
  341. package/knowledge/test-matrix-examples/spring-boot-service.md +25 -0
  342. package/knowledge/test-matrix-examples/ssr-htmx.md +24 -0
  343. package/knowledge/test-organization.md +70 -0
  344. package/knowledge/test-pyramid.md +84 -0
  345. package/knowledge/test-refactoring.md +67 -0
  346. package/knowledge/test-review-division-of-labor.md +85 -0
  347. package/knowledge/test-smells.md +80 -0
  348. package/knowledge/test-stack-profiles/bdd-frameworks.md +235 -0
  349. package/knowledge/test-stack-profiles/django.md +13 -0
  350. package/knowledge/test-stack-profiles/dotnet.md +18 -0
  351. package/knowledge/test-stack-profiles/go.md +16 -0
  352. package/knowledge/test-stack-profiles/node.md +16 -0
  353. package/knowledge/test-stack-profiles/react.md +12 -0
  354. package/knowledge/test-stack-profiles/spring-boot.md +16 -0
  355. package/knowledge/test-stack-profiles/ssr-htmx.md +14 -0
  356. package/knowledge/test-stack-profiles/vue.md +12 -0
  357. package/knowledge/test-strategy.md +70 -0
  358. package/knowledge/testability-patterns.md +240 -0
  359. package/knowledge/testing-quadrants.md +44 -0
  360. package/knowledge/testing-techniques/approval.md +15 -0
  361. package/knowledge/testing-techniques/chaos.md +17 -0
  362. package/knowledge/testing-techniques/fuzz.md +15 -0
  363. package/knowledge/testing-techniques/property-based.md +15 -0
  364. package/knowledge/testing-techniques/schema-validation.md +15 -0
  365. package/knowledge/testing-techniques/screenshot.md +15 -0
  366. package/knowledge/three-phase-workflow.md +198 -0
  367. package/knowledge/value-patterns.md +55 -0
  368. package/knowledge/verification-mode.md +116 -0
  369. package/knowledge/virtual-service-libraries.md +75 -0
  370. package/knowledge/wave-consolidation-guidance.md +21 -0
  371. package/overrides/agents/Explore.md +15 -0
  372. package/overrides/agents/general-purpose.md +10 -0
  373. package/overrides/notes/autoship.md +6 -0
  374. package/overrides/notes/issues-from-assessment.md +3 -0
  375. package/overrides/notes/issues-from-plan.md +3 -0
  376. package/overrides/notes/mutation-night-watch.md +3 -0
  377. package/overrides/notes/mutation-testing.md +3 -0
  378. package/overrides/notes/pr.md +7 -0
  379. package/overrides/notes/project-init.md +6 -0
  380. package/overrides/notes/setup.md +13 -0
  381. package/overrides/notes/specs.md +3 -0
  382. package/overrides/skills/headless-run/SKILL.md +45 -0
  383. package/overrides/skills/upgrade/SKILL.md +30 -0
  384. package/overrides/skills/version/SKILL.md +25 -0
  385. package/package.json +36 -0
  386. package/scripts/authoring_digest.py +93 -0
  387. package/scripts/autoship_discover.py +121 -0
  388. package/scripts/autoship_group.py +409 -0
  389. package/scripts/autoship_proposals.py +494 -0
  390. package/scripts/autoship_queue.py +291 -0
  391. package/scripts/autoship_reclaim.py +495 -0
  392. package/scripts/build_jobs.py +108 -0
  393. package/scripts/build_rollback_point.py +240 -0
  394. package/scripts/build_slice_scope.py +157 -0
  395. package/scripts/build_wave.py +109 -0
  396. package/scripts/build_wave_reconcile.py +252 -0
  397. package/scripts/build_worktree_baseref.py +113 -0
  398. package/scripts/check_agent_scope.py +117 -0
  399. package/scripts/check_agent_tool_mapping.py +213 -0
  400. package/scripts/check_review_agent_mcp_tools.py +317 -0
  401. package/scripts/check_security_assessment_mcp_tools.py +165 -0
  402. package/scripts/checkpoint_abort.py +502 -0
  403. package/scripts/claude_setup_review.py +438 -0
  404. package/scripts/codebase_recon.py +556 -0
  405. package/scripts/coverage_config.py +623 -0
  406. package/scripts/coverage_delta_steering.py +330 -0
  407. package/scripts/coverage_discovery_dotnet.py +315 -0
  408. package/scripts/coverage_discovery_java.py +742 -0
  409. package/scripts/coverage_discovery_js.py +546 -0
  410. package/scripts/coverage_gap_ranking.py +556 -0
  411. package/scripts/coverage_readiness.py +455 -0
  412. package/scripts/coverage_report_parse.py +521 -0
  413. package/scripts/detect_bdd_convention.py +252 -0
  414. package/scripts/eval_ablation.py +376 -0
  415. package/scripts/gherkin_analysis_coverage_gate.py +306 -0
  416. package/scripts/gherkin_cross_feature_duplicate_titles_gate.py +173 -0
  417. package/scripts/gherkin_effectiveness_rollup.py +238 -0
  418. package/scripts/gherkin_failure_path_gate.py +206 -0
  419. package/scripts/gherkin_feature_merge.py +720 -0
  420. package/scripts/gherkin_stub_gate.py +163 -0
  421. package/scripts/gherkin_stub_merge.py +479 -0
  422. package/scripts/git_origin_host.py +88 -0
  423. package/scripts/install-java-static-analysis.py +110 -0
  424. package/scripts/issue_deps.py +74 -0
  425. package/scripts/lib/_bdd_markers.py +28 -0
  426. package/scripts/lib/_gherkin_text.py +93 -0
  427. package/scripts/lib/_vendored_tree.py +70 -0
  428. package/scripts/lib/autoship_state.py +397 -0
  429. package/scripts/lib/claude_md_guard.py +226 -0
  430. package/scripts/lib/deterministic_recon.py +446 -0
  431. package/scripts/lib/mcp_tool_grants.py +211 -0
  432. package/scripts/lib/plan_parse.py +386 -0
  433. package/scripts/lib/review_result.py +84 -0
  434. package/scripts/lib/review_roster.py +86 -0
  435. package/scripts/lib/session_log/__init__.py +34 -0
  436. package/scripts/lib/session_log/__pycache__/__init__.cpython-314.pyc +0 -0
  437. package/scripts/lib/session_log/__pycache__/records.cpython-314.pyc +0 -0
  438. package/scripts/lib/session_log/classify.py +231 -0
  439. package/scripts/lib/session_log/corrections.py +194 -0
  440. package/scripts/lib/session_log/discovery.py +108 -0
  441. package/scripts/lib/session_log/records.py +218 -0
  442. package/scripts/lib/session_log/redact.py +76 -0
  443. package/scripts/lib/session_log/signals.py +373 -0
  444. package/scripts/lib/session_report_downstream.py +614 -0
  445. package/scripts/lib/session_report_maintainer.py +1273 -0
  446. package/scripts/lib/session_report_shared.py +262 -0
  447. package/scripts/lib/settings_hook_guard.py +157 -0
  448. package/scripts/lib/slug.py +33 -0
  449. package/scripts/lib/stub_extractors/__init__.py +82 -0
  450. package/scripts/lib/stub_extractors/_common.py +328 -0
  451. package/scripts/lib/stub_extractors/csharp.py +19 -0
  452. package/scripts/lib/stub_extractors/go.py +173 -0
  453. package/scripts/lib/stub_extractors/java.py +18 -0
  454. package/scripts/lib/stub_extractors/jsts.py +126 -0
  455. package/scripts/mutation_stack_sections.py +149 -0
  456. package/scripts/mutation_yield_steering.py +345 -0
  457. package/scripts/orchestrator.py +895 -0
  458. package/scripts/plan_gherkin_export.py +227 -0
  459. package/scripts/plan_waves.py +208 -0
  460. package/scripts/pr_close_keyword_lint.py +108 -0
  461. package/scripts/progress_guardian.py +888 -0
  462. package/scripts/recon_inventory.py +273 -0
  463. package/scripts/review_findings_log.py +93 -0
  464. package/scripts/run_invariants.py +124 -0
  465. package/scripts/select_lenses.py +640 -0
  466. package/scripts/session_report.py +486 -0
  467. package/scripts/set_autocompact_env.py +221 -0
  468. package/scripts/ship_resume_guard.py +135 -0
  469. package/scripts/ship_review_gate.py +63 -0
  470. package/scripts/specs_convention_marker.py +103 -0
  471. package/scripts/test_improve_resume.py +277 -0
  472. package/scripts/test_review_mechanics.py +958 -0
  473. package/scripts/token_efficiency_review.py +322 -0
  474. package/scripts/verdict_scope.py +285 -0
  475. package/scripts/verify_gherkin_quality_critic_isolation.py +296 -0
  476. package/scripts/verify_tier.py +157 -0
  477. package/skills/adr-tools/SKILL.md +118 -0
  478. package/skills/agent-readiness/SKILL.md +105 -0
  479. package/skills/agent-readiness/ai_friendly_analyzers.py +326 -0
  480. package/skills/agent-readiness/scanner.py +441 -0
  481. package/skills/agent-readiness/scorecard.yaml +88 -0
  482. package/skills/api-design/SKILL.md +115 -0
  483. package/skills/apply-fixes/SKILL.md +171 -0
  484. package/skills/apply-test-doubles/SKILL.md +321 -0
  485. package/skills/artifact-lifecycle/SKILL.md +127 -0
  486. package/skills/autoship/SKILL.md +1124 -0
  487. package/skills/benchmark/SKILL.md +105 -0
  488. package/skills/branch-workflow/SKILL.md +89 -0
  489. package/skills/browse/SKILL.md +184 -0
  490. package/skills/browser-testing/SKILL.md +62 -0
  491. package/skills/browser-testing/references/playwright-patterns.md +216 -0
  492. package/skills/build/SKILL.md +422 -0
  493. package/skills/build/references/static-self-heal.md +245 -0
  494. package/skills/careful/SKILL.md +72 -0
  495. package/skills/cd-test-architecture/SKILL.md +371 -0
  496. package/skills/ci-debugging/SKILL.md +105 -0
  497. package/skills/co-evolution-audit/SKILL.md +269 -0
  498. package/skills/code-review/SKILL.md +1015 -0
  499. package/skills/code-review/examples/aggregated-sample.json +56 -0
  500. package/skills/code-review/examples/sample-report.md +41 -0
  501. package/skills/code-review/output-format.md +478 -0
  502. package/skills/code-review/scripts/activation.py +86 -0
  503. package/skills/code-review/scripts/change_impact.py +357 -0
  504. package/skills/code-review/scripts/change_shape.py +372 -0
  505. package/skills/code-review/scripts/change_size.py +212 -0
  506. package/skills/code-review/scripts/changed_file_list.py +141 -0
  507. package/skills/code-review/scripts/closing_pass.py +187 -0
  508. package/skills/code-review/scripts/consolidate.py +277 -0
  509. package/skills/code-review/scripts/contract_failure_report.py +185 -0
  510. package/skills/code-review/scripts/dispatch_reconcile.py +66 -0
  511. package/skills/code-review/scripts/dispatch_waves.py +164 -0
  512. package/skills/code-review/scripts/finding_signature.py +446 -0
  513. package/skills/code-review/scripts/ledger.py +283 -0
  514. package/skills/code-review/scripts/partition.py +169 -0
  515. package/skills/code-review/scripts/render_tiered_findings.py +274 -0
  516. package/skills/code-review/scripts/repo_invariants.py +1066 -0
  517. package/skills/code-review/scripts/review_context_pack.py +306 -0
  518. package/skills/code-review/scripts/review_round_log.py +345 -0
  519. package/skills/code-review/scripts/review_value_coverage.py +297 -0
  520. package/skills/code-review/scripts/validate_review_output.py +467 -0
  521. package/skills/code-review/sliced-mode.md +205 -0
  522. package/skills/competitive-analysis/SKILL.md +191 -0
  523. package/skills/context-loading-protocol/SKILL.md +157 -0
  524. package/skills/continue/SKILL.md +90 -0
  525. package/skills/cost-report/SKILL.md +178 -0
  526. package/skills/coverage-baseline/SKILL.md +335 -0
  527. package/skills/coverage-baseline/references/multi-project-discovery.md +202 -0
  528. package/skills/coverage-delta/SKILL.md +181 -0
  529. package/skills/coverage-delta/references/mutation-gate.md +70 -0
  530. package/skills/design-doc/SKILL.md +95 -0
  531. package/skills/design-interrogation/SKILL.md +89 -0
  532. package/skills/design-it-twice/SKILL.md +91 -0
  533. package/skills/docker-image-audit/SKILL.md +108 -0
  534. package/skills/docker-image-audit/references/install-guide.md +64 -0
  535. package/skills/docker-image-audit/references/report-template.md +73 -0
  536. package/skills/docker-image-create/SKILL.md +185 -0
  537. package/skills/domain-analysis/SKILL.md +183 -0
  538. package/skills/domain-driven-design/SKILL.md +194 -0
  539. package/skills/exploratory-testing/SKILL.md +108 -0
  540. package/skills/explore/SKILL.md +51 -0
  541. package/skills/farley-score/SKILL.md +165 -0
  542. package/skills/feature-file-validation/SKILL.md +78 -0
  543. package/skills/feature-file-validation/references/validation-rules.md +115 -0
  544. package/skills/feedback-learning/SKILL.md +414 -0
  545. package/skills/fix/SKILL.md +450 -0
  546. package/skills/freeze/SKILL.md +68 -0
  547. package/skills/frontend-architecture/SKILL.md +113 -0
  548. package/skills/gherkin-derive/SKILL.md +630 -0
  549. package/skills/gherkin-public/SKILL.md +266 -0
  550. package/skills/governance-compliance/SKILL.md +150 -0
  551. package/skills/guard/SKILL.md +75 -0
  552. package/skills/handoff/SKILL.md +139 -0
  553. package/skills/handoff/references/summary-templates.md +242 -0
  554. package/skills/harness-audit/SKILL.md +751 -0
  555. package/skills/harness-audit/scripts/lesson_validate.py +386 -0
  556. package/skills/harness-audit/scripts/redundancy_criterion.py +188 -0
  557. package/skills/headless-run/SKILL.md +45 -0
  558. package/skills/headless-run/scripts/isolated_dispatch.py +381 -0
  559. package/skills/help/SKILL.md +72 -0
  560. package/skills/hexagonal-architecture/SKILL.md +85 -0
  561. package/skills/human-oversight-protocol/SKILL.md +224 -0
  562. package/skills/issues-from-assessment/SKILL.md +223 -0
  563. package/skills/issues-from-plan/SKILL.md +133 -0
  564. package/skills/legacy-code/SKILL.md +132 -0
  565. package/skills/mermaid-diagramming/SKILL.md +120 -0
  566. package/skills/mutation-night-watch/SKILL.md +154 -0
  567. package/skills/mutation-night-watch/references/scheduling.md +135 -0
  568. package/skills/mutation-testing/SKILL.md +396 -0
  569. package/skills/mutation-testing/references/languages/csharp-stryker-net.md +676 -0
  570. package/skills/mutation-testing/references/languages/go-go-mutesting.md +95 -0
  571. package/skills/mutation-testing/references/languages/java-pitest.md +77 -0
  572. package/skills/mutation-testing/references/languages/javascript-stryker.md +188 -0
  573. package/skills/mutation-testing/references/languages/python-mutmut.md +97 -0
  574. package/skills/mutation-testing/references/time-estimation.md +34 -0
  575. package/skills/mutation-testing/references/tool-detection.md +15 -0
  576. package/skills/mutation-testing/references/workflow-callers.md +23 -0
  577. package/skills/mutation-testing/scripts/__pycache__/xunit_v3_feature_detector.cpython-314.pyc +0 -0
  578. package/skills/mutation-testing/scripts/csharp_stryker_net_slice_runner.py +635 -0
  579. package/skills/mutation-testing/scripts/csharp_stryker_net_status_loop.py +525 -0
  580. package/skills/mutation-testing/scripts/csharp_stryker_net_wrapper.py +681 -0
  581. package/skills/mutation-testing/scripts/mutation_baseline_reuse.py +292 -0
  582. package/skills/mutation-testing/scripts/mutation_exclude_policy.py +268 -0
  583. package/skills/mutation-testing/scripts/mutation_feasibility_gate.py +463 -0
  584. package/skills/mutation-testing/scripts/mutation_kill_headless.py +331 -0
  585. package/skills/mutation-testing/scripts/mutation_kill_insert.py +199 -0
  586. package/skills/mutation-testing/scripts/mutation_kill_insert_python.py +150 -0
  587. package/skills/mutation-testing/scripts/mutation_kill_loop.py +869 -0
  588. package/skills/mutation-testing/scripts/mutation_kill_loop_python.py +949 -0
  589. package/skills/mutation-testing/scripts/mutation_kill_retry.py +592 -0
  590. package/skills/mutation-testing/scripts/mutation_kill_shared.py +620 -0
  591. package/skills/mutation-testing/scripts/mutation_nightwatch.py +462 -0
  592. package/skills/mutation-testing/scripts/mutation_nightwatch_stacks.py +425 -0
  593. package/skills/mutation-testing/scripts/mutation_report.py +743 -0
  594. package/skills/mutation-testing/scripts/mutation_report_cli.py +175 -0
  595. package/skills/mutation-testing/scripts/mutation_safety_gate.py +69 -0
  596. package/skills/mutation-testing/scripts/stryker_shard_pipeline.py +847 -0
  597. package/skills/mutation-testing/scripts/stryker_shard_setup.py +440 -0
  598. package/skills/mutation-testing/scripts/stryker_timeout_retry.py +142 -0
  599. package/skills/mutation-testing/scripts/xunit_v3_feature_detector.py +341 -0
  600. package/skills/performance-benchmark/SKILL.md +174 -0
  601. package/skills/performance-benchmark/examples/report-format.md +43 -0
  602. package/skills/performance-benchmark/references/benchmark-script.md +169 -0
  603. package/skills/performance-metrics/SKILL.md +265 -0
  604. package/skills/plan/SKILL.md +199 -0
  605. package/skills/plan/references/gherkin-persistence.md +43 -0
  606. package/skills/plan/references/plan-template.md +182 -0
  607. package/skills/pr/SKILL.md +289 -0
  608. package/skills/pr/scripts/gate_retry_state.py +368 -0
  609. package/skills/project-init/README.md +141 -0
  610. package/skills/project-init/SKILL.md +1197 -0
  611. package/skills/project-init/evals/evals.json +200 -0
  612. package/skills/project-init/references/capability-tools.md +55 -0
  613. package/skills/project-init/references/configs.md +221 -0
  614. package/skills/property-based-testing/SKILL.md +121 -0
  615. package/skills/property-based-testing/fixtures/invariant_fixture.py +15 -0
  616. package/skills/property-based-testing/fixtures/js-roundtrip/README.md +42 -0
  617. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/LICENSE +21 -0
  618. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/README.md +263 -0
  619. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.d.ts +5165 -0
  620. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/fast-check.js +12147 -0
  621. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/package.json +3 -0
  622. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/cjs/types57/fast-check.d.ts +5165 -0
  623. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.d.ts +5165 -0
  624. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/fast-check.js +12011 -0
  625. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/rolldown-runtime-D7D4PA-g.js +13 -0
  626. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/lib/types57/fast-check.d.ts +5165 -0
  627. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/fast-check/package.json +94 -0
  628. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/LICENSE +21 -0
  629. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/README.md +168 -0
  630. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/RandomGenerator-DcXj09Ch.d.ts +14 -0
  631. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.d.ts +15 -0
  632. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformBigInt.js +38 -0
  633. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.d.ts +15 -0
  634. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat32.js +18 -0
  635. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.d.ts +15 -0
  636. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformFloat64.js +22 -0
  637. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.d.ts +15 -0
  638. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/distribution/uniformInt.js +134 -0
  639. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/RandomGenerator-DcXj09Ch.d.ts +14 -0
  640. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.d.ts +15 -0
  641. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformBigInt.js +37 -0
  642. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.d.ts +15 -0
  643. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat32.js +17 -0
  644. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.d.ts +15 -0
  645. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformFloat64.js +21 -0
  646. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.d.ts +15 -0
  647. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/distribution/uniformInt.js +133 -0
  648. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.d.ts +7 -0
  649. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/congruential32.js +44 -0
  650. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.d.ts +7 -0
  651. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/mersenne.js +90 -0
  652. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.d.ts +7 -0
  653. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xoroshiro128plus.js +80 -0
  654. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.d.ts +7 -0
  655. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/generator/xorshift128plus.js +78 -0
  656. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/package.json +3 -0
  657. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.d.ts +16 -0
  658. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/JumpableRandomGenerator.js +0 -0
  659. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.d.ts +2 -0
  660. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/types/RandomGenerator.js +0 -0
  661. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.d.ts +6 -0
  662. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/generateN.js +8 -0
  663. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.d.ts +12 -0
  664. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/purify.js +9 -0
  665. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.d.ts +6 -0
  666. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/esm/utils/skipN.js +6 -0
  667. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.d.ts +7 -0
  668. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/congruential32.js +46 -0
  669. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.d.ts +7 -0
  670. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/mersenne.js +92 -0
  671. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.d.ts +7 -0
  672. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xoroshiro128plus.js +82 -0
  673. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.d.ts +7 -0
  674. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/generator/xorshift128plus.js +80 -0
  675. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.d.ts +16 -0
  676. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/JumpableRandomGenerator.js +0 -0
  677. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.d.ts +2 -0
  678. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/types/RandomGenerator.js +0 -0
  679. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.d.ts +6 -0
  680. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/generateN.js +9 -0
  681. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.d.ts +12 -0
  682. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/purify.js +10 -0
  683. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.d.ts +6 -0
  684. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/lib/utils/skipN.js +7 -0
  685. package/skills/property-based-testing/fixtures/js-roundtrip/node_modules/pure-rand/package.json +133 -0
  686. package/skills/property-based-testing/fixtures/js-roundtrip/package-lock.json +1179 -0
  687. package/skills/property-based-testing/fixtures/js-roundtrip/package.json +14 -0
  688. package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.js +29 -0
  689. package/skills/property-based-testing/fixtures/js-roundtrip/roundtrip.properties.test.js +16 -0
  690. package/skills/property-based-testing/fixtures/no_property_fixture.py +10 -0
  691. package/skills/property-based-testing/fixtures/roundtrip_fixture.py +16 -0
  692. package/skills/property-based-testing/references/languages/javascript.md +54 -0
  693. package/skills/property-based-testing/scripts/detect_and_dispatch.py +80 -0
  694. package/skills/property-based-testing/scripts/hypothesis_scaffold.py +276 -0
  695. package/skills/proxy-resilience/SKILL.md +84 -0
  696. package/skills/quality-gate-pipeline/SKILL.md +184 -0
  697. package/skills/quality-targets-converge/SKILL.md +254 -0
  698. package/skills/repo-review/SKILL.md +159 -0
  699. package/skills/report-pdf/SKILL.md +66 -0
  700. package/skills/review/SKILL.md +47 -0
  701. package/skills/review-agent/SKILL.md +152 -0
  702. package/skills/review-summary/SKILL.md +73 -0
  703. package/skills/run-report/SKILL.md +70 -0
  704. package/skills/semantic-duplication-scan/SKILL.md +337 -0
  705. package/skills/semantic-scan/SKILL.md +53 -0
  706. package/skills/semgrep-analyze/SKILL.md +139 -0
  707. package/skills/setup/SKILL.md +1122 -0
  708. package/skills/ship/SKILL.md +240 -0
  709. package/skills/source-verification/SKILL.md +210 -0
  710. package/skills/source-verification/scripts/claim_extractor.py +155 -0
  711. package/skills/specs/.size-baseline.json +4 -0
  712. package/skills/specs/SKILL.md +243 -0
  713. package/skills/specs/references/completeness-checklist.md +83 -0
  714. package/skills/specs/references/extraction.md +58 -0
  715. package/skills/specs/references/glossary.md +59 -0
  716. package/skills/specs/references/persistence.md +115 -0
  717. package/skills/specs/references/predictability-check.md +77 -0
  718. package/skills/static-analysis-integration/SKILL.md +235 -0
  719. package/skills/static-analysis-integration/adapters/_envelope.py +26 -0
  720. package/skills/static-analysis-integration/adapters/jscpd-adapter.py +66 -0
  721. package/skills/static-analysis-integration/adapters/lizard-adapter.py +81 -0
  722. package/skills/static-analysis-integration/adapters/mypy-adapter.py +50 -0
  723. package/skills/static-analysis-integration/adapters/mypy-src-layout.py +93 -0
  724. package/skills/static-analysis-integration/adapters/security-review-adapter.py +212 -0
  725. package/skills/static-analysis-integration/maintenance.md +23 -0
  726. package/skills/static-analysis-integration/references/language-setup.md +228 -0
  727. package/skills/static-analysis-integration/references/sarif-parser.md +124 -0
  728. package/skills/static-analysis-integration/references/security-review-adapter.md +118 -0
  729. package/skills/static-analysis-integration/references/tool-configs.md +617 -0
  730. package/skills/static-analysis-integration/rulesets/pmd-quickstart.xml +24 -0
  731. package/skills/stryker-xunit-v2-shim/SKILL.md +274 -0
  732. package/skills/stryker-xunit-v2-shim/references/shim-howto.md +256 -0
  733. package/skills/stryker-xunit-v2-shim/scripts/generate_shim.py +143 -0
  734. package/skills/systematic-debugging/SKILL.md +130 -0
  735. package/skills/telemetry/SKILL.md +75 -0
  736. package/skills/test-audit-disable/SKILL.md +129 -0
  737. package/skills/test-design/SKILL.md +177 -0
  738. package/skills/test-design/scripts/__pycache__/internal_double_detector.cpython-314.pyc +0 -0
  739. package/skills/test-design/scripts/internal_double_detector.py +631 -0
  740. package/skills/test-design-advisor/SKILL.md +166 -0
  741. package/skills/test-driven-development/SKILL.md +169 -0
  742. package/skills/test-health/SKILL.md +262 -0
  743. package/skills/test-improve/SKILL.md +239 -0
  744. package/skills/test-improve/references/phase-0-approach-contract.md +228 -0
  745. package/skills/test-improve/references/phase-1-analyze.md +131 -0
  746. package/skills/test-improve/references/phase-2-baseline.md +121 -0
  747. package/skills/test-improve/references/phase-3-derive-gherkin.md +53 -0
  748. package/skills/test-improve/references/phase-4-plan-fixes.md +34 -0
  749. package/skills/test-improve/references/phase-5-improve.md +215 -0
  750. package/skills/test-improve/references/phase-6-refactor-decision.md +45 -0
  751. package/skills/test-improve/references/phase-7-refactor.md +44 -0
  752. package/skills/test-improve/references/phase-8-validate.md +66 -0
  753. package/skills/test-improve/references/phase-9-close-out-prompt.md +11 -0
  754. package/skills/test-improve/references/phase-9-report.md +62 -0
  755. package/skills/test-improve/references/review-loop.md +92 -0
  756. package/skills/test-improve/templates/executive-summary.md +123 -0
  757. package/skills/threat-modeling/SKILL.md +108 -0
  758. package/skills/triage/SKILL.md +211 -0
  759. package/skills/ubiquitous-language/SKILL.md +192 -0
  760. package/skills/ubiquitous-language/scripts/collect_domain_signals.py +300 -0
  761. package/skills/unfreeze/SKILL.md +37 -0
  762. package/skills/upgrade/SKILL.md +31 -0
  763. package/skills/upgrade/scripts/check_version_drift.py +113 -0
  764. package/skills/upgrade/scripts/enable_autoupdate.py +149 -0
  765. package/skills/version/SKILL.md +25 -0
  766. package/sync/__pycache__/sync_upstream.cpython-314.pyc +0 -0
  767. package/sync/sync_upstream.py +293 -0
  768. package/templates/ACCEPTED-RISKS.md.tmpl +46 -0
  769. package/templates/agents/agent-template.md +151 -0
  770. package/templates/agents/angular-testing.md +66 -0
  771. package/templates/agents/csharp-quality.md +63 -0
  772. package/templates/agents/esm-enforcer.md +52 -0
  773. package/templates/agents/front-end-testing.md +65 -0
  774. package/templates/agents/go-quality.md +65 -0
  775. package/templates/agents/python-quality.md +62 -0
  776. package/templates/agents/react-testing.md +61 -0
  777. package/templates/agents/ts-enforcer.md +60 -0
  778. package/templates/agents/twelve-factor-audit.md +49 -0
  779. package/tools/entropy-check.py +250 -0
  780. package/tools/model-hash-verify.py +213 -0
@@ -0,0 +1,274 @@
1
+ ---
2
+ name: stryker-xunit-v2-shim
3
+ description: Build a xunit.v2 Stryker shim so Stryker.NET produces a valid mutation score for a xunit.v3 test project. Stryker.NET cannot observe mutant kills through xunit.v3 (it runs on the Microsoft Testing Platform), so a normal run reports a false near-zero score with almost every mutant reported Survived. Use this BEFORE running Stryker whenever the target .NET test project references xunit.v3 — including when mutation is enabled via /test-improve or /mutation-testing, or you are about to run dotnet-stryker — and as a rescue when a run already reported ~0% or everything Survived or the user says the score looks suspiciously low. When Stryker and xunit.v3 both appear, build the shim first.
4
+ role: worker
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Stryker xunit.v2 Shim
9
+
10
+ Role: worker. Builds measurement scaffolding and does not modify the tests it
11
+ measures.
12
+
13
+ ## Why this exists
14
+
15
+ Stryker.NET (through at least 4.15/4.16) **cannot observe mutant kills through
16
+ xunit.v3**. xunit.v3 runs on the Microsoft Testing Platform (MTP), and Stryker's
17
+ per-test coverage/kill mapping doesn't work across it (stryker-net issues 3237,
18
+ 3629, 3094). The run completes and the initial test pass even succeeds, so the
19
+ failure is **silent** — the only symptom is the score: near-zero, with almost
20
+ every mutant reported *Survived* (e.g. `0.13% — 3 killed / 7,685 survived`). That
21
+ is the **observation-failure signature**, not a real result.
22
+
23
+ The fix is a **shim**: a second test project that recompiles the *same test source
24
+ files* under xunit.v2 (classic VSTest), which Stryker observes correctly. No test
25
+ is rewritten — the shim **links** the existing `.cs` files, so there is one source
26
+ of truth. Stryker is then run **from the shim directory** in project mode.
27
+
28
+ [`references/shim-howto.md`](references/shim-howto.md) has the full reference build
29
+ and any edge case not covered here.
30
+
31
+ ## Version scope — this whole skill is a < 5.0.0 workaround
32
+
33
+ Everything below applies to **Stryker.NET < 5.0.0**. Starting at **5.0.0**
34
+ ([stryker-net#3752](https://github.com/stryker-mutator/stryker-net/issues/3752)),
35
+ `-t mtp` + `coverage-analysis: perTest` observes mutant kills through xunit.v3
36
+ directly — no shim, no v3-only-construct porting, no operator gate. See
37
+ [`csharp-stryker-net.md`](../mutation-testing/references/languages/csharp-stryker-net.md)
38
+ for the >= 5.0.0 command and its `concurrency: 1` caveat
39
+ ([stryker-net#3832](https://github.com/stryker-mutator/stryker-net/issues/3832),
40
+ tracked for removal in [#2192](https://github.com/bdfinst/agentic-dev-team/issues/2192)).
41
+ `stryker_xunit_shim_guard.py` detects the installed version
42
+ (`hooks/mutation_adapters/stryker_net.py::stryker_net_version()`) and
43
+ silent-passes on >= 5.0.0 — this skill's Step 1a operator gate is never
44
+ reached on a known >= 5.0.0 install. An undetermined version fails closed to
45
+ the < 5.0.0 behavior this skill documents.
46
+
47
+ ## Scope — one path, not the only one
48
+
49
+ The shim is the path that keeps the **mutant-kill loop** viable on xunit.v3 **below 5.0.0**, because it restores per-test coverage (fast covering-subset per mutant). It is not mandatory for every xunit.v3 run. Within `mutation-kill` the shim-first feasibility gate ([#1158](https://github.com/bdfinst/agentic-dev-team/issues/1158)) decides per run: build the shim and probe under `perTest`; if per-test capture works and a round fits the budget, enter the loop; otherwise **degrade** to the no-shim floor — the real v3 suite via `-t mtp` + `coverage-analysis: off` (a real but slow, whole-suite-per-mutant single advisory pass; see [`csharp-stryker-net.md`](../mutation-testing/references/languages/csharp-stryker-net.md)). Before building, [`xunit_v3_feature_detector.py`](../mutation-testing/scripts/xunit_v3_feature_detector.py) classifies the shim-breaking v3-only constructs for the always-ask operator gate in Step 1a — enforced by the guard hook, which stays blocked until the operator's choice is recorded ([#1791](https://github.com/bdfinst/agentic-dev-team/issues/1791)). On `exclude`, the guard passes their selections to `generate_shim.py --compile-exclude` itself.
50
+
51
+ ## When to build it
52
+
53
+ Detection is one check: a test `.csproj` contains `Include="xunit.v3"`. Build the
54
+ shim **proactively, before the first Stryker run** — because the failure is silent
55
+ (the run succeeds and the score is bogus), waiting for the symptom wastes a full,
56
+ possibly hours-long run. As a backstop the `stryker_xunit_shim_guard.py` PreToolUse
57
+ hook auto-scaffolds the shim (and reports what it wrote) when you run
58
+ `dotnet-stryker` against a xunit.v3 project whose sources are clean, then blocks so
59
+ you re-run from the shim dir; when the sources are **not** clean it presents the
60
+ Step 1a operator gate instead of scaffolding. Build proactively rather than relying
61
+ on the interception. (The guard **exempts** an explicit `-t mtp` run — the no-shim floor — so it is not forced into a shim; see the Scope section.) Within `mutation-kill` the feasibility gate may still degrade to that floor after the shim is built and probed.
62
+
63
+ One precondition decides whether the shim is cheap: source compatibility with
64
+ xunit.v2. `[Fact]`, `[Theory]`, `[InlineData]`, `TheoryData<>`, `MemberData`,
65
+ `ClassData`, and `Assert.*` are source-identical between v2 and v3, so a plain
66
+ suite ports in minutes. `AutoFixture.Xunit3` `[AutoData]`/`[InlineAutoData]` are
67
+ **not** v2-compatible. The Step 1 scope probe quantifies how much of that a suite
68
+ has; when there is any, Step 1a's operator gate decides what to do about it —
69
+ "say so and stop" is not yours to choose, it is one of four options the operator
70
+ picks between.
71
+
72
+ ## Canonical invocations — copy these, don't improvise
73
+
74
+ Every command below is written to run **from the repository root** unless it says
75
+ otherwise. Guessing at the working directory or at a flag that doesn't exist is
76
+ the single biggest source of retried commands here ([#1777](https://github.com/bdfinst/agentic-dev-team/issues/1777)), so paste these and
77
+ substitute only `<TestProject>`.
78
+
79
+ ```bash
80
+ # Detect (repo root) — a test .csproj referencing xunit.v3 is the whole check
81
+ git grep -l 'Include="xunit.v3"' -- '*.csproj'
82
+
83
+ # Scope probe (repo root) — every hit is a file the operator gate will ask about
84
+ git grep -n 'AutoFixture.Xunit3\|\[AutoData\|InlineAutoData\|AutoMoqData\|MemberAutoData' -- '*.cs'
85
+ git grep -n 'TestContext\|Assert.Skip\|Assert.Multiple\|Assert.Equivalent\|ValueTask InitializeAsync' -- '*.cs'
86
+
87
+ # Green baseline (repo root) — expect the SAME test count as the real project, 0 failed
88
+ dotnet build tests/<TestProject>.Mutation -c Release
89
+ dotnet test tests/<TestProject>.Mutation -c Release --no-build
90
+
91
+ # Mutation run — the ONLY correct form: from the shim dir, no arguments
92
+ cd tests/<TestProject>.Mutation
93
+ dotnet-stryker
94
+
95
+ # No-shim floor (from the REAL test project dir) — set "coverage-analysis": "off"
96
+ # in stryker-config.json first; it is config-file-only, there is no CLI flag
97
+ cd tests/<TestProject>
98
+ dotnet-stryker -t mtp
99
+ ```
100
+
101
+ Three invocations that look right, fail, and get retried:
102
+
103
+ | Don't | Do instead | Why |
104
+ |---|---|---|
105
+ | `dotnet-stryker` at the repo root | `cd tests/<TestProject>.Mutation && dotnet-stryker` | A root run auto-detects the `.sln`, enters solution mode, and binds to the real xunit.v3 project → false ~0% |
106
+ | `dotnet-stryker --solution ../../App.sln` (or a `SolutionPath` in the shim's config) | omit it entirely — `test-projects` in the shim's `stryker-config.json` is the selection | With both set Stryker enumerates the solution and prefers the v3 project over the shim (the SolutionPath trap, [#557](https://github.com/bdfinst/agentic-dev-team/issues/557)) |
107
+ | `dotnet-stryker --coverage-analysis off` | set `"coverage-analysis"` in `stryker-config.json` | `coverage-analysis` is **config-file-only** in Stryker.NET 4.15 — there is no CLI flag, so the run dies on an unknown option |
108
+
109
+ Shim *selection* is not a command-line argument at all: it is the cwd having no
110
+ `.sln` (project mode) plus the `test-projects` entry the generator wrote. If a
111
+ run reports the observation-failure signature from a shim directory, check those
112
+ two before reaching for a flag.
113
+
114
+ ## Workflow
115
+
116
+ ### Read before editing
117
+
118
+ Before editing an artifact this workflow has already produced, read it first — each of these only exists once the workflow has reached the step that creates it, so don't expect all three on the proactive, before-the-first-run path:
119
+
120
+ - the mutant-survivors report (`StrykerOutput/<timestamp>/reports/mutation-report.json`) — once a Stryker run has completed
121
+ - the shim config (`stryker-config.json`) — once Step 2 has created it
122
+ - the step files (the shim's linked test source files) — once they exist on disk
123
+
124
+ **Converged-state check.** Compare each file's current content against the
125
+ target state described in the step you're about to run before editing it.
126
+ If a file already matches its target state, skip re-editing it — do not
127
+ overwrite a file that has already converged.
128
+
129
+ ### Step 1 — Scope probe (decide whether the shim is cheap)
130
+
131
+ Run against the branch under test to find v3-only usage that would need porting:
132
+
133
+ ```bash
134
+ # v3-incompatible attribute usage in test sources
135
+ git grep -l "AutoFixture.Xunit3\|\[AutoData\|InlineAutoData\|AutoMoqData\|MemberAutoData" -- 'tests/**/*.cs'
136
+ # other v3-only APIs
137
+ git grep -l "TestContext\|Assert.Skip\|Assert.Multiple\|IAsyncLifetime\|Assert.Equivalent" -- 'tests/**/*.cs'
138
+ ```
139
+
140
+ Each hit is a file the operator gate below will ask about. **Zero hits → the shim
141
+ builds unattended, proceed to Step 2.** Any hits → Step 1a; do not decide for the
142
+ operator, and in particular do not quietly conclude the approach "isn't a good
143
+ fit" — that is one of four options, and it is theirs to pick.
144
+
145
+ ### Step 1a — Operator gate (always-ask; you cannot skip it)
146
+
147
+ When the probe finds shim-breaking constructs, the operator chooses how to
148
+ proceed. This is enforced, not advisory: `stryker_xunit_shim_guard.py` blocks
149
+ every `dotnet-stryker` invocation against that project until a choice is
150
+ **recorded**, so paraphrasing the gate or picking on the operator's behalf does
151
+ not get the run through ([#1791](https://github.com/bdfinst/agentic-dev-team/issues/1791)).
152
+
153
+ The block body is the question, already assembled: the per-construct breakdown
154
+ from [`xunit_v3_feature_detector.py`](../mutation-testing/scripts/xunit_v3_feature_detector.py) (which construct, translatable or
155
+ not, coverage-bearing or neutral, with file and line), the four options with
156
+ their tradeoffs, and the exact `record` command carrying this blocker set's
157
+ fingerprint. Present the four options to the operator with `AskUserQuestion`,
158
+ then run the printed command verbatim — the fingerprint is per-blocker-set, so
159
+ don't reuse one from an earlier run.
160
+
161
+ | Choice | What happens next |
162
+ |---|---|
163
+ | `port` | Rewrite the flagged constructs to v2-compatible forms (Step 3). The guard auto-scaffolds once the sources are clean. |
164
+ | `exclude` | The guard scaffolds with `--compile-exclude` on the flagged files. They stay **unmeasured** — their mutants report as survivors. |
165
+ | `skip` | Deactivate just the offending tests, then re-run. Clears the gate **only** where the deactivation removes the construct itself (`[Fact(Explicit = true)]` → `[Fact(Skip = "…")]`); a construct in a test body or on a data attribute stays in the source the shim compiles, so those need `port` or `exclude`. Undo at teardown. |
166
+ | `degrade` | Skip the shim; run the no-shim floor (`-t mtp`, `coverage-analysis: off`) for one slow advisory pass. Only relevant below 5.0.0 — this whole gate is bypassed on a known >= 5.0.0 install (see Version scope above). |
167
+
168
+ The fingerprint is **mandatory** — it is what scopes a decision to the blockers
169
+ the operator actually saw. Add a new blocking file after they answered and the
170
+ gate **re-asks**. A reply matching none of the four is re-asked with the same
171
+ four; never default or guess.
172
+
173
+ ### Step 2 — Scaffold the shim project
174
+
175
+ Use the bundled script — it reads the real test `.csproj` and writes the shim
176
+ `.csproj` (mirroring every non-xunit `PackageReference` verbatim, swapping in the
177
+ xunit.v2 stack, setting `RootNamespace`/`AssemblyName`, adding the linked-`Compile`
178
+ glob and the product `ProjectReference`) plus a `stryker-config.json`:
179
+
180
+ ```bash
181
+ python3 "${CLAUDE_PLUGIN_ROOT}/skills/stryker-xunit-v2-shim/scripts/generate_shim.py" tests/<TestProject>/<TestProject>.csproj \
182
+ --mutate-exclude '**/gRPC/**/*.cs' --mutate-exclude '**/Caching/**/*.cs'
183
+ ```
184
+
185
+ It creates `tests/<TestProject>.Mutation/` beside the real project. Pass
186
+ `--mutate-exclude` for each product folder that's genuinely out of mutation scope
187
+ (generated code, gRPC stubs, etc.); omit if none.
188
+
189
+ Why these choices matter, so you can fix the file by hand if the script's
190
+ heuristics miss something in an unusual `.csproj`:
191
+
192
+ - **`RootNamespace` must equal the real project's root namespace** — the linked
193
+ sources resolve the same types, so a mismatch breaks compilation.
194
+ - **`AssemblyName` must differ** (`.Mutation`) so both projects coexist.
195
+ - **Non-xunit package versions must match exactly** — a version drift causes
196
+ compile errors in the linked sources.
197
+ - **Keep the shim out of the `.sln`** (see Step 4 — this is what forces project
198
+ mode). Do not `dotnet sln add` it.
199
+
200
+ ### Step 3 — Port v3-only constructs (only files Step 1 flagged)
201
+
202
+ Rewrite v3-only APIs to behavior-equivalent v2-compatible forms, **in the real
203
+ test project's sources** (the shim links those same files, so one edit satisfies
204
+ both). Verify each replacement still compiles under v3 too.
205
+
206
+ | v3-only | v2-compatible replacement |
207
+ |---|---|
208
+ | `TestContext.Current.CancellationToken` | `CancellationToken.None` (token was never cancelled for a passing test) |
209
+ | `[AutoData]` / `[InlineAutoData]` | manual `new Fixture()` in the body, or `[Theory]` + `[InlineData]` — heavier; avoid the shim if pervasive |
210
+ | `Assert.Skip(...)` | `[Fact(Skip="…")]` or a guard-and-return |
211
+
212
+ ### Step 3a — Grant internals access
213
+
214
+ If the product exposes internals to the real test assembly via
215
+ `InternalsVisibleTo`, add the shim assembly too (its tests exercise `internal`
216
+ types):
217
+
218
+ ```csharp
219
+ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("<TestProject>.Mutation")]
220
+ ```
221
+
222
+ ### Step 4 — Run Stryker FROM the shim directory (the critical part)
223
+
224
+ ```bash
225
+ cd tests/<TestProject>.Mutation
226
+ dotnet-stryker
227
+ ```
228
+
229
+ **This directory choice is the whole game.** A bare `dotnet-stryker` at repo root
230
+ auto-detects the single `.sln`, enters **solution mode**, ignores test-project
231
+ selection, and binds to the real xunit.v3 project → false ~0%. Running from a
232
+ directory with **no `.sln`** forces **project mode**: Stryker uses the shim in the
233
+ cwd and finds the product through its `ProjectReference`. The `stryker-config.json`
234
+ the script wrote (with `coverage-analysis: perTest` and `additional-timeout:
235
+ 30000`) lives beside the shim; perTest mode is required for kill observation and
236
+ the raised timeout keeps slow mutants from being scored as timeouts.
237
+
238
+ ### Step 5 — Validate BEFORE the full run
239
+
240
+ A full run can take hours; a wrong harness wastes all of it. Two gates:
241
+
242
+ 1. **Green baseline** — the shim builds and every test passes:
243
+ ```bash
244
+ dotnet build tests/<TestProject>.Mutation -c Release
245
+ dotnet test tests/<TestProject>.Mutation -c Release --no-build
246
+ # expect the SAME test count as the real project, 0 failed
247
+ ```
248
+ 2. **Kills register** — temporarily scope `mutate` to one small, well-covered file
249
+ and run Stryker from the shim dir. Expect a **non-zero** score with real kills.
250
+ If this scoped run is still ~0%, the harness is wrong — **do not launch the full
251
+ run**; recheck the directory (Step 4) and the shim references.
252
+
253
+ ### Step 6 — Launch the full run, then sanity-check
254
+
255
+ Widen `mutate` back to the full scope and launch. A full Stryker run is
256
+ long-running — start it in the background and watch it (a Monitor plus a periodic
257
+ status check), rather than blocking on it. If the periodic check is a scheduled
258
+ wake-up, follow the calling contract in
259
+ [`knowledge/long-run-waiting.md`](../../knowledge/long-run-waiting.md) — a
260
+ wake-up armed without its replay instruction schedules nothing.
261
+
262
+ Before recording any score, **reject the observation-failure signature**: a
263
+ near-zero score with almost everything *Survived* means it bound to the v3 project
264
+ again — rerun from the shim dir. A healthy run kills the majority of covered
265
+ mutants. Output lands at
266
+ `StrykerOutput/<timestamp>/reports/mutation-report.{html,json}`.
267
+
268
+ ## Teardown
269
+
270
+ The shim, its `stryker-config.json`, the `InternalsVisibleTo` line, and any v3→v2
271
+ source ports are **measurement scaffolding**. If you were measuring a throwaway
272
+ branch/worktree, discard it. If the shim lives in the repo, keep it **out of the
273
+ `.sln` and out of CI test discovery** so it never runs as a normal suite and never
274
+ double-counts.
@@ -0,0 +1,256 @@
1
+ # Building a xunit.v2 Stryker shim for a xunit.v3 test project
2
+
3
+ How to make Stryker.NET produce a valid mutation score for a project whose real
4
+ test suite is **xunit.v3**. This is the full reference behind the
5
+ `stryker-xunit-v2-shim` skill; read it when an edge case isn't covered by
6
+ `SKILL.md`.
7
+
8
+ ---
9
+
10
+ ## 1. Why the shim exists
11
+
12
+ Stryker.NET (through at least 4.15/4.16) **cannot observe mutant kills through
13
+ xunit.v3.** xunit.v3 runs on the Microsoft Testing Platform (MTP), and Stryker's
14
+ per-test coverage/kill mapping does not work across it (stryker-net issues
15
+ 3237, 3629, 3094). Symptom: the run completes but nearly every mutant is reported
16
+ *Survived*, e.g. **0.13% (3 killed / 7,685 survived)** — the *observation-failure
17
+ signature*. The initial test run passes and coverage filters even fire, so the
18
+ failure is silent unless you sanity-check the score.
19
+
20
+ The fix is a **shim**: a second test project that recompiles the *same test
21
+ source files* under **xunit.v2** (classic VSTest), which Stryker observes
22
+ correctly. No test is rewritten — the shim links the existing `.cs` files.
23
+
24
+ **Precondition that makes this cheap:** the test sources must be
25
+ source-compatible with xunit.v2. `[Fact]`, `[Theory]`, `[InlineData]`,
26
+ `TheoryData<>`, `MemberData`, `ClassData`, and `Assert.*` are all source-identical
27
+ between v2 and v3. Only genuinely v3-only constructs need porting (see step 4).
28
+ AutoFixture.Xunit3 `[AutoData]`/`[InlineAutoData]` attributes are **not**
29
+ v2-compatible; if the suite uses them heavily, this approach needs more work.
30
+
31
+ ---
32
+
33
+ ## 2. When to build / use it
34
+
35
+ Trigger conditions (all true):
36
+
37
+ - The target test project references `xunit.v3` (check its `.csproj`).
38
+ - You need a Stryker mutation score for it.
39
+ - The test sources are mostly plain xunit (grep confirms few/no `[AutoData]`,
40
+ `AutoFixture.Xunit3`, `TestContext`, `Assert.Skip`, `Assert.Multiple`,
41
+ `IAsyncLifetime` usages).
42
+
43
+ Quick scope probe (run against the branch under test):
44
+
45
+ ```bash
46
+ # v3-incompatible attribute usage in test .cs sources
47
+ git grep -l "AutoFixture.Xunit3\|\[AutoData\|InlineAutoData\|AutoMoqData\|MemberAutoData" -- 'tests/**/*.cs'
48
+ # other v3-only APIs
49
+ git grep -l "TestContext\|Assert.Skip\|Assert.Multiple\|IAsyncLifetime\|Assert.Equivalent" -- 'tests/**/*.cs'
50
+ ```
51
+
52
+ Each hit is a file the operator gate asks about. Zero hits → this is a ~10-minute
53
+ unattended job.
54
+
55
+ ### 2a. The operator gate, recorded (#1791)
56
+
57
+ Any hit means the operator picks between `port`, `exclude`, `skip`, and
58
+ `degrade`, and `stryker_xunit_shim_guard.py` blocks every `dotnet-stryker` run
59
+ against that project until the choice is recorded. The guard's block body prints
60
+ the classified breakdown, the four tradeoffs, and the exact command to run —
61
+ including the fingerprint of *this* blocker set. Its shape:
62
+
63
+ ```bash
64
+ sh "$CLAUDE_PLUGIN_ROOT/hooks/py.sh" \
65
+ "$CLAUDE_PLUGIN_ROOT/hooks/lib/xunit_v3_operator_gate.py" record \
66
+ --project <TestProject> --choice exclude --fingerprint <from-the-block-body>
67
+ ```
68
+
69
+ Prefer the command the guard printed (absolute paths, correct fingerprint) over
70
+ retyping this. `--fingerprint` is **required** — it is what scopes a decision to
71
+ the blockers the operator actually saw. Omitting it is rejected outright rather
72
+ than writing a blanket record that would silently cover blockers added later;
73
+ reuse a stale one and the gate re-asks. Add `--file <path>` per flagged file and
74
+ `--note "<why>"` to leave the rationale in the record. `check --project
75
+ <TestProject>` prints the stored decision and exits non-zero when there is none.
76
+
77
+ Recorded decisions live in `.claude/metrics/xunit-v3-shim-decisions.json` —
78
+ no path override (#1870 dropped `DEV_TEAM_XUNIT3_SHIM_DECISION_FILE`
79
+ entirely). Both the write and every later honor of a recorded decision emit a
80
+ `boundary-events.jsonl` entry, so a self-recorded choice stays visible in the
81
+ audit stream.
82
+
83
+ ---
84
+
85
+ ## 3. Build the shim project
86
+
87
+ Create `tests/<TestProject>.Mutation/<TestProject>.Mutation.csproj` next to the
88
+ real test project. It has **no `.cs` of its own** — it links the real project's
89
+ sources. (The bundled [`generate_shim.py`](../scripts/generate_shim.py) writes this
90
+ for you; the template below is what it emits and what to hand-fix for an unusual
91
+ `.csproj`.)
92
+
93
+ ```xml
94
+ <Project Sdk="Microsoft.NET.Sdk">
95
+
96
+ <!-- xunit.v2 shim of <TestProject> for Stryker.NET.
97
+ Delete once stryker-net fixes MTP mutation observation
98
+ (issues 3237, 3629, 3094). -->
99
+
100
+ <PropertyGroup>
101
+ <TargetFramework>net10.0</TargetFramework> <!-- match the test project's TFM -->
102
+ <IsPackable>false</IsPackable>
103
+ <RootNamespace><TestProject></RootNamespace> <!-- SAME namespace as the real project -->
104
+ <AssemblyName><TestProject>.Mutation</AssemblyName> <!-- distinct assembly name -->
105
+ <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
106
+ <NoWarn>$(NoWarn);IDE0028;RCS1163;CS8032;NU1701</NoWarn>
107
+ <GenerateProgramFile>true</GenerateProgramFile>
108
+ </PropertyGroup>
109
+
110
+ <ItemGroup>
111
+ <!-- Mirror EVERY non-xunit package from the real test project at the SAME
112
+ versions (AutoFixture, Moq, assertion lib, Grpc.Core.Testing, any
113
+ private/internal deps). Swap the xunit stack for v2: -->
114
+ <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.11.1" />
115
+ <PackageReference Include="xunit" Version="2.9.2" />
116
+ <PackageReference Include="xunit.runner.visualstudio" Version="2.8.2">
117
+ <PrivateAssets>all</PrivateAssets>
118
+ <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
119
+ </PackageReference>
120
+ <!-- Do NOT reference xunit.v3 or AutoFixture.Xunit3 here. -->
121
+ </ItemGroup>
122
+
123
+ <ItemGroup>
124
+ <ProjectReference Include="..\..\src\<Product>\<Product>.csproj" />
125
+ </ItemGroup>
126
+
127
+ <ItemGroup>
128
+ <!-- Link the real test project's sources; exclude build output. -->
129
+ <Compile Include="..\<TestProject>\**\*.cs"
130
+ Exclude="..\<TestProject>\obj\**\*.cs;..\<TestProject>\bin\**\*.cs">
131
+ <Link>Linked\%(RecursiveDir)%(FileName)%(Extension)</Link>
132
+ </Compile>
133
+ </ItemGroup>
134
+
135
+ </Project>
136
+ ```
137
+
138
+ Key points:
139
+
140
+ - **`RootNamespace` must equal the real project's root namespace** so linked
141
+ sources resolve the same types.
142
+ - **`AssemblyName` must differ** (`.Mutation`) so both projects can coexist.
143
+ - **Mirror non-xunit package versions exactly** — a version drift causes compile
144
+ errors in the linked sources.
145
+ - Do **not** add the shim to the `.sln` (see step 5 for why).
146
+
147
+ ### 3a. Grant internals access
148
+
149
+ If the product uses `InternalsVisibleTo` for the real test assembly, add the shim
150
+ assembly too (the shim tests exercise `internal` types):
151
+
152
+ ```csharp
153
+ [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("<TestProject>.Mutation")]
154
+ ```
155
+
156
+ ---
157
+
158
+ ## 4. Port v3-only constructs (only the files step 2 flagged)
159
+
160
+ Rewrite v3-only APIs to v2-compatible, behavior-equivalent forms. Common cases:
161
+
162
+ | v3-only | v2-compatible replacement | Notes |
163
+ |---|---|---|
164
+ | `TestContext.Current.CancellationToken` | `CancellationToken.None` | Equivalent for passing tests; the token was never cancelled |
165
+ | `[AutoData]` / `[InlineAutoData]` (AutoFixture.Xunit3) | manual `new Fixture()` in the test body, or convert to `[Fact]`/`[Theory]+[InlineData]` | Heavier; avoid this shim if pervasive |
166
+ | `Assert.Skip(...)` | `[Fact(Skip="…")]` or guard-and-return | |
167
+
168
+ Port **in the real test project's source** — the shim links those same files, so
169
+ one edit satisfies both. Verify the replacement still compiles under v3 too
170
+ (`CancellationToken.None` does).
171
+
172
+ ---
173
+
174
+ ## 5. Invoke Stryker against the shim (the critical part)
175
+
176
+ **Run `dotnet-stryker` FROM the shim's project directory**, with a
177
+ `stryker-config.json` beside it:
178
+
179
+ ```bash
180
+ cd tests/<TestProject>.Mutation
181
+ dotnet-stryker
182
+ ```
183
+
184
+ Why this and not a bare run at repo root:
185
+
186
+ - The repo root has a single `.sln` that does **not** contain the shim. A bare
187
+ `dotnet-stryker` at root **auto-detects the `.sln`, enters solution mode,
188
+ ignores `test-projects`, and binds to the real xunit.v3 project** → false ~0%.
189
+ - Running from a directory with **no `.sln`** forces **project mode**: Stryker
190
+ uses the test project in the cwd (the shim) and finds the product via its
191
+ `ProjectReference`.
192
+
193
+ `stryker-config.json` (place in the shim directory):
194
+
195
+ ```json
196
+ {
197
+ "stryker-config": {
198
+ "mutate": ["**/*.cs", "!obj/**/*.cs", "!**/gRPC/**/*.cs", "!**/Caching/**/*.cs"],
199
+ "mutation-level": "Standard",
200
+ "coverage-analysis": "perTest",
201
+ "additional-timeout": 30000,
202
+ "target-framework": "net10.0",
203
+ "reporters": ["html", "json", "progress"],
204
+ "thresholds": { "high": 80, "low": 60, "break": 0 }
205
+ }
206
+ }
207
+ ```
208
+
209
+ (Adjust the `mutate` excludes to the product's own out-of-scope folders.)
210
+
211
+ ---
212
+
213
+ ## 6. Validate BEFORE the full run
214
+
215
+ A full run can take hours; a wrong harness wastes all of it. Two gates:
216
+
217
+ 1. **Green baseline** — the shim must build and all tests pass:
218
+ ```bash
219
+ dotnet build tests/<TestProject>.Mutation/<TestProject>.Mutation.csproj -c Release
220
+ dotnet test tests/<TestProject>.Mutation/<TestProject>.Mutation.csproj -c Release --no-build
221
+ # expect the same test count as the real project, 0 failed
222
+ ```
223
+ 2. **Kills register** — scope `mutate` to one small, well-covered file and run
224
+ Stryker from the shim dir. Expect a *non-zero* score with real kills:
225
+ ```json
226
+ { "stryker-config": { "mutate": ["**/Extensions/DecimalExtensions.cs"],
227
+ "coverage-analysis": "perTest", "reporters": ["json","progress"] } }
228
+ ```
229
+ A healthy scoped run produces real kills (e.g. **5 killed / 4 survived →
230
+ 55.56%**) — proof observation works. If this scoped run shows ~0%, the harness
231
+ is still wrong; do **not** launch the full run.
232
+
233
+ Then widen `mutate` to the full scope and launch the full run in the background,
234
+ with periodic status monitoring rather than blocking on it.
235
+
236
+ ---
237
+
238
+ ## 7. Sanity-check the result
239
+
240
+ Before recording any score, reject the observation-failure signature: a
241
+ near-zero score with almost everything *Survived* means the run bound to the v3
242
+ project — rerun from the shim dir. A healthy run kills the majority of covered
243
+ mutants (a real example from this technique: **57.44%**, 4,419 killed / 2,209
244
+ survived / 1 timeout of 6,629 tested).
245
+
246
+ Output lives at `StrykerOutput/<timestamp>/reports/mutation-report.{html,json}`.
247
+
248
+ ---
249
+
250
+ ## 8. Teardown
251
+
252
+ The shim, its `stryker-config.json`, the `InternalsVisibleTo` line, and any v3→v2
253
+ source ports are **measurement scaffolding**. If measuring a branch you won't
254
+ merge (e.g. a worktree baseline), discard the worktree. If the shim is meant to
255
+ live in the repo, keep it out of the `.sln` and out of CI test discovery so it
256
+ isn't run as a normal suite.