@event4u/agent-config 14.10.0 → 14.12.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 (667) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +161 -208
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/design.md +88 -0
  7. package/dist/agent-src/commands/project/analyze.md +47 -0
  8. package/dist/agent-src/commands/review/changes.md +67 -6
  9. package/dist/agent-src/commands/roadmap/create.md +49 -0
  10. package/dist/agent-src/commands/roadmap/next.md +27 -11
  11. package/dist/agent-src/commands/roadmap/process-full.md +14 -0
  12. package/dist/agent-src/commands/video/from-script.md +60 -3
  13. package/dist/agent-src/commands/video/stitch.md +14 -0
  14. package/dist/agent-src/contexts/communication/rules-auto/guidelines-mechanics.md +1 -0
  15. package/dist/agent-src/contexts/execution/evidence-discipline.md +26 -0
  16. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +154 -2
  17. package/dist/agent-src/rules/active-remediation.md +3 -3
  18. package/dist/agent-src/rules/code-provenance.md +2 -2
  19. package/dist/agent-src/rules/context-hygiene.md +13 -33
  20. package/dist/agent-src/rules/council-availability.md +2 -2
  21. package/dist/agent-src/rules/decision-revisit-gate.md +3 -1
  22. package/dist/agent-src/rules/design-fidelity.md +18 -0
  23. package/dist/agent-src/rules/design-review-after-ui-write.md +2 -2
  24. package/dist/agent-src/rules/evaluator-independence.md +56 -44
  25. package/dist/agent-src/rules/fix-what-you-see.md +9 -1
  26. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +1 -1
  27. package/dist/agent-src/rules/minimal-safe-diff.md +14 -20
  28. package/dist/agent-src/rules/missing-skill-recovery.md +13 -1
  29. package/dist/agent-src/rules/playbook-precedence.md +105 -0
  30. package/dist/agent-src/rules/recurring-criticism.md +3 -1
  31. package/dist/agent-src/rules/roadmap-progress-sync.md +14 -13
  32. package/dist/agent-src/rules/scale-discipline.md +24 -0
  33. package/dist/agent-src/rules/security-sensitive-stop.md +2 -2
  34. package/dist/agent-src/rules/settings-ask-protocol.md +2 -2
  35. package/dist/agent-src/rules/ui-audit-gate.md +27 -15
  36. package/dist/agent-src/rules/untrusted-input-defense.md +2 -2
  37. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +19 -0
  38. package/dist/agent-src/skills/adr-create/SKILL.md +7 -0
  39. package/dist/agent-src/skills/agents-md-thin-root/SKILL.md +33 -0
  40. package/dist/agent-src/skills/ai-council/references/advanced-modes.md +17 -3
  41. package/dist/agent-src/skills/ai-council/references/output-and-synthesis.md +31 -0
  42. package/dist/agent-src/skills/ai-council/references/procedure.md +19 -0
  43. package/dist/agent-src/skills/alerting-doctrine/SKILL.md +225 -0
  44. package/dist/agent-src/skills/authz-review/SKILL.md +0 -1
  45. package/dist/agent-src/skills/blast-radius-analyzer/SKILL.md +32 -0
  46. package/dist/agent-src/skills/brand/SKILL.md +3 -0
  47. package/dist/agent-src/skills/brand-asset-generation/SKILL.md +3 -0
  48. package/dist/agent-src/skills/brand-audit/SKILL.md +3 -0
  49. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -0
  50. package/dist/agent-src/skills/brand-strategy/SKILL.md +3 -0
  51. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -0
  52. package/dist/agent-src/skills/check-refs/SKILL.md +3 -0
  53. package/dist/agent-src/skills/code-refactoring/SKILL.md +45 -1
  54. package/dist/agent-src/skills/code-review/SKILL.md +75 -5
  55. package/dist/agent-src/skills/command-routing/SKILL.md +6 -0
  56. package/dist/agent-src/skills/command-writing/SKILL.md +35 -0
  57. package/dist/agent-src/skills/condense-memory/SKILL.md +3 -0
  58. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  59. package/dist/agent-src/skills/conventional-commits-writing/SKILL.md +3 -0
  60. package/dist/agent-src/skills/copilot-agents-optimization/SKILL.md +10 -0
  61. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -0
  62. package/dist/agent-src/skills/design-intelligence/SKILL.md +3 -0
  63. package/dist/agent-src/skills/design-intelligence/data/landing.csv +36 -35
  64. package/dist/agent-src/skills/design-intelligence/data/stacks/threejs.csv +1 -0
  65. package/dist/agent-src/skills/design-review/SKILL.md +79 -1
  66. package/dist/agent-src/skills/design-review/references/verification-automation.md +41 -0
  67. package/dist/agent-src/skills/design-system-capture/SKILL.md +35 -40
  68. package/dist/agent-src/skills/design-system-capture/references/import-procedure.md +50 -0
  69. package/dist/agent-src/skills/design-tokens/SKILL.md +3 -0
  70. package/dist/agent-src/skills/design-variations/SKILL.md +3 -0
  71. package/dist/agent-src/skills/developer-like-execution/SKILL.md +3 -0
  72. package/dist/agent-src/skills/estimate-ticket/SKILL.md +3 -0
  73. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +28 -4
  74. package/dist/agent-src/skills/fe-design/SKILL.md +74 -41
  75. package/dist/agent-src/skills/fe-design/references/craft-floor.md +52 -0
  76. package/dist/agent-src/skills/fe-design/references/source-led-port.md +36 -0
  77. package/dist/agent-src/skills/file-editor/SKILL.md +5 -0
  78. package/dist/agent-src/skills/finishing-a-development-branch/SKILL.md +2 -2
  79. package/dist/agent-src/skills/git-workflow/SKILL.md +3 -0
  80. package/dist/agent-src/skills/html-deck/SKILL.md +3 -0
  81. package/dist/agent-src/skills/iconography/SKILL.md +3 -0
  82. package/dist/agent-src/skills/image-editing/SKILL.md +3 -0
  83. package/dist/agent-src/skills/image-generation/SKILL.md +3 -0
  84. package/dist/agent-src/skills/image-provider-routing/SKILL.md +3 -0
  85. package/dist/agent-src/skills/incident-commander/SKILL.md +10 -0
  86. package/dist/agent-src/skills/js-library-packaging/SKILL.md +173 -0
  87. package/dist/agent-src/skills/js-library-packaging/scripts/check_package_surface.ts +270 -0
  88. package/dist/agent-src/skills/laravel-migration/SKILL.md +3 -0
  89. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +3 -0
  90. package/dist/agent-src/skills/lint-skills/SKILL.md +3 -0
  91. package/dist/agent-src/skills/llm-provider-knowledge/SKILL.md +3 -0
  92. package/dist/agent-src/skills/logging-monitoring/SKILL.md +234 -51
  93. package/dist/agent-src/skills/logo-generation/SKILL.md +3 -0
  94. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -0
  95. package/dist/agent-src/skills/monorepo-workspace/SKILL.md +149 -0
  96. package/dist/agent-src/skills/motion-choreographer/SKILL.md +6 -0
  97. package/dist/agent-src/skills/multi-tenancy/SKILL.md +4 -0
  98. package/dist/agent-src/skills/operational-readiness/SKILL.md +184 -0
  99. package/dist/agent-src/skills/override-management/SKILL.md +3 -0
  100. package/dist/agent-src/skills/persona-improvement/SKILL.md +3 -0
  101. package/dist/agent-src/skills/pest-testing/SKILL.md +3 -0
  102. package/dist/agent-src/skills/playbook-authoring/SKILL.md +162 -0
  103. package/dist/agent-src/skills/playwright-testing/SKILL.md +3 -0
  104. package/dist/agent-src/skills/privacy-review/SKILL.md +3 -0
  105. package/dist/agent-src/skills/project-analysis-core/SKILL.md +23 -0
  106. package/dist/agent-src/skills/prompt-engineering-image/SKILL.md +3 -0
  107. package/dist/agent-src/skills/quality-tools/SKILL.md +5 -0
  108. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +81 -33
  109. package/dist/agent-src/skills/readme-reviewer/SKILL.md +3 -0
  110. package/dist/agent-src/skills/readme-writing/SKILL.md +3 -0
  111. package/dist/agent-src/skills/readme-writing-package/SKILL.md +3 -0
  112. package/dist/agent-src/skills/receiving-code-review/SKILL.md +2 -2
  113. package/dist/agent-src/skills/refine-prompt/SKILL.md +3 -0
  114. package/dist/agent-src/skills/refine-ticket/SKILL.md +3 -0
  115. package/dist/agent-src/skills/requesting-code-review/SKILL.md +2 -2
  116. package/dist/agent-src/skills/review-routing/SKILL.md +2 -2
  117. package/dist/agent-src/skills/roadmap-writing/SKILL.md +23 -41
  118. package/dist/agent-src/skills/roadmap-writing/references/follow-up-roadmap-shape.md +47 -0
  119. package/dist/agent-src/skills/rtk-output-filtering/SKILL.md +22 -6
  120. package/dist/agent-src/skills/runway-cognition/SKILL.md +3 -0
  121. package/dist/agent-src/skills/scene-expander/scene-blueprint.schema.yaml +26 -0
  122. package/dist/agent-src/skills/secrets-management/SKILL.md +4 -0
  123. package/dist/agent-src/skills/server-hardening/SKILL.md +159 -0
  124. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +3 -0
  125. package/dist/agent-src/skills/skill-management/SKILL.md +3 -0
  126. package/dist/agent-src/skills/skill-reviewer/SKILL.md +3 -0
  127. package/dist/agent-src/skills/skill-writing/SKILL.md +6 -0
  128. package/dist/agent-src/skills/skill-writing/references/procedure.md +24 -2
  129. package/dist/agent-src/skills/spreadsheet-authoring/SKILL.md +3 -0
  130. package/dist/agent-src/skills/storybook-workshop/SKILL.md +203 -0
  131. package/dist/agent-src/skills/storybook-workshop/scripts/story_contrast_floor.ts +134 -0
  132. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +1 -1
  133. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +25 -0
  134. package/dist/agent-src/skills/supply-chain-intake/SKILL.md +12 -0
  135. package/dist/agent-src/skills/systematic-debugging/SKILL.md +1 -1
  136. package/dist/agent-src/skills/terraform/SKILL.md +3 -0
  137. package/dist/agent-src/skills/test-driven-development/SKILL.md +1 -1
  138. package/dist/agent-src/skills/threat-modeling/SKILL.md +0 -3
  139. package/dist/agent-src/skills/token-optimizer/SKILL.md +3 -0
  140. package/dist/agent-src/skills/typography-system/SKILL.md +3 -0
  141. package/dist/agent-src/skills/ui-component-architect/SKILL.md +17 -1
  142. package/dist/agent-src/skills/upstream-contribute/SKILL.md +3 -0
  143. package/dist/agent-src/skills/validate-feature-fit/SKILL.md +3 -0
  144. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -2
  145. package/dist/agent-src/skills/wireframe/SKILL.md +3 -0
  146. package/dist/agent-src/skills/wireframe/references/story-beat-ledger.schema.json +115 -0
  147. package/dist/agent-src/skills/workspace-link/SKILL.md +131 -0
  148. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  149. package/dist/agent-src/templates/playbook.md +75 -0
  150. package/dist/agent-src/templates/roadmaps.md +37 -0
  151. package/dist/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  152. package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  153. package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  154. package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  155. package/dist/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  156. package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  157. package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  158. package/dist/cli/commands/uiAudit.js +221 -0
  159. package/dist/cli/commands/uiRender.js +206 -0
  160. package/dist/cli/main.js +22 -1
  161. package/dist/cli/mcp/content.js +64 -1
  162. package/dist/cli/mcp/dispatch.js +175 -10
  163. package/dist/cli/registry.js +3 -0
  164. package/dist/cli-delegate/{chunk-G23AT6GD.js → chunk-DMSZHXZS.js} +57 -1
  165. package/dist/cli-delegate/{chunk-77GR3VD4.js → chunk-FF7WAFMR.js} +58 -3
  166. package/dist/cli-delegate/{chunk-YM4GZDJG.js → chunk-JCW7ZLHK.js} +10 -0
  167. package/dist/cli-delegate/{chunk-H4VIVD4C.js → chunk-JJA2QEWA.js} +413 -391
  168. package/dist/cli-delegate/{chunk-PLSG6UL5.js → chunk-K4FFODTS.js} +341 -204
  169. package/dist/cli-delegate/{chunk-B2ERU2VA.js → chunk-WOKWX5PL.js} +1 -1
  170. package/dist/cli-delegate/cmd_brand_status.js +8 -6
  171. package/dist/cli-delegate/cmd_conformance.js +3 -3
  172. package/dist/cli-delegate/cmd_doctor.js +3 -3
  173. package/dist/cli-delegate/cmd_export.js +4 -4
  174. package/dist/cli-delegate/cmd_handoff.js +1 -1
  175. package/dist/cli-delegate/cmd_preflight.js +2 -2
  176. package/dist/cli-delegate/cmd_prune.js +4 -4
  177. package/dist/cli-delegate/cmd_session_recycle.js +70 -9
  178. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  179. package/dist/cli-delegate/cmd_settings_set.js +1 -1
  180. package/dist/cli-delegate/cmd_sync.js +4 -4
  181. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  182. package/dist/cli-delegate/cmd_validate.js +4 -4
  183. package/dist/discovery/deprecation-report.md +1 -1
  184. package/dist/discovery/discovery-manifest.json +362 -127
  185. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  186. package/dist/discovery/discovery-manifest.summary.md +4 -4
  187. package/dist/discovery/dormancy-report.md +1 -1
  188. package/dist/discovery/orphan-report.md +1 -1
  189. package/dist/discovery/packs.json +18 -8
  190. package/dist/discovery/trust-report.md +3 -3
  191. package/dist/discovery/workspaces.json +16 -6
  192. package/dist/hooks/dispatch.js +2575 -1472
  193. package/dist/install/install.mjs +800 -708
  194. package/dist/mcp/registry-manifest.json +3 -3
  195. package/dist/mcp/server.json +2 -2
  196. package/dist/mcp/server.mjs +1685 -1250
  197. package/dist/router.json +1 -1
  198. package/dist/scripts/_lib/lean_projection_mode.js +40 -0
  199. package/dist/scripts/_lib/scoped_projection.js +84 -0
  200. package/dist/scripts/_lib/ui_surface.js +89 -0
  201. package/dist/scripts/condense.js +6 -10
  202. package/dist/scripts/project_thin_rules.js +40 -2
  203. package/dist/server/schemas/settings.js +6 -0
  204. package/dist/shared/skillRanking.js +159 -0
  205. package/docs/contracts/provider-lifecycle.md +47 -18
  206. package/docs/contracts/settings-classes.md +35 -5
  207. package/docs/guidelines/agent-infra/context-hygiene-mechanics.md +49 -0
  208. package/docs/guidelines/agent-infra/downstream-changes-mechanics.md +91 -0
  209. package/docs/guidelines/agent-infra/evaluator-independence-mechanics.md +92 -0
  210. package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +45 -1
  211. package/docs/guidelines/agent-infra/roadmap-deferred-resolution-provenance.md +54 -0
  212. package/docs/guidelines/code-clarity.md +21 -0
  213. package/docs/guidelines/design-antipatterns.md +4 -2
  214. package/docs/guidelines/design-asset-discipline.md +38 -0
  215. package/docs/guidelines/design-fidelity-mechanics.md +45 -29
  216. package/docs/guidelines/design-handover-extraction.md +35 -5
  217. package/docs/guidelines/design-modes.md +41 -1
  218. package/docs/guidelines/monorepo-antipatterns.md +141 -0
  219. package/docs/guidelines/redundancy-taxonomy.md +180 -0
  220. package/llms.txt +50 -39
  221. package/package.json +6 -2
  222. package/src/agent-src/templates/scripts/check_playbook_invokes.ts +231 -0
  223. package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +24 -0
  224. package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +2 -0
  225. package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +216 -0
  226. package/src/agent-src/templates/scripts/work_engine/directives/ui/scaffold.ts +159 -0
  227. package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +73 -4
  228. package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +325 -40
  229. package/src/config/agent-settings.template.yml +44 -0
  230. package/src/config/assurance-capability-registry.json +223 -0
  231. package/src/config/assurance-threshold-budget.json +65 -0
  232. package/src/config/budgets.yml +19 -0
  233. package/src/config/ci-local-parity.yml +29 -0
  234. package/src/config/discovery/prompt-patterns.yml +56 -0
  235. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  236. package/src/config/dispatch-economy-metrics.json +4 -2
  237. package/src/config/estate-count-budget.json +8 -3
  238. package/src/config/evaluator-budgets.json +14 -14
  239. package/src/config/gate-coverage.yml +392 -8
  240. package/src/config/gate-violation-baselines.json +76 -72
  241. package/src/config/hook-latency-budget.json +1 -0
  242. package/src/config/hook-token-budget.json +137 -125
  243. package/src/config/pack-size-budget.json +39 -10
  244. package/src/config/preamble-payload-budget.json +97 -71
  245. package/src/config/quorum-attendance-budget.json +12 -4
  246. package/src/config/routing-coverage-seed.json +29 -0
  247. package/src/config/rule-activation-census.json +7 -3
  248. package/src/config/rule-enforcement-baseline.json +0 -1
  249. package/src/config/rule-stub-ceilings.json +112 -91
  250. package/src/config/suggestion-capture.json +28 -0
  251. package/src/config/surface-matrix.yml +21 -2
  252. package/src/config/web-launch-readiness.json +188 -0
  253. package/src/scripts/_cli/cmd_doctor.ts +15 -16
  254. package/src/scripts/_cli/doctor_install_mode.ts +49 -0
  255. package/src/scripts/_cli/doctor_overrides.ts +154 -0
  256. package/src/scripts/_dispatch.bash +17 -0
  257. package/src/scripts/_lib/as_of.ts +412 -0
  258. package/src/scripts/_lib/exec_evidence.ts +7 -0
  259. package/src/scripts/_lib/gate_baseline.ts +150 -1
  260. package/src/scripts/_lib/hook_settings.ts +33 -0
  261. package/src/scripts/_lib/host_listing_model.ts +192 -0
  262. package/src/scripts/_lib/lean_projection_mode.ts +44 -0
  263. package/src/scripts/_lib/mcp_bridge.ts +199 -0
  264. package/src/scripts/_lib/review_independence.ts +62 -10
  265. package/src/scripts/_lib/rule_injection.ts +239 -0
  266. package/src/scripts/_lib/run_checkpoint.ts +54 -1
  267. package/src/scripts/_lib/scoped_projection.ts +96 -0
  268. package/src/scripts/_lib/session_register.ts +44 -2
  269. package/src/scripts/_lib/skill_catalogue.ts +38 -2
  270. package/src/scripts/_lib/skill_estate.ts +115 -0
  271. package/src/scripts/_lib/transcript_reads.ts +207 -0
  272. package/src/scripts/_lib/ui_authority.ts +343 -0
  273. package/src/scripts/ai-video/adapters/fal.sh +8 -3
  274. package/src/scripts/ai-video/adapters/gemini-veo.sh +10 -0
  275. package/src/scripts/ai-video/adapters/higgsfield.sh +10 -2
  276. package/src/scripts/ai-video/adapters/kling.sh +10 -0
  277. package/src/scripts/ai-video/adapters/sora.sh +10 -0
  278. package/src/scripts/ai-video/lib/calibrate-cost.sh +145 -0
  279. package/src/scripts/ai-video/lib/model-capabilities/README.md +53 -7
  280. package/src/scripts/ai-video/lib/model-capabilities/comfyui.json +15 -3
  281. package/src/scripts/ai-video/lib/model-capabilities/fal.json +36 -6
  282. package/src/scripts/ai-video/lib/model-capabilities/gemini-veo.json +23 -0
  283. package/src/scripts/ai-video/lib/model-capabilities/higgsfield.json +23 -0
  284. package/src/scripts/ai-video/lib/model-capabilities/kling.json +23 -0
  285. package/src/scripts/ai-video/lib/model-capabilities/musetalk.json +8 -2
  286. package/src/scripts/ai-video/lib/model-capabilities/replicate.json +36 -6
  287. package/src/scripts/ai-video/lib/model-capabilities/sora.json +45 -0
  288. package/src/scripts/ai-video/lib/model-capabilities/syncso.json +8 -2
  289. package/src/scripts/ai-video/lib/parse-blueprint.sh +52 -5
  290. package/src/scripts/ai-video/lib/resume-scan.sh +92 -3
  291. package/src/scripts/ai-video/lib/seam-plan.sh +212 -0
  292. package/src/scripts/ai-video/smoke-trace.sh +450 -2
  293. package/src/scripts/ai-video/stitch.sh +191 -10
  294. package/src/scripts/ai-video/test-pipeline.sh +84 -6
  295. package/src/scripts/ai_council/argument_exhaustion.ts +130 -0
  296. package/src/scripts/ai_council/cli_agency_bounds.ts +139 -0
  297. package/src/scripts/ai_council/cli_least_agency_canary.ts +347 -0
  298. package/src/scripts/ai_council/clients.ts +3 -2
  299. package/src/scripts/ai_council/consensus.ts +63 -6
  300. package/src/scripts/ai_council/events_log.ts +46 -1
  301. package/src/scripts/ai_council/orchestrator.ts +103 -108
  302. package/src/scripts/ai_council/orchestrator_results.ts +166 -0
  303. package/src/scripts/ai_council/prompts.ts +12 -5
  304. package/src/scripts/ai_council/quorum.ts +82 -1
  305. package/src/scripts/ai_council/quorum_wiring.ts +82 -5
  306. package/src/scripts/ai_council/stance_tally.ts +22 -0
  307. package/src/scripts/bench_hook_latency.ts +62 -0
  308. package/src/scripts/build_proof.ts +12 -1
  309. package/src/scripts/capture_skill_catalogue.ts +21 -0
  310. package/src/scripts/check_always_budget.ts +2 -1
  311. package/src/scripts/check_augmentignore.ts +2 -1
  312. package/src/scripts/check_beta_review_markers.ts +2 -1
  313. package/src/scripts/check_bundle_path_leakage.ts +162 -7
  314. package/src/scripts/check_command_examples.ts +557 -0
  315. package/src/scripts/check_composite_arming.ts +364 -0
  316. package/src/scripts/check_corpus_staleness.ts +2 -1
  317. package/src/scripts/check_council_pin_staleness.ts +3 -1
  318. package/src/scripts/check_enforcement_coverage.ts +116 -3
  319. package/src/scripts/check_enforcement_denominator.ts +365 -0
  320. package/src/scripts/check_estate_count.ts +122 -3
  321. package/src/scripts/check_gate_coverage.ts +2 -1
  322. package/src/scripts/check_hook_bundle_freshness.ts +13 -1
  323. package/src/scripts/check_knowledge_cards.ts +2 -1
  324. package/src/scripts/check_knowledge_pages.ts +3 -2
  325. package/src/scripts/check_memory.ts +2 -1
  326. package/src/scripts/check_no_automerge_key.ts +287 -0
  327. package/src/scripts/check_pack_conformance_fixture.ts +565 -0
  328. package/src/scripts/check_preamble_payload_budget.ts +30 -3
  329. package/src/scripts/check_proposal.ts +2 -1
  330. package/src/scripts/check_reach_staleness.ts +2 -1
  331. package/src/scripts/check_release_adjacent_health.ts +2 -1
  332. package/src/scripts/check_release_pr_shape.ts +5 -0
  333. package/src/scripts/check_review_schema.ts +34 -1
  334. package/src/scripts/check_roadmap_trackable.ts +48 -3
  335. package/src/scripts/check_routing_coverage.ts +352 -0
  336. package/src/scripts/check_score_contract.ts +505 -0
  337. package/src/scripts/check_skill_admissions.ts +514 -0
  338. package/src/scripts/check_source_size_budget.ts +2 -1
  339. package/src/scripts/check_standing_payload_delta.ts +505 -0
  340. package/src/scripts/check_trigger_evals.ts +2 -1
  341. package/src/scripts/check_web_launch_readiness.ts +705 -0
  342. package/src/scripts/classify_change_risk.ts +281 -0
  343. package/src/scripts/compute_skill_tiers.ts +186 -0
  344. package/src/scripts/condense.ts +8 -13
  345. package/src/scripts/council_attendance_metrics.ts +183 -0
  346. package/src/scripts/council_cli.ts +10 -8
  347. package/src/scripts/council_parse_rate.ts +116 -0
  348. package/src/scripts/derive_playbooks.ts +406 -0
  349. package/src/scripts/description_route_check.ts +494 -0
  350. package/src/scripts/design_slop_rules.ts +56 -2
  351. package/src/scripts/dispatch_r2_reviewer.ts +16 -0
  352. package/src/scripts/frontend_corpus_hash.ts +116 -0
  353. package/src/scripts/grade_target_readiness.ts +478 -0
  354. package/src/scripts/hook_manifest.json +1 -1
  355. package/src/scripts/hook_manifest.yaml +124 -16
  356. package/src/scripts/hooks/concern_registry.ts +6 -0
  357. package/src/scripts/hooks/design_pass_hook.ts +356 -0
  358. package/src/scripts/hooks/rtk_wrap_hook.ts +30 -7
  359. package/src/scripts/hooks/rule_inject_hook.ts +318 -0
  360. package/src/scripts/hooks/suggestion_capture_hook.ts +368 -0
  361. package/src/scripts/hot_context_hook.ts +74 -7
  362. package/src/scripts/install.ts +40 -89
  363. package/src/scripts/lint_adapter_tier.ts +663 -0
  364. package/src/scripts/lint_archived_skills.ts +93 -0
  365. package/src/scripts/lint_budget_ownership.ts +56 -5
  366. package/src/scripts/lint_deterministic_time.ts +470 -0
  367. package/src/scripts/lint_framework_leakage.ts +5 -0
  368. package/src/scripts/lint_handoffs.ts +525 -1
  369. package/src/scripts/lint_judge_prompt_expectation.ts +155 -0
  370. package/src/scripts/lint_marketplace.ts +88 -0
  371. package/src/scripts/lint_media_policy_linkage.ts +140 -1
  372. package/src/scripts/lint_one_off_age.ts +6 -1
  373. package/src/scripts/lint_override_kernel_guard.ts +87 -5
  374. package/src/scripts/lint_roadmap_complexity.ts +56 -0
  375. package/src/scripts/lint_rule_enforcement_declaration.ts +24 -7
  376. package/src/scripts/lint_rule_norm_pin.ts +321 -0
  377. package/src/scripts/lint_skill_trigger_corpus.ts +349 -0
  378. package/src/scripts/lint_spawn_payload.ts +42 -5
  379. package/src/scripts/lint_symptom_intake.ts +2 -1
  380. package/src/scripts/mcp_parity_smoke.ts +30 -4
  381. package/src/scripts/mcp_render.ts +66 -1
  382. package/src/scripts/mcp_tool_fingerprint.ts +241 -0
  383. package/src/scripts/measure_risk_class_drift.ts +140 -0
  384. package/src/scripts/measure_skill_ranker_baseline.ts +212 -0
  385. package/src/scripts/media/lib/adapter-common.sh +211 -1
  386. package/src/scripts/media/lib/adapter-contract.md +74 -6
  387. package/src/scripts/model_rule_injection.ts +907 -0
  388. package/src/scripts/pack_install_smoke.ts +363 -0
  389. package/src/scripts/pr_conflict_census.ts +187 -0
  390. package/src/scripts/project_thin_rules.ts +45 -2
  391. package/src/scripts/release.ts +66 -860
  392. package/src/scripts/release_drill.ts +59 -3
  393. package/src/scripts/release_env.ts +298 -0
  394. package/src/scripts/release_publication.ts +720 -0
  395. package/src/scripts/report_pack_delta.ts +204 -0
  396. package/src/scripts/roadmap_context.ts +778 -0
  397. package/src/scripts/schemas/fidelity-measurement-sheet.schema.json +169 -0
  398. package/src/scripts/schemas/rule.schema.json +24 -2
  399. package/src/scripts/schemas/skill.schema.json +39 -0
  400. package/src/scripts/schemas/ui-authority.schema.json +114 -0
  401. package/src/scripts/select_analysis_mode.ts +112 -0
  402. package/src/scripts/session_register_hook.ts +29 -3
  403. package/src/scripts/sessions_cli.ts +67 -3
  404. package/src/scripts/skill_tools/score_skill_relevance.ts +36 -53
  405. package/src/scripts/sync_pr_branch.ts +40 -1
  406. package/src/scripts/token_sink_report.ts +239 -0
  407. package/src/scripts/trigger_coverage.ts +122 -3
  408. package/src/scripts/update_counts.ts +7 -3
  409. package/src/scripts/validate_frontmatter.ts +66 -0
  410. package/src/server/schemas/settings.ts +10 -0
  411. package/src/shared/skillRanking.ts +183 -0
  412. package/dist/agent-src/skills/accessibility-auditor/evals/evals.json +0 -15
  413. package/dist/agent-src/skills/agent-security-review/evals/triggers.json +0 -52
  414. package/dist/agent-src/skills/ai-code-blindspots/evals/triggers.json +0 -52
  415. package/dist/agent-src/skills/analysis-skill-router/evals/evals.json +0 -13
  416. package/dist/agent-src/skills/brand/evals/triggers.json +0 -17
  417. package/dist/agent-src/skills/brand-asset-generation/evals/triggers.json +0 -17
  418. package/dist/agent-src/skills/brand-audit/evals/triggers.json +0 -17
  419. package/dist/agent-src/skills/brand-identity/evals/triggers.json +0 -17
  420. package/dist/agent-src/skills/brand-strategy/evals/triggers.json +0 -17
  421. package/dist/agent-src/skills/brand-to-tokens/evals/triggers.json +0 -17
  422. package/dist/agent-src/skills/bug-analyzer/evals/evals.json +0 -13
  423. package/dist/agent-src/skills/canvas-design/evals/triggers.json +0 -17
  424. package/dist/agent-src/skills/character-consistency/evals/evals.json +0 -16
  425. package/dist/agent-src/skills/code-intelligence/evals/triggers.json +0 -52
  426. package/dist/agent-src/skills/code-review/evals/evals.json +0 -100
  427. package/dist/agent-src/skills/command-routing/evals/evals.json +0 -14
  428. package/dist/agent-src/skills/complexity-first-planning/evals/triggers.json +0 -17
  429. package/dist/agent-src/skills/contract-review/evals/triggers.json +0 -17
  430. package/dist/agent-src/skills/conventional-commits-writing/evals/evals.json +0 -15
  431. package/dist/agent-src/skills/corpus-grounding/evals/triggers.json +0 -17
  432. package/dist/agent-src/skills/dashboard-design/evals/evals.json +0 -16
  433. package/dist/agent-src/skills/dcf-modeling/evals/domain-truth.json +0 -29
  434. package/dist/agent-src/skills/dcf-modeling/evals/evals.json +0 -20
  435. package/dist/agent-src/skills/decision-record/evals/evals.json +0 -20
  436. package/dist/agent-src/skills/decision-record/evals/triggers.json +0 -87
  437. package/dist/agent-src/skills/design-intelligence/evals/evals.json +0 -14
  438. package/dist/agent-src/skills/design-intelligence/evals/triggers.json +0 -17
  439. package/dist/agent-src/skills/design-system-capture/evals/evals.json +0 -15
  440. package/dist/agent-src/skills/design-tokens/evals/triggers.json +0 -17
  441. package/dist/agent-src/skills/design-variations/evals/triggers.json +0 -17
  442. package/dist/agent-src/skills/developer-like-execution/evals/evals.json +0 -16
  443. package/dist/agent-src/skills/doc-coauthoring/evals/evals.json +0 -16
  444. package/dist/agent-src/skills/doc-coauthoring/evals/triggers.json +0 -17
  445. package/dist/agent-src/skills/docx-authoring/evals/triggers.json +0 -52
  446. package/dist/agent-src/skills/dpa-review/evals/triggers.json +0 -17
  447. package/dist/agent-src/skills/editorial-calendar/evals/domain-truth.json +0 -16
  448. package/dist/agent-src/skills/editorial-calendar/evals/evals.json +0 -16
  449. package/dist/agent-src/skills/eloquent/evals/triggers.json +0 -17
  450. package/dist/agent-src/skills/estimate-ticket/evals/evals.json +0 -16
  451. package/dist/agent-src/skills/estimate-ticket/evals/output-schema.yml +0 -20
  452. package/dist/agent-src/skills/estimate-ticket/evals/triggers.json +0 -19
  453. package/dist/agent-src/skills/evaluate-llm-feature/evals/triggers.json +0 -52
  454. package/dist/agent-src/skills/existing-ui-audit/evals/triggers.json +0 -47
  455. package/dist/agent-src/skills/experiment-loop/evals/output-schema.yml +0 -27
  456. package/dist/agent-src/skills/experiment-loop/evals/triggers.json +0 -17
  457. package/dist/agent-src/skills/fe-design/evals/triggers.json +0 -55
  458. package/dist/agent-src/skills/forecasting/evals/domain-truth.json +0 -29
  459. package/dist/agent-src/skills/forecasting/evals/evals.json +0 -20
  460. package/dist/agent-src/skills/forensics-report/evals/triggers.json +0 -17
  461. package/dist/agent-src/skills/frontend-render-security/evals/triggers.json +0 -52
  462. package/dist/agent-src/skills/fundraising-narrative/evals/domain-truth.json +0 -16
  463. package/dist/agent-src/skills/fundraising-narrative/evals/evals.json +0 -16
  464. package/dist/agent-src/skills/gated-reach/evals/triggers.json +0 -72
  465. package/dist/agent-src/skills/github-ci/evals/evals.json +0 -25
  466. package/dist/agent-src/skills/history-design/evals/triggers.json +0 -17
  467. package/dist/agent-src/skills/html-deck/evals/triggers.json +0 -17
  468. package/dist/agent-src/skills/humanizer/evals/strip_fixtures.json +0 -57
  469. package/dist/agent-src/skills/humanizer/evals/triggers.json +0 -17
  470. package/dist/agent-src/skills/iconography/evals/triggers.json +0 -17
  471. package/dist/agent-src/skills/image-analyser/evals/triggers.json +0 -17
  472. package/dist/agent-src/skills/image-creator/evals/triggers.json +0 -17
  473. package/dist/agent-src/skills/image-editing/evals/triggers.json +0 -17
  474. package/dist/agent-src/skills/image-generation/evals/triggers.json +0 -17
  475. package/dist/agent-src/skills/image-provider-routing/evals/triggers.json +0 -17
  476. package/dist/agent-src/skills/incident-commander/evals/domain-truth.json +0 -16
  477. package/dist/agent-src/skills/incident-commander/evals/evals.json +0 -20
  478. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +0 -17
  479. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +0 -17
  480. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +0 -17
  481. package/dist/agent-src/skills/launch-readiness/evals/evals.json +0 -21
  482. package/dist/agent-src/skills/learning-tutor/evals/triggers.json +0 -52
  483. package/dist/agent-src/skills/legal-intake-triage/evals/triggers.json +0 -17
  484. package/dist/agent-src/skills/legal-practice-profile/evals/triggers.json +0 -17
  485. package/dist/agent-src/skills/license-compliance-audit/evals/triggers.json +0 -52
  486. package/dist/agent-src/skills/license-compliance-borrow-check/evals/triggers.json +0 -52
  487. package/dist/agent-src/skills/license-compliance-credits/evals/triggers.json +0 -52
  488. package/dist/agent-src/skills/llm-provider-knowledge/evals/triggers.json +0 -20
  489. package/dist/agent-src/skills/logging-monitoring/evals/evals.json +0 -16
  490. package/dist/agent-src/skills/logo-generation/evals/triggers.json +0 -17
  491. package/dist/agent-src/skills/messaging-architecture/evals/domain-truth.json +0 -16
  492. package/dist/agent-src/skills/messaging-architecture/evals/evals.json +0 -16
  493. package/dist/agent-src/skills/nda-triage/evals/triggers.json +0 -17
  494. package/dist/agent-src/skills/pdf-tools/evals/triggers.json +0 -52
  495. package/dist/agent-src/skills/perf-feedback-craft/evals/evals.json +0 -16
  496. package/dist/agent-src/skills/persona-improvement/evals/triggers.json +0 -52
  497. package/dist/agent-src/skills/php-coder/evals/triggers.json +0 -17
  498. package/dist/agent-src/skills/prediction-pool-optimizer/evals/triggers.json +0 -21
  499. package/dist/agent-src/skills/prompt-engineering-image/evals/triggers.json +0 -17
  500. package/dist/agent-src/skills/prompt-engineering-patterns/evals/evals.json +0 -16
  501. package/dist/agent-src/skills/prompt-validator/evals/triggers.json +0 -17
  502. package/dist/agent-src/skills/quality-tools/evals/evals.json +0 -15
  503. package/dist/agent-src/skills/reasoning-orchestrator/evals/triggers.json +0 -17
  504. package/dist/agent-src/skills/refine-prompt/evals/evals.json +0 -16
  505. package/dist/agent-src/skills/refine-ticket/evals/evals.json +0 -16
  506. package/dist/agent-src/skills/refine-ticket/evals/output-schema.yml +0 -16
  507. package/dist/agent-src/skills/refine-ticket/evals/triggers.json +0 -17
  508. package/dist/agent-src/skills/release-comms/evals/evals.json +0 -16
  509. package/dist/agent-src/skills/rice-prioritization/evals/evals.json +0 -20
  510. package/dist/agent-src/skills/runway-cognition/evals/domain-truth.json +0 -29
  511. package/dist/agent-src/skills/runway-cognition/evals/evals.json +0 -20
  512. package/dist/agent-src/skills/scenario-modeling/evals/domain-truth.json +0 -29
  513. package/dist/agent-src/skills/scenario-modeling/evals/evals.json +0 -20
  514. package/dist/agent-src/skills/schema-review/evals/triggers.json +0 -17
  515. package/dist/agent-src/skills/screenshot-hygiene/evals/triggers.json +0 -52
  516. package/dist/agent-src/skills/security-maturity-assessment/evals/triggers.json +0 -52
  517. package/dist/agent-src/skills/skill-writing/evals/triggers.json +0 -17
  518. package/dist/agent-src/skills/spreadsheet-authoring/evals/triggers.json +0 -47
  519. package/dist/agent-src/skills/subagent-orchestration/evals/evals.json +0 -60
  520. package/dist/agent-src/skills/supply-chain-intake/evals/triggers.json +0 -52
  521. package/dist/agent-src/skills/systematic-debugging/evals/evals.json +0 -20
  522. package/dist/agent-src/skills/test-case-discovery/evals/triggers.json +0 -52
  523. package/dist/agent-src/skills/test-driven-development/evals/evals.json +0 -16
  524. package/dist/agent-src/skills/threat-modeling/evals/evals.json +0 -21
  525. package/dist/agent-src/skills/typography-system/evals/evals.json +0 -14
  526. package/dist/agent-src/skills/typography-system/evals/triggers.json +0 -17
  527. package/dist/agent-src/skills/unit-economics-modeling/evals/domain-truth.json +0 -40
  528. package/dist/agent-src/skills/unit-economics-modeling/evals/evals.json +0 -24
  529. package/dist/agent-src/skills/verify-completion-evidence/evals/evals.json +0 -16
  530. package/dist/agent-src/skills/verify-repair-loop/evals/output-schema.yml +0 -20
  531. package/dist/agent-src/skills/verify-repair-loop/evals/triggers.json +0 -17
  532. package/dist/agent-src/skills/vision-articulation/evals/evals.json +0 -16
  533. package/dist/agent-src/skills/voice-and-tone-design/evals/evals.json +0 -16
  534. package/dist/agent-src/skills/wireframe/evals/triggers.json +0 -17
  535. package/dist/agent-src/skills/worktree-lifecycle/evals/evals.json +0 -38
  536. package/dist/agent-src/skills/worktree-lifecycle/evals/triggers.json +0 -52
  537. package/dist/cli/agent-config.js.map +0 -1
  538. package/dist/cli/bash/runBash.js.map +0 -1
  539. package/dist/cli/commands/commands.js.map +0 -1
  540. package/dist/cli/commands/config.js.map +0 -1
  541. package/dist/cli/commands/doctorShell.js.map +0 -1
  542. package/dist/cli/commands/mcpServer.js.map +0 -1
  543. package/dist/cli/commands/packs.js.map +0 -1
  544. package/dist/cli/commands/profiles.js.map +0 -1
  545. package/dist/cli/commands/recordTriggerEval.js.map +0 -1
  546. package/dist/cli/commands/rtkDetect.js.map +0 -1
  547. package/dist/cli/commands/settings.js.map +0 -1
  548. package/dist/cli/commands/uiServe.js.map +0 -1
  549. package/dist/cli/commands/versions.js.map +0 -1
  550. package/dist/cli/commands/workspaces.js.map +0 -1
  551. package/dist/cli/configRoot.js.map +0 -1
  552. package/dist/cli/discovery/loadManifest.js.map +0 -1
  553. package/dist/cli/firstRunNotice.js.map +0 -1
  554. package/dist/cli/help.js.map +0 -1
  555. package/dist/cli/initRouting.js.map +0 -1
  556. package/dist/cli/log/logger.js.map +0 -1
  557. package/dist/cli/main.js.map +0 -1
  558. package/dist/cli/mcp/content.js.map +0 -1
  559. package/dist/cli/mcp/dispatch.js.map +0 -1
  560. package/dist/cli/mcp/stdio.js.map +0 -1
  561. package/dist/cli/paths.js.map +0 -1
  562. package/dist/cli/python/knowledge_ingest.js.map +0 -1
  563. package/dist/cli/python/workspace_analytics.js.map +0 -1
  564. package/dist/cli/python/workspace_crypto.js.map +0 -1
  565. package/dist/cli/python/workspace_documents.js.map +0 -1
  566. package/dist/cli/python/workspace_drive.js.map +0 -1
  567. package/dist/cli/python/workspace_drive_health.js.map +0 -1
  568. package/dist/cli/python/workspace_explain.js.map +0 -1
  569. package/dist/cli/python/workspace_hosts.js.map +0 -1
  570. package/dist/cli/python/workspace_inbox.js.map +0 -1
  571. package/dist/cli/python/workspace_render.js.map +0 -1
  572. package/dist/cli/python/workspace_roles.js.map +0 -1
  573. package/dist/cli/python/workspace_secrets.js.map +0 -1
  574. package/dist/cli/python/workspace_sessions.js.map +0 -1
  575. package/dist/cli/python/workspace_skills.js.map +0 -1
  576. package/dist/cli/registry.js.map +0 -1
  577. package/dist/install/agentSwitchDetection.js.map +0 -1
  578. package/dist/install/agentSwitchProfile.js.map +0 -1
  579. package/dist/install/atomic.js.map +0 -1
  580. package/dist/install/claudePathsPlan.js.map +0 -1
  581. package/dist/install/conflict.js.map +0 -1
  582. package/dist/install/detect.js.map +0 -1
  583. package/dist/install/emit_host_rules_cli.js.map +0 -1
  584. package/dist/install/globalRuleLayers.js.map +0 -1
  585. package/dist/install/hostLayerFingerprint.js.map +0 -1
  586. package/dist/install/partitionEligibility.js.map +0 -1
  587. package/dist/install/paths.js.map +0 -1
  588. package/dist/install/plan.js.map +0 -1
  589. package/dist/install/preflight.js.map +0 -1
  590. package/dist/install/rtkDetection.js.map +0 -1
  591. package/dist/install/ruleInScope.js.map +0 -1
  592. package/dist/install/ruleLayerPartition.js.map +0 -1
  593. package/dist/install/rule_scope.js.map +0 -1
  594. package/dist/install/rule_scope_cli.js.map +0 -1
  595. package/dist/install/selectedTools.js.map +0 -1
  596. package/dist/install/toolDetection.js.map +0 -1
  597. package/dist/install/txlog.js.map +0 -1
  598. package/dist/install/types.js.map +0 -1
  599. package/dist/install/wizard-plan.js.map +0 -1
  600. package/dist/install/wizardDismissals.js.map +0 -1
  601. package/dist/scripts/_lib/agent_settings.js.map +0 -1
  602. package/dist/scripts/_lib/agent_src.js.map +0 -1
  603. package/dist/scripts/_lib/claude_builtin_names.js.map +0 -1
  604. package/dist/scripts/_lib/claude_plugin.js.map +0 -1
  605. package/dist/scripts/_lib/claude_settings_hooks.js.map +0 -1
  606. package/dist/scripts/_lib/compile_time_toggles.js.map +0 -1
  607. package/dist/scripts/_lib/environment_detector.js.map +0 -1
  608. package/dist/scripts/_lib/host_launch.js.map +0 -1
  609. package/dist/scripts/_lib/install_layout.js.map +0 -1
  610. package/dist/scripts/_lib/installed_lock.js.map +0 -1
  611. package/dist/scripts/_lib/model_tier.js.map +0 -1
  612. package/dist/scripts/_lib/prune_empty_dirs.js.map +0 -1
  613. package/dist/scripts/_lib/scoped_projection.js.map +0 -1
  614. package/dist/scripts/_lib/script_output.js.map +0 -1
  615. package/dist/scripts/_lib/spawn_env.js.map +0 -1
  616. package/dist/scripts/_lib/surface_tiers.js.map +0 -1
  617. package/dist/scripts/_lib/token_count.js.map +0 -1
  618. package/dist/scripts/_lib/trigger_eval_floors.js.map +0 -1
  619. package/dist/scripts/_lib/user_global_paths.js.map +0 -1
  620. package/dist/scripts/ai_council/modes.js.map +0 -1
  621. package/dist/scripts/ai_council/transport_resolver.js.map +0 -1
  622. package/dist/scripts/condense.js.map +0 -1
  623. package/dist/scripts/project_thin_rules.js.map +0 -1
  624. package/dist/server/app.js.map +0 -1
  625. package/dist/server/io/atomicMultiWrite.js.map +0 -1
  626. package/dist/server/io/atomicWrite.js.map +0 -1
  627. package/dist/server/io/sharedWriteCheck.js.map +0 -1
  628. package/dist/server/io/substituteTemplate.js.map +0 -1
  629. package/dist/server/io/yamlIO.js.map +0 -1
  630. package/dist/server/nicknameResolver.js.map +0 -1
  631. package/dist/server/port.js.map +0 -1
  632. package/dist/server/routes/discovery.js.map +0 -1
  633. package/dist/server/routes/install.js.map +0 -1
  634. package/dist/server/routes/ping.js.map +0 -1
  635. package/dist/server/routes/schema.js.map +0 -1
  636. package/dist/server/routes/settings.js.map +0 -1
  637. package/dist/server/routes/settingsChanges.js.map +0 -1
  638. package/dist/server/routes/userMd.js.map +0 -1
  639. package/dist/server/routes/wizard.js.map +0 -1
  640. package/dist/server/routes/workspace.js.map +0 -1
  641. package/dist/server/schemas/settings.js.map +0 -1
  642. package/dist/server/serverInfo.js.map +0 -1
  643. package/dist/server/token.js.map +0 -1
  644. package/dist/server/writeRoot.js.map +0 -1
  645. package/dist/shared/capabilities.js.map +0 -1
  646. package/dist/shared/interactiveContext.js.map +0 -1
  647. package/dist/shared/nicknamePrefill.js.map +0 -1
  648. package/dist/shared/settingsAsks.js.map +0 -1
  649. package/dist/shared/settingsCarveOut.js.map +0 -1
  650. package/dist/shared/settingsClasses.js.map +0 -1
  651. package/dist/shared/settingsConsent.js.map +0 -1
  652. package/dist/shared/settingsSurface.js.map +0 -1
  653. package/dist/shared/userMd/formAdapter.js.map +0 -1
  654. package/dist/shared/userMd/schema.js.map +0 -1
  655. package/dist/shared/userMd/utils.js.map +0 -1
  656. package/dist/ui/assets/index-Cxgy63kz.js.map +0 -1
  657. package/src/scripts/_lib/adr_frontmatter.test.ts +0 -365
  658. package/src/scripts/_lib/adversarial_council_gate.test.ts +0 -112
  659. package/src/scripts/_lib/adversarial_reconcile.test.ts +0 -197
  660. package/src/scripts/_lib/auto_dispatch.corpus.test.ts +0 -150
  661. package/src/scripts/_lib/secret_detector.test.ts +0 -108
  662. package/src/scripts/_lib/secret_detector_adversarial.test.ts +0 -116
  663. package/src/scripts/_lib/untrusted_content.test.ts +0 -175
  664. package/src/scripts/check_secret_leak.test.ts +0 -90
  665. package/src/scripts/design_slop_rules.test.ts +0 -239
  666. package/src/scripts/self_review_gate.test.ts +0 -296
  667. package/src/shared/capabilities.test.ts +0 -43
@@ -0,0 +1,363 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Global-install smoke harness — does the PUBLISHED payload still work?
4
+ *
5
+ * `prepack-check.mjs` (in the `prepack` script) answers a narrower question:
6
+ * does every import in the packed set RESOLVE. That is not the same question,
7
+ * and the gap is recorded in the tree rather than hypothetical —
8
+ * `src/cli/python/workspace_hosts.ts:180-191` records a real
9
+ * `ERR_MODULE_NOT_FOUND` in a global install, and
10
+ * `src/server/routes/wizard.ts:136-137` invokes a shell script from
11
+ * `src/scripts/` **by path** at runtime, which no import graph can see. A trim
12
+ * can pass every static gate and still break an install.
13
+ *
14
+ * So this harness is behavioural: pack a real tarball, install it into a
15
+ * throwaway prefix, and RUN the consumer surface.
16
+ *
17
+ * WHY IT EXISTS AT ALL — `road-to-npm-payload-reduction` Phase 1.1. The
18
+ * `packed_size_mb` cap has been raised four times in twenty days (6.4 → 6.9 →
19
+ * 7.8 → 8.4 → 9.2), and every note names the same structural cause: nobody
20
+ * knows which of the 16.7 MB under `src/scripts/` a consumer actually needs.
21
+ * That question is not decidable by reading import specifiers — an earlier
22
+ * budget note asserted an answer that way and had to retract it. It is
23
+ * decidable by removing a subtree and watching an install break, or not.
24
+ *
25
+ * ```bash
26
+ * pack_install_smoke # the tarball as it ships
27
+ * pack_install_smoke --exclude src/scripts/ai_council/
28
+ * pack_install_smoke --sabotage src/scripts/_lib/ # must FAIL — sensitivity
29
+ * pack_install_smoke --json
30
+ * ```
31
+ *
32
+ * `--exclude` appends a negation to `files[]` in a COPY of package.json inside
33
+ * a temporary clone; the tracked tree is never modified.
34
+ *
35
+ * Exit codes: 0 = every probe passed · 1 = a probe failed · 2 = harness error
36
+ * (could not pack, could not install) — kept distinct because "the install
37
+ * broke" and "the harness broke" must not read the same.
38
+ */
39
+ import * as fs from 'node:fs';
40
+ import * as os from 'node:os';
41
+ import * as path from 'node:path';
42
+ import { spawnSync, type SpawnSyncReturns } from 'node:child_process';
43
+ import { fileURLToPath, pathToFileURL } from 'node:url';
44
+
45
+ const _FILE = fileURLToPath(import.meta.url);
46
+ const REPO = path.resolve(path.dirname(_FILE), '..', '..');
47
+
48
+ export interface ProbeResult {
49
+ readonly name: string;
50
+ readonly ok: boolean;
51
+ readonly exit: number | null;
52
+ readonly detail: string;
53
+ }
54
+
55
+ export interface SmokeResult {
56
+ readonly excluded: readonly string[];
57
+ readonly packedBytes: number | null;
58
+ readonly probes: readonly ProbeResult[];
59
+ readonly ok: boolean;
60
+ readonly harnessError: string | null;
61
+ }
62
+
63
+ const run = (
64
+ cmd: string,
65
+ args: readonly string[],
66
+ opts: { cwd?: string; env?: NodeJS.ProcessEnv; timeout?: number } = {},
67
+ ): SpawnSyncReturns<string> =>
68
+ spawnSync(cmd, [...args], {
69
+ cwd: opts.cwd ?? REPO,
70
+ encoding: 'utf8',
71
+ timeout: opts.timeout ?? 600_000,
72
+ maxBuffer: 64 * 1024 * 1024,
73
+ env: opts.env ?? process.env,
74
+ });
75
+
76
+ /** A throwaway checkout of HEAD — never the working tree, so `--exclude` is safe. */
77
+ function stageClone(excluded: readonly string[]): string {
78
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'ac-pack-smoke-'));
79
+ const src = path.join(dir, 'src');
80
+ const r = run('git', ['worktree', 'add', '--quiet', '--detach', src, 'HEAD']);
81
+ if (r.status !== 0) throw new Error(`git worktree add failed: ${r.stderr}`);
82
+ if (excluded.length > 0) {
83
+ const pj = path.join(src, 'package.json');
84
+ const manifest = JSON.parse(fs.readFileSync(pj, 'utf8')) as { files?: string[] };
85
+ // A trailing negation wins in npm's files[] evaluation, which is what
86
+ // makes a one-line append a faithful simulation of removing a subtree.
87
+ // A directory argument gets `**` appended; a glob (one containing `*`)
88
+ // is passed through as written. Without that distinction only whole
89
+ // subtrees could be tested, and the reductions that actually exist in
90
+ // this payload are FILE PATTERNS, not subtrees.
91
+ manifest.files = [
92
+ ...(manifest.files ?? []),
93
+ ...excluded.map((e) => (e.includes('*') ? `!${e}` : `!${e}**`)),
94
+ ];
95
+ fs.writeFileSync(pj, JSON.stringify(manifest, null, 4), 'utf8');
96
+ }
97
+ return dir;
98
+ }
99
+
100
+ /** The consumer surface. Each probe is one thing a real install must be able to do. */
101
+ function probes(bin: string, home: string, project: string): ProbeResult[] {
102
+ const env: NodeJS.ProcessEnv = {
103
+ ...process.env,
104
+ HOME: home,
105
+ EVENT4U_CONFIG_HOME: path.join(home, '.event4u', 'agent-config'),
106
+ AGENT_CONFIG_NO_UI: '1',
107
+ CI: '1',
108
+ };
109
+ const probe = (name: string, args: readonly string[], cwd = project): ProbeResult => {
110
+ const r = run(bin, args, { cwd, env, timeout: 300_000 });
111
+ const detail = `${r.stdout ?? ''}${r.stderr ?? ''}`.trim().slice(-1200);
112
+ return { name, ok: r.status === 0, exit: r.status, detail };
113
+ };
114
+
115
+ const out: ProbeResult[] = [
116
+ probe('--version', ['--version']),
117
+ // The projection writers are the surface where a missing template or
118
+ // script shows up as a real failure, so they must be exercised. The CLI
119
+ // `install` verb boots the wizard UI and takes no --global/--tools —
120
+ // that is the BASH orchestrator's signature, and getting this wrong once
121
+ // produced a red probe that said nothing about the payload. `--dry-run`
122
+ // is the CLI's own writes-suppressed boot.
123
+
124
+ probe('council:status', ['council:status']),
125
+ probe('hooks:status', ['hooks:status']),
126
+ probe('mcp:available', ['mcp:available']),
127
+ // `mcp:available` only lists the registry. `mcp:setup` verifies the
128
+ // server MODULE resolves, which is the probe that can actually see
129
+ // src/scripts/mcp_server/ disappear — without it, excluding that subtree
130
+ // reads green for the wrong reason.
131
+ probe('mcp:setup (server module resolves)', ['mcp:setup']),
132
+ probe('settings:get', ['settings:get', 'roles.active_role']),
133
+ ];
134
+
135
+ // The wizard boot is a separate shape: it must START and then be killable,
136
+ // so a zero exit is the wrong assertion — a server that exits 0 immediately
137
+ // has not booted. `--check` is the non-serving form when the CLI has one.
138
+ const boot = run(bin, ['setup', '--check'], { cwd: project, env, timeout: 120_000 });
139
+ out.push({
140
+ name: 'setup --check (wizard boot path)',
141
+ // A CLI that does not know the flag is a harness limitation, not an
142
+ // install defect — recorded as such rather than silently counted green.
143
+ ok: boot.status === 0 || /unknown option|unknown command/i.test(`${boot.stderr}`),
144
+ exit: boot.status,
145
+ detail: `${boot.stdout ?? ''}${boot.stderr ?? ''}`.trim().slice(-600),
146
+ });
147
+
148
+ // The wizard boot is a SERVER: it prints WIZARD_READY and then stays up, so
149
+ // exit 0 is the wrong assertion — a zero exit here would mean it died. The
150
+ // marker is the success signal, and the timeout is the harness's way of
151
+ // saying "it was still serving".
152
+ const wiz = run(bin, ['install', '--dry-run', '--no-open', '--allow-headless'], {
153
+ cwd: project,
154
+ env,
155
+ timeout: 60_000,
156
+ });
157
+ const wizOut = `${wiz.stdout ?? ''}${wiz.stderr ?? ''}`;
158
+ out.push({
159
+ name: 'install --dry-run boots the wizard (WIZARD_READY)',
160
+ ok: wizOut.includes('WIZARD_READY'),
161
+ exit: wiz.status,
162
+ detail: wizOut.trim().slice(-900),
163
+ });
164
+
165
+ // The bash orchestrator, run FROM THE INSTALLED TREE. This is the probe that
166
+ // actually reads `src/scripts/` by path rather than by import, which is the
167
+ // only way the path-reachability the roadmap's Context documents gets tested.
168
+ // bin resolves to <pkg>/dist/cli/agent-config.js, so the package root is
169
+ // THREE levels up. Two was wrong and reported a payload finding that was a
170
+ // harness defect — recorded because that is the exact confusion this whole
171
+ // harness exists to prevent.
172
+ const pkgRoot = path.resolve(path.dirname(fs.realpathSync(bin)), '..', '..');
173
+ const orch = path.join(pkgRoot, 'src', 'scripts', 'install');
174
+ if (fs.existsSync(orch)) {
175
+ const r = run('bash', [orch, '--global', '--tools=claude-code', '--yes', '--quiet'], {
176
+ cwd: project,
177
+ env,
178
+ timeout: 300_000,
179
+ });
180
+ out.push({
181
+ name: 'bash src/scripts/install --global (installed tree)',
182
+ ok: r.status === 0,
183
+ exit: r.status,
184
+ detail: `${r.stdout ?? ''}${r.stderr ?? ''}`.trim().slice(-1500),
185
+ });
186
+ } else {
187
+ out.push({
188
+ name: 'bash src/scripts/install --global (installed tree)',
189
+ ok: false,
190
+ exit: null,
191
+ detail: `orchestrator absent from the installed tree at ${orch} — this IS a payload finding, not a harness gap`,
192
+ });
193
+ }
194
+
195
+ // The media pipeline, dry-run. src/scripts/ai-video/ is shell, so no import
196
+ // graph reaches it and only a by-path invocation can see it go missing.
197
+ const trace = path.join(pkgRoot, 'src', 'scripts', 'ai-video', 'smoke-trace.sh');
198
+ out.push({
199
+ name: 'ai-video smoke-trace.sh present and executable (dry-run path)',
200
+ ok: fs.existsSync(trace),
201
+ exit: null,
202
+ detail: fs.existsSync(trace)
203
+ ? trace
204
+ : `absent from the installed tree at ${trace} — the /video:* surface has no shell to call`,
205
+ });
206
+
207
+ // One hook dispatch, the surface a consumer's editor drives on every turn.
208
+ const disp = run(
209
+ bin,
210
+ ['dispatch:hook', '--platform', 'claude', '--event', 'pre_tool_use', '--project-dir', project],
211
+ { cwd: project, env: { ...env, CLAUDE_PROJECT_DIR: project }, timeout: 120_000 },
212
+ );
213
+ out.push({
214
+ name: 'dispatch:hook pre_tool_use',
215
+ // A dispatcher legitimately returns non-zero to BLOCK. What must never
216
+ // happen is a module-resolution crash, so that is what is asserted.
217
+ ok: !/ERR_MODULE_NOT_FOUND|Cannot find module|ERR_REQUIRE_ESM/.test(
218
+ `${disp.stdout ?? ''}${disp.stderr ?? ''}`,
219
+ ),
220
+ exit: disp.status,
221
+ detail: `${disp.stdout ?? ''}${disp.stderr ?? ''}`.trim().slice(-1200),
222
+ });
223
+ return out;
224
+ }
225
+
226
+ export function smoke(excluded: readonly string[]): SmokeResult {
227
+ let stage: string | null = null;
228
+ const fail = (msg: string): SmokeResult => ({
229
+ excluded,
230
+ packedBytes: null,
231
+ probes: [],
232
+ ok: false,
233
+ harnessError: msg,
234
+ });
235
+ try {
236
+ stage = stageClone(excluded);
237
+ const src = path.join(stage, 'src');
238
+ const prefix = path.join(stage, 'prefix');
239
+ const home = path.join(stage, 'home');
240
+ const project = path.join(stage, 'project');
241
+ for (const d of [prefix, home, project]) fs.mkdirSync(d, { recursive: true });
242
+ fs.writeFileSync(path.join(project, 'package.json'), '{"name":"smoke-project"}\n', 'utf8');
243
+
244
+ // node_modules is symlinked rather than installed: `prepack` runs the
245
+ // real build, and a fresh `npm ci` per bisect step would make the loop
246
+ // unusable. The symlink is read-only in practice — the build writes into
247
+ // the clone's own dist/.
248
+ const nm = path.join(src, 'node_modules');
249
+ if (!fs.existsSync(nm)) fs.symlinkSync(path.join(REPO, 'node_modules'), nm, 'dir');
250
+
251
+ // NOT --ignore-scripts. The budget file measures the TRACKED payload
252
+ // that way, but a published tarball is BUILT — `prepack` runs
253
+ // `npm run build`, and dist/cli/agent-config.js is the `bin` target. A
254
+ // harness packing an unbuilt tree installs a package with no binary and
255
+ // proves nothing about the payload a consumer downloads.
256
+ const packed = run('npm', ['pack', '--json', '--pack-destination', stage], {
257
+ cwd: src,
258
+ timeout: 900_000,
259
+ });
260
+ if (packed.status !== 0) return fail(`npm pack failed: ${packed.stderr.slice(-800)}`);
261
+ // `prepack` runs the build, whose progress goes to stdout too — and the
262
+ // build itself prints bracketed lines, so "slice from the last `[`" is
263
+ // not enough either. Take the last balanced top-level array and parse
264
+ // that; if it does not parse, fall back to finding the tarball on disk,
265
+ // because the pack SUCCEEDED and only its report was unreadable.
266
+ const entry = ((): { filename: string; size: number } | null => {
267
+ for (let i = packed.stdout.lastIndexOf('['); i !== -1; i = packed.stdout.lastIndexOf('[', i - 1)) {
268
+ try {
269
+ const parsed = JSON.parse(packed.stdout.slice(i)) as Array<{ filename: string; size: number }>;
270
+ if (Array.isArray(parsed) && parsed[0]?.filename !== undefined) return parsed[0];
271
+ } catch {
272
+ /* keep walking left */
273
+ }
274
+ }
275
+ const tgz = fs.readdirSync(stage).filter((f) => f.endsWith('.tgz'));
276
+ const only = tgz[0];
277
+ if (only === undefined) return null;
278
+ return { filename: only, size: fs.statSync(path.join(stage, only)).size };
279
+ })();
280
+ if (entry === null) return fail(`npm pack produced no tarball: ${packed.stdout.slice(-800)}`);
281
+ const tarball = path.join(stage, entry.filename);
282
+
283
+ const inst = run(
284
+ 'npm',
285
+ ['install', '--global', '--prefix', prefix, '--ignore-scripts', '--no-audit', '--no-fund', tarball],
286
+ { cwd: stage, env: { ...process.env, npm_config_prefix: prefix } },
287
+ );
288
+ if (inst.status !== 0) return fail(`global install failed: ${inst.stderr.slice(-1500)}`);
289
+
290
+ const bin = path.join(prefix, 'bin', 'agent-config');
291
+ if (!fs.existsSync(bin)) return fail(`installed bin missing at ${bin}`);
292
+
293
+ const results = probes(bin, home, project);
294
+ return {
295
+ excluded,
296
+ packedBytes: entry.size,
297
+ probes: results,
298
+ ok: results.every((p) => p.ok),
299
+ harnessError: null,
300
+ };
301
+ } catch (exc) {
302
+ return fail(String(exc));
303
+ } finally {
304
+ if (stage !== null) {
305
+ // Detach the worktree before removing it, or git keeps a dangling
306
+ // administrative entry that breaks the NEXT run in the same repo.
307
+ run('git', ['worktree', 'remove', '--force', path.join(stage, 'src')]);
308
+ fs.rmSync(stage, { recursive: true, force: true });
309
+ }
310
+ }
311
+ }
312
+
313
+ export function main(argv: readonly string[] = process.argv.slice(2)): number {
314
+ const excluded: string[] = [];
315
+ let sabotage: string | null = null;
316
+ const json = argv.includes('--json');
317
+ for (let i = 0; i < argv.length; i += 1) {
318
+ if (argv[i] === '--exclude' && argv[i + 1] !== undefined) excluded.push(argv[i + 1] as string);
319
+ if (argv[i] === '--sabotage' && argv[i + 1] !== undefined) sabotage = argv[i + 1] as string;
320
+ }
321
+ if (sabotage !== null) excluded.push(sabotage);
322
+
323
+ const res = smoke(excluded);
324
+ if (json) {
325
+ process.stdout.write(`${JSON.stringify(res, null, 2)}\n`);
326
+ } else {
327
+ const mb = res.packedBytes === null ? 'n/a' : (res.packedBytes / 1e6).toFixed(4);
328
+ process.stdout.write(
329
+ `pack_install_smoke · excluded=${excluded.length === 0 ? '(none)' : excluded.join(' ')} · packed=${mb} MB\n`,
330
+ );
331
+ for (const p of res.probes) {
332
+ process.stdout.write(` ${p.ok ? '✅' : '❌'} ${p.name} (exit ${String(p.exit)})\n`);
333
+ if (!p.ok) process.stdout.write(` ${p.detail.split('\n').slice(-6).join('\n ')}\n`);
334
+ }
335
+ if (res.harnessError !== null) process.stderr.write(`\n⚠️ harness error: ${res.harnessError}\n`);
336
+ }
337
+ if (res.harnessError !== null) return 2;
338
+ if (sabotage !== null) {
339
+ // Sensitivity mode: the run is CORRECT when the install breaks.
340
+ const broke = !res.ok;
341
+ process.stdout.write(
342
+ broke
343
+ ? `\n✅ sabotage of ${sabotage} broke the install — the harness is sensitive.\n`
344
+ : `\n❌ sabotage of ${sabotage} did NOT break the install. Either the subtree is genuinely unused, or this harness cannot see the surface that needs it — say which before trusting a green.\n`,
345
+ );
346
+ return broke ? 0 : 1;
347
+ }
348
+ return res.ok ? 0 : 1;
349
+ }
350
+
351
+ function _isCliEntry(): boolean {
352
+ const a = process.argv[1];
353
+ if (!a) return false;
354
+ if (a === _FILE || pathToFileURL(path.resolve(a)).href === import.meta.url) return true;
355
+ try {
356
+ return fs.realpathSync(a) === fs.realpathSync(_FILE);
357
+ } catch {
358
+ return false;
359
+ }
360
+ }
361
+ if (_isCliEntry()) process.exit(main());
362
+
363
+ export { REPO };
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * `pr_conflict_census` — which paths actually cost merge conflicts.
4
+ *
5
+ * Answers "why is everything red" as one command, so the measurement never has
6
+ * to be reconstructed by hand (road-to-merge-surface-zero AC-4).
7
+ *
8
+ * THE MEASUREMENT, and why it is a count of conflicts rather than of churn.
9
+ * `git show --name-only` on a MERGE commit prints the *combined* diff: only the
10
+ * paths that differ from BOTH parents. A conflict-free merge therefore prints
11
+ * nothing, and a merge that resolved conflicts prints exactly the resolved
12
+ * paths. Validated in both directions before this script existed:
13
+ *
14
+ * - a merge with five known conflicts printed those five paths;
15
+ * - a clean PR merge printed nothing.
16
+ *
17
+ * So the census counts RESOLUTIONS, not touches. That distinction is the whole
18
+ * value: a file edited in every branch but never conflicting is not a merge
19
+ * surface, and a file edited rarely but always conflicting is.
20
+ *
21
+ * WHAT IT CANNOT SEE, stated because a census that overstates its reach is
22
+ * worse than none. A conflict resolved by rebase leaves no merge commit, so it
23
+ * is invisible here. A squash-merge of a branch that itself merged main carries
24
+ * the resolution inside one commit with one parent — also invisible. The number
25
+ * is therefore a FLOOR on conflict cost, never a total.
26
+ *
27
+ * Exit codes: 0 always. This is an instrument, not a gate.
28
+ */
29
+ import { spawnSync } from 'node:child_process';
30
+ import * as path from 'node:path';
31
+ import process from 'node:process';
32
+ import { fileURLToPath } from 'node:url';
33
+
34
+ const HERE = fileURLToPath(import.meta.url);
35
+ const REPO_ROOT = path.resolve(path.dirname(HERE), '..', '..');
36
+
37
+ export interface CensusRow {
38
+ path: string;
39
+ /** Merge commits in which this path had to be resolved against both parents. */
40
+ resolutions: number;
41
+ }
42
+
43
+ export interface Census {
44
+ rows: CensusRow[];
45
+ /** Merge commits examined. */
46
+ merges: number;
47
+ /** Merges that resolved at least one path. */
48
+ conflicted: number;
49
+ /** The `--since` ASKED for. Not necessarily the window measured — see below. */
50
+ since: string;
51
+ ref: string;
52
+ /**
53
+ * Merge commits the `--since` window contains, before `--limit` truncation.
54
+ *
55
+ * The gap between this and `merges` is the whole reason it is reported: on
56
+ * this repository a 60-day window holds ~1,800 merge commits, so a default
57
+ * limit of 200 measures the newest THREE DAYS while a naive header would
58
+ * print "60 days ago → HEAD". A census that mislabels its own window is
59
+ * worse than no census, because the number looks like a trend.
60
+ */
61
+ available: number;
62
+ /** Oldest and newest merge date ACTUALLY scanned, `YYYY-MM-DD`. */
63
+ scannedFrom: string;
64
+ scannedTo: string;
65
+ }
66
+
67
+ function git(root: string, args: readonly string[]): string {
68
+ const r = spawnSync('git', args, { cwd: root, encoding: 'utf-8', maxBuffer: 64 * 1024 * 1024 });
69
+ return r.status === 0 ? (r.stdout ?? '') : '';
70
+ }
71
+
72
+ export function census(
73
+ root = REPO_ROOT,
74
+ opts: { since?: string | undefined; ref?: string | undefined; limit?: number | undefined } = {},
75
+ ): Census {
76
+ const since = opts.since ?? '60 days ago';
77
+ const ref = opts.ref ?? 'HEAD';
78
+ const limit = opts.limit ?? 200;
79
+ const lines = git(root, [
80
+ 'log',
81
+ '--merges',
82
+ `--since=${since}`,
83
+ '--format=%H %ad',
84
+ '--date=short',
85
+ ref,
86
+ ])
87
+ .split('\n')
88
+ .filter((l) => l.trim() !== '');
89
+ const available = lines.length;
90
+ const scanned = lines.slice(0, limit);
91
+ const merges = scanned.map((l) => l.split(' ')[0] ?? '').filter((h) => h !== '');
92
+ const dates = scanned.map((l) => (l.split(' ')[1] ?? '').trim()).filter((d) => d !== '');
93
+ const scannedTo = dates[0] ?? '';
94
+ const scannedFrom = dates[dates.length - 1] ?? '';
95
+ const counts = new Map<string, number>();
96
+ let conflicted = 0;
97
+ for (const h of merges) {
98
+ const files = git(root, ['show', '--format=', '--name-only', h])
99
+ .split('\n')
100
+ .map((l) => l.trim())
101
+ .filter((l) => l !== '');
102
+ if (files.length > 0) conflicted += 1;
103
+ for (const f of files) counts.set(f, (counts.get(f) ?? 0) + 1);
104
+ }
105
+ const rows = [...counts.entries()]
106
+ .map(([p, n]) => ({ path: p, resolutions: n }))
107
+ .sort((a, b) => b.resolutions - a.resolutions || a.path.localeCompare(b.path));
108
+ return { rows, merges: merges.length, conflicted, since, ref, available, scannedFrom, scannedTo };
109
+ }
110
+
111
+ /** Is this path a generated artefact, i.e. one that should never be hand-merged? */
112
+ export function isGenerated(p: string): boolean {
113
+ return (
114
+ /^docs\/(proof|catalog|skills-catalog)\.md$/.test(p) ||
115
+ /^agents\/(index\.md|reports\/)/.test(p) ||
116
+ /^internal\/reports\//.test(p) ||
117
+ /^dist\//.test(p) ||
118
+ p === 'llms.txt' ||
119
+ /^src\/domains\/[^/]+\/pack\.yaml$/.test(p) ||
120
+ // Added after the first full-window run, because the first version
121
+ // MISSED the top four hotspots and reported 10 % generated where the
122
+ // real share is far higher. All four are written by
123
+ // `update_roadmap_progress` / the archive index builder / the
124
+ // condensation pass, never by hand:
125
+ p === 'agents/roadmaps-progress.md' ||
126
+ /^agents\/roadmaps\/(archive\/(index\.json|INDEX\.md)|stubs\/README\.md)$/.test(p) ||
127
+ p === 'internal/.condensation-hashes.json'
128
+ );
129
+ }
130
+
131
+ export function main(argv: string[] = process.argv.slice(2), root = REPO_ROOT): number {
132
+ const arg = (flag: string): string | undefined => {
133
+ const i = argv.indexOf(flag);
134
+ return i >= 0 ? argv[i + 1] : undefined;
135
+ };
136
+ const top = Number(arg('--top') ?? '15');
137
+ const limitArg = arg('--limit');
138
+ const c = census(root, {
139
+ since: arg('--since'),
140
+ ref: arg('--ref'),
141
+ // Parsed here and not only accepted in `census()`: the default of 200
142
+ // measures the newest three days on this repository, so a caller asking
143
+ // for a real window needs a way to say so from the CLI.
144
+ limit: limitArg === undefined ? undefined : Number(limitArg),
145
+ });
146
+ if (argv.includes('--json')) {
147
+ process.stdout.write(`${JSON.stringify(c, null, 2)}\n`);
148
+ return 0;
149
+ }
150
+ // The window ACTUALLY scanned, never the one asked for. Printing `--since`
151
+ // as though it were the window is how a three-day reading becomes a
152
+ // sixty-day claim.
153
+ process.stdout.write(
154
+ `merge conflicts resolved, ${c.scannedFrom} → ${c.scannedTo} (${c.ref}): ` +
155
+ `${String(c.conflicted)} of ${String(c.merges)} merge commit(s) resolved at least one path\n`,
156
+ );
157
+ if (c.available > c.merges) {
158
+ process.stdout.write(
159
+ ` ⚠️ TRUNCATED: \`--since ${c.since}\` holds ${String(c.available)} merge commit(s); ` +
160
+ `${String(c.merges)} were scanned (--limit). Raise --limit for the full window.\n`,
161
+ );
162
+ }
163
+ process.stdout.write('\n');
164
+ if (c.rows.length === 0) {
165
+ process.stdout.write(' (no resolutions in the window — every merge in it was clean)\n');
166
+ return 0;
167
+ }
168
+ const width = Math.max(...c.rows.slice(0, top).map((r) => r.path.length));
169
+ for (const r of c.rows.slice(0, top)) {
170
+ const tag = isGenerated(r.path) ? ' [generated]' : '';
171
+ process.stdout.write(
172
+ ` ${String(r.resolutions).padStart(3)} ${r.path.padEnd(width)}${tag}\n`,
173
+ );
174
+ }
175
+ const gen = c.rows.filter((r) => isGenerated(r.path)).reduce((n, r) => n + r.resolutions, 0);
176
+ const all = c.rows.reduce((n, r) => n + r.resolutions, 0);
177
+ process.stdout.write(
178
+ `\n ${String(gen)} of ${String(all)} resolutions (${String(Math.round((gen / all) * 100))} %) are on GENERATED paths — ` +
179
+ 'a PR carrying a regenerated output it did not need to carry.\n' +
180
+ ' Floor, not a total: a conflict resolved by rebase leaves no merge commit and is invisible here.\n',
181
+ );
182
+ return 0;
183
+ }
184
+
185
+ if (path.resolve(process.argv[1] ?? '') === path.resolve(HERE)) {
186
+ process.exit(main());
187
+ }
@@ -68,6 +68,30 @@ export function kernel_ids(): Set<string> {
68
68
  return new Set();
69
69
  }
70
70
 
71
+ /**
72
+ * Tier rules the router gives NO trigger at all.
73
+ *
74
+ * These cannot be delivered on a match, so thinning them would remove a body
75
+ * that nothing can ever put back — a silent hole rather than a saving. They
76
+ * project full-bodied, and `measure` reports them by name so the residue is
77
+ * visible instead of being absorbed into the pointer count
78
+ * (road-to-trigger-delivered-rule-bodies 1.3).
79
+ */
80
+ export function no_trigger_ids(): Set<string> {
81
+ const data = JSON.parse(fs.readFileSync(ROUTER, 'utf-8')) as Record<string, unknown>;
82
+ const out = new Set<string>();
83
+ for (const tier of ['tier_1', 'tier_2']) {
84
+ const entries = data[tier];
85
+ if (!Array.isArray(entries)) continue;
86
+ for (const e of entries) {
87
+ const obj = e as Record<string, unknown>;
88
+ const t = obj.triggers;
89
+ if (!Array.isArray(t) || t.length === 0) out.add(String(obj.id));
90
+ }
91
+ }
92
+ return out;
93
+ }
94
+
71
95
  /**
72
96
  * id → workspaces for every non-kernel router entry (router.json schema v2,
73
97
  * road-to-request-scoped-rule-load Phase 1). Rules absent from the map (or
@@ -192,6 +216,7 @@ export function build_thin(
192
216
  scope: readonly string[] | null = null,
193
217
  ): Map<string, string> {
194
218
  const kernel = kernel_ids();
219
+ const noTrigger = no_trigger_ids();
195
220
  const wsMap = scope !== null ? rule_workspaces_map() : new Map<string, string[]>();
196
221
  const out = new Map<string, string>();
197
222
  for (const p of _globSortedMd(rules_dir)) {
@@ -200,7 +225,8 @@ export function build_thin(
200
225
  if (!id_in_scope(stem, scope, kernel, wsMap, fm_workspaces(text))) {
201
226
  continue; // out of workspace scope — no body, no pointer line
202
227
  }
203
- out.set(path.basename(p), kernel.has(stem) ? text : thin_entry(stem, text));
228
+ const full = kernel.has(stem) || noTrigger.has(stem);
229
+ out.set(path.basename(p), full ? text : thin_entry(stem, text));
204
230
  }
205
231
  return out;
206
232
  }
@@ -209,6 +235,10 @@ export interface ThinMeasure {
209
235
  rules_total: number;
210
236
  kernel_full: number;
211
237
  non_kernel_thinned: number;
238
+ /** Non-kernel rules kept full-bodied because the router gives them no trigger. */
239
+ no_trigger_full: number;
240
+ no_trigger_ids: string[];
241
+ no_trigger_gpt: number;
212
242
  eager_gpt: number;
213
243
  thin_gpt: number;
214
244
  saved_gpt: number;
@@ -263,13 +293,22 @@ export function measure(
263
293
  kernelInDir += 1;
264
294
  }
265
295
  }
296
+ const noTrigger = no_trigger_ids();
297
+ const residueIds = [...noTrigger].filter((id) => stemSet.has(id)).sort();
298
+ const residueBlob = residueIds
299
+ .map((id) => fs.readFileSync(path.join(rules_dir, `${id}.md`), 'utf-8'))
300
+ .join('');
301
+ const residueGpt = residueIds.length === 0 ? 0 : token_count.measure(residueBlob).tokens_gpt;
266
302
  const saved_pct = eager.tokens_gpt
267
303
  ? _python_round1((100 * (eager.tokens_gpt - thin.tokens_gpt)) / eager.tokens_gpt)
268
304
  : 0.0;
269
305
  return {
270
306
  rules_total: n,
271
307
  kernel_full: kernelInDir,
272
- non_kernel_thinned: n - kernelInDir,
308
+ non_kernel_thinned: n - kernelInDir - residueIds.length,
309
+ no_trigger_full: residueIds.length,
310
+ no_trigger_ids: residueIds,
311
+ no_trigger_gpt: residueGpt,
273
312
  eager_gpt: eager.tokens_gpt,
274
313
  thin_gpt: thin.tokens_gpt,
275
314
  saved_gpt: eager.tokens_gpt - thin.tokens_gpt,
@@ -480,6 +519,10 @@ export function main(argv: string[] | null = null): number {
480
519
  process.stdout.write(` thin: ${_rjust6(m.thin_gpt)} GPT tok (${_comma(m.thin_chars)} chars)\n`);
481
520
  process.stdout.write(` saved: ${_rjust6(m.saved_gpt)} GPT tok (${m.saved_pct}% of the rule layer)\n`);
482
521
  process.stdout.write(` method: ${m.token_method}\n`);
522
+ process.stdout.write(
523
+ ` no-trigger residue (kept full-bodied, ${m.no_trigger_full} rules, ` +
524
+ `${m.no_trigger_gpt} GPT tok): ${m.no_trigger_ids.join(', ')}\n`,
525
+ );
483
526
  }
484
527
  return 0;
485
528
  }