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,111 @@
1
+ # Context Management
2
+
3
+ How the plugin keeps a session's context in check: the harness compacts at a
4
+ percentage `/dev-team:setup` configures, a pair of small SessionStart hooks
5
+ nudge and restore state, and `/handoff` stays available by hand. For the
6
+ runtime procedure (what to load, when), see [Context Loading
7
+ Protocol](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/context-loading-protocol/SKILL.md);
8
+ for manual compression and side-task forks, see
9
+ [Handoff](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/handoff/SKILL.md).
10
+
11
+ The design record is [ADR 0043](../../../docs/adr/0043-replace-the-context-ceiling-guard-with-harness-autocompact.md),
12
+ which replaced the former context-ceiling hook (ADRs 0011, 0016, 0037-0039).
13
+
14
+ ## How it works
15
+
16
+ 1. **Harness autocompact, configured per repo.** `/dev-team:setup` writes
17
+ `CLAUDE_AUTOCOMPACT_PCT_OVERRIDE` into the repo's `.claude/settings.json`
18
+ `env` block (default `40`). The harness then compacts the conversation
19
+ when it reaches that percentage of its auto-compact window. It applies to
20
+ subagents as well as the main session.
21
+ 2. **A setup nudge.** On `startup`, `resume` and `clear`, the SessionStart
22
+ hook `autocompact_setup_nudge.py` prints one line recommending
23
+ `/dev-team:setup` when the key is absent or invalid in the process env,
24
+ `.claude/settings.local.json`, `.claude/settings.json` and user settings.
25
+ It is advisory, never blocks, and never fires on `compact`.
26
+ 3. **State restore after compaction.** A SessionStart hook with matcher
27
+ `compact`, `post_compact_state_reinject.py`, re-injects the active `/build`
28
+ phase, step, plan path and unchecked `## Build Progress` items as
29
+ `additionalContext` (at most 10,000 characters; phase and step survive
30
+ truncation first). It reads `.claude/memory/build-phase.json`, so it only
31
+ has something to restore while a build is in progress (a step, or
32
+ between steps). It is
33
+ best-effort and fail-open.
34
+ 4. **`/handoff` is manual.** Run it yourself to compress the conversation
35
+ (continue mode) or split off a side task (fork mode).
36
+ Write a full summary to `.claude/memory/` so the next phase starts from a
37
+ file. Nothing forces or blocks on it.
38
+
39
+ ## Configuring the threshold
40
+
41
+ ```bash
42
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/set_autocompact_env.py" --project-dir . --yes
43
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/set_autocompact_env.py" --project-dir . --autocompact-pct 30
44
+ python3 "${CLAUDE_PLUGIN_ROOT}/scripts/set_autocompact_env.py" --project-dir . --no-autocompact
45
+ ```
46
+
47
+ `/dev-team:setup` runs the same script (Step 9b). The value is an integer
48
+ 1-100 written as a string, merged into existing `env` entries. The harness
49
+ can only lower its threshold; values above its default (about 83%, reported)
50
+ have no effect, and the script warns when you pick one. It also warns when a
51
+ process-env or `settings.local.json` entry shadows the project value.
52
+
53
+ There is no absolute token cap: the percentage applies to the window, so 40%
54
+ of a 1M window is 400K. The former 350K cap was deliberately dropped.
55
+
56
+ To silence the nudge without configuring autocompact, set
57
+ `DEV_TEAM_AUTOCOMPACT_NUDGE=0` or create `.claude/memory/autocompact-nudge-off`
58
+ (`--no-autocompact` creates it).
59
+
60
+ ## What to expect
61
+
62
+ - **Coverage is per repo.** A repo that never runs `/setup` keeps the harness
63
+ default, which is much later than 40%. The nudge advises; it does not
64
+ enforce.
65
+ - **Compaction is generic.** The harness summary can drop plan-step state,
66
+ file:line anchors and acceptance criteria. The re-inject hook restores
67
+ `/build` phase/step and plan progress only; for anything else, write a
68
+ structured summary with `/handoff` before you need it.
69
+ - **Timing.** The threshold is checked between turns (reported, not
70
+ verified), so one long tool loop can overshoot it.
71
+ - **`compact` SessionStart firing is unconfirmed.** That it fires after a
72
+ real compaction and reaches the model is tracked in
73
+ [#2233](https://github.com/bdfinst/agentic-dev-team/issues/2233).
74
+
75
+ ## Why a low threshold
76
+
77
+ The 40% default is a conservative planning target, not a claimed accuracy
78
+ cliff:
79
+
80
+ - Chroma's [Context Rot study](https://www.trychroma.com/research/context-rot)
81
+ found degradation across 18 models (including Claude 4) is gradual, not a
82
+ sharp drop at any single percentage.
83
+ - Needle-in-a-haystack benchmarks like RULER and NoLiMa show a model's
84
+ *effective* context is often only about half its advertised window.
85
+ - Anthropic's [effective context engineering
86
+ guidance](https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents)
87
+ recommends proactive compaction well ahead of the limit.
88
+
89
+ ## Troubleshooting
90
+
91
+ **"The nudge keeps firing after I ran setup."** A process-env or
92
+ `settings.local.json` value can shadow the project one; the nudge names the
93
+ source of an invalid value. Fix or remove that entry.
94
+
95
+ **"Nothing restored after compaction."** `build-phase.json` is deleted when the plan
96
+ completes, and records older than four hours are ignored; with no active
97
+ build there is nothing to restore. Also check #2233.
98
+
99
+ **"The setup script refuses to write."** It aborts, leaving the file
100
+ untouched, when `.claude/settings.json` is malformed, is a symlink, is not a
101
+ JSON object, or has a non-object `env`. Fix the file and re-run.
102
+
103
+ ## Source
104
+
105
+ - `plugins/dev-team/scripts/set_autocompact_env.py` (writer),
106
+ `plugins/dev-team/hooks/lib/autocompact_config.py` (shared detector).
107
+ - `plugins/dev-team/hooks/autocompact_setup_nudge.py`,
108
+ `plugins/dev-team/hooks/post_compact_state_reinject.py`,
109
+ `plugins/dev-team/hooks/lib/build_state.py`.
110
+ - Registered in `plugins/dev-team/hooks/hooks.json` and
111
+ `plugins/dev-team/settings.json` under `SessionStart`.
@@ -0,0 +1,280 @@
1
+ # Developer notes — extending and maintaining the plugin
2
+
3
+ This page is for people working **on** the dev-team plugin: adding a tool,
4
+ agent, or skill, maintaining the eval corpus, or extending the static-analysis
5
+ suite to a new language. If you are *using* the plugin for your own
6
+ development work, you want the [skills reference](skills.md) and the
7
+ [workflows guide](workflows.md) instead — nothing here changes how the plugin
8
+ behaves in your project.
9
+
10
+ ## Where plugin-development knowledge lives
11
+
12
+ Plugin-development documentation is spread across a few focused files. This
13
+ table is the jumping-off point; each doc stays the authority for its own
14
+ topic.
15
+
16
+ | Topic | Doc | What it covers |
17
+ |---|---|---|
18
+ | Agent architecture | [`agent-architecture.md`](agent-architecture.md) | How agents are structured, routed, and dispatched. |
19
+ | Agent authoring | [`agent_info.md`](agent_info.md) | The per-agent file format and required sections. |
20
+ | Eval architecture | [`eval-system.md`](eval-system.md) | How the agent-eval system is built and gated. |
21
+ | Running evals | [`eval-running-guide.md`](eval-running-guide.md) | The operational procedure for eval runs and variance batches. |
22
+ | Eval upkeep | [`eval-maintenance.md`](eval-maintenance.md) | Grading rules, the calibration trap, and corpus discipline. |
23
+ | Adapter & ruleset lifecycle | [`static-analysis-integration/maintenance.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/maintenance.md) | Ownership, drift detection, and deprecation for shipped adapters and rulesets. |
24
+ | Adding agents, skills, or hooks | [root `CLAUDE.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/CLAUDE.md) § "Adding agents, skills, or hooks" | Where each artifact type lives and the structural audit to run afterwards. |
25
+ | Code knowledge graphs | [`codegraph-vs-graphify.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/knowledge/codegraph-vs-graphify.md) | When to use CodeGraph vs Graphify, how `/project-init` installs each, and the CLAUDE.md-preservation guard. |
26
+ | Script conventions | [ADR 0014](../../../docs/adr/0014-python-for-cross-os-scripts.md), [ADR 0015](../../../docs/adr/0015-bash-removal-complete.md), [ADR 0031](../../../docs/adr/0031-raise-shipped-python-floor-to-3-10.md) | Why every shipped script is Python 3.10+ stdlib-only, the completed bash removal, and the floor's move off EOL 3.8. |
27
+
28
+ ## Hooks
29
+
30
+ `PreToolUse`/`PostToolUse` guard hooks are documented in
31
+ [`agent-architecture.md` § Governance](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/docs/agent-architecture.md#governance).
32
+ `SubagentStop` hooks aren't yet indexed there; this section is the entry
33
+ point for them.
34
+
35
+ ### Subagent Completion Guard
36
+
37
+ A `SubagentStop` hook (`hooks/subagent_completion_guard.py`, #2188)
38
+ classifies each dispatched subagent's own transcript tail into `clean`,
39
+ `empty-final-turn`, `truncated-final-turn`, or `unreadable`, and emits a
40
+ `boundary-events.jsonl` "warn" record for the two non-clean, explainable
41
+ outcomes (`empty-final-turn`, `truncated-final-turn`) via
42
+ `hooks/lib/boundary_events.emit_boundary_event`; `clean` and `unreadable`
43
+ stay silent — record-only, never blocking. It runs alongside the plugin's
44
+ other `SubagentStop` hooks, `hooks/cost_meter.py` and
45
+ `hooks/task_completion_metrics.py` (both undocumented as of this entry).
46
+ Classification reads the last JSON row of the subagent's own transcript file
47
+ directly — no sidechain filtering needed, since every row in a subagent's
48
+ own `subagents/agent-<hash>.jsonl` file already belongs to it — and checks
49
+ `message.stop_reason == "max_tokens"` (→ `truncated-final-turn`, checked
50
+ first since a token-limit cutoff can itself produce empty content) before
51
+ falling back to empty/whitespace-only content (→ `empty-final-turn`).
52
+ Fail-open throughout: a missing/unreadable transcript, or a last row missing
53
+ `message`/`content` entirely, classifies as `unreadable` and emits nothing.
54
+ Tests: `tests/hooks/test_subagent_completion_guard.py`.
55
+
56
+ The rest of this page covers the one extension path that touches several of
57
+ these files at once and has no other single writeup: adding a new language to
58
+ the static-analysis suite.
59
+
60
+ ## Playbook: adding a static-analysis language
61
+
62
+ The static-analysis suite has two consumption sites that share one registry:
63
+
64
+ - **`/code-review`'s full-repo pre-pass** — the
65
+ [static-analysis-integration skill](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/SKILL.md)
66
+ runs every detected tool over the target set, normalizes output to the
67
+ unified finding envelope, deduplicates, and hands confirmed findings to the
68
+ review agents.
69
+ - **`/build`'s static self-heal pass** — at each review checkpoint, language
70
+ **lanes** fix or surface mechanical findings in the changed files before
71
+ semantic review. The mechanism (scoping, the shared fix loop, the 2-attempt
72
+ cap, detection and provider binding, the degradation ladder) is specified
73
+ once in [`static-self-heal.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/build/references/static-self-heal.md);
74
+ lanes are registered in
75
+ [`tool-configs.md` § Build-time lanes](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/references/tool-configs.md#build-time-lanes).
76
+
77
+ Adding a language means wiring both sites plus the user-facing setup docs.
78
+ The four landed lanes are the worked examples this playbook generalizes from:
79
+
80
+ | Lane | Issue | Autofix slot | Diagnostic slot | Notable shape |
81
+ |---|---|---|---|---|
82
+ | Python | #807 | ruff (SARIF-native) → black + flake8 | mypy (Tier 3 JSON adapter) → pyright (gated) | Two independent slots, each with a recognized-equivalent fallback. |
83
+ | JS/TS | #808 | oxlint → biome → eslint (demoted) | none — verify via autofix check mode | A slow-but-qualified provider bound with granularity demotion. |
84
+ | C# | #809 | `dotnet format` (SDK-builtin) | Roslyn ErrorLog SARIF from the GREEN-confirming build | Diagnostics ride a build the pipeline already pays for. |
85
+ | Java | #810 | none — no fast Java autofixer exists | PMD (SARIF-native) → checkstyle | Diagnostic-only lane; standalone installer (the exception). |
86
+
87
+ **Audience boundary.** This playbook is for plugin maintainers wiring a new
88
+ language *into the plugin*. The
89
+ [per-language setup guide](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/references/language-setup.md)
90
+ is for end users configuring their own repo's toolchain, and it remains the
91
+ single source of truth for install/config/verification commands. The two
92
+ cross-link and never duplicate: your job here includes *adding* that guide's
93
+ new section, not restating its content anywhere else.
94
+
95
+ ### First, classify the candidate tool — two independent questions
96
+
97
+ Every candidate tool gets sorted by two axes, and they are genuinely
98
+ independent — knowing one tells you nothing about the other:
99
+
100
+ 1. **Output format: SARIF-native, or needs an adapter?** This decides the
101
+ tool's tier in `tool-configs.md`. A tool that emits SARIF is consumed raw
102
+ by the [shared SARIF parser](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/references/sarif-parser.md)
103
+ (Tier 1/2). A tool with only JSON or line-based output needs a bespoke
104
+ adapter (Tier 3), and the budget is hard: **≤ 40 LOC**. If an adapter
105
+ wants to be bigger than that, the tool is fighting the pipeline —
106
+ reconsider the candidate.
107
+ 2. **Capability: autofix-capable, or diagnostic-only?** This decides which
108
+ lane **slot** the tool can provide. An autofix tool runs the mechanical
109
+ pre-fix and can double as its own verifier in check mode; a
110
+ diagnostic-only tool feeds findings to the coding agent inside the shared
111
+ fix loop.
112
+
113
+ The worked examples cover all four quadrants: ruff is SARIF-native *and*
114
+ autofix-capable; PMD is SARIF-native but diagnostic-only; mypy needs an
115
+ adapter and is diagnostic-only; `dotnet format` is autofix-capable and needs
116
+ no output format at all, because verification comes from its own
117
+ `--verify-no-changes` mode and from the Roslyn ErrorLog SARIF.
118
+
119
+ Version-pin early, and re-check the format question against the pinned
120
+ version: oxlint was specced as a Tier 3 JSON adapter, but by implementation
121
+ time the pinned release had gained native SARIF, so it landed adapter-free.
122
+ Upstream SARIF support arriving is the cheapest adapter deletion you will
123
+ ever do.
124
+
125
+ ### Wiring the `/code-review` side
126
+
127
+ A new tool becomes visible to `/code-review` through an entry in
128
+ [`tool-configs.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/references/tool-configs.md),
129
+ under the tier its output format earned. The existing entries define the
130
+ house metadata shape; a complete entry carries:
131
+
132
+ - **Invocation** — the exact command, SARIF-first.
133
+ - **Install** — the repo-level form (see the install conventions below).
134
+ - **Install hint** — in the skill's fixed format:
135
+ `<tool-name> — <capability-tier>. install: <command>`. This exact string
136
+ is what users see when the tool is missing, so it names the repo-level
137
+ install, never a global one.
138
+ - **Detection** — how presence is probed. Repo-local locations come first,
139
+ then PATH: a project-local `node_modules/.bin` binary or a gitignored tool
140
+ directory must be found even when nothing is user-installed.
141
+ - **Language-conditional dispatch** — the tool is probed, dispatched, and
142
+ its missing-tool hint surfaced *only when matching files are in the target
143
+ set*. A non-Java repo must never see a "pmd missing" warning. Absence is
144
+ never a pipeline failure.
145
+ - **Adapter** — "none" for SARIF-native tools; otherwise the ≤ 40 LOC
146
+ adapter under the skill's `adapters/`, with its field-mapping table in the
147
+ entry. Per the [maintenance policy](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/maintenance.md),
148
+ a SARIF adapter comes first — bespoke JSON only when upstream genuinely
149
+ has no SARIF plan.
150
+ - **Exit-code semantics** — when the tool distinguishes "findings exist"
151
+ from "tool broke" by exit code (PMD exits 4 on violations), the entry says
152
+ so, because the degradation ladder treats the two very differently.
153
+
154
+ Two more pieces ride along with the entry:
155
+
156
+ - **A fixture pair** under `evals/static-analysis-tools/tier1-mocks/<tool>/`
157
+ — a mock tool output plus the expected unified findings. This is the
158
+ regression harness proving the parser (or adapter) reads the tool
159
+ correctly, and the maintenance policy makes it a precondition for adding
160
+ any tool.
161
+ - **A dedup-chain decision.** The pre-pass deduplicates findings across
162
+ tools and keeps the higher-priority source; the chain lives in the skill's
163
+ step 4. Most language-specific tools need no new thought — semgrep already
164
+ outranks them all, and the precedent (recorded on the pmd and Roslyn
165
+ entries) is to revisit only if a *second* source for the same language is
166
+ added. A tool that genuinely overlaps an existing one, as oxlint overlaps
167
+ legacy ESLint, gets an explicit ranking.
168
+
169
+ ### Wiring the build-time lane
170
+
171
+ The self-heal pass never gains per-language logic. Everything a lane does —
172
+ how changed files are scoped, how the fix loop retries, when it escalates,
173
+ how providers bind — is specified once in
174
+ [`static-self-heal.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/build/references/static-self-heal.md), and a
175
+ new language plugs in as pure registry data: one subsection under
176
+ `tool-configs.md` § Build-time lanes. If you find yourself writing loop or
177
+ scoping logic for your language, stop — the mechanism doc forbids restating
178
+ it, and an accommodation belongs in the mechanism doc (as with C#'s
179
+ post-hoc SARIF filtering), not in the lane row.
180
+
181
+ A lane row declares:
182
+
183
+ - **Extensions** — the file patterns that route changed files into the lane.
184
+ - **Up to two capability slots** — an **autofix** slot and a **diagnostic**
185
+ slot, either of which may be absent. Missing slots are normal, not
186
+ deficiencies: the degradation ladder runs Java diagnostic-only (no fast
187
+ Java autofixer exists), and JS/TS verifies with the autofix tool's own
188
+ check mode rather than carrying a diagnostic slot.
189
+ - **An ordered provider list per slot** — the default provider first. The
190
+ default doubles as the **last-resort provider**: the one install hints
191
+ name and `/project-init` installs, chosen only when the probe finds no
192
+ recognized provider already configured. This is the bind-don't-replace
193
+ rule — a project that arrives with black + flake8, or checkstyle, or an
194
+ ESLint config keeps its own tool.
195
+ - **A detection probe per provider** — repo-local install locations first,
196
+ then PATH, matching the `/code-review` detection convention.
197
+ - **Scoped invocations** — the fix and verify commands as run against the
198
+ checkpoint's changed-file list, plus any wrapper contract the tool needs
199
+ (PMD requires a `--file-list` temp file and must never be invoked with an
200
+ empty set; `dotnet format` treats an empty `--include` as "format
201
+ everything", which is why the mechanism's empty-partition guarantee is
202
+ load-bearing).
203
+
204
+ Every provider you list must satisfy the mechanism's **provider
205
+ qualification contract**: scoped invocation, machine-readable output within
206
+ the adapter budget, checkpoint-compatible latency, deterministic exit codes.
207
+ A tool that fails the latency item can still bind with its lane demoted to
208
+ slice-boundary granularity — that is how a project's existing ESLint config
209
+ is honored without slowing the per-step loop. Keep provider lists short and
210
+ explicit: every recognized provider is an adapter and a registry row someone
211
+ maintains, and this is deliberately not an open-ended plugin system.
212
+
213
+ ### The user-facing setup section and `/project-init`
214
+
215
+ Two more places make the lane usable by people who did not read any of the
216
+ above:
217
+
218
+ - **A language section in [`language-setup.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/references/language-setup.md)**,
219
+ following that guide's "Per-lane section contract": tools and roles,
220
+ repo-level install, configuration, verification, opt-out, and recognized
221
+ equivalent providers, in that order. This is where the actual install and
222
+ verification commands live — the lane row and this playbook link to it
223
+ rather than repeating them.
224
+ - **A `/project-init` lane**, so the one-command scaffold performs the same
225
+ repo-level install the setup section documents manually. Each
226
+ `language-setup.md` section carries the one-line pointer to
227
+ `/project-init`; the guide stays the source of truth for the manual
228
+ commands.
229
+
230
+ ### Install conventions
231
+
232
+ The four landed lanes established conventions that new lanes inherit:
233
+
234
+ - **Shipped scripts are Python 3.10+ stdlib-only.** No bash, no Git Bash
235
+ requirement; Windows portability comes from the Python stdlib. See
236
+ [ADR 0014](../../../docs/adr/0014-python-for-cross-os-scripts.md) and
237
+ [ADR 0015](../../../docs/adr/0015-bash-removal-complete.md).
238
+ - **Repo-level over user-level, always.** The install lands in the project's
239
+ own dependency mechanism so the toolchain is versioned with the repo and
240
+ reproducible for every contributor and CI: an npm devDependency (oxlint),
241
+ a venv / dev-requirements entry (ruff, mypy), a `global.json` SDK pin
242
+ (dotnet), or a repo-local gitignored tool directory (`.pmd/`). Never
243
+ `npm install -g`, `pip install --user`, or a global toolchain assumption.
244
+ - **A standalone installer is the exception, not the rule.** Of the four
245
+ lanes, only Java needed one (`plugins/dev-team/scripts/install-java-static-analysis.py`),
246
+ because PMD has no project-level dependency mechanism to ride. Prefer the
247
+ project's own mechanism; write an installer only when none exists.
248
+ - **Idempotent re-runs.** Running the install twice must be safe and cheap —
249
+ an existing install is detected and nothing is re-downloaded.
250
+ - **Single-source version pinning.** The pinned version lives in exactly one
251
+ place (the lockfile, `global.json`, or one constant in the installer), so
252
+ a bump is a one-line change.
253
+
254
+ ### Retiring an older tool
255
+
256
+ Bind-don't-replace means older tools do not disappear when a better one
257
+ lands: a project configured for ESLint keeps ESLint, and legacy tools stay
258
+ in the provider list and dedup chain as long as real projects arrive with
259
+ them. Retirement is therefore a deliberate decision, and the precedent to
260
+ copy is the oxlint/ESLint checklist ("When a project may drop ESLint
261
+ entirely" in [`tool-configs.md`](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/references/tool-configs.md))
262
+ — a **decidable** test, not a vibe:
263
+
264
+ 1. Every rule the old tool enforces in this project is either covered by the
265
+ new tool's pinned version or explicitly acknowledged as not relied on.
266
+ 2. No plugin/extension of the old tool contributes an enabled rule the new
267
+ tool lacks (framework ESLint plugins were the real blocker there).
268
+ 3. A one-time dual run over the repo shows the old tool reporting nothing
269
+ the new tool misses.
270
+
271
+ Until all three hold, both tools run, with overlap suppressed (the
272
+ `eslint-plugin-oxlint` pattern) and the dedup chain ranking the newer tool
273
+ higher. The same shape applies to any successor pair — Ruff replacing
274
+ pylint/flake8 followed it: the legacy Python entry was retired outright only
275
+ once ruff covered the surface, while black + flake8 remain a recognized
276
+ *provider pair* for projects that arrive with them. Retiring a tool from the
277
+ plugin (deleting its entry and adapter) additionally follows the
278
+ [adapter deprecation policy](https://github.com/bdfinst/agentic-dev-team/blob/main/plugins/dev-team/skills/static-analysis-integration/maintenance.md):
279
+ demote, warn, then remove at the next major contract version — never a
280
+ silent deletion.
@@ -0,0 +1,101 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 520" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif">
2
+ <defs>
3
+ <filter id="shadow" x="-4%" y="-4%" width="108%" height="116%">
4
+ <feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#000" flood-opacity="0.07"/>
5
+ </filter>
6
+ <marker id="arrow" viewBox="0 0 10 8" refX="9" refY="4" markerWidth="8" markerHeight="6" orient="auto-start-reverse">
7
+ <path d="M0,0 L10,4 L0,8 Z" fill="#94A3B8"/>
8
+ </marker>
9
+ <marker id="arrow-red" viewBox="0 0 10 8" refX="9" refY="4" markerWidth="8" markerHeight="6" orient="auto-start-reverse">
10
+ <path d="M0,0 L10,4 L0,8 Z" fill="#F43F5E"/>
11
+ </marker>
12
+ </defs>
13
+
14
+ <!-- Light background so the diagram stays readable in dark-mode docs -->
15
+ <rect width="600" height="520" fill="#ffffff"/>
16
+
17
+ <!-- User Request -->
18
+ <g filter="url(#shadow)">
19
+ <rect x="215" y="12" width="170" height="44" rx="22" fill="#F8FAFC" stroke="#CBD5E1" stroke-width="1.5"/>
20
+ <text x="300" y="39" text-anchor="middle" font-size="13" font-weight="500" fill="#475569">User Request</text>
21
+ </g>
22
+
23
+ <!-- Arrow -->
24
+ <line x1="300" y1="56" x2="300" y2="78" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
25
+
26
+ <!-- Orchestrator -->
27
+ <g filter="url(#shadow)">
28
+ <rect x="195" y="82" width="210" height="52" rx="12" fill="#EEF2FF" stroke="#6366F1" stroke-width="1.5"/>
29
+ <rect x="195" y="82" width="5" height="52" rx="2.5" fill="#6366F1"/>
30
+ <text x="300" y="113" text-anchor="middle" font-size="14" font-weight="600" fill="#1E293B">Orchestrator</text>
31
+ </g>
32
+
33
+ <!-- Branches from Orchestrator -->
34
+ <line x1="258" y1="134" x2="158" y2="166" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
35
+ <line x1="342" y1="134" x2="358" y2="166" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
36
+
37
+ <!-- Model Tier Resolution (PreToolUse hook) -->
38
+ <g filter="url(#shadow)">
39
+ <rect x="65" y="170" width="170" height="48" rx="12" fill="#F5F3FF" stroke="#8B5CF6" stroke-width="1.5"/>
40
+ <rect x="65" y="170" width="5" height="48" rx="2.5" fill="#8B5CF6"/>
41
+ <text x="150" y="194" text-anchor="middle" font-size="12" font-weight="600" fill="#1E293B">Model Tier Resolution</text>
42
+ <text x="150" y="208" text-anchor="middle" font-size="10" font-weight="400" fill="#475569">(PreToolUse hook)</text>
43
+ </g>
44
+
45
+ <!-- Agent Selection -->
46
+ <g filter="url(#shadow)">
47
+ <rect x="275" y="170" width="170" height="48" rx="12" fill="#EFF6FF" stroke="#3B82F6" stroke-width="1.5"/>
48
+ <rect x="275" y="170" width="5" height="48" rx="2.5" fill="#3B82F6"/>
49
+ <text x="360" y="199" text-anchor="middle" font-size="13" font-weight="600" fill="#1E293B">Agent Selection</text>
50
+ </g>
51
+
52
+ <!-- Merge arrows down -->
53
+ <line x1="150" y1="218" x2="300" y2="248" stroke="#94A3B8" stroke-width="2"/>
54
+ <line x1="360" y1="218" x2="300" y2="248" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
55
+
56
+ <!-- Task Execution -->
57
+ <g filter="url(#shadow)">
58
+ <rect x="190" y="252" width="220" height="52" rx="12" fill="#ECFDF5" stroke="#10B981" stroke-width="1.5"/>
59
+ <rect x="190" y="252" width="5" height="52" rx="2.5" fill="#10B981"/>
60
+ <text x="300" y="274" text-anchor="middle" font-size="13" font-weight="600" fill="#1E293B">Task Execution</text>
61
+ <text x="300" y="292" text-anchor="middle" font-size="11" fill="#64748B">Coding Agent</text>
62
+ </g>
63
+
64
+ <!-- Arrow down -->
65
+ <line x1="300" y1="304" x2="300" y2="330" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
66
+
67
+ <!-- Inline Review -->
68
+ <g filter="url(#shadow)">
69
+ <rect x="170" y="334" width="260" height="52" rx="12" fill="#FDF2F8" stroke="#EC4899" stroke-width="1.5"/>
70
+ <rect x="170" y="334" width="5" height="52" rx="2.5" fill="#EC4899"/>
71
+ <text x="300" y="356" text-anchor="middle" font-size="13" font-weight="600" fill="#1E293B">Inline Review Checkpoint</text>
72
+ <text x="300" y="374" text-anchor="middle" font-size="11" fill="#64748B">Targeted Review Agents</text>
73
+ </g>
74
+
75
+ <!-- Fail loop back -->
76
+ <path d="M170,360 C100,360 100,278 190,278" stroke="#F43F5E" stroke-width="2" fill="none" stroke-dasharray="6,3" marker-end="url(#arrow-red)"/>
77
+ <text x="95" y="315" text-anchor="middle" font-size="10" fill="#F43F5E">fail</text>
78
+ <text x="95" y="328" text-anchor="middle" font-size="9" fill="#F43F5E">(max 5x)</text>
79
+
80
+ <!-- Escalate -->
81
+ <line x1="430" y1="360" x2="490" y2="360" stroke="#F43F5E" stroke-width="2" stroke-dasharray="6,3" marker-end="url(#arrow-red)"/>
82
+ <g filter="url(#shadow)">
83
+ <rect x="490" y="340" width="100" height="40" rx="20" fill="#FEF2F2" stroke="#F43F5E" stroke-width="1.5"/>
84
+ <text x="540" y="365" text-anchor="middle" font-size="11" font-weight="500" fill="#DC2626">Escalate</text>
85
+ </g>
86
+ <text x="460" y="352" text-anchor="middle" font-size="9" fill="#F43F5E">still fail</text>
87
+
88
+ <!-- Pass arrow down -->
89
+ <line x1="300" y1="386" x2="300" y2="415" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
90
+ <text x="320" y="404" font-size="10" fill="#10B981">pass / warn</text>
91
+
92
+ <!-- Learning Loop -->
93
+ <g filter="url(#shadow)">
94
+ <rect x="195" y="420" width="210" height="48" rx="12" fill="#F8FAFC" stroke="#64748B" stroke-width="1.5"/>
95
+ <rect x="195" y="420" width="5" height="48" rx="2.5" fill="#64748B"/>
96
+ <text x="300" y="449" text-anchor="middle" font-size="13" font-weight="600" fill="#1E293B">Learning Loop</text>
97
+ </g>
98
+
99
+ <!-- Loop back to orchestrator -->
100
+ <path d="M405,444 C520,444 520,108 405,108" stroke="#94A3B8" stroke-width="2" fill="none" marker-end="url(#arrow)"/>
101
+ </svg>
@@ -0,0 +1,139 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 900 480" font-family="system-ui, -apple-system, 'Segoe UI', sans-serif">
2
+ <defs>
3
+ <filter id="shadow" x="-4%" y="-4%" width="108%" height="116%">
4
+ <feDropShadow dx="0" dy="2" stdDeviation="3" flood-color="#000" flood-opacity="0.07"/>
5
+ </filter>
6
+ <marker id="arrow" viewBox="0 0 10 8" refX="9" refY="4" markerWidth="8" markerHeight="6" orient="auto-start-reverse">
7
+ <path d="M0,0 L10,4 L0,8 Z" fill="#94A3B8"/>
8
+ </marker>
9
+ <marker id="arrow-green" viewBox="0 0 10 8" refX="9" refY="4" markerWidth="8" markerHeight="6" orient="auto-start-reverse">
10
+ <path d="M0,0 L10,4 L0,8 Z" fill="#10B981"/>
11
+ </marker>
12
+ <marker id="arrow-red" viewBox="0 0 10 8" refX="9" refY="4" markerWidth="8" markerHeight="6" orient="auto-start-reverse">
13
+ <path d="M0,0 L10,4 L0,8 Z" fill="#F43F5E"/>
14
+ </marker>
15
+ </defs>
16
+
17
+ <!-- Light background so the diagram stays readable in dark-mode docs -->
18
+ <rect width="900" height="480" fill="#ffffff"/>
19
+
20
+ <!-- Orchestrator -->
21
+ <g filter="url(#shadow)">
22
+ <rect x="16" y="190" width="160" height="52" rx="12" fill="#6366F1" stroke="#4F46E5" stroke-width="1"/>
23
+ <text x="96" y="213" text-anchor="middle" font-size="13" font-weight="600" fill="#FFF">Orchestrator</text>
24
+ <text x="96" y="229" text-anchor="middle" font-size="10" fill="#C7D2FE">Agent Dispatch</text>
25
+ </g>
26
+
27
+ <!-- Arrow to spec-compliance -->
28
+ <line x1="176" y1="216" x2="210" y2="216" stroke="#94A3B8" stroke-width="2" marker-end="url(#arrow)"/>
29
+ <text x="193" y="208" text-anchor="middle" font-size="9" fill="#64748B">all</text>
30
+
31
+ <!-- Spec Compliance (first gate) -->
32
+ <g filter="url(#shadow)">
33
+ <rect x="214" y="190" width="180" height="52" rx="12" fill="#EEF2FF" stroke="#6366F1" stroke-width="1.5"/>
34
+ <rect x="214" y="190" width="5" height="52" rx="2.5" fill="#6366F1"/>
35
+ <text x="304" y="213" text-anchor="middle" font-size="12" font-weight="600" fill="#1E293B">spec-compliance</text>
36
+ <text x="304" y="229" text-anchor="middle" font-size="10" fill="#6366F1">sonnet</text>
37
+ </g>
38
+
39
+ <!-- Pass arrow to Quality Gate -->
40
+ <line x1="394" y1="216" x2="430" y2="216" stroke="#10B981" stroke-width="2" marker-end="url(#arrow-green)"/>
41
+ <text x="412" y="208" text-anchor="middle" font-size="9" fill="#10B981">pass</text>
42
+
43
+ <!-- Quality Gate label -->
44
+ <g filter="url(#shadow)">
45
+ <rect x="434" y="190" width="120" height="52" rx="12" fill="#ECFDF5" stroke="#10B981" stroke-width="1.5"/>
46
+ <text x="494" y="221" text-anchor="middle" font-size="13" font-weight="600" fill="#065F46">Quality Gate</text>
47
+ </g>
48
+
49
+ <!-- Fail arrow back -->
50
+ <path d="M304,242 L304,262 L96,262 L96,242" stroke="#F43F5E" stroke-width="1.5" fill="none" stroke-dasharray="5,3" marker-end="url(#arrow-red)"/>
51
+ <text x="200" y="276" text-anchor="middle" font-size="9" fill="#F43F5E">fail → correction</text>
52
+
53
+ <!-- Fan-out lines from Quality Gate to agents -->
54
+ <line x1="554" y1="200" x2="630" y2="42" stroke="#CBD5E1" stroke-width="1.5"/>
55
+ <line x1="554" y1="206" x2="630" y2="102" stroke="#CBD5E1" stroke-width="1.5"/>
56
+ <line x1="554" y1="213" x2="630" y2="162" stroke="#CBD5E1" stroke-width="1.5"/>
57
+ <line x1="554" y1="219" x2="630" y2="222" stroke="#CBD5E1" stroke-width="1.5"/>
58
+ <line x1="554" y1="226" x2="630" y2="282" stroke="#CBD5E1" stroke-width="1.5"/>
59
+ <line x1="554" y1="232" x2="630" y2="342" stroke="#CBD5E1" stroke-width="1.5"/>
60
+
61
+ <!-- Trigger labels (left of agents) -->
62
+ <text x="588" y="40" text-anchor="middle" font-size="8" fill="#94A3B8">JS/TS</text>
63
+ <text x="588" y="100" text-anchor="middle" font-size="8" fill="#94A3B8">Tests</text>
64
+ <text x="588" y="160" text-anchor="middle" font-size="8" fill="#94A3B8">API/auth</text>
65
+ <text x="588" y="220" text-anchor="middle" font-size="8" fill="#94A3B8">Domain</text>
66
+ <text x="588" y="280" text-anchor="middle" font-size="8" fill="#94A3B8">UI</text>
67
+ <text x="588" y="340" text-anchor="middle" font-size="8" fill="#94A3B8">All</text>
68
+
69
+ <!-- Review agents (right column) -->
70
+ <!-- naming-review (haiku) -->
71
+ <g filter="url(#shadow)">
72
+ <rect x="630" y="20" width="180" height="44" rx="10" fill="#F8FAFC" stroke="#94A3B8" stroke-width="1"/>
73
+ <rect x="630" y="20" width="4" height="44" rx="2" fill="#94A3B8"/>
74
+ <text x="720" y="40" text-anchor="middle" font-size="11" font-weight="600" fill="#1E293B">naming-review</text>
75
+ <text x="720" y="54" text-anchor="middle" font-size="9" fill="#94A3B8">haiku</text>
76
+ </g>
77
+
78
+ <!-- test-review (sonnet) -->
79
+ <g filter="url(#shadow)">
80
+ <rect x="630" y="80" width="180" height="44" rx="10" fill="#EFF6FF" stroke="#3B82F6" stroke-width="1"/>
81
+ <rect x="630" y="80" width="4" height="44" rx="2" fill="#3B82F6"/>
82
+ <text x="720" y="100" text-anchor="middle" font-size="11" font-weight="600" fill="#1E293B">test-review</text>
83
+ <text x="720" y="114" text-anchor="middle" font-size="9" fill="#3B82F6">sonnet</text>
84
+ </g>
85
+
86
+ <!-- security-review (opus) -->
87
+ <g filter="url(#shadow)">
88
+ <rect x="630" y="140" width="180" height="44" rx="10" fill="#FEF2F2" stroke="#EF4444" stroke-width="1"/>
89
+ <rect x="630" y="140" width="4" height="44" rx="2" fill="#EF4444"/>
90
+ <text x="720" y="160" text-anchor="middle" font-size="11" font-weight="600" fill="#1E293B">security-review</text>
91
+ <text x="720" y="174" text-anchor="middle" font-size="9" fill="#EF4444">opus</text>
92
+ </g>
93
+
94
+ <!-- domain-review (opus) -->
95
+ <g filter="url(#shadow)">
96
+ <rect x="630" y="200" width="180" height="44" rx="10" fill="#FEF2F2" stroke="#EF4444" stroke-width="1"/>
97
+ <rect x="630" y="200" width="4" height="44" rx="2" fill="#EF4444"/>
98
+ <text x="720" y="220" text-anchor="middle" font-size="11" font-weight="600" fill="#1E293B">domain-review</text>
99
+ <text x="720" y="234" text-anchor="middle" font-size="9" fill="#EF4444">opus</text>
100
+ </g>
101
+
102
+ <!-- a11y-review (sonnet) -->
103
+ <g filter="url(#shadow)">
104
+ <rect x="630" y="260" width="180" height="44" rx="10" fill="#EFF6FF" stroke="#3B82F6" stroke-width="1"/>
105
+ <rect x="630" y="260" width="4" height="44" rx="2" fill="#3B82F6"/>
106
+ <text x="720" y="280" text-anchor="middle" font-size="11" font-weight="600" fill="#1E293B">a11y-review</text>
107
+ <text x="720" y="294" text-anchor="middle" font-size="9" fill="#3B82F6">sonnet</text>
108
+ </g>
109
+
110
+ <!-- structure-review (sonnet) -->
111
+ <g filter="url(#shadow)">
112
+ <rect x="630" y="320" width="180" height="44" rx="10" fill="#EFF6FF" stroke="#3B82F6" stroke-width="1"/>
113
+ <rect x="630" y="320" width="4" height="44" rx="2" fill="#3B82F6"/>
114
+ <text x="720" y="340" text-anchor="middle" font-size="11" font-weight="600" fill="#1E293B">structure-review</text>
115
+ <text x="720" y="354" text-anchor="middle" font-size="9" fill="#3B82F6">sonnet</text>
116
+ </g>
117
+
118
+ <!-- Aggregate -->
119
+ <line x1="810" y1="42" x2="850" y2="216" stroke="#CBD5E1" stroke-width="1"/>
120
+ <line x1="810" y1="102" x2="850" y2="216" stroke="#CBD5E1" stroke-width="1"/>
121
+ <line x1="810" y1="162" x2="850" y2="216" stroke="#CBD5E1" stroke-width="1"/>
122
+ <line x1="810" y1="222" x2="850" y2="216" stroke="#CBD5E1" stroke-width="1"/>
123
+ <line x1="810" y1="282" x2="850" y2="216" stroke="#CBD5E1" stroke-width="1"/>
124
+ <line x1="810" y1="342" x2="850" y2="216" stroke="#CBD5E1" stroke-width="1"/>
125
+
126
+ <!-- Aggregate diamond -->
127
+ <polygon points="850,196 870,216 850,236 830,216" fill="#FFF7ED" stroke="#F97316" stroke-width="1.5" filter="url(#shadow)"/>
128
+ <text x="850" y="220" text-anchor="middle" font-size="8" font-weight="600" fill="#C2410C">AGG</text>
129
+
130
+ <!-- Legend -->
131
+ <g transform="translate(16, 440)">
132
+ <rect x="0" y="0" width="12" height="12" rx="3" fill="#F8FAFC" stroke="#94A3B8" stroke-width="1"/>
133
+ <text x="18" y="10" font-size="10" fill="#64748B">haiku (fast, pattern-matching)</text>
134
+ <rect x="220" y="0" width="12" height="12" rx="3" fill="#EFF6FF" stroke="#3B82F6" stroke-width="1"/>
135
+ <text x="238" y="10" font-size="10" fill="#64748B">sonnet (semantic analysis)</text>
136
+ <rect x="440" y="0" width="12" height="12" rx="3" fill="#FEF2F2" stroke="#EF4444" stroke-width="1"/>
137
+ <text x="458" y="10" font-size="10" fill="#64748B">opus (cross-file reasoning)</text>
138
+ </g>
139
+ </svg>