@event4u/agent-config 9.7.0 → 9.9.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 (901) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +314 -190
  3. package/CONTRIBUTING.md +23 -7
  4. package/MIGRATION.md +20 -0
  5. package/README.md +57 -11
  6. package/dist/agent-src/commands/agents/audit.md +1 -1
  7. package/dist/agent-src/commands/agents/optimize.md +2 -2
  8. package/dist/agent-src/commands/agents/user.md +1 -1
  9. package/dist/agent-src/commands/agents.md +1 -1
  10. package/dist/agent-src/commands/check-current-md.md +3 -3
  11. package/dist/agent-src/commands/commit/in-chunks.md +8 -0
  12. package/dist/agent-src/commands/commit.md +17 -0
  13. package/dist/agent-src/commands/fix/portability.md +2 -2
  14. package/dist/agent-src/commands/fix/pr-comments-loop.md +136 -0
  15. package/dist/agent-src/commands/fix/refs.md +2 -2
  16. package/dist/agent-src/commands/fix/route.md +4 -3
  17. package/dist/agent-src/commands/fix.md +9 -6
  18. package/dist/agent-src/commands/ghostwriter.md +1 -1
  19. package/dist/agent-src/commands/image.md +1 -1
  20. package/dist/agent-src/commands/optimize/augmentignore.md +1 -1
  21. package/dist/agent-src/commands/optimize/skills.md +2 -2
  22. package/dist/agent-src/commands/post-as.md +1 -1
  23. package/dist/agent-src/commands/pr/create.md +4 -0
  24. package/dist/agent-src/commands/research.md +1 -1
  25. package/dist/agent-src/commands/roadmap/ai-council.md +1 -1
  26. package/dist/agent-src/commands/security-audit-config.md +1 -1
  27. package/dist/agent-src/commands/team/delegate.md +4 -0
  28. package/dist/agent-src/commands/video.md +1 -1
  29. package/dist/agent-src/contexts/authority/kernel-rule-edits.md +1 -1
  30. package/dist/agent-src/contexts/contracts/emergency-triage-block.md +2 -2
  31. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +48 -2
  32. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +10 -0
  33. package/dist/agent-src/contexts/execution/subagent-modes-detail.md +109 -8
  34. package/dist/agent-src/contexts/execution/subagent-response-contract.md +20 -0
  35. package/dist/agent-src/contexts/execution/subagent-spawn-contract.md +53 -3
  36. package/dist/agent-src/contexts/override-system.md +75 -5
  37. package/dist/agent-src/rules/code-provenance.md +112 -0
  38. package/dist/agent-src/rules/context-hygiene.md +2 -0
  39. package/dist/agent-src/rules/doc-screenshot-hygiene.md +97 -0
  40. package/dist/agent-src/rules/domain-safety-pii.md +1 -0
  41. package/dist/agent-src/rules/external-code-graph-interop.md +13 -3
  42. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +2 -0
  43. package/dist/agent-src/rules/git-history-discipline.md +2 -0
  44. package/dist/agent-src/rules/history-discipline.md +80 -0
  45. package/dist/agent-src/rules/language-and-tone.md +2 -0
  46. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -0
  47. package/dist/agent-src/rules/media-governance-routing.md +2 -0
  48. package/dist/agent-src/rules/minimal-safe-diff.md +2 -0
  49. package/dist/agent-src/rules/no-roadmap-references.md +4 -1
  50. package/dist/agent-src/rules/non-destructive-by-default.md +20 -0
  51. package/dist/agent-src/rules/onboarding-gate.md +2 -0
  52. package/dist/agent-src/rules/output-discipline.md +2 -0
  53. package/dist/agent-src/rules/persona-governance.md +2 -0
  54. package/dist/agent-src/rules/php-coding.md +1 -0
  55. package/dist/agent-src/rules/preservation-guard.md +3 -0
  56. package/dist/agent-src/rules/reviewer-awareness.md +1 -0
  57. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +1 -0
  58. package/dist/agent-src/rules/roadmap-progress-sync.md +9 -0
  59. package/dist/agent-src/rules/scale-discipline.md +92 -0
  60. package/dist/agent-src/rules/secret-vcs-guard.md +106 -0
  61. package/dist/agent-src/rules/security-sensitive-stop.md +11 -1
  62. package/dist/agent-src/rules/session-canary.md +77 -0
  63. package/dist/agent-src/rules/skill-quality.md +2 -0
  64. package/dist/agent-src/rules/source-confidentiality.md +2 -0
  65. package/dist/agent-src/rules/source-of-truth.md +2 -0
  66. package/dist/agent-src/rules/telegraph-speak.md +2 -0
  67. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -1
  68. package/dist/agent-src/rules/tool-safety.md +4 -1
  69. package/dist/agent-src/rules/untrusted-input-defense.md +10 -0
  70. package/dist/agent-src/rules/verify-before-complete.md +2 -0
  71. package/dist/agent-src/skills/adr-create/SKILL.md +17 -1
  72. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  73. package/dist/agent-src/skills/code-intelligence/SKILL.md +97 -0
  74. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  75. package/dist/agent-src/skills/corpus-grounding/SKILL.md +0 -3
  76. package/dist/agent-src/skills/description-assist/SKILL.md +1 -1
  77. package/dist/agent-src/skills/design-review/SKILL.md +5 -6
  78. package/dist/agent-src/skills/design-tokens/SKILL.md +0 -1
  79. package/dist/agent-src/skills/gated-reach/SKILL.md +185 -0
  80. package/dist/agent-src/skills/gated-reach/evals/triggers.json +72 -0
  81. package/dist/agent-src/skills/history-design/SKILL.md +101 -0
  82. package/dist/agent-src/skills/history-design/evals/triggers.json +17 -0
  83. package/dist/agent-src/skills/humanizer/SKILL.md +3 -3
  84. package/dist/agent-src/skills/image-analyser/SKILL.md +14 -12
  85. package/dist/agent-src/skills/image-editing/SKILL.md +2 -1
  86. package/dist/agent-src/skills/image-generation/SKILL.md +2 -1
  87. package/dist/agent-src/skills/image-provider-routing/SKILL.md +2 -2
  88. package/dist/agent-src/skills/launch-readiness/SKILL.md +1 -1
  89. package/dist/agent-src/skills/license-compliance-audit/SKILL.md +161 -0
  90. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +52 -0
  91. package/dist/agent-src/skills/license-compliance-borrow-check/SKILL.md +145 -0
  92. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +52 -0
  93. package/dist/agent-src/skills/license-compliance-credits/SKILL.md +97 -0
  94. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +52 -0
  95. package/dist/agent-src/skills/md-language-check/SKILL.md +1 -1
  96. package/dist/agent-src/skills/override-management/SKILL.md +1 -1
  97. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +7 -7
  98. package/dist/agent-src/skills/project-analysis-core/SKILL.md +1 -1
  99. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -2
  100. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +2 -2
  101. package/dist/agent-src/skills/readme-writing/SKILL.md +6 -1
  102. package/dist/agent-src/skills/recursive-verification/SKILL.md +6 -0
  103. package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -3
  104. package/dist/agent-src/skills/roadmap-writing/SKILL.md +4 -0
  105. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +31 -12
  106. package/dist/agent-src/skills/rule-refactor/SKILL.md +3 -3
  107. package/dist/agent-src/skills/schema-review/SKILL.md +92 -0
  108. package/dist/agent-src/skills/schema-review/evals/triggers.json +17 -0
  109. package/dist/agent-src/skills/screenshot-hygiene/SKILL.md +171 -0
  110. package/dist/agent-src/skills/secrets-management/SKILL.md +43 -1
  111. package/dist/agent-src/skills/security-audit/SKILL.md +1 -1
  112. package/dist/agent-src/skills/security-maturity-assessment/SKILL.md +1 -1
  113. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -3
  114. package/dist/agent-src/skills/skill-writing/SKILL.md +2 -2
  115. package/dist/agent-src/skills/source-discovery/SKILL.md +5 -5
  116. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +45 -85
  117. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +5 -4
  118. package/dist/agent-src/skills/subagent-orchestration/prompts/adversarial-verification-council.md +29 -0
  119. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge-two-stage.md +29 -0
  120. package/dist/agent-src/skills/subagent-orchestration/prompts/do-and-judge.md +29 -0
  121. package/dist/agent-src/skills/subagent-orchestration/prompts/do-competitively.md +29 -0
  122. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-parallel.md +29 -0
  123. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +29 -0
  124. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-worktrees.md +29 -0
  125. package/dist/agent-src/skills/subagent-orchestration/prompts/judge-with-debate.md +29 -0
  126. package/dist/agent-src/skills/systematic-debugging/SKILL.md +2 -2
  127. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +2 -3
  128. package/dist/agent-src/skills/token-optimizer/SKILL.md +4 -4
  129. package/dist/agent-src/skills/verify-repair-loop/SKILL.md +4 -0
  130. package/dist/agent-src/skills/worktree-lifecycle/SKILL.md +2 -3
  131. package/dist/agent-src/templates/AGENTS.md +1 -1
  132. package/dist/agent-src/templates/agents/.gitattributes.fragment +25 -6
  133. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  134. package/dist/agent-src/templates/command.md +3 -3
  135. package/dist/agent-src/templates/github-workflows/secret-scan.yml +65 -0
  136. package/dist/agent-src/templates/persona.md +2 -2
  137. package/dist/agent-src/templates/rule.md +2 -2
  138. package/dist/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
  139. package/dist/agent-src/templates/scripts/telemetry_record.ts +33 -1
  140. package/dist/cli/commands/doctorShell.js +20 -0
  141. package/dist/cli/commands/doctorShell.js.map +1 -1
  142. package/dist/cli/commands/rtkDetect.js +58 -0
  143. package/dist/cli/commands/rtkDetect.js.map +1 -0
  144. package/dist/cli/configRoot.js +112 -0
  145. package/dist/cli/configRoot.js.map +1 -0
  146. package/dist/cli/configRoot.test.js +97 -0
  147. package/dist/cli/configRoot.test.js.map +1 -0
  148. package/dist/cli/firstRunNotice.js +70 -0
  149. package/dist/cli/firstRunNotice.js.map +1 -0
  150. package/dist/cli/help.js +4 -1
  151. package/dist/cli/help.js.map +1 -1
  152. package/dist/cli/main.js +54 -5
  153. package/dist/cli/main.js.map +1 -1
  154. package/dist/cli/registry.js +8 -1
  155. package/dist/cli/registry.js.map +1 -1
  156. package/dist/discovery/deprecation-report.md +1 -1
  157. package/dist/discovery/discovery-manifest.json +502 -101
  158. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  159. package/dist/discovery/discovery-manifest.summary.md +6 -4
  160. package/dist/discovery/orphan-report.md +1 -1
  161. package/dist/discovery/packs.json +95 -8
  162. package/dist/discovery/trust-report.md +11 -11
  163. package/dist/discovery/workspaces.json +36 -7
  164. package/dist/hooks/dispatch.js +19475 -0
  165. package/dist/install/agentSwitchDetection.js +75 -0
  166. package/dist/install/agentSwitchDetection.js.map +1 -0
  167. package/dist/install/agentSwitchProfile.js +117 -0
  168. package/dist/install/agentSwitchProfile.js.map +1 -0
  169. package/dist/install/atomic.js +1 -1
  170. package/dist/install/detect.js +1 -1
  171. package/dist/install/install.mjs +791 -486
  172. package/dist/install/rtkDetection.js +213 -0
  173. package/dist/install/rtkDetection.js.map +1 -0
  174. package/dist/install/rule_scope.js +2 -1
  175. package/dist/install/rule_scope.js.map +1 -1
  176. package/dist/install/types.js +2 -2
  177. package/dist/install/wizard-plan.js +1 -1
  178. package/dist/install/wizardDismissals.js +58 -0
  179. package/dist/install/wizardDismissals.js.map +1 -0
  180. package/dist/mcp/awesome-mcp-servers.row.md +1 -1
  181. package/dist/mcp/mcp-cloudflare-catalogue.json +1 -1
  182. package/dist/mcp/registry-manifest.json +15 -4
  183. package/dist/mcp/server.json +20 -0
  184. package/dist/mcp/server.mjs +44292 -0
  185. package/dist/router.json +1 -1
  186. package/dist/scripts/condense.js +14 -7
  187. package/dist/scripts/condense.js.map +1 -1
  188. package/dist/server/app.js +12 -0
  189. package/dist/server/app.js.map +1 -1
  190. package/dist/server/io/sharedWriteCheck.js +101 -0
  191. package/dist/server/io/sharedWriteCheck.js.map +1 -0
  192. package/dist/server/routes/ping.js +32 -0
  193. package/dist/server/routes/ping.js.map +1 -1
  194. package/dist/server/routes/settings.js +21 -4
  195. package/dist/server/routes/settings.js.map +1 -1
  196. package/dist/server/routes/userMd.js +21 -4
  197. package/dist/server/routes/userMd.js.map +1 -1
  198. package/dist/server/routes/wizard.js +68 -25
  199. package/dist/server/routes/wizard.js.map +1 -1
  200. package/dist/server/schemas/settings.js +12 -2
  201. package/dist/server/schemas/settings.js.map +1 -1
  202. package/dist/server/serverInfo.js +6 -2
  203. package/dist/server/serverInfo.js.map +1 -1
  204. package/dist/server/token.js +11 -4
  205. package/dist/server/token.js.map +1 -1
  206. package/dist/server/writeRoot.js +15 -1
  207. package/dist/server/writeRoot.js.map +1 -1
  208. package/dist/shared/capabilities.js +33 -0
  209. package/dist/shared/capabilities.js.map +1 -0
  210. package/dist/shared/capabilities.test.js +39 -0
  211. package/dist/shared/capabilities.test.js.map +1 -0
  212. package/dist/ui/assets/index-BpSQt5vm.js +40 -0
  213. package/dist/ui/assets/index-BpSQt5vm.js.map +1 -0
  214. package/dist/ui/assets/index-jSfMW8_t.css +1 -0
  215. package/dist/ui/index.html +15 -6
  216. package/docs/MIGRATION.md +16 -0
  217. package/docs/guidelines/component-oriented-and-oop-development.md +4 -2
  218. package/package.json +22 -9
  219. package/src/agent-src/templates/AGENTS.md +1 -1
  220. package/src/agent-src/templates/scripts/telemetry/engagement.ts +77 -0
  221. package/src/agent-src/templates/scripts/telemetry_record.ts +33 -1
  222. package/src/config/agent-settings.template.yml +94 -13
  223. package/src/config/discovery/packs.yml +22 -0
  224. package/src/config/discovery/workspaces.yml +1 -1
  225. package/src/config/evaluator-budgets.json +47 -0
  226. package/src/config/hook-latency-budget.json +20 -0
  227. package/src/config/reach-channels.yml +217 -0
  228. package/src/config/reach-prescriptions-intake.yml +200 -0
  229. package/src/install/agentSwitchDetection.ts +90 -0
  230. package/src/install/agentSwitchProfile.ts +131 -0
  231. package/src/install/atomic.ts +1 -1
  232. package/src/install/detect.ts +1 -1
  233. package/src/install/rtkDetection.ts +274 -0
  234. package/src/install/rule_scope.ts +9 -2
  235. package/src/install/types.ts +2 -2
  236. package/src/install/wizard-plan.ts +1 -1
  237. package/src/install/wizardDismissals.ts +60 -0
  238. package/src/scripts/_cli/cmd_doctor.ts +62 -1
  239. package/src/scripts/_cli/cmd_memory_get.ts +197 -0
  240. package/src/scripts/_cli/cmd_refresh.ts +30 -0
  241. package/src/scripts/_dispatch.bash +96 -0
  242. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +64 -1
  243. package/src/scripts/_lib/auto_dispatch.ts +76 -0
  244. package/src/scripts/_lib/detect_target_license.ts +714 -0
  245. package/src/scripts/_lib/exec_evidence.ts +251 -0
  246. package/src/scripts/_lib/fixtures/secret-detector/negatives.txt +15 -0
  247. package/src/scripts/_lib/fixtures/secret-detector/positives.txt +15 -0
  248. package/src/scripts/_lib/install_drift.ts +194 -0
  249. package/src/scripts/_lib/kernel_rules.ts +46 -0
  250. package/src/scripts/_lib/memory_fts_index.ts +390 -0
  251. package/src/scripts/_lib/orchestration_record.ts +91 -2
  252. package/src/scripts/_lib/persistence/adapter_raw_sql.ts +443 -0
  253. package/src/scripts/_lib/persistence/detect_audit_coverage.ts +423 -0
  254. package/src/scripts/_lib/persistence/detect_bounded_reads.ts +154 -0
  255. package/src/scripts/_lib/persistence/detect_index_parity.ts +576 -0
  256. package/src/scripts/_lib/persistence/detect_n1_eloquent.ts +226 -0
  257. package/src/scripts/_lib/persistence/detect_offload.ts +441 -0
  258. package/src/scripts/_lib/persistence/detect_prisma_growth.ts +74 -0
  259. package/src/scripts/_lib/persistence/offload_catalog.ts +73 -0
  260. package/src/scripts/_lib/persistence/types.ts +109 -0
  261. package/src/scripts/_lib/reddit_thread_parse.ts +598 -0
  262. package/src/scripts/_lib/risk_paths.ts +160 -0
  263. package/src/scripts/_lib/rtk_allowlist.ts +44 -0
  264. package/src/scripts/_lib/secret_detector.test.ts +108 -0
  265. package/src/scripts/_lib/secret_detector.ts +328 -0
  266. package/src/scripts/_lib/secret_detector_adversarial.test.ts +116 -0
  267. package/src/scripts/_lib/spawn_env.ts +7 -0
  268. package/src/scripts/_lib/sqlite_guard.ts +191 -0
  269. package/src/scripts/_lib/subagent_spawn.ts +53 -0
  270. package/src/scripts/_lib/tool_probe.ts +359 -0
  271. package/src/scripts/_lib/worker_budget.ts +107 -0
  272. package/src/scripts/adr/regenerate_index.ts +81 -6
  273. package/src/scripts/ai_council/blind_review.ts +0 -0
  274. package/src/scripts/ai_council/config.ts +12 -6
  275. package/src/scripts/ai_council/orchestrator.ts +73 -3
  276. package/src/scripts/ai_team/review_gate.ts +8 -10
  277. package/src/scripts/ai_team/team_dispatch.ts +48 -0
  278. package/src/scripts/audit_adr_coverage.ts +33 -0
  279. package/src/scripts/audit_initial_context.ts +1 -1
  280. package/src/scripts/bench_cross_source_eval.ts +400 -0
  281. package/src/scripts/bench_honesty_score.ts +1093 -0
  282. package/src/scripts/bench_hook_latency.ts +218 -0
  283. package/src/scripts/build_mcp_catalog.ts +275 -0
  284. package/src/scripts/build_mcp_registry_manifest.ts +46 -0
  285. package/src/scripts/build_proof.ts +207 -0
  286. package/src/scripts/chat_history.ts +8 -5
  287. package/src/scripts/check_adr_frontmatter.ts +195 -0
  288. package/src/scripts/check_artefact_count_messaging.ts +4 -0
  289. package/src/scripts/check_backstop_debt.ts +210 -0
  290. package/src/scripts/check_bundle_path_leakage.ts +343 -0
  291. package/src/scripts/check_claims.ts +188 -8
  292. package/src/scripts/check_comparison.ts +12 -0
  293. package/src/scripts/check_enforcement_coverage.ts +592 -0
  294. package/src/scripts/check_evaluator_budgets.ts +99 -0
  295. package/src/scripts/check_kernel_rule_bundle.ts +16 -12
  296. package/src/scripts/check_knowledge_sharing.ts +12 -1
  297. package/src/scripts/check_no_external_sources.ts +2 -2
  298. package/src/scripts/check_reach_channels.ts +407 -0
  299. package/src/scripts/check_reach_staleness.ts +364 -0
  300. package/src/scripts/check_secret_leak.test.ts +47 -0
  301. package/src/scripts/check_secret_leak.ts +290 -0
  302. package/src/scripts/check_source_pointer_freshness.ts +28 -3
  303. package/src/scripts/code_graph/build.ts +0 -0
  304. package/src/scripts/code_graph/cli.ts +379 -0
  305. package/src/scripts/code_graph/detect.ts +186 -0
  306. package/src/scripts/code_graph/extract.ts +386 -0
  307. package/src/scripts/code_graph/intent.ts +45 -0
  308. package/src/scripts/code_graph/loader.ts +123 -0
  309. package/src/scripts/code_graph/query.ts +290 -0
  310. package/src/scripts/code_graph/sanitize.ts +30 -0
  311. package/src/scripts/code_graph/sqlite_store.ts +174 -0
  312. package/src/scripts/code_graph/types.ts +83 -0
  313. package/src/scripts/code_graph/validate.ts +63 -0
  314. package/src/scripts/condense.ts +14 -6
  315. package/src/scripts/context_hygiene_hook.ts +8 -5
  316. package/src/scripts/council_cli.ts +126 -12
  317. package/src/scripts/detect_target_license.ts +203 -0
  318. package/src/scripts/evaluator_umbrella.sh +145 -0
  319. package/src/scripts/external_sources_denylist.json +8 -4
  320. package/src/scripts/first_run_gate_hook.ts +9 -5
  321. package/src/scripts/generate_subagent_floor.ts +194 -0
  322. package/src/scripts/hermetic-install.sh +3 -3
  323. package/src/scripts/hook_manifest.yaml +65 -16
  324. package/src/scripts/hooks/block_kernel_rule_writes.ts +212 -0
  325. package/src/scripts/hooks/block_no_verify.ts +9 -9
  326. package/src/scripts/hooks/code_graph_nudge_hook.ts +191 -0
  327. package/src/scripts/hooks/concern_registry.ts +75 -0
  328. package/src/scripts/hooks/design_slop_hook.ts +8 -5
  329. package/src/scripts/hooks/dispatch_entry.ts +37 -0
  330. package/src/scripts/hooks/dispatch_hook.ts +176 -3
  331. package/src/scripts/hooks/hook_stdin.ts +42 -0
  332. package/src/scripts/hooks/rtk_wrap_hook.ts +26 -12
  333. package/src/scripts/hot_context_hook.ts +7 -6
  334. package/src/scripts/injection_scan_hook.ts +9 -1
  335. package/src/scripts/install +6 -6
  336. package/src/scripts/install-hooks.sh +4 -4
  337. package/src/scripts/install.sh +5 -4
  338. package/src/scripts/install.ts +264 -23
  339. package/src/scripts/iron_law_sha.ts +3 -12
  340. package/src/scripts/learning_sidecar.ts +0 -0
  341. package/src/scripts/lint_budget_ownership.ts +89 -0
  342. package/src/scripts/lint_command_routing.ts +35 -5
  343. package/src/scripts/lint_command_verbs.ts +42 -9
  344. package/src/scripts/lint_consumer_internal_refs.ts +211 -0
  345. package/src/scripts/lint_discovery_vocabulary.ts +2 -0
  346. package/src/scripts/lint_documented_commands.ts +670 -0
  347. package/src/scripts/lint_framework_leakage.ts +17 -3
  348. package/src/scripts/lint_framework_leakage_allowlist.json +32 -0
  349. package/src/scripts/lint_governed_writes.ts +335 -0
  350. package/src/scripts/lint_hidden_unicode.ts +6 -0
  351. package/src/scripts/lint_mcp_registry_manifest.ts +26 -1
  352. package/src/scripts/lint_memory_tripwire.ts +186 -0
  353. package/src/scripts/lint_override_kernel_guard.ts +267 -0
  354. package/src/scripts/lint_persistence.ts +171 -0
  355. package/src/scripts/lint_pre_migration_refs.ts +106 -0
  356. package/src/scripts/lint_provenance.ts +547 -0
  357. package/src/scripts/lint_provenance_vocabulary.ts +437 -0
  358. package/src/scripts/lint_spawn_payload.ts +283 -0
  359. package/src/scripts/lint_store_boundary.ts +152 -0
  360. package/src/scripts/lint_versioned_cache.ts +7 -1
  361. package/src/scripts/mcp_server/__main__.ts +7 -2
  362. package/src/scripts/mcp_server/catalog.ts +23 -1
  363. package/src/scripts/mcp_server/consumer_tool_catalog.json +563 -193
  364. package/src/scripts/mcp_server/prompts.ts +6 -0
  365. package/src/scripts/mcp_server/tool_catalog_source.ts +332 -0
  366. package/src/scripts/mcp_server/tools.ts +56 -5
  367. package/src/scripts/mcp_telemetry_query.ts +2 -33
  368. package/src/scripts/mcp_telemetry_store.ts +64 -34
  369. package/src/scripts/measure_rule_budget.ts +3 -12
  370. package/src/scripts/memory_learn_hook.ts +126 -0
  371. package/src/scripts/memory_lookup.ts +0 -0
  372. package/src/scripts/memory_replay_24.ts +312 -0
  373. package/src/scripts/memory_report.ts +16 -3
  374. package/src/scripts/memory_signal.ts +48 -0
  375. package/src/scripts/memory_status.ts +6 -0
  376. package/src/scripts/minimal_safe_diff_hook.ts +8 -5
  377. package/src/scripts/onboarding_gate_hook.ts +8 -5
  378. package/src/scripts/orchestration_record.ts +16 -0
  379. package/src/scripts/pr_url_reminder_hook.ts +8 -1
  380. package/src/scripts/prepack-check.mjs +17 -0
  381. package/src/scripts/prepack_lifecycle_check.d.mts +8 -0
  382. package/src/scripts/prepack_lifecycle_check.mjs +82 -0
  383. package/src/scripts/profile_staleness_hook.ts +8 -7
  384. package/src/scripts/reach_doctor.ts +1651 -0
  385. package/src/scripts/release.ts +24 -3
  386. package/src/scripts/report_install_drift.ts +109 -0
  387. package/src/scripts/risk_escalation_shadow.ts +160 -0
  388. package/src/scripts/roadmap_progress_hook.ts +8 -5
  389. package/src/scripts/schemas/agent-settings.schema.json +23 -0
  390. package/src/scripts/schemas/license-policy.schema.json +89 -0
  391. package/src/scripts/schemas/provenance-borrow.schema.json +46 -0
  392. package/src/scripts/schemas/reach-channels.schema.json +134 -0
  393. package/src/scripts/schemas/reach-doctor-payload.schema.json +220 -0
  394. package/src/scripts/schemas/rule.schema.json +20 -0
  395. package/src/scripts/self_review_gate.test.ts +173 -1
  396. package/src/scripts/self_review_gate.ts +155 -15
  397. package/src/scripts/session_canary_hook.ts +182 -0
  398. package/src/scripts/skill_linter.ts +55 -0
  399. package/src/scripts/smoke_quickstart.ts +2 -2
  400. package/src/scripts/surface_probe_hook.ts +8 -7
  401. package/src/scripts/sync_gitattributes.ts +310 -0
  402. package/src/scripts/team_review_gate_hook.ts +13 -16
  403. package/src/scripts/validate_reach_prescriptions.ts +751 -0
  404. package/src/scripts/verify_before_complete_hook.ts +8 -5
  405. package/src/scripts/wrapper_freshness_hook.ts +8 -7
  406. package/src/server/schemas/settings.ts +24 -2
  407. package/src/shared/capabilities.test.ts +43 -0
  408. package/src/shared/capabilities.ts +75 -0
  409. package/src/templates/minimal/agents-overrides-readme.md +20 -0
  410. package/dist/ui/assets/index-BPFMZWUs.css +0 -1
  411. package/dist/ui/assets/index-BiEZiZ31.js +0 -40
  412. package/dist/ui/assets/index-BiEZiZ31.js.map +0 -1
  413. package/docs/CLAIMS.md +0 -261
  414. package/docs/DISTRIBUTION_CHECKLIST.md +0 -170
  415. package/docs/RELEASE_STORY_TEMPLATE.md +0 -37
  416. package/docs/SKILL_CENSUS.md +0 -352
  417. package/docs/adrs/cost/0001-hard-stop-hook.md +0 -114
  418. package/docs/adrs/cost/README.md +0 -9
  419. package/docs/adrs/memory/0001-consumer-side-snapshot.md +0 -119
  420. package/docs/adrs/memory/README.md +0 -10
  421. package/docs/adrs/router/0001-three-tier-routing.md +0 -119
  422. package/docs/adrs/router/README.md +0 -9
  423. package/docs/adrs/schema/0001-json-schema-frontmatter.md +0 -102
  424. package/docs/adrs/schema/README.md +0 -9
  425. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +0 -99
  426. package/docs/adrs/smoke/README.md +0 -9
  427. package/docs/adrs/telegraph/0001-default-off-until-bench.md +0 -93
  428. package/docs/adrs/telegraph/README.md +0 -9
  429. package/docs/announcements/2026-05-non-dev-launch.md +0 -79
  430. package/docs/announcements/2026-07-honest-cost-sweep-launch.md +0 -84
  431. package/docs/anti-reskin-gate.md +0 -60
  432. package/docs/architecture/augment-projection.md +0 -70
  433. package/docs/architecture/claude-bundle.md +0 -77
  434. package/docs/architecture/current-onboard-baseline.md +0 -126
  435. package/docs/architecture/current-safety-behavior.md +0 -137
  436. package/docs/architecture/multi-tool-projection.md +0 -125
  437. package/docs/architecture/setup-vs-settings-shared-surface.md +0 -114
  438. package/docs/architecture/source-projection.md +0 -85
  439. package/docs/architecture.md +0 -390
  440. package/docs/archive/CHANGELOG-6.0.0-overview.md +0 -953
  441. package/docs/archive/CHANGELOG-7.0.0.md +0 -419
  442. package/docs/archive/CHANGELOG-pre-2.11.0.md +0 -141
  443. package/docs/archive/CHANGELOG-pre-2.15.0.md +0 -244
  444. package/docs/archive/CHANGELOG-pre-2.16.0.md +0 -48
  445. package/docs/archive/CHANGELOG-pre-2.17.0.md +0 -63
  446. package/docs/archive/CHANGELOG-pre-2.2.0.md +0 -2138
  447. package/docs/archive/CHANGELOG-pre-2.20.0.md +0 -159
  448. package/docs/archive/CHANGELOG-pre-2.25.0.md +0 -191
  449. package/docs/archive/CHANGELOG-pre-2.7.0.md +0 -185
  450. package/docs/archive/CHANGELOG-pre-3.0.0.md +0 -130
  451. package/docs/archive/CHANGELOG-pre-3.1.0.md +0 -167
  452. package/docs/archive/CHANGELOG-pre-3.2.0.md +0 -268
  453. package/docs/archive/CHANGELOG-pre-4.0.0.md +0 -80
  454. package/docs/archive/CHANGELOG-pre-4.5.0.md +0 -289
  455. package/docs/archive/CHANGELOG-pre-5.4.0.md +0 -260
  456. package/docs/archive/CHANGELOG-pre-5.9.0.md +0 -270
  457. package/docs/archive/CHANGELOG-pre-6.0.0.md +0 -473
  458. package/docs/archive/CHANGELOG-pre-7.0.0.md +0 -126
  459. package/docs/archive/CHANGELOG-pre-8.0.0.md +0 -301
  460. package/docs/archive/CHANGELOG-pre-8.1.0.md +0 -316
  461. package/docs/archive/CHANGELOG-pre-8.12.0.md +0 -304
  462. package/docs/archive/CHANGELOG-pre-8.9.0.md +0 -306
  463. package/docs/archive/CHANGELOG-pre-9.2.0.md +0 -276
  464. package/docs/artefact-census.md +0 -71
  465. package/docs/benchmark.md +0 -648
  466. package/docs/benchmark.pinned.yml +0 -31
  467. package/docs/benchmarks.md +0 -85
  468. package/docs/capability-matrix.md +0 -33
  469. package/docs/case-studies/_template.md +0 -60
  470. package/docs/case-studies/frontend-design-positioning.md +0 -86
  471. package/docs/catalog.md +0 -721
  472. package/docs/command-flows.md +0 -272
  473. package/docs/command-naming-audit.md +0 -60
  474. package/docs/comparison.yaml +0 -45
  475. package/docs/contracts/CHANGELOG-conventions.md +0 -149
  476. package/docs/contracts/STABILITY.md +0 -188
  477. package/docs/contracts/adoption-signal-floor.md +0 -127
  478. package/docs/contracts/adr-architectural-consensus-mechanism.md +0 -68
  479. package/docs/contracts/adr-chat-history-split.md +0 -140
  480. package/docs/contracts/adr-command-suggestion.md +0 -144
  481. package/docs/contracts/adr-forecast-construction-shape.md +0 -90
  482. package/docs/contracts/adr-gtm-context-spine.md +0 -116
  483. package/docs/contracts/adr-implement-ticket-runtime.md +0 -121
  484. package/docs/contracts/adr-install-user-type-axis.md +0 -107
  485. package/docs/contracts/adr-layout.md +0 -107
  486. package/docs/contracts/adr-level-6-productization.md +0 -145
  487. package/docs/contracts/adr-mcp-runtime.md +0 -128
  488. package/docs/contracts/adr-product-ui-track.md +0 -381
  489. package/docs/contracts/adr-prompt-driven-execution.md +0 -186
  490. package/docs/contracts/adr-settings-sync-engine.md +0 -128
  491. package/docs/contracts/adr-user-types-axis.md +0 -127
  492. package/docs/contracts/adr-wing4-context-spine.md +0 -126
  493. package/docs/contracts/agent-user-schema.md +0 -170
  494. package/docs/contracts/agents-layout.md +0 -148
  495. package/docs/contracts/agents-md-tech-stack.md +0 -75
  496. package/docs/contracts/ai-council-config.md +0 -829
  497. package/docs/contracts/ai-team-config.md +0 -224
  498. package/docs/contracts/analysis-memory-loop.md +0 -149
  499. package/docs/contracts/at-rest-encryption.md +0 -191
  500. package/docs/contracts/audit-log-v1.md +0 -150
  501. package/docs/contracts/auto-orchestration-v1.md +0 -70
  502. package/docs/contracts/benchmark-ab-contract.md +0 -106
  503. package/docs/contracts/benchmark-corpus-spec.md +0 -125
  504. package/docs/contracts/benchmark-report-schema.md +0 -113
  505. package/docs/contracts/branch-protection-policy.md +0 -139
  506. package/docs/contracts/brand-token-consumption.md +0 -74
  507. package/docs/contracts/capability-boundary.md +0 -69
  508. package/docs/contracts/capability-packs.md +0 -217
  509. package/docs/contracts/ci-cost-budget.md +0 -111
  510. package/docs/contracts/ci-green-floor.md +0 -141
  511. package/docs/contracts/command-category-governance.md +0 -84
  512. package/docs/contracts/command-clusters.md +0 -399
  513. package/docs/contracts/command-surface-tiers.md +0 -176
  514. package/docs/contracts/command-taxonomy.md +0 -137
  515. package/docs/contracts/condensation-default-kill-criterion.md +0 -116
  516. package/docs/contracts/config-presets.md +0 -144
  517. package/docs/contracts/conformance.md +0 -84
  518. package/docs/contracts/consumer-bridge.md +0 -73
  519. package/docs/contracts/context-paths.md +0 -101
  520. package/docs/contracts/context-spine.md +0 -179
  521. package/docs/contracts/cost-dashboard.md +0 -143
  522. package/docs/contracts/cost-enforcement.md +0 -134
  523. package/docs/contracts/cost-profile-defaults.md +0 -110
  524. package/docs/contracts/cost-summary-schema.md +0 -107
  525. package/docs/contracts/creative-pack-boundary.md +0 -63
  526. package/docs/contracts/cross-repo-retrieval.md +0 -64
  527. package/docs/contracts/cross-wing-handoff.md +0 -134
  528. package/docs/contracts/daily-workspace.md +0 -147
  529. package/docs/contracts/decision-engine-gates.md +0 -120
  530. package/docs/contracts/decision-trace-v1.md +0 -177
  531. package/docs/contracts/design-artifact-lifecycle.md +0 -93
  532. package/docs/contracts/design-artifact-verification.md +0 -153
  533. package/docs/contracts/discovery-manifest.md +0 -209
  534. package/docs/contracts/discovery-manifest.schema.json +0 -254
  535. package/docs/contracts/evidence-based-pruning.md +0 -102
  536. package/docs/contracts/explain-modes.md +0 -187
  537. package/docs/contracts/explain-trace.schema.json +0 -144
  538. package/docs/contracts/file-ownership-matrix.json +0 -13941
  539. package/docs/contracts/file-ownership-matrix.md +0 -135
  540. package/docs/contracts/frontmatter-contract.md +0 -140
  541. package/docs/contracts/ghostwriter-schema.md +0 -337
  542. package/docs/contracts/governance-enforcement-projection.md +0 -159
  543. package/docs/contracts/gui-wizard.md +0 -350
  544. package/docs/contracts/harness-expectations.md +0 -128
  545. package/docs/contracts/hook-architecture-v1.md +0 -325
  546. package/docs/contracts/host-agent-protocol.md +0 -110
  547. package/docs/contracts/implement-ticket-flow.md +0 -625
  548. package/docs/contracts/init-telemetry.md +0 -132
  549. package/docs/contracts/injected-block-authenticity-model.md +0 -66
  550. package/docs/contracts/install-layout.md +0 -249
  551. package/docs/contracts/install-scopes.md +0 -82
  552. package/docs/contracts/installed-tools-lockfile.md +0 -144
  553. package/docs/contracts/installer-agent-mode.md +0 -137
  554. package/docs/contracts/iron-law-overrides.txt +0 -26
  555. package/docs/contracts/kernel-membership.md +0 -339
  556. package/docs/contracts/linear-ai-rules-inclusion.md +0 -143
  557. package/docs/contracts/linear-ai-three-layers.md +0 -130
  558. package/docs/contracts/linter-structural-model.md +0 -181
  559. package/docs/contracts/load-context-budget-model.md +0 -259
  560. package/docs/contracts/load-context-schema.md +0 -220
  561. package/docs/contracts/local-analytics.md +0 -160
  562. package/docs/contracts/local-knowledge-ingestion.md +0 -96
  563. package/docs/contracts/local-server-api.md +0 -134
  564. package/docs/contracts/low-impact-corpus-format.md +0 -95
  565. package/docs/contracts/mcp-beta-criteria.md +0 -130
  566. package/docs/contracts/mcp-cloud-scope.md +0 -355
  567. package/docs/contracts/mcp-discovery-phase-notice.md +0 -60
  568. package/docs/contracts/mcp-phase-1-scope.md +0 -272
  569. package/docs/contracts/mcp-registry-manifest.schema.json +0 -129
  570. package/docs/contracts/mcp-tool-inventory.md +0 -64
  571. package/docs/contracts/mcp-tool-stub-envelope.md +0 -78
  572. package/docs/contracts/measurement-baseline.md +0 -103
  573. package/docs/contracts/memory-visibility-v1.md +0 -160
  574. package/docs/contracts/mental-models.md +0 -336
  575. package/docs/contracts/migrate-command.md +0 -233
  576. package/docs/contracts/multi-tool-projection-fidelity.md +0 -134
  577. package/docs/contracts/namespace.md +0 -125
  578. package/docs/contracts/no-runtime-boundary.md +0 -61
  579. package/docs/contracts/one-off-script-lifecycle.md +0 -110
  580. package/docs/contracts/orchestration-dsl-v1.md +0 -153
  581. package/docs/contracts/package-self-orientation.md +0 -163
  582. package/docs/contracts/pilot/agent-authority.md +0 -24
  583. package/docs/contracts/pilot/direct-answers.md +0 -70
  584. package/docs/contracts/pilot/language-and-tone.md +0 -63
  585. package/docs/contracts/plain-language-surface.md +0 -117
  586. package/docs/contracts/prelaunch-diagnostics.md +0 -151
  587. package/docs/contracts/profile-system.md +0 -167
  588. package/docs/contracts/reasoning-discipline-protocol.md +0 -83
  589. package/docs/contracts/release-pr-gating.md +0 -151
  590. package/docs/contracts/release-sizing.md +0 -107
  591. package/docs/contracts/release-trunk-sync.md +0 -105
  592. package/docs/contracts/review-lens-schema.md +0 -64
  593. package/docs/contracts/roadmap-complexity-standard.md +0 -138
  594. package/docs/contracts/role-experience.md +0 -125
  595. package/docs/contracts/router-blending.md +0 -71
  596. package/docs/contracts/rule-classification.md +0 -171
  597. package/docs/contracts/rule-interactions.md +0 -132
  598. package/docs/contracts/rule-interactions.yml +0 -260
  599. package/docs/contracts/rule-priority-hierarchy.md +0 -88
  600. package/docs/contracts/rule-router.md +0 -287
  601. package/docs/contracts/safety-model.md +0 -129
  602. package/docs/contracts/session-profile-overlay.md +0 -157
  603. package/docs/contracts/settings-api.md +0 -264
  604. package/docs/contracts/settings-gui-agent-mode.schema.json +0 -128
  605. package/docs/contracts/settings-sync-yaml-subset.md +0 -139
  606. package/docs/contracts/skill-bundled-assets.md +0 -62
  607. package/docs/contracts/skill-discovery.md +0 -80
  608. package/docs/contracts/skill-distribution-channels.md +0 -66
  609. package/docs/contracts/skill-domains.md +0 -144
  610. package/docs/contracts/skill-dry-run.md +0 -47
  611. package/docs/contracts/skill-family-map.yml +0 -915
  612. package/docs/contracts/smoke-contracts.md +0 -144
  613. package/docs/contracts/subagent-boundary.md +0 -59
  614. package/docs/contracts/surface-agent-contracts.md +0 -153
  615. package/docs/contracts/surface-matrix.md +0 -108
  616. package/docs/contracts/surface-tiers.md +0 -81
  617. package/docs/contracts/telegraph-telemetry.md +0 -83
  618. package/docs/contracts/ticket-bundle-format.md +0 -233
  619. package/docs/contracts/tier-3-contrib-plugin.md +0 -137
  620. package/docs/contracts/trust-and-safety.md +0 -144
  621. package/docs/contracts/ui-stack-extension.md +0 -237
  622. package/docs/contracts/ui-track-flow.md +0 -329
  623. package/docs/contracts/universal-skills.md +0 -91
  624. package/docs/contracts/user-type-schema.md +0 -146
  625. package/docs/contracts/value-dashboard-spec.md +0 -378
  626. package/docs/contracts/value-report-schema.md +0 -168
  627. package/docs/contracts/workflow-packs.md +0 -121
  628. package/docs/contracts/workspace-boundary.md +0 -84
  629. package/docs/contracts/workspace-documents.md +0 -144
  630. package/docs/contracts/write-engine.md +0 -182
  631. package/docs/cookbook.md +0 -152
  632. package/docs/customization.md +0 -685
  633. package/docs/decisions/ADR-001-kernel-swap-deferred.md +0 -109
  634. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +0 -135
  635. package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +0 -137
  636. package/docs/decisions/ADR-004-rule-governance-pruning.md +0 -240
  637. package/docs/decisions/ADR-005-subagent-worktrees.md +0 -120
  638. package/docs/decisions/ADR-006-skill-tools-python-pilot.md +0 -114
  639. package/docs/decisions/ADR-007-agent-discovery-scopes.md +0 -371
  640. package/docs/decisions/ADR-008-installed-tools-manifest.md +0 -160
  641. package/docs/decisions/ADR-009-event4u-namespace.md +0 -188
  642. package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +0 -168
  643. package/docs/decisions/ADR-011-domain-pack-readiness.md +0 -213
  644. package/docs/decisions/ADR-012-typescript-cli-shell.md +0 -162
  645. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +0 -342
  646. package/docs/decisions/ADR-014-gui-framework-choice.md +0 -136
  647. package/docs/decisions/ADR-015-discovery-manifest-contract.md +0 -146
  648. package/docs/decisions/ADR-016-installer-architecture.md +0 -189
  649. package/docs/decisions/ADR-017-monorepo-physical-layout.md +0 -261
  650. package/docs/decisions/ADR-018-trust-and-safety-layer.md +0 -159
  651. package/docs/decisions/ADR-019-router-json-dist-location.md +0 -124
  652. package/docs/decisions/ADR-020-global-only-consumer-scope.md +0 -213
  653. package/docs/decisions/ADR-021-deployment-shape.md +0 -153
  654. package/docs/decisions/ADR-022-daily-workspace-decomposition.md +0 -140
  655. package/docs/decisions/ADR-023-host-agent-protocol.md +0 -129
  656. package/docs/decisions/ADR-024-workspace-v0-feature-floor.md +0 -126
  657. package/docs/decisions/ADR-025-workspace-chrome.md +0 -119
  658. package/docs/decisions/ADR-026-explain-mode-translation.md +0 -117
  659. package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +0 -129
  660. package/docs/decisions/ADR-028-root-layout.md +0 -147
  661. package/docs/decisions/ADR-029-multi-workspace-deferred.md +0 -122
  662. package/docs/decisions/ADR-030-claude-code-command-projection.md +0 -147
  663. package/docs/decisions/ADR-031-validation-severity-tiers-and-projection-roundtrip.md +0 -97
  664. package/docs/decisions/ADR-032-linked-projects-scope.md +0 -122
  665. package/docs/decisions/ADR-033-distribution-identity-npm-primary.md +0 -81
  666. package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +0 -63
  667. package/docs/decisions/ADR-035-model-capability-tiers.md +0 -104
  668. package/docs/decisions/ADR-036-global-install-browser-wizard-handoff.md +0 -106
  669. package/docs/decisions/ADR-037-cost-profile-untangle.md +0 -117
  670. package/docs/decisions/ADR-038-canonical-settings-path.md +0 -96
  671. package/docs/decisions/ADR-039-claude-skills-untracked.md +0 -139
  672. package/docs/decisions/ADR-040-execution-model-projection-time-filtering.md +0 -244
  673. package/docs/decisions/ADR-041-controlled-command-verbs.md +0 -133
  674. package/docs/decisions/ADR-042-runtime-resolver-decision-gate.md +0 -113
  675. package/docs/decisions/ADR-043-monorepo-collapse-to-src-domains.md +0 -128
  676. package/docs/decisions/ADR-044-command-naming-scheme-hyphenated.md +0 -250
  677. package/docs/decisions/ADR-045-src-source-layout-and-profiles-as-views.md +0 -111
  678. package/docs/decisions/ADR-046-thin-command-principle.md +0 -93
  679. package/docs/decisions/ADR-047-framework-neutral-stack-adaptive-commands.md +0 -94
  680. package/docs/decisions/ADR-048-command-justification-rule.md +0 -106
  681. package/docs/decisions/ADR-049-configuration-trust-boundary.md +0 -132
  682. package/docs/decisions/ADR-050-workspace-vs-package-root-boundary.md +0 -121
  683. package/docs/decisions/ADR-051-uncondensed-source-container-relocation.md +0 -114
  684. package/docs/decisions/ADR-052-packages-removal-and-pack-home-migration.md +0 -86
  685. package/docs/decisions/ADR-053-agents-namespace-dual-role-resolution.md +0 -132
  686. package/docs/decisions/ADR-054-rule-adherence-decay-triggered-restate.md +0 -143
  687. package/docs/decisions/ADR-055-flow-layer-data-model.md +0 -235
  688. package/docs/decisions/ADR-056-unvalidated-video-adapters-disposition.md +0 -124
  689. package/docs/decisions/ADR-057-consolidation-evidence-gate-outcomes.md +0 -135
  690. package/docs/decisions/ADR-058-condensed-output-relocation-to-dist.md +0 -94
  691. package/docs/decisions/ADR-059-render-resume-filesystem-as-state.md +0 -161
  692. package/docs/decisions/ADR-060-comfyui-sandbox-model.md +0 -154
  693. package/docs/decisions/ADR-061-corpus-grounding-layer.md +0 -230
  694. package/docs/decisions/ADR-062-encrypt-at-rest-store-architecture.md +0 -121
  695. package/docs/decisions/ADR-063-append-jsonl-encryption-deferred.md +0 -83
  696. package/docs/decisions/ADR-064-append-jsonl-per-record-encryption.md +0 -113
  697. package/docs/decisions/ADR-065-tier3-inbox-handoff-v0.md +0 -86
  698. package/docs/decisions/ADR-066-skill-body-prerendering.md +0 -93
  699. package/docs/decisions/ADR-067-glama-registry-listing.md +0 -259
  700. package/docs/decisions/ADR-068-host-tier-detection.md +0 -90
  701. package/docs/decisions/ADR-069-prompt-renderer.md +0 -97
  702. package/docs/decisions/ADR-070-tier1-drive-loop.md +0 -94
  703. package/docs/decisions/ADR-071-launch-drive-integration.md +0 -95
  704. package/docs/decisions/ADR-072-codex-gemini-drive-configs.md +0 -90
  705. package/docs/decisions/ADR-073-drive-health-kill-switch.md +0 -81
  706. package/docs/decisions/ADR-074-drive-kill-switch-auto-recovery.md +0 -84
  707. package/docs/decisions/ADR-075-workspace-gui-drive.md +0 -83
  708. package/docs/decisions/ADR-076-workspace-multi-turn.md +0 -92
  709. package/docs/decisions/ADR-077-workspace-followup-gui.md +0 -70
  710. package/docs/decisions/ADR-078-drive-health-panel.md +0 -70
  711. package/docs/decisions/ADR-079-workspace-host-picker.md +0 -81
  712. package/docs/decisions/ADR-080-host-session-expired-410.md +0 -92
  713. package/docs/decisions/ADR-081-drive-health-reset-and-410-affordance.md +0 -71
  714. package/docs/decisions/ADR-082-410-one-click-relaunch.md +0 -58
  715. package/docs/decisions/ADR-083-session-thread-and-arbitrary-continuation.md +0 -85
  716. package/docs/decisions/ADR-084-drive-health-refresh-on-drive.md +0 -52
  717. package/docs/decisions/ADR-085-mcp-stdio-end-user-distribution-shape.md +0 -158
  718. package/docs/decisions/ADR-086-read-only-cross-agent-mcp-discovery-helper.md +0 -171
  719. package/docs/decisions/ADR-087-installer-e2e-test-strategy.md +0 -111
  720. package/docs/decisions/ADR-088-no-external-runtime-federation.md +0 -144
  721. package/docs/decisions/ADR-089-lean-local-plugin-install.md +0 -111
  722. package/docs/decisions/ADR-090-visibility-command-frontmatter-field.md +0 -95
  723. package/docs/decisions/ADR-091-split-meta-capability-packs.md +0 -113
  724. package/docs/decisions/ADR-092-defer-command-tier-alias-removal.md +0 -117
  725. package/docs/decisions/ADR-093-ai-council-config-user-global.md +0 -117
  726. package/docs/decisions/ADR-094-agent-memory-layer-removal.md +0 -94
  727. package/docs/decisions/ADR-095-workspace-boundary-contract.md +0 -108
  728. package/docs/decisions/ADR-096-analysis-workbench.md +0 -110
  729. package/docs/decisions/ADR-097-mission-recipe-privilege-boundary.md +0 -121
  730. package/docs/decisions/ADR-098-evidence-first-structure-discovery.md +0 -154
  731. package/docs/decisions/ADR-099-file-first-pattern-library.md +0 -87
  732. package/docs/decisions/ADR-100-global-knowledge-card-sharing.md +0 -140
  733. package/docs/decisions/ADR-101-ticket-bundle-emission.md +0 -109
  734. package/docs/decisions/ADR-102-ticket-handoff-paste-and-mcp.md +0 -72
  735. package/docs/decisions/ADR-103-global-knowledge-default-off-until-measured.md +0 -92
  736. package/docs/decisions/ADR-104-ai-council-config-global-only.md +0 -119
  737. package/docs/decisions/ADR-105-automatic-subagent-orchestration.md +0 -108
  738. package/docs/decisions/ADR-106-recursive-verification-benchmark-gate.md +0 -126
  739. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +0 -70
  740. package/docs/decisions/ADR-108-open-source-forever-no-commercial-tier.md +0 -46
  741. package/docs/decisions/ADR-109-subagent-v1-contract.md +0 -246
  742. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +0 -110
  743. package/docs/decisions/ADR-111-canonical-glama-listing.md +0 -97
  744. package/docs/decisions/ADR-112-stdio-lite-stays-read-only.md +0 -92
  745. package/docs/decisions/ADR-113-ci-native-release-label-trigger.md +0 -201
  746. package/docs/decisions/ADR-114-commit-policy-iron-law-override.md +0 -85
  747. package/docs/decisions/ADR-115-command-cluster-consolidation-phase-4.md +0 -91
  748. package/docs/decisions/ADR-116-memory-tripwire-activation-path.md +0 -144
  749. package/docs/decisions/ADR-117-subagents-auto-default-on.md +0 -89
  750. package/docs/decisions/ADR-118-loop-engineering-boundaries.md +0 -162
  751. package/docs/decisions/ADR-119-global-knowledge-default-on.md +0 -104
  752. package/docs/decisions/ADR-120-council-chairman-mode.md +0 -70
  753. package/docs/decisions/ADR-121-knowledge-sensitivity-classes.md +0 -90
  754. package/docs/decisions/ADR-122-adversarial-verification-council.md +0 -166
  755. package/docs/decisions/ADR-123-runtime-security-scope-and-spawn-hardening.md +0 -142
  756. package/docs/decisions/ADR-200-python-to-typescript-migration.md +0 -203
  757. package/docs/decisions/ADR-rule-kernel-and-router.md +0 -133
  758. package/docs/decisions/INDEX.md +0 -136
  759. package/docs/deploy/connector-setup.md +0 -129
  760. package/docs/deploy/env-vars.md +0 -70
  761. package/docs/deploy/policy-cookbook.md +0 -130
  762. package/docs/deploy/quickstart.md +0 -112
  763. package/docs/deploy/small-team-recipe.md +0 -148
  764. package/docs/deploy/team-deployment-posture.md +0 -111
  765. package/docs/design/adversarial-council-eval.md +0 -106
  766. package/docs/design/council-vs-solo-baseline.md +0 -92
  767. package/docs/design/cross-model-parity-eval.md +0 -82
  768. package/docs/design/length-neutral-judge-rerun.md +0 -92
  769. package/docs/design/utilization-window-criteria.md +0 -51
  770. package/docs/development.md +0 -230
  771. package/docs/distribution/awesome-list-submission.md +0 -46
  772. package/docs/distribution/consumer-matrix.md +0 -96
  773. package/docs/distribution/launch-story-draft.md +0 -58
  774. package/docs/distribution/mcp-submission-checklist.md +0 -95
  775. package/docs/distribution/public-install-smoke.md +0 -68
  776. package/docs/distribution/registries.md +0 -117
  777. package/docs/distribution/registry-submissions.md +0 -85
  778. package/docs/distribution/telemetry-privacy.md +0 -128
  779. package/docs/distribution/telemetry-schema.md +0 -174
  780. package/docs/distribution/topics-equivalents-decay-policy.md +0 -51
  781. package/docs/end-to-end-walkthroughs.md +0 -165
  782. package/docs/enforcement-by-host.md +0 -44
  783. package/docs/examples/agent-user.example.md +0 -22
  784. package/docs/experiences/agency.md +0 -49
  785. package/docs/experiences/content_creator.md +0 -49
  786. package/docs/experiences/developer.md +0 -49
  787. package/docs/experiences/finance.md +0 -50
  788. package/docs/experiences/founder.md +0 -49
  789. package/docs/experiences/ops.md +0 -49
  790. package/docs/featured-commands.md +0 -27
  791. package/docs/featured-skills.md +0 -95
  792. package/docs/flows.md +0 -67
  793. package/docs/getting-started-by-role.md +0 -190
  794. package/docs/getting-started-laravel.md +0 -72
  795. package/docs/getting-started-local-stdio.md +0 -77
  796. package/docs/getting-started.md +0 -254
  797. package/docs/github-topics.md +0 -93
  798. package/docs/governance-advantage.md +0 -72
  799. package/docs/governance.md +0 -96
  800. package/docs/guides/cross-repo-linked-projects.md +0 -93
  801. package/docs/guides/cross-repo-retrieval.md +0 -61
  802. package/docs/guides/frontend-design-corpus-refresh.md +0 -83
  803. package/docs/guides/local-analytics.md +0 -125
  804. package/docs/guides/local-knowledge.md +0 -127
  805. package/docs/guides/skill-discovery.md +0 -71
  806. package/docs/guides/skill-preview.md +0 -71
  807. package/docs/hook-payload-capture.md +0 -221
  808. package/docs/install-friction-report.md +0 -66
  809. package/docs/installation.md +0 -959
  810. package/docs/maintainers/branch-protection.md +0 -105
  811. package/docs/maintainers/dev-mode.md +0 -106
  812. package/docs/maintainers/optional-media-deps.md +0 -50
  813. package/docs/maintainers/system-map.md +0 -85
  814. package/docs/mcp-registries.md +0 -94
  815. package/docs/mcp-server.md +0 -175
  816. package/docs/mcp.md +0 -147
  817. package/docs/media/proof-demo.cast +0 -14
  818. package/docs/media/proof-demo.gif +0 -0
  819. package/docs/migration/consumer-template-consumption-model.md +0 -145
  820. package/docs/migration/divergences/README.md +0 -55
  821. package/docs/migration/divergences/_template.md +0 -50
  822. package/docs/migration/divergences/bench-stats-float-precision.md +0 -72
  823. package/docs/migration/divergences/mcp-telemetry-node-sqlite.md +0 -61
  824. package/docs/migration/divergences/pack-mcp-content-gzip-body.md +0 -53
  825. package/docs/migration/divergences/src-scripts-build_cloud_bundle.md +0 -63
  826. package/docs/migration/divergences/src-scripts-check_memory.md +0 -91
  827. package/docs/migration/divergences/src-scripts-inventory_abstraction_budget.md +0 -65
  828. package/docs/migration/divergences/src-scripts-lint_marketplace.md +0 -57
  829. package/docs/migration/divergences/src-scripts-lint_mcp_registry_manifest.md +0 -70
  830. package/docs/migration/divergences/src-scripts-spotcheck_thin_root.md +0 -60
  831. package/docs/migration/divergences/src-scripts-validate_agent_settings.md +0 -58
  832. package/docs/migration/node-floor.md +0 -86
  833. package/docs/migration/v1-to-v2.md +0 -156
  834. package/docs/migration/yaml-roundtrip-spike.md +0 -163
  835. package/docs/migrations/commands-1.15.0.md +0 -117
  836. package/docs/parity/bench-external.json +0 -58
  837. package/docs/parity/bench.json +0 -41
  838. package/docs/parity/command-frontmatter.md +0 -60
  839. package/docs/parity/external-runtime.md +0 -46
  840. package/docs/personas.md +0 -178
  841. package/docs/positioning-evidence.md +0 -86
  842. package/docs/profiles.md +0 -108
  843. package/docs/proof.md +0 -176
  844. package/docs/quality.md +0 -98
  845. package/docs/readme-split-plan.md +0 -102
  846. package/docs/recruits/_template.md +0 -81
  847. package/docs/release-runbook.md +0 -141
  848. package/docs/role-experiences.md +0 -19
  849. package/docs/safety.md +0 -30
  850. package/docs/second-brain-scope.md +0 -116
  851. package/docs/self-review-gate.md +0 -65
  852. package/docs/setup/enterprise-and-offline.md +0 -201
  853. package/docs/setup/mcp-client-config.md +0 -358
  854. package/docs/setup/mcp-cloud-endpoints.md +0 -116
  855. package/docs/setup/mcp-cloud-registry-listing.md +0 -99
  856. package/docs/setup/mcp-cloud-setup.md +0 -183
  857. package/docs/setup/mcp-r2-bootstrap.md +0 -82
  858. package/docs/setup/mcp-server-docker.md +0 -101
  859. package/docs/setup/per-ide/aider.md +0 -48
  860. package/docs/setup/per-ide/antigravity.md +0 -68
  861. package/docs/setup/per-ide/augment.md +0 -89
  862. package/docs/setup/per-ide/claude-code.md +0 -97
  863. package/docs/setup/per-ide/claude-desktop.md +0 -207
  864. package/docs/setup/per-ide/cline.md +0 -43
  865. package/docs/setup/per-ide/codebuddy.md +0 -63
  866. package/docs/setup/per-ide/codex.md +0 -46
  867. package/docs/setup/per-ide/continue.md +0 -68
  868. package/docs/setup/per-ide/copilot.md +0 -80
  869. package/docs/setup/per-ide/cursor.md +0 -125
  870. package/docs/setup/per-ide/droid.md +0 -65
  871. package/docs/setup/per-ide/gemini-cli.md +0 -45
  872. package/docs/setup/per-ide/jetbrains.md +0 -76
  873. package/docs/setup/per-ide/kilocode.md +0 -66
  874. package/docs/setup/per-ide/kiro.md +0 -72
  875. package/docs/setup/per-ide/opencode.md +0 -62
  876. package/docs/setup/per-ide/qoder.md +0 -63
  877. package/docs/setup/per-ide/roocode.md +0 -68
  878. package/docs/setup/per-ide/trae.md +0 -63
  879. package/docs/setup/per-ide/warp.md +0 -63
  880. package/docs/setup/per-ide/windsurf.md +0 -109
  881. package/docs/setup/per-ide/zed.md +0 -73
  882. package/docs/showcase.md +0 -209
  883. package/docs/skill-duplication-findings.md +0 -91
  884. package/docs/skills-catalog.md +0 -265
  885. package/docs/skills-taxonomy.md +0 -90
  886. package/docs/spawn-site-policy.md +0 -72
  887. package/docs/succession.md +0 -80
  888. package/docs/threat-model.md +0 -29
  889. package/docs/troubleshooting.md +0 -155
  890. package/docs/ui-track-mental-model.md +0 -121
  891. package/docs/us-vs-the-category.md +0 -38
  892. package/docs/value.md +0 -86
  893. package/docs/walkthroughs/assets/workspace-role-grid.png +0 -0
  894. package/docs/walkthroughs/assets/workspace-session-started.png +0 -0
  895. package/docs/walkthroughs/assets/workspace-task-picker.png +0 -0
  896. package/docs/walkthroughs/daily-workspace-a11y.md +0 -87
  897. package/docs/walkthroughs/daily-workspace.md +0 -127
  898. package/docs/wedge/production-validator/README.md +0 -81
  899. package/docs/wedge/production-validator/first-run-check.sh +0 -42
  900. package/docs/wedge/production-validator/production-validator.md +0 -83
  901. package/docs/wizard.md +0 -173
@@ -0,0 +1,226 @@
1
+ /**
2
+ * detect_n1_eloquent — deterministic N+1 pattern detection for Laravel/Eloquent PHP.
3
+ *
4
+ * Falsification spike S0.1 of the road-to-scale-and-history-discipline roadmap.
5
+ * Failure class F1 (N+1 queries), rule R-A1, tier gate.
6
+ *
7
+ * Approach: lightweight line/brace scanning, no PHP AST. A foreach loop is
8
+ * suspicious when its iterable derives from an Eloquent/DB query source
9
+ * (::all(), ->get(), ->cursor(), DB::table(...)->get()) WITHOUT eager loading
10
+ * (->with(...) on the source chain, or a ->load(...) call on the variable
11
+ * before the loop). Inside such a loop, we flag:
12
+ * - static query calls (Model::find/where/..., DB::table(...))
13
+ * - lazy relation access on the loop variable (chained property access,
14
+ * count($var->rel), relation-method calls chained into query methods,
15
+ * foreach over $var->rel)
16
+ *
17
+ * NOT flagged (by construction): iterables from ->with()/->load(), constant
18
+ * array literals (bounded loops), chunk() callbacks (unknown-source iterables
19
+ * are skipped), whereIn-prefetch keyed lookups, plain scalar attribute access,
20
+ * and chained access to known non-relation attributes (Carbon dates).
21
+ *
22
+ * Deterministic pattern detection only — instance-level correctness is handled
23
+ * by the waiver process (see types.ts), never by this scanner claiming
24
+ * judgment it does not have.
25
+ */
26
+
27
+ import { readdirSync, readFileSync } from 'node:fs';
28
+ import { join, relative } from 'node:path';
29
+ import { parse_waiver, type Finding } from './types.js';
30
+ import { is_ignored_dir } from './types.js';
31
+
32
+ export interface FileInput {
33
+ path: string;
34
+ content: string;
35
+ }
36
+
37
+ /** Attributes commonly chained without being relations (Carbon casts etc.). */
38
+ const NON_RELATION_ATTRS = new Set([
39
+ 'created_at',
40
+ 'updated_at',
41
+ 'deleted_at',
42
+ 'published_at',
43
+ 'email_verified_at',
44
+ 'pivot',
45
+ ]);
46
+
47
+ /** Query methods that, chained onto a relation method call, execute a query. */
48
+ const QUERY_CHAIN_METHODS = 'get|first|count|pluck|sum|avg|min|max|exists|paginate|value';
49
+
50
+ /** Static entry points on a model class that build/execute a query. */
51
+ const STATIC_QUERY_RE =
52
+ /\b[A-Z]\w*::(?:find|findOrFail|where|whereIn|firstWhere|first|all|query|count|pluck|exists|sum)\s*\(/;
53
+ const DB_TABLE_RE = /\bDB::table\s*\(/;
54
+
55
+ /** Strip line comments and quoted string contents so braces/parens scan cleanly. */
56
+ function strip_noise(line: string): string {
57
+ return line
58
+ .replace(/'(?:[^'\\]|\\.)*'/g, "''")
59
+ .replace(/"(?:[^"\\]|\\.)*"/g, '""')
60
+ .replace(/\/\/.*$/, '');
61
+ }
62
+
63
+ type SourceKind = 'query' | 'eager-query' | 'constant' | 'other';
64
+
65
+ /** Classify a right-hand-side expression as a query source (eager or not). */
66
+ function classify_expr(expr: string): SourceKind {
67
+ const e = expr.trim();
68
+ if (e.startsWith('[')) return 'constant';
69
+ const is_query =
70
+ /\b[A-Z]\w*::(?:all|cursor)\s*\(\s*\)/.test(e) ||
71
+ ((/^[A-Z]\w*::/.test(e) || DB_TABLE_RE.test(e)) && /->(?:get|cursor)\s*\(\s*\)/.test(e));
72
+ if (!is_query) return 'other';
73
+ return /(?:::|->)with\s*\(/.test(e) ? 'eager-query' : 'query';
74
+ }
75
+
76
+ /** Find the line index of the matching close brace for a block opening at open_idx. */
77
+ function find_block_end(lines: string[], open_idx: number): number {
78
+ let depth = 0;
79
+ let opened = false;
80
+ for (let i = open_idx; i < lines.length; i++) {
81
+ const clean = strip_noise(lines[i]!);
82
+ for (const ch of clean) {
83
+ if (ch === '{') {
84
+ depth++;
85
+ opened = true;
86
+ } else if (ch === '}') {
87
+ depth--;
88
+ if (opened && depth === 0) return i;
89
+ }
90
+ }
91
+ }
92
+ return lines.length - 1;
93
+ }
94
+
95
+ interface InnerHit {
96
+ line_idx: number;
97
+ detail: string;
98
+ }
99
+
100
+ /** Scan a loop body for per-iteration query patterns relative to the loop variable. */
101
+ function scan_loop_body(lines: string[], start: number, end: number, loop_var: string): InnerHit[] {
102
+ const hits: InnerHit[] = [];
103
+ const v = loop_var.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
104
+ const lazy_chain_re = new RegExp(`\\$${v}->(\\w+)(?!\\s*\\()->`);
105
+ const count_lazy_re = new RegExp(`\\bcount\\(\\s*\\$${v}->(\\w+)\\s*\\)`);
106
+ const relation_method_query_re = new RegExp(
107
+ `\\$${v}->\\w+\\(\\)\\s*->\\s*(?:${QUERY_CHAIN_METHODS})\\s*\\(`,
108
+ );
109
+ const foreach_lazy_re = new RegExp(`foreach\\s*\\(\\s*\\$${v}->(\\w+)`);
110
+
111
+ for (let i = start; i <= end; i++) {
112
+ const clean = strip_noise(lines[i]!);
113
+
114
+ if (STATIC_QUERY_RE.test(clean) || DB_TABLE_RE.test(clean)) {
115
+ hits.push({ line_idx: i, detail: 'query call inside loop body' });
116
+ continue;
117
+ }
118
+ const chain = clean.match(lazy_chain_re);
119
+ if (chain && chain[1] && !NON_RELATION_ATTRS.has(chain[1])) {
120
+ hits.push({
121
+ line_idx: i,
122
+ detail: `lazy relation access $${loop_var}->${chain[1]} inside loop body`,
123
+ });
124
+ continue;
125
+ }
126
+ const counted = clean.match(count_lazy_re);
127
+ if (counted && counted[1] && !NON_RELATION_ATTRS.has(counted[1])) {
128
+ hits.push({
129
+ line_idx: i,
130
+ detail: `count() over lazy relation $${loop_var}->${counted[1]} inside loop body`,
131
+ });
132
+ continue;
133
+ }
134
+ if (relation_method_query_re.test(clean)) {
135
+ hits.push({
136
+ line_idx: i,
137
+ detail: `relation-method query on $${loop_var} inside loop body`,
138
+ });
139
+ continue;
140
+ }
141
+ const inner_iter = clean.match(foreach_lazy_re);
142
+ if (inner_iter && inner_iter[1] && !NON_RELATION_ATTRS.has(inner_iter[1])) {
143
+ hits.push({
144
+ line_idx: i,
145
+ detail: `iteration over lazy relation $${loop_var}->${inner_iter[1]}`,
146
+ });
147
+ }
148
+ }
149
+ return hits;
150
+ }
151
+
152
+ /** Detect N+1 query patterns in the given PHP files. Returns F1 gate findings. */
153
+ export function detect_n1(files: FileInput[]): Finding[] {
154
+ const findings: Finding[] = [];
155
+
156
+ for (const { path, content } of files) {
157
+ const lines = content.split('\n');
158
+
159
+ // Pass 1 — track variable sources: assignments + ->load() eager upgrades.
160
+ const sources = new Map<string, SourceKind>();
161
+ for (const raw of lines) {
162
+ const clean = strip_noise(raw);
163
+ const assign = clean.match(/^\s*\$(\w+)\s*=\s*(.+);\s*$/);
164
+ if (assign) {
165
+ sources.set(assign[1]!, classify_expr(assign[2]!));
166
+ continue;
167
+ }
168
+ const loaded = clean.match(/^\s*\$(\w+)->load(?:Missing)?\s*\(/);
169
+ if (loaded && sources.get(loaded[1]!) === 'query') {
170
+ sources.set(loaded[1]!, 'eager-query');
171
+ }
172
+ }
173
+
174
+ // Pass 2 — analyze foreach loops whose iterable is a non-eager query source.
175
+ for (let i = 0; i < lines.length; i++) {
176
+ const clean = strip_noise(lines[i]!);
177
+ const fe = clean.match(/foreach\s*\(\s*(.+?)\s+as\s+(?:\$\w+\s*=>\s*)?\$(\w+)\s*\)/);
178
+ if (!fe) continue;
179
+
180
+ const [, src_expr, loop_var] = fe;
181
+ const var_ref = src_expr!.trim().match(/^\$(\w+)$/);
182
+ const kind: SourceKind = var_ref
183
+ ? (sources.get(var_ref[1]!) ?? 'other')
184
+ : classify_expr(src_expr!);
185
+ if (kind !== 'query') continue;
186
+
187
+ const body_end = find_block_end(lines, i);
188
+ for (const hit of scan_loop_body(lines, i + 1, body_end, loop_var!)) {
189
+ const finding: Finding = {
190
+ failure_class: 'F1',
191
+ rule: 'R-A1',
192
+ file: path,
193
+ line: hit.line_idx + 1,
194
+ message: `N+1: ${hit.detail}; iterable ${src_expr!.trim()} is a non-eager query result`,
195
+ tier: 'gate',
196
+ };
197
+ const waiver = parse_waiver(lines, hit.line_idx);
198
+ if (waiver) {
199
+ finding.waived = true;
200
+ finding.waiver_reason = waiver.reason;
201
+ }
202
+ findings.push(finding);
203
+ }
204
+ }
205
+ }
206
+
207
+ return findings;
208
+ }
209
+
210
+ /** Convenience: recursively scan a directory for .php files and run detect_n1. */
211
+ export function scan_dir(dir: string): Finding[] {
212
+ const files: FileInput[] = [];
213
+ const walk = (d: string): void => {
214
+ for (const entry of readdirSync(d, { withFileTypes: true })) {
215
+ const full = join(d, entry.name);
216
+ if (entry.isDirectory()) {
217
+ if (!is_ignored_dir(entry.name)) walk(full);
218
+ }
219
+ else if (entry.name.endsWith('.php')) {
220
+ files.push({ path: relative(process.cwd(), full), content: readFileSync(full, 'utf8') });
221
+ }
222
+ }
223
+ };
224
+ walk(dir);
225
+ return detect_n1(files);
226
+ }
@@ -0,0 +1,441 @@
1
+ /**
2
+ * Offload detection — spike S0.5, road-to-scale-and-history-discipline
3
+ * Phase 0. Deterministic pattern detection for:
4
+ *
5
+ * F9 (R-A8) — offloadable-catalog calls inside a request handler
6
+ * F11 (R-A10) — non-durable async for must-not-lose work (fire-and-forget,
7
+ * sync listeners doing catalog work, dispatchAfterResponse /
8
+ * shutdown hooks carrying must-not-lose jobs)
9
+ *
10
+ * Scope-aware: the same call inside a queued job/listener/worker is the FIX,
11
+ * not the bug, and never fires. Waivers (`// sync-required: <reason>`,
12
+ * `// accepted-loss: <reason>`) mark findings as waived per types.parse_waiver.
13
+ * The catalog itself is config data in offload_catalog.ts.
14
+ */
15
+ import * as fs from 'node:fs';
16
+ import * as path from 'node:path';
17
+
18
+ import type { Finding } from './types.js';
19
+ import { parse_waiver, is_ignored_dir } from './types.js';
20
+ import { ELOQUENT_CATALOG, TS_CATALOG, MUST_NOT_LOSE_NAME_RE, type StackCatalog } from './offload_catalog.js';
21
+
22
+ export type Stack = 'eloquent' | 'ts';
23
+
24
+ export interface SourceFile {
25
+ path: string;
26
+ content: string;
27
+ }
28
+
29
+ interface Span {
30
+ start: number; // 0-indexed inclusive
31
+ end: number; // 0-indexed inclusive
32
+ }
33
+
34
+ // ------------------------------------------------------------ helpers
35
+
36
+ /** Blank comment bodies and string contents, preserving line structure. */
37
+ function mask_code(text: string): string {
38
+ let out = '';
39
+ let i = 0;
40
+ let mode: 'code' | 'line' | 'block' | 's1' | 's2' | 'tpl' = 'code';
41
+ while (i < text.length) {
42
+ const c = text[i];
43
+ const next = text[i + 1];
44
+ if (mode === 'code') {
45
+ if (c === '/' && next === '/') {
46
+ mode = 'line';
47
+ out += '//';
48
+ i += 2;
49
+ continue;
50
+ }
51
+ if (c === '/' && next === '*') {
52
+ mode = 'block';
53
+ out += ' ';
54
+ i += 2;
55
+ continue;
56
+ }
57
+ if (c === "'") mode = 's1';
58
+ else if (c === '"') mode = 's2';
59
+ else if (c === '`') mode = 'tpl';
60
+ out += c;
61
+ i += 1;
62
+ continue;
63
+ }
64
+ if (mode === 'line') {
65
+ if (c === '\n') mode = 'code';
66
+ out += c === '\n' ? c : c; // keep line comments verbatim (waivers live here)
67
+ i += 1;
68
+ continue;
69
+ }
70
+ if (mode === 'block') {
71
+ if (c === '*' && next === '/') {
72
+ mode = 'code';
73
+ out += ' ';
74
+ i += 2;
75
+ continue;
76
+ }
77
+ out += c === '\n' ? '\n' : ' ';
78
+ i += 1;
79
+ continue;
80
+ }
81
+ // strings: keep the protocol prefix visible for URL catalog patterns
82
+ if ((mode === 's1' && c === "'") || (mode === 's2' && c === '"') || (mode === 'tpl' && c === '`')) {
83
+ mode = 'code';
84
+ out += c;
85
+ i += 1;
86
+ continue;
87
+ }
88
+ if (c === '\\') {
89
+ out += '\\' + (next ?? '');
90
+ i += 2;
91
+ continue;
92
+ }
93
+ out += c === '\n' ? '\n' : c;
94
+ i += 1;
95
+ continue;
96
+ }
97
+ return out;
98
+ }
99
+
100
+ /**
101
+ * Blank string CONTENTS (quotes stay) — for brace math only, so a `{id}`
102
+ * inside a route path or template literal cannot corrupt scope spans.
103
+ */
104
+ function blank_strings(text: string): string {
105
+ let out = '';
106
+ let mode: 'code' | 's1' | 's2' | 'tpl' | 'line' | 'block' = 'code';
107
+ for (let i = 0; i < text.length; i += 1) {
108
+ const c = text[i];
109
+ const next = text[i + 1];
110
+ if (mode === 'code') {
111
+ if (c === '/' && next === '/') mode = 'line';
112
+ else if (c === '/' && next === '*') mode = 'block';
113
+ else if (c === "'") mode = 's1';
114
+ else if (c === '"') mode = 's2';
115
+ else if (c === '`') mode = 'tpl';
116
+ out += c;
117
+ continue;
118
+ }
119
+ if (mode === 'line') {
120
+ if (c === '\n') mode = 'code';
121
+ out += c;
122
+ continue;
123
+ }
124
+ if (mode === 'block') {
125
+ if (c === '*' && next === '/') {
126
+ mode = 'code';
127
+ out += '*';
128
+ continue;
129
+ }
130
+ out += c === '\n' ? '\n' : ' ';
131
+ continue;
132
+ }
133
+ if (c === '\\') {
134
+ out += ' ';
135
+ i += 1;
136
+ continue;
137
+ }
138
+ if ((mode === 's1' && c === "'") || (mode === 's2' && c === '"') || (mode === 'tpl' && c === '`')) {
139
+ mode = 'code';
140
+ out += c;
141
+ continue;
142
+ }
143
+ out += c === '\n' ? '\n' : ' ';
144
+ }
145
+ return out;
146
+ }
147
+
148
+ /** Find the span of the brace block opening at/after `from` (0-indexed line). */
149
+ function brace_span(lines: string[], from: number): Span | null {
150
+ let depth = 0;
151
+ let opened = false;
152
+ for (let i = from; i < lines.length; i += 1) {
153
+ for (const ch of lines[i]!) {
154
+ if (ch === '{') {
155
+ depth += 1;
156
+ opened = true;
157
+ } else if (ch === '}') {
158
+ depth -= 1;
159
+ if (opened && depth === 0) return { start: from, end: i };
160
+ }
161
+ }
162
+ if (opened && depth === 0) return { start: from, end: i };
163
+ }
164
+ return opened ? { start: from, end: lines.length - 1 } : null;
165
+ }
166
+
167
+ function in_spans(line0: number, spans: Span[]): boolean {
168
+ return spans.some((s) => line0 >= s.start && line0 <= s.end);
169
+ }
170
+
171
+ // ------------------------------------------------------------ PHP scopes
172
+
173
+ interface PhpScopes {
174
+ handler_spans: Span[];
175
+ queued_spans: Span[]; // ShouldQueue job/listener bodies — never fire
176
+ sync_listener_spans: Span[]; // listener WITHOUT ShouldQueue — F11 on catalog work
177
+ }
178
+
179
+ function php_scopes(file: string, lines: string[]): PhpScopes {
180
+ const text = lines.join('\n');
181
+ const blanked = blank_strings(text).split('\n');
182
+ const handler_spans: Span[] = [];
183
+ const queued_spans: Span[] = [];
184
+ const sync_listener_spans: Span[] = [];
185
+
186
+ const is_controller_file =
187
+ /Http[\\/]Controllers/.test(file) || /extends\s+Controller\b/.test(text);
188
+ const is_listener_file = /namespace\s+App\\Listeners|[\\/]Listeners[\\/]/.test(file + '\n' + text);
189
+ const is_job_file = /namespace\s+App\\Jobs|[\\/]Jobs[\\/]/.test(file + '\n' + text);
190
+
191
+ for (let i = 0; i < lines.length; i += 1) {
192
+ const l = lines[i]!;
193
+ // Class bodies
194
+ const cls = l.match(/\bclass\s+(\w+)/);
195
+ if (cls) {
196
+ const span = brace_span(blanked, i);
197
+ if (!span) continue;
198
+ const head = lines.slice(i, Math.min(i + 3, lines.length)).join(' ');
199
+ const implements_queue = /implements[^{]*\bShouldQueue\b/.test(head);
200
+ if (implements_queue) queued_spans.push(span);
201
+ else if (is_listener_file) sync_listener_spans.push(span);
202
+ else if (is_controller_file || /extends\s+Controller\b/.test(head)) handler_spans.push(span);
203
+ else if (is_job_file) queued_spans.push(span); // non-queued job class: treated as worker context
204
+ }
205
+ // Route closures
206
+ if (/Route::(get|post|put|patch|delete|any)\s*\(/.test(l) && /function\s*\(/.test(lines.slice(i, i + 2).join(' '))) {
207
+ const span = brace_span(blanked, i);
208
+ if (span) handler_spans.push(span);
209
+ }
210
+ }
211
+ return { handler_spans, queued_spans, sync_listener_spans };
212
+ }
213
+
214
+ // ------------------------------------------------------------ TS scopes
215
+
216
+ interface TsScopes {
217
+ handler_spans: Span[];
218
+ worker: boolean; // whole file is worker/queue context
219
+ }
220
+
221
+ function ts_scopes(file: string, lines: string[]): TsScopes {
222
+ const text = lines.join('\n');
223
+ const blanked = blank_strings(text).split('\n');
224
+ const worker =
225
+ /[\\/](workers?|queues?|jobs|consumers?)[\\/]/.test(file) ||
226
+ /new\s+Worker\s*\(/.test(text) ||
227
+ /[\\/]scripts[\\/]/.test(file);
228
+ const handler_spans: Span[] = [];
229
+ if (!worker) {
230
+ for (let i = 0; i < lines.length; i += 1) {
231
+ const l = lines[i]!;
232
+ if (
233
+ /\b(app|router|fastify)\.(get|post|put|patch|delete|all)\s*\(/.test(l) ||
234
+ /export\s+(default\s+)?async\s+function\s+(GET|POST|PUT|PATCH|DELETE)\b/.test(l) ||
235
+ /export\s+const\s+(GET|POST|PUT|PATCH|DELETE)\s*=/.test(l)
236
+ ) {
237
+ const span = brace_span(blanked, i);
238
+ if (span) handler_spans.push(span);
239
+ }
240
+ }
241
+ }
242
+ return { handler_spans, worker };
243
+ }
244
+
245
+ // ------------------------------------------------------------ detection
246
+
247
+ function make_finding(
248
+ file: string,
249
+ lines: string[],
250
+ line0: number,
251
+ failure_class: 'F9' | 'F11',
252
+ rule: 'R-A8' | 'R-A10',
253
+ message: string,
254
+ ): Finding {
255
+ const waiver = parse_waiver(lines, line0);
256
+ return {
257
+ failure_class,
258
+ rule,
259
+ file,
260
+ line: line0 + 1,
261
+ message,
262
+ tier: 'gate',
263
+ ...(waiver ? { waived: true, waiver_reason: waiver.reason } : {}),
264
+ };
265
+ }
266
+
267
+ function detect_php(file: SourceFile, catalog: StackCatalog): Finding[] {
268
+ const lines = file.content.split('\n');
269
+ const masked_lines = mask_code(file.content).split('\n');
270
+ const scopes = php_scopes(file.path, lines);
271
+ const findings: Finding[] = [];
272
+
273
+ const catalog_hit = (l: string): { label: string; must_not_lose: boolean } | null => {
274
+ for (const alt of catalog.allowed_alternatives) {
275
+ if (new RegExp(alt).test(l)) return null;
276
+ }
277
+ for (const entry of catalog.offloadable) {
278
+ if (new RegExp(entry.pattern).test(l)) return entry;
279
+ }
280
+ return null;
281
+ };
282
+
283
+ for (let i = 0; i < masked_lines.length; i += 1) {
284
+ const l = masked_lines[i]!;
285
+ if (in_spans(i, scopes.queued_spans)) continue;
286
+
287
+ const in_handler = in_spans(i, scopes.handler_spans);
288
+ const in_sync_listener = in_spans(i, scopes.sync_listener_spans);
289
+ if (!in_handler && !in_sync_listener) continue;
290
+
291
+ // Notification::send — queued when the notification class (in-file)
292
+ // implements ShouldQueue; conservative skip when the class is unknown.
293
+ if (/Notification(Facade)?::send\s*\(/.test(l)) {
294
+ const cls = l.match(/new\s+(\w+)\s*\(/);
295
+ const queued =
296
+ !cls ||
297
+ new RegExp(String.raw`class\s+${cls[1]}[^{]*implements[^{]*ShouldQueue`).test(
298
+ file.content,
299
+ );
300
+ if (!queued) {
301
+ findings.push(
302
+ make_finding(file.path, lines, i, 'F9', 'R-A8', 'synchronous notification send in request handler — queue it (ShouldQueue)'),
303
+ );
304
+ }
305
+ continue;
306
+ }
307
+
308
+ const hit = catalog_hit(l);
309
+ if (hit) {
310
+ if (in_sync_listener) {
311
+ findings.push(
312
+ make_finding(file.path, lines, i, 'F11', 'R-A10', `${hit.label} in a NON-queued listener — runs synchronously in the firing request; implement ShouldQueue`),
313
+ );
314
+ } else {
315
+ findings.push(
316
+ make_finding(file.path, lines, i, 'F9', 'R-A8', `${hit.label} in request handler — offload to a queued job (validate → persist → dispatch → respond)`),
317
+ );
318
+ }
319
+ continue;
320
+ }
321
+
322
+ if (in_handler) {
323
+ // Unbounded bulk mutation: ::query()->update( without a ->where( in the chain.
324
+ if (/::query\(\)\s*->\s*update\s*\(/.test(l) && !/->\s*where/.test(l)) {
325
+ findings.push(
326
+ make_finding(file.path, lines, i, 'F9', 'R-A8', 'unbounded bulk mutation over a whole table in the handler — offload or bound it'),
327
+ );
328
+ continue;
329
+ }
330
+ // dispatchAfterResponse for must-not-lose job classes.
331
+ const dar = l.match(/\b(\w+)::dispatchAfterResponse\s*\(/);
332
+ if (dar && MUST_NOT_LOSE_NAME_RE.test(dar[1]!)) {
333
+ findings.push(
334
+ make_finding(file.path, lines, i, 'F11', 'R-A10', `dispatchAfterResponse(${dar[1]}) — in-process after-response work is lost on process kill; use a durable queue`),
335
+ );
336
+ continue;
337
+ }
338
+ // register_shutdown_function carrying catalog work.
339
+ if (/register_shutdown_function\s*\(/.test(l)) {
340
+ const span = brace_span(masked_lines, i) ?? { start: i, end: Math.min(i + 10, masked_lines.length - 1) };
341
+ const body = masked_lines.slice(span.start, span.end + 1).join('\n');
342
+ const inner = catalog.offloadable.find((e) => new RegExp(e.pattern).test(body));
343
+ if (inner) {
344
+ findings.push(
345
+ make_finding(file.path, lines, i, 'F11', 'R-A10', `${inner.label} inside a shutdown hook — silently lost on process kill; use a durable queue`),
346
+ );
347
+ }
348
+ }
349
+ }
350
+ }
351
+ return findings;
352
+ }
353
+
354
+ function detect_ts(file: SourceFile, catalog: StackCatalog): Finding[] {
355
+ const lines = file.content.split('\n');
356
+ const masked_lines = mask_code(file.content).split('\n');
357
+ const scopes = ts_scopes(file.path, lines);
358
+ if (scopes.worker) return [];
359
+ const findings: Finding[] = [];
360
+
361
+ for (let i = 0; i < masked_lines.length; i += 1) {
362
+ if (!in_spans(i, scopes.handler_spans)) continue;
363
+ const l = masked_lines[i]!;
364
+
365
+ let allowed = false;
366
+ for (const alt of catalog.allowed_alternatives) {
367
+ if (new RegExp(alt).test(l)) {
368
+ allowed = true;
369
+ break;
370
+ }
371
+ }
372
+ if (allowed) continue;
373
+
374
+ // setTimeout/setImmediate background work carrying catalog calls.
375
+ if (/\b(setTimeout|setImmediate)\s*\(/.test(l)) {
376
+ const span = brace_span(masked_lines, i) ?? { start: i, end: Math.min(i + 10, masked_lines.length - 1) };
377
+ const body = masked_lines.slice(span.start, span.end + 1).join('\n');
378
+ const inner = catalog.offloadable.find(
379
+ (e) => e.must_not_lose && new RegExp(e.pattern).test(body),
380
+ );
381
+ if (inner) {
382
+ findings.push(
383
+ make_finding(file.path, lines, i, 'F11', 'R-A10', `${inner.label} inside setTimeout — in-process fire-and-forget is lost on process kill; use a durable queue`),
384
+ );
385
+ continue;
386
+ }
387
+ }
388
+
389
+ const hit = catalog.offloadable.find((e) => new RegExp(e.pattern).test(l));
390
+ if (!hit) continue;
391
+
392
+ // Unbounded updateMany: no `where` on the same statement line.
393
+ if (hit.label === 'unbounded bulk mutation' && /where\s*:/.test(l)) continue;
394
+
395
+ const fire_and_forget =
396
+ hit.must_not_lose &&
397
+ !/\bawait\b/.test(l) &&
398
+ !/\breturn\b/.test(l) &&
399
+ !/\.then\s*\(/.test(l) &&
400
+ !/=\s*\w/.test(l.split(l.match(new RegExp(hit.pattern))?.[0] ?? '')[0] ?? '');
401
+
402
+ if (fire_and_forget) {
403
+ findings.push(
404
+ make_finding(file.path, lines, i, 'F11', 'R-A10', `un-awaited ${hit.label} in request handler — fire-and-forget must-not-lose work; use a durable queue`),
405
+ );
406
+ } else {
407
+ findings.push(
408
+ make_finding(file.path, lines, i, 'F9', 'R-A8', `${hit.label} in request handler — offload to a queued job (validate → persist → dispatch → respond)`),
409
+ );
410
+ }
411
+ }
412
+ return findings;
413
+ }
414
+
415
+ // ------------------------------------------------------------ public API
416
+
417
+ export function detect_offload(files: SourceFile[], stack: Stack): Finding[] {
418
+ const catalog = stack === 'eloquent' ? ELOQUENT_CATALOG : TS_CATALOG;
419
+ const out: Finding[] = [];
420
+ for (const f of files) {
421
+ out.push(...(stack === 'eloquent' ? detect_php(f, catalog) : detect_ts(f, catalog)));
422
+ }
423
+ return out;
424
+ }
425
+
426
+ export function scan_dir(dir: string, stack: Stack): Finding[] {
427
+ const files: SourceFile[] = [];
428
+ const walk = (d: string): void => {
429
+ for (const e of fs.readdirSync(d, { withFileTypes: true })) {
430
+ const p = path.join(d, e.name);
431
+ if (e.isDirectory()) {
432
+ if (!is_ignored_dir(e.name)) walk(p);
433
+ }
434
+ else if (stack === 'eloquent' ? p.endsWith('.php') : /\.(ts|js|mjs)$/.test(p)) {
435
+ files.push({ path: p, content: fs.readFileSync(p, 'utf8') });
436
+ }
437
+ }
438
+ };
439
+ walk(dir);
440
+ return detect_offload(files, stack);
441
+ }