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,14 @@
1
+ {
2
+ "name": "pbt-js-roundtrip-fixture",
3
+ "private": true,
4
+ "version": "0.0.0",
5
+ "description": "Fixture project for /property-based-testing's fast-check (JS/TS) path (#2190) — see ../../references/languages/javascript.md",
6
+ "type": "module",
7
+ "scripts": {
8
+ "test": "vitest run"
9
+ },
10
+ "devDependencies": {
11
+ "fast-check": "^4.10.2",
12
+ "vitest": "^5.0.1"
13
+ }
14
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Fixture module for the fast-check round-trip property path (#2190).
3
+ *
4
+ * Exposes `encode`/`decode` as named exports — the same literal-name
5
+ * round-trip heuristic `hypothesis_scaffold.py`'s Python path looks for
6
+ * (see `../roundtrip_fixture.py`), mirrored here for the JS/TS path
7
+ * documented in `../../references/languages/javascript.md`.
8
+ *
9
+ * `decode(encode(value)) === value` holds for any string because reversal
10
+ * is its own inverse.
11
+ */
12
+
13
+ /**
14
+ * Encode a string by reversing it.
15
+ * @param {string} value
16
+ * @returns {string}
17
+ */
18
+ export function encode(value) {
19
+ return [...value].reverse().join('');
20
+ }
21
+
22
+ /**
23
+ * Decode a string produced by encode() by reversing it back.
24
+ * @param {string} value
25
+ * @returns {string}
26
+ */
27
+ export function decode(value) {
28
+ return [...value].reverse().join('');
29
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Generated fast-check property test — round-trip property for
3
+ * encode/decode. Shape documented in
4
+ * ../../references/languages/javascript.md; do not hand-edit, regenerate if
5
+ * roundtrip.js changes.
6
+ */
7
+ import { describe, it } from 'vitest';
8
+ import fc from 'fast-check';
9
+
10
+ import { encode, decode } from './roundtrip.js';
11
+
12
+ describe('encode/decode round-trip property', () => {
13
+ it('decode(encode(x)) === x for any string', () => {
14
+ fc.assert(fc.property(fc.string(), (x) => decode(encode(x)) === x));
15
+ });
16
+ });
@@ -0,0 +1,10 @@
1
+ """Fixture module for hypothesis_scaffold.py's negative case (#2190).
2
+
3
+ `add_one` has no round-trip counterpart and no documented postcondition, so
4
+ neither heuristic matches — the scaffold should derive no property for it.
5
+ """
6
+
7
+
8
+ def add_one(value: int) -> int:
9
+ """Add one to a value."""
10
+ return value + 1
@@ -0,0 +1,16 @@
1
+ """Fixture module for hypothesis_scaffold.py's round-trip heuristic (#2190).
2
+
3
+ Exposes a module-level `encode`/`decode` pair by name — the exact literal
4
+ names the scaffold's heuristic looks for. `decode(encode(x)) == x` holds for
5
+ any string because reversal is its own inverse.
6
+ """
7
+
8
+
9
+ def encode(value: str) -> str:
10
+ """Encode a string by reversing it."""
11
+ return value[::-1]
12
+
13
+
14
+ def decode(value: str) -> str:
15
+ """Decode a string produced by encode() by reversing it back."""
16
+ return value[::-1]
@@ -0,0 +1,54 @@
1
+ # Property-Based Testing — JavaScript / TypeScript (fast-check)
2
+
3
+ Tool: [fast-check](https://fast-check.dev/). Detection: `package.json`/`tsconfig.json` present — project-init's own JS/TS stack-detection signal (see [`SKILL.md` → Step 1](../../SKILL.md#step-1-detect-the-target-language-reuse-project-init-never-re-derive); this doc never re-derives it).
4
+
5
+ This is the JS/TS equivalent of [Step 4.1's Python scaffold](../../scripts/hypothesis_scaffold.py) (`hypothesis` → `fast-check`). Same narrow, explicit heuristic — do not extend without updating this doc:
6
+
7
+ 1. **Round-trip** — the target module exports both a function literally named `encode` and one literally named `decode` (named exports, or both methods on the same exported class/object) and the requested function is one of that pair. Generates a test asserting `decode(encode(x)) === x`.
8
+ 2. **Invariant** — the target function's JSDoc contains a recognized postcondition phrase (the same phrase list as the Python path — `returns sorted`, `is idempotent`) documented near a type signature (a `@param`/`@returns` JSDoc tag, or a TypeScript type annotation on the function). Generates a test asserting that invariant.
9
+ 3. **Neither matches** — no file is written; report the exact same "No property derived" message [Step 4.1](../../scripts/hypothesis_scaffold.py) defines (`NO_PROPERTY_MESSAGE`), substituting the target function name — this doc does not define a second copy of that message.
10
+
11
+ This is deliberately narrow, matching the Python path's own stated scope — not a general contract-inference engine.
12
+
13
+ ## Install / detect
14
+
15
+ Per [`SKILL.md` → Step 3](../../SKILL.md#step-3-install-the-property-testing-tool-if-missing): `npm install --save-dev fast-check`, mirroring project-init's existing `npm` devDependency install shape for `oxlint`/`@playwright/test` — never a global/user-level install. Confirm it resolved:
16
+
17
+ ```bash
18
+ npm ls fast-check
19
+ ```
20
+
21
+ ## Generation approach
22
+
23
+ Emit a runnable `<name>.properties.test.js` using `fc.assert(fc.property(...))`, run via this repo's JS test runner convention (`npx vitest run`, per [project-init's own generated `vitest.config.js`](../../../project-init/SKILL.md) — see [`fixtures/js-roundtrip/`](../../fixtures/js-roundtrip/) for a working example project):
24
+
25
+ ```js
26
+ import { describe, it } from 'vitest';
27
+ import fc from 'fast-check';
28
+
29
+ import { encode, decode } from './roundtrip.js';
30
+
31
+ describe('encode/decode round-trip property', () => {
32
+ it('decode(encode(x)) === x for any string', () => {
33
+ fc.assert(fc.property(fc.string(), (x) => decode(encode(x)) === x));
34
+ });
35
+ });
36
+ ```
37
+
38
+ An invariant test follows the same `fc.assert(fc.property(<arbitrary>, (value) => <assertion>))` shape, with the arbitrary chosen from the target's parameter type the same narrow way Step 4.1's `_STRATEGY_BY_ANNOTATION` map picks a Hypothesis strategy (e.g. a `number[]` parameter → `fc.array(fc.integer())`; no recognized annotation → `fc.string()`).
39
+
40
+ ## Test determinism & the vendoring boundary
41
+
42
+ `fast-check` (and its own only dependency, `pure-rand`) is **vendored into this fixture's checked-in `node_modules`** rather than installed live during a test run — this repo's deterministic-tooling standard, the same posture `chk_python_ceiling` takes as `exempt`-but-still-treated-as-blocking in [`.github/required-status-checks.json`](../../../../../../.github/required-status-checks.json). Both packages are pure JS with no native/platform-specific binaries (~1.8M total), so the vendored copy is byte-identical on every dev machine and CI runner. See [`fixtures/js-roundtrip/README.md`](../../fixtures/js-roundtrip/README.md) for the exact `git add -f` mechanics (the repo-root `.gitignore`'s blanket `node_modules/` rule otherwise excludes it, and a nested `.gitignore` cannot un-ignore a directory a parent `.gitignore` already excludes).
43
+
44
+ `vitest` itself is **not** vendored — newer vitest pulls in platform-native binaries (`@rolldown/binding-<platform>`, `lightningcss-<platform>`) that would silently break on a different host OS/arch than whatever built the vendored copy (this repo's CI is `ubuntu-*`, but maintainers develop on macOS). Resolving `vitest` via `npx vitest run` is project-init's own normal live-install path for the project's test runner, unaffected by this skill's own vendoring requirement — that requirement is scoped to `fast-check`, the property library this skill is actually generating tests against.
45
+
46
+ ## Fixture
47
+
48
+ [`fixtures/js-roundtrip/`](../../fixtures/js-roundtrip/) — a minimal project with `roundtrip.js` (an `encode`/`decode` pair, string reversal) and the fast-check test a scaffold targeting it would generate (`roundtrip.properties.test.js`). Runs green via:
49
+
50
+ ```bash
51
+ cd fixtures/js-roundtrip
52
+ npm install # fetches vitest; fast-check/pure-rand are already vendored
53
+ npx vitest run
54
+ ```
@@ -0,0 +1,80 @@
1
+ """Thin dispatch helper for /property-based-testing's SKILL.md procedure
2
+ (#2190, Step 4.2).
3
+
4
+ Language detection itself is NOT implemented here. `SKILL.md` runs
5
+ project-init's own stack-detection step first —
6
+ `${CLAUDE_PLUGIN_ROOT}/skills/project-init/SKILL.md` § "Step 1: Detect the
7
+ stack" — and passes its result into this module via `--language`. This
8
+ module only decides, from that already-detected value, whether the skill
9
+ can proceed: it never re-derives a language from project-init's own
10
+ manifest-file detection signals itself.
11
+
12
+ On an unsupported or missing language it prints the exact message the
13
+ Gherkin "Unsupported or undetected language" scenario requires and returns
14
+ a non-zero exit code, so `SKILL.md`'s procedure can stop with no partial
15
+ run. On a supported language it prints which generator the procedure
16
+ should dispatch to next and returns 0.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+
23
+ # The only two languages this skill scaffolds properties for today. `JS/TS`
24
+ # is project-init's own stack-detection display name (SKILL.md § "Step 1:
25
+ # Detect the stack") — this module matches it verbatim, never a spelled-out
26
+ # "JavaScript/TypeScript", since that is the actual value Step 1 hands this
27
+ # script. Python dispatches to Step 4.1's hypothesis_scaffold.py; JS/TS
28
+ # dispatches to the fast-check path (references/languages/javascript.md).
29
+ SUPPORTED_LANGUAGES = ("Python", "JS/TS")
30
+
31
+ UNSUPPORTED_MESSAGE = "Unsupported language: {language} — supported: Python, JS/TS."
32
+
33
+ _DISPATCH = {
34
+ "Python": "Hypothesis (scripts/hypothesis_scaffold.py)",
35
+ "JS/TS": "fast-check (references/languages/javascript.md)",
36
+ }
37
+
38
+
39
+ def is_supported(language: str | None) -> bool:
40
+ """True when `language` is one of the two languages this skill supports."""
41
+ return language in SUPPORTED_LANGUAGES
42
+
43
+
44
+ def unsupported_language_message(language: str | None) -> str:
45
+ """Render the exact unsupported-language message. `language` is the
46
+ value project-init's stack detection (see module docstring) returned —
47
+ `None`/empty when detection failed or returned nothing, in which case
48
+ the message interpolates the literal word "unknown"."""
49
+ return UNSUPPORTED_MESSAGE.format(language=language or "unknown")
50
+
51
+
52
+ def main(argv: list | None = None) -> int:
53
+ parser = argparse.ArgumentParser(
54
+ description=(
55
+ "Decide whether /property-based-testing can proceed for an "
56
+ "already-detected language (from project-init's stack "
57
+ "detection) and print the unsupported-language message when it "
58
+ "can't."
59
+ )
60
+ )
61
+ parser.add_argument(
62
+ "--language",
63
+ default=None,
64
+ help=(
65
+ "the language project-init's stack detection returned; omit "
66
+ "when detection failed or returned nothing"
67
+ ),
68
+ )
69
+ args = parser.parse_args(argv)
70
+
71
+ if not is_supported(args.language):
72
+ print(unsupported_language_message(args.language))
73
+ return 1
74
+
75
+ print(f"Detected {args.language} — dispatching to {_DISPATCH[args.language]}")
76
+ return 0
77
+
78
+
79
+ if __name__ == "__main__":
80
+ raise SystemExit(main())
@@ -0,0 +1,276 @@
1
+ """Hypothesis property-test scaffold for a single target Python function (#2190).
2
+
3
+ This module's own analysis is stdlib-only (`ast`), per ADR 0014 — no
4
+ third-party imports here. The *generated* test file it writes imports the
5
+ third-party `hypothesis` library; that import lives only in the emitted
6
+ file, never in this script.
7
+
8
+ Narrow, explicit heuristic (do not extend without updating this docstring):
9
+
10
+ 1. Round-trip: the target module defines a function literally named
11
+ `encode` and a function literally named `decode` — either both at module
12
+ level, or both as methods of the same class — and the requested function
13
+ is one of that pair. Generates a test asserting
14
+ `decode(encode(x)) == x`.
15
+ 2. Invariant: the target function's docstring contains a recognized
16
+ postcondition phrase (see `INVARIANT_PHRASES`) and the function carries
17
+ at least one type annotation (parameter or return) — the "near a type
18
+ hint" signal. Generates a test asserting that invariant.
19
+ 3. Neither matches: no file is written; the exact negative message is
20
+ printed to stdout.
21
+
22
+ This is deliberately narrow — it is not a general contract-inference
23
+ engine. Extending the phrase list or the type-annotation proximity check is
24
+ in scope; inferring arbitrary contracts from prose is not.
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import argparse
30
+ import ast
31
+ import os
32
+ from dataclasses import dataclass
33
+
34
+ # Postcondition phrase -> human label used only for readability; the phrase
35
+ # itself is the literal substring matched (case-insensitively) against the
36
+ # target function's docstring.
37
+ INVARIANT_PHRASES = ("returns sorted", "is idempotent")
38
+
39
+ NO_PROPERTY_MESSAGE = (
40
+ "No property derived for {function} — no round-trip pair or documented "
41
+ "invariant found nearby. Add a docstring postcondition (e.g. a 'returns "
42
+ "sorted'/'is idempotent'-style phrase) to make one derivable."
43
+ )
44
+
45
+ # Narrow annotation -> Hypothesis strategy expression map. Anything not
46
+ # listed here falls back to st.text() — this is not general type inference.
47
+ _STRATEGY_BY_ANNOTATION = {
48
+ "str": "st.text()",
49
+ "int": "st.integers()",
50
+ "float": "st.floats(allow_nan=False, allow_infinity=False)",
51
+ "bool": "st.booleans()",
52
+ "list[int]": "st.lists(st.integers())",
53
+ "List[int]": "st.lists(st.integers())",
54
+ }
55
+
56
+
57
+ @dataclass
58
+ class RoundTripProperty:
59
+ encode_name: str
60
+ decode_name: str
61
+ class_name: str | None = None
62
+
63
+
64
+ @dataclass
65
+ class InvariantProperty:
66
+ function_name: str
67
+ phrase: str
68
+
69
+
70
+ def _module_name(module_path: str) -> str:
71
+ """Derive the importable module name a generated test's `from {module}
72
+ import ...` line will use.
73
+
74
+ Raises `ValueError` when the basename isn't a valid Python identifier —
75
+ this value is interpolated unescaped into a generated test file's import
76
+ statement (`_render_roundtrip_test`/`_render_invariant_test`), so a
77
+ filename engineered to contain e.g. a newline could otherwise inject
78
+ arbitrary statements into a file pytest later collects and executes
79
+ (security-review finding). Every other interpolated value on that path
80
+ is already constrained to a safe shape: `encode`/`decode` are literals,
81
+ `class_name`/`function_name` are `ast.FunctionDef`/`ClassDef.name`
82
+ values (valid identifiers by construction), and `module_dir` is
83
+ `repr()`-escaped at render time.
84
+ """
85
+ base = os.path.basename(module_path)
86
+ name = base.removesuffix(".py")
87
+ if not name.isidentifier():
88
+ raise ValueError(
89
+ f"unsupported module filename {module_path!r}: {name!r} is not a "
90
+ "valid Python identifier, so it can't be used in a generated "
91
+ "test's import statement"
92
+ )
93
+ return name
94
+
95
+
96
+ def _parse_module(module_path: str) -> ast.Module:
97
+ with open(module_path, "r", encoding="utf-8") as handle:
98
+ source = handle.read()
99
+ return ast.parse(source, filename=module_path)
100
+
101
+
102
+ def _find_function(tree: ast.Module, name: str) -> ast.FunctionDef | None:
103
+ """Module-level functions only — deliberately not `ast.walk`, which
104
+ would also match a same-named method inside a class body. The invariant
105
+ render path assumes a module-level import (`from {module} import
106
+ {function_name}`), which is wrong for a method (no `self`/receiver, no
107
+ class import/instantiation) — see `find_roundtrip_pair` for the
108
+ separate, already class-aware handling the round-trip path has."""
109
+ for node in tree.body:
110
+ if isinstance(node, ast.FunctionDef) and node.name == name:
111
+ return node
112
+ return None
113
+
114
+
115
+ def find_roundtrip_pair(tree: ast.Module) -> RoundTripProperty | None:
116
+ """Locate a literal `encode`/`decode` pair at module level or as methods
117
+ of one class. Returns None when no such pair exists."""
118
+ module_level = {n.name for n in tree.body if isinstance(n, ast.FunctionDef)}
119
+ if "encode" in module_level and "decode" in module_level:
120
+ return RoundTripProperty(encode_name="encode", decode_name="decode")
121
+
122
+ for node in tree.body:
123
+ if isinstance(node, ast.ClassDef):
124
+ methods = {n.name for n in node.body if isinstance(n, ast.FunctionDef)}
125
+ if "encode" in methods and "decode" in methods:
126
+ return RoundTripProperty(
127
+ encode_name="encode", decode_name="decode", class_name=node.name
128
+ )
129
+ return None
130
+
131
+
132
+ def _has_nearby_type_hint(func: ast.FunctionDef) -> bool:
133
+ """Narrow proximity check: the function carries at least one type
134
+ annotation (a parameter or its return type)."""
135
+ if func.returns is not None:
136
+ return True
137
+ return any(arg.annotation is not None for arg in func.args.args)
138
+
139
+
140
+ def find_invariant(func: ast.FunctionDef) -> InvariantProperty | None:
141
+ docstring = ast.get_docstring(func) or ""
142
+ if not docstring or not _has_nearby_type_hint(func):
143
+ return None
144
+ lowered = docstring.lower()
145
+ for phrase in INVARIANT_PHRASES:
146
+ if phrase in lowered:
147
+ return InvariantProperty(function_name=func.name, phrase=phrase)
148
+ return None
149
+
150
+
151
+ def _first_arg_strategy(func: ast.FunctionDef) -> str:
152
+ args = func.args.args
153
+ if not args or args[0].annotation is None:
154
+ return "st.text()"
155
+ annotation_text = ast.unparse(args[0].annotation)
156
+ return _STRATEGY_BY_ANNOTATION.get(annotation_text, "st.text()")
157
+
158
+
159
+ def _render_roundtrip_test(
160
+ prop: RoundTripProperty, module_path: str, module_name: str
161
+ ) -> str:
162
+ module_dir = os.path.dirname(os.path.abspath(module_path))
163
+ if prop.class_name:
164
+ import_line = f"from {module_name} import {prop.class_name}"
165
+ setup = f" obj = {prop.class_name}()\n"
166
+ call_encode = f"obj.{prop.encode_name}(x)"
167
+ call_decode = "obj.{}({})".format(prop.decode_name, "encoded")
168
+ else:
169
+ import_line = f"from {module_name} import {prop.encode_name}, {prop.decode_name}"
170
+ setup = ""
171
+ call_encode = f"{prop.encode_name}(x)"
172
+ call_decode = f"{prop.decode_name}(encoded)"
173
+
174
+ return (
175
+ f'"""Generated by hypothesis_scaffold.py — round-trip property test\n'
176
+ f"for {prop.encode_name}/{prop.decode_name}. Do not hand-edit;\n"
177
+ f'regenerate via /property-based-testing if the source module changes.\n"""\n\n'
178
+ "import os\n"
179
+ "import sys\n\n"
180
+ f"sys.path.insert(0, {module_dir!r})\n\n"
181
+ "from hypothesis import given\n"
182
+ "from hypothesis import strategies as st\n\n"
183
+ f"{import_line}\n\n\n"
184
+ "@given(st.text())\n"
185
+ f"def test_{prop.encode_name}_{prop.decode_name}_roundtrip(x):\n"
186
+ f"{setup}"
187
+ f" encoded = {call_encode}\n"
188
+ f" assert {call_decode} == x\n"
189
+ )
190
+
191
+
192
+ def _render_invariant_test(
193
+ prop: InvariantProperty, func: ast.FunctionDef, module_path: str, module_name: str
194
+ ) -> str:
195
+ module_dir = os.path.dirname(os.path.abspath(module_path))
196
+ strategy_expr = _first_arg_strategy(func)
197
+ if prop.phrase == "returns sorted":
198
+ assertion = (
199
+ f" result = {prop.function_name}(value)\n"
200
+ " assert result == sorted(result)\n"
201
+ )
202
+ elif prop.phrase == "is idempotent":
203
+ assertion = (
204
+ f" once = {prop.function_name}(value)\n"
205
+ f" twice = {prop.function_name}(once)\n"
206
+ " assert twice == once\n"
207
+ )
208
+ else: # pragma: no cover - defensive, INVARIANT_PHRASES is exhaustive above
209
+ assertion = f" {prop.function_name}(value)\n"
210
+
211
+ return (
212
+ f'"""Generated by hypothesis_scaffold.py — invariant property test\n'
213
+ f'for {prop.function_name} ("{prop.phrase}"). Do not hand-edit;\n'
214
+ f'regenerate via /property-based-testing if the source module changes.\n"""\n\n'
215
+ "import sys\n\n"
216
+ f"sys.path.insert(0, {module_dir!r})\n\n"
217
+ "from hypothesis import given\n"
218
+ "from hypothesis import strategies as st\n\n"
219
+ f"from {module_name} import {prop.function_name}\n\n\n"
220
+ f"@given({strategy_expr})\n"
221
+ f"def test_{prop.function_name}_invariant(value):\n"
222
+ f"{assertion}"
223
+ )
224
+
225
+
226
+ def scaffold(module_path: str, function_name: str, out_dir: str) -> str | None:
227
+ """Analyze `module_path` for a property involving `function_name`.
228
+
229
+ On a match, writes `test_<function_name>_properties.py` into `out_dir`
230
+ and returns its path. On no match, prints the exact negative message to
231
+ stdout and returns None without writing any file.
232
+ """
233
+ tree = _parse_module(module_path)
234
+ module_name = _module_name(module_path)
235
+
236
+ roundtrip = find_roundtrip_pair(tree)
237
+ if roundtrip and function_name in (roundtrip.encode_name, roundtrip.decode_name):
238
+ content = _render_roundtrip_test(roundtrip, module_path, module_name)
239
+ else:
240
+ func = _find_function(tree, function_name)
241
+ invariant = find_invariant(func) if func is not None else None
242
+ if func is not None and invariant:
243
+ content = _render_invariant_test(invariant, func, module_path, module_name)
244
+ else:
245
+ print(NO_PROPERTY_MESSAGE.format(function=function_name))
246
+ return None
247
+
248
+ os.makedirs(out_dir, exist_ok=True)
249
+ out_path = os.path.join(out_dir, f"test_{function_name}_properties.py")
250
+ with open(out_path, "w", encoding="utf-8") as handle:
251
+ handle.write(content)
252
+ return out_path
253
+
254
+
255
+ def main(argv: list | None = None) -> int:
256
+ parser = argparse.ArgumentParser(
257
+ description="Scaffold a Hypothesis property test for a Python function."
258
+ )
259
+ parser.add_argument("module_path", help="path to the target module")
260
+ parser.add_argument("function_name", help="name of the function to target")
261
+ parser.add_argument(
262
+ "--out-dir",
263
+ default=None,
264
+ help="directory to write the generated test into (default: module's directory)",
265
+ )
266
+ args = parser.parse_args(argv)
267
+ out_dir = args.out_dir or os.path.dirname(os.path.abspath(args.module_path))
268
+ result = scaffold(args.module_path, args.function_name, out_dir)
269
+ if result:
270
+ print(f"Wrote {result}")
271
+ return 0
272
+ return 1
273
+
274
+
275
+ if __name__ == "__main__":
276
+ raise SystemExit(main())
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: proxy-resilience
3
+ description: Bounded backoff, retry ceiling, and escalation convention for repeated failures against a corporate Anthropic proxy. Use when you observe repeated HTTP 429 rate-limit responses or connection-refused errors that reference a proxy host, or the user says "proxy is rate-limiting", "429 from the proxy", "proxy connection refused", or "corporate proxy is flaky".
4
+ role: worker
5
+ user-invocable: true
6
+ ---
7
+
8
+ # Proxy Resilience
9
+
10
+ ## Overview
11
+
12
+ A corporate proxy fronting Anthropic API traffic enforces its own rate
13
+ limits and allowlist behavior, independent of the underlying account's tier
14
+ — a 429 or connection-refused error in a proxy-fronted session is a
15
+ different failure class than a direct-API rate limit (already retried
16
+ natively by the harness; do not apply this convention to those).
17
+
18
+ Covers two related failure modes sharing one root cause (transient
19
+ corporate-proxy unavailability) and one remedy shape (bounded backoff, a
20
+ hard retry ceiling, then escalate): rate-limit errors (issue #723, this
21
+ file) and connection-refused errors (issue #724). Documented together so
22
+ either failure mode is found in one place.
23
+
24
+ ## Detection Signals
25
+
26
+ Treat an error as **proxy rate-limiting** when it shows *all* of:
27
+
28
+ 1. The session is known to run against a corporate proxy (e.g. the
29
+ `anthropic-proxy` operating note, a proxy env var/base URL, or a
30
+ previously observed proxy hostname in error text).
31
+ 2. The error text contains HTTP 429, "rate limit", "too many requests", or
32
+ "quota exceeded".
33
+ 3. The error references the proxy host, not `api.anthropic.com` directly.
34
+
35
+ Treat an error as **proxy connection-refused** (#724) when it shows (1)
36
+ above plus a connection-level failure (`ECONNREFUSED`, "connection
37
+ refused", "could not connect", timeout connecting to the proxy host).
38
+
39
+ ## Backoff Schedule
40
+
41
+ Apply exponential backoff **per call site** (one place repeatedly issuing
42
+ the same request — e.g. one subagent retrying one API call, not the whole
43
+ session): **initial delay 1s, ×2 multiplier, 60s cap, max 5 attempts.**
44
+
45
+ | Attempt | 1 | 2 | 3 | 4 | 5 (last) |
46
+ |---------|---|---|---|---|---|
47
+ | Delay | 1s | 2s | 4s | 8s | 16s |
48
+
49
+ After 5 retries at the same call site still fail with a proxy rate-limit
50
+ error, stop retrying and escalate (below) rather than looping further. Five
51
+ is deliberately far below any plausible recurrence of "28 rate-limit errors
52
+ in one session" — that scale breaches this ceiling on the first call site
53
+ alone, well before reaching 28.
54
+
55
+ ## Escalation Rule
56
+
57
+ Once the retry budget (5 attempts) is exhausted at a call site:
58
+
59
+ 1. **Stop retrying that call site** — no indefinite loop, no silent failure.
60
+ 2. Surface one plain-language line naming the proxy as the suspected cause,
61
+ e.g.: "Repeated rate-limit errors from the corporate Anthropic proxy —
62
+ pausing retries here; consider reducing concurrent requests or retrying
63
+ later."
64
+ 3. Let the user decide whether to continue, reduce concurrency, or pause.
65
+ Escalate and wait for direction rather than unilaterally abandoning the
66
+ task.
67
+
68
+ ## Concurrency Guidance
69
+
70
+ Parallel subagent/Task fan-out against a shared proxy allowlist is a likely
71
+ amplifier of rate-limit bursts — concurrent requests can exhaust the
72
+ proxy's rate window faster than a serial stream would. If repeated 429s are
73
+ observed, reduce concurrent dispatch (e.g. lower
74
+ `DEV_TEAM_MAX_PARALLEL_BUILDS`, or serialize the specific failing call site)
75
+ before increasing backoff further; prefer narrow serialization over
76
+ session-wide serialization.
77
+
78
+ ## Anti-Patterns
79
+
80
+ | Anti-pattern | Why it's wrong | What to do instead |
81
+ | ------------- | --------------- | ------------------- |
82
+ | Retrying immediately with no delay | Compounds the burst that triggered the 429 | Apply the backoff schedule above |
83
+ | Treating a direct Anthropic 429 the same as a proxy 429 | The harness already retries direct API limits; double-retrying wastes time | Confirm proxy involvement (Detection Signals) first |
84
+ | Increasing concurrency to "push through" a rate limit | Makes proxy throttling worse | Reduce concurrent dispatch instead |