@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
@@ -37,8 +37,9 @@ import {
37
37
  type QuorumCommand,
38
38
  type QuorumDispatch,
39
39
  type QuorumEventPhase,
40
+ type StanceAgreement,
40
41
  } from './events_log.js';
41
- import { evaluateQuorum, SOLO_FLOOR_MIN_PRESENT, type QuorumResult } from './quorum.js';
42
+ import { evaluateQuorum, formatAttendanceCaveats, SOLO_FLOOR_MIN_PRESENT, withUnparsed, type QuorumResult } from './quorum.js';
42
43
  import { absentReasonFromCliFailure, classifyCliFailure } from './transport_resolver.js';
43
44
 
44
45
  type Dict = Record<string, unknown>;
@@ -117,6 +118,12 @@ export function _emitQuorumEvent(
117
118
  * absence is what the `false` on every line honestly records.
118
119
  */
119
120
  minPresent?: number;
121
+ /**
122
+ * Phase 3 — whether the seats agreed, when a stance tally ran.
123
+ * Omitted by every caller that ran none, which `appendQuorumEvent`
124
+ * records as `not_tallied` rather than as a bare `false`.
125
+ */
126
+ stanceAgreement?: StanceAgreement;
120
127
  },
121
128
  ): void {
122
129
  appendQuorumEvent({
@@ -128,6 +135,7 @@ export function _emitQuorumEvent(
128
135
  configuredTotal: ctx.configuredTotal ?? quorum.total,
129
136
  result: quorum,
130
137
  ...(ctx.minPresent !== undefined ? { minPresent: ctx.minPresent } : {}),
138
+ ...(ctx.stanceAgreement !== undefined ? { stanceAgreement: ctx.stanceAgreement } : {}),
131
139
  absent: absent.map(
132
140
  (a): QuorumAbsence => ({
133
141
  member: String(a['member'] ?? ''),
@@ -154,9 +162,11 @@ export function _postRunQuorum(
154
162
  members: ExternalAIClient[],
155
163
  responses: CouncilResponse[],
156
164
  ai_cfg: Dict,
165
+ parse_outcomes?: ReadonlyMap<string, string>,
157
166
  ): { quorum: QuorumResult; absent: Dict[] } {
158
167
  const absent: Dict[] = [];
159
168
  let present = 0;
169
+ let unparsed = 0;
160
170
  for (let i = 0; i < members.length; i++) {
161
171
  const m = members[i] as ExternalAIClient;
162
172
  const r = responses[i];
@@ -167,7 +177,33 @@ export function _postRunQuorum(
167
177
  // banner printed `2/2 present` — a single-voice verdict presented as
168
178
  // convergence, on a paid run. An empty answer contributes nothing to a
169
179
  // quorum by definition, whatever the transport thought of it.
180
+ // Step 2.3 — the same argument, one rung further in. The byte check
181
+ // below settles "did the transport deliver anything"; it cannot settle
182
+ // "was what it delivered usable content", and a prose refusal passes it
183
+ // unchanged. So a member whose findings answer reached `parse_failed`
184
+ // is pulled out of `present` into its own bucket rather than folded
185
+ // into `N/N present`. It is NOT merged with the error cases: those are
186
+ // transport failures with an `AbsentReason` taxonomy the absent-member
187
+ // table renders, and re-labelling one of them `unparsed` would lose the
188
+ // auth/timeout/quota distinction. Hence the error branch below wins for
189
+ // a member that both errored and parsed badly — the transport failure
190
+ // is the stronger fact.
191
+ //
192
+ // `parse_outcomes` is optional because the run path derives it AFTER
193
+ // the post-run attendance event is emitted: the event stays a
194
+ // transport-level reading by design, and the rendered artefact is where
195
+ // AC-2 asks for the distinction. A caller with no map gets the exact
196
+ // pre-2.3 behaviour, key-for-key.
170
197
  if (r !== undefined && !r.error && r.text.trim() !== '') {
198
+ if (parse_outcomes?.get(m.name) === 'parse_failed') {
199
+ unparsed += 1;
200
+ absent.push({
201
+ member: m.name,
202
+ reason: 'unparsed',
203
+ detail: 'answer present, no parser could read it',
204
+ });
205
+ continue;
206
+ }
171
207
  present += 1;
172
208
  continue;
173
209
  }
@@ -179,7 +215,46 @@ export function _postRunQuorum(
179
215
  detail: raw,
180
216
  });
181
217
  }
182
- return { quorum: evaluateQuorum(members.length, present, _quorum_setting_from(ai_cfg)), absent };
218
+ return { quorum: evaluateQuorum(members.length, present, _quorum_setting_from(ai_cfg), unparsed), absent };
219
+ }
220
+
221
+ /**
222
+ * Which of the three agreement states a stance tally represents.
223
+ *
224
+ * `undefined` when no tally ran — the emitter records that as `not_tallied`,
225
+ * which is a fact ("nobody asked"), not a `false` that reads as disagreement.
226
+ * Returned as an optional rather than a nullable so the caller can spread it
227
+ * under `exactOptionalPropertyTypes`, where an explicit `undefined` and an
228
+ * absent key are different things.
229
+ */
230
+ export function stanceAgreementOf(
231
+ tally: { consensus: unknown } | null,
232
+ ): StanceAgreement | undefined {
233
+ if (tally === null) {
234
+ return undefined;
235
+ }
236
+ return tally.consensus !== null ? 'consensus' : 'split';
237
+ }
238
+
239
+ /**
240
+ * Re-derive the rendered attendance line once the findings parser has spoken.
241
+ *
242
+ * Lives here rather than at the call site because it is the second half of the
243
+ * split `withUnparsed` documents: the post-run event stays a TRANSPORT-level
244
+ * reading so every rate over `events.log` keeps its denominator, and the
245
+ * rendered artefact is where AC-2 asks for the unparsed distinction. Counting
246
+ * `parse_failed` outcomes is the whole derivation; keeping it next to
247
+ * `_postRunQuorum` keeps both readings in one file.
248
+ */
249
+ export function annotateRenderedQuorum(
250
+ quorum: QuorumResult | null,
251
+ parse_outcomes: ReadonlyMap<string, string> | null | undefined,
252
+ ): QuorumResult | null {
253
+ if (quorum === null || parse_outcomes === null || parse_outcomes === undefined) {
254
+ return quorum;
255
+ }
256
+ const unparsed = Array.from(parse_outcomes.values()).filter((o) => o === 'parse_failed').length;
257
+ return withUnparsed(quorum, unparsed);
183
258
  }
184
259
 
185
260
  /**
@@ -205,7 +280,9 @@ export function _format_quorum_line(q: QuorumResult, phase?: QuorumEventPhase):
205
280
  // a solo answer concludes, and nothing in the line distinguishes "both
206
281
  // members agreed" from "one member answered". The counts were always there;
207
282
  // what was missing is the word that stops a reader inferring convergence.
208
- const degraded =
209
- q.present < q.total ? ` ⚠️ DEGRADED — ${String(q.total - q.present)} member(s) did not answer; this is not convergence.` : '';
210
- return `council:quorum · ${tag}${q.present}/${q.total} present, needed ${q.threshold} — ${verdict}.${degraded}`;
283
+ // Step 2.3 moved the wording into `formatAttendanceCaveats` so this line and
284
+ // its mirror in `orchestrator.ts` cannot drift apart, and added the
285
+ // present-unparsed clause there — see that function for why the two counts
286
+ // are disjoint.
287
+ return `council:quorum · ${tag}${q.present}/${q.total} present, needed ${q.threshold} — ${verdict}.${formatAttendanceCaveats(q)}`;
211
288
  }
@@ -218,6 +218,28 @@ export function tally_stances(
218
218
  * Render the **Vote Tally** verdict section: one line per option, the threshold,
219
219
  * and a cleared-or-escalated line. Deterministic — pure projection of the tally.
220
220
  */
221
+ /**
222
+ * Tally the stance lines of a finished round, or `null` when tallying is off.
223
+ *
224
+ * Wraps the member-shape mapping so a caller does not re-derive it: an errored
225
+ * response has no stance line to read, and the member key is
226
+ * `provider:model` because that is what `parse_stance_line` records. Exists so
227
+ * ONE tally is computed per pass and reused — two tallies over the same
228
+ * responses are two chances to disagree, and the attendance event and the
229
+ * handoff envelope both consume this one.
230
+ */
231
+ export function tallyFromResponses(
232
+ responses: ReadonlyArray<{ provider: string; model: string; text: string; error?: string | null }>,
233
+ enabled: boolean,
234
+ ): StanceTallyResult | null {
235
+ if (!enabled) {
236
+ return null;
237
+ }
238
+ return tally_stances(
239
+ responses.filter((r) => !r.error).map((r) => ({ member: `${r.provider}:${r.model}`, text: r.text })),
240
+ );
241
+ }
242
+
221
243
  export function render_vote_tally(result: StanceTallyResult): string {
222
244
  const lines: string[] = ['### Vote Tally'];
223
245
  if (result.options.length === 0) {
@@ -580,6 +580,58 @@ export function perTurnComposite(
580
580
  };
581
581
  }
582
582
 
583
+ /**
584
+ * A1.1 — append ONE composite reading to the durable store.
585
+ *
586
+ * The bench used to print the composite and discard it, which made
587
+ * `per_turn_composite.arming_precondition` ("at least 10 CI gate readings … from
588
+ * at least 2 distinct runner sessions") impossible to evaluate at all. This is
589
+ * the write half; `check_composite_arming.ts` is the read half.
590
+ *
591
+ * THE SESSION DISCRIMINATOR IS THE LOAD-BEARING FIELD, not the count. The
592
+ * precondition asks for two distinct runner SESSIONS because the instability it
593
+ * excludes was measured on ONE machine — a sibling metric read 44-157 % at n=12
594
+ * and 69-74 % at n=50 there — so twelve readings from one session is exactly the
595
+ * shape the floor rejects, and a bare counter cannot see the difference.
596
+ *
597
+ * A null composite is written as null rather than skipped. Dropping it silently
598
+ * would make the store's own length a lie about how many runs contributed, and
599
+ * the reader needs to distinguish "no run" from "a run whose slots were
600
+ * incomplete" — `perTurnComposite` returns null exactly because a composite over
601
+ * a subset reads LOW, and low is the direction that makes a ceiling look met.
602
+ */
603
+ export function composeReadingRecord(
604
+ composite: { ms: number; parts: Record<string, number> } | null,
605
+ tool_calls: number,
606
+ env: NodeJS.ProcessEnv = process.env,
607
+ ): Record<string, unknown> {
608
+ // In CI a session is the workflow run on a given runner; locally it is the
609
+ // host plus the process's own start, so two consecutive local runs are
610
+ // distinguishable while one run's records stay grouped.
611
+ const ciRun = env['GITHUB_RUN_ID'];
612
+ const session =
613
+ ciRun !== undefined && ciRun !== ''
614
+ ? `gh-${ciRun}-${env['RUNNER_OS'] ?? os.platform()}-${env['GITHUB_RUN_ATTEMPT'] ?? '1'}`
615
+ : `local-${os.hostname()}-${String(process.pid)}`;
616
+ return {
617
+ composite_ms: composite === null ? null : composite.ms,
618
+ parts: composite === null ? null : composite.parts,
619
+ tool_calls,
620
+ session,
621
+ platform: `${os.platform()}-${os.arch()}`,
622
+ node: process.version,
623
+ commit: env['GITHUB_SHA'] ?? null,
624
+ run_id: ciRun ?? null,
625
+ recorded_at: new Date().toISOString(),
626
+ };
627
+ }
628
+
629
+ /** Append one JSONL record. Creates the file and its directory if absent. */
630
+ export function appendReading(storePath: string, record: Record<string, unknown>): void {
631
+ fs.mkdirSync(path.dirname(storePath), { recursive: true });
632
+ fs.appendFileSync(storePath, `${JSON.stringify(record)}\n`, 'utf-8');
633
+ }
634
+
583
635
  interface HistoryEntry {
584
636
  recorded_at: string;
585
637
  invocation_path: InvocationPath;
@@ -895,6 +947,16 @@ export function main(argv: string[] = process.argv.slice(2)): number {
895
947
  : perTurnComposite(results, compositeCfg.tool_calls ?? 10);
896
948
  if (compositeCfg !== undefined) {
897
949
  const calls = compositeCfg.tool_calls ?? 10;
950
+ // A1.1: persist the reading BEFORE the ceiling comparison below, so a run
951
+ // that fails the gate still contributes its number. A store that only
952
+ // gets the passing runs is biased in the direction that makes a ceiling
953
+ // look met, which is the same bias the null-composite rule guards.
954
+ const recIdx = argv.indexOf('--record-composite');
955
+ if (recIdx >= 0) {
956
+ const dest = argv[recIdx + 1] ?? path.join(REPO_ROOT, 'agents', 'evidence', 'hook-composite-readings.jsonl');
957
+ appendReading(dest, composeReadingRecord(composite, calls));
958
+ process.stdout.write(`recorded composite reading → ${path.relative(REPO_ROOT, dest)}\n`);
959
+ }
898
960
  if (composite === null) {
899
961
  process.stdout.write(
900
962
  `ℹ️ per-turn composite not computed — a slot the definition needs is missing from this run\n`,
@@ -24,7 +24,11 @@ import * as path from 'node:path';
24
24
  import { fileURLToPath, pathToFileURL } from 'node:url';
25
25
 
26
26
  import { REPO, LEDGER_REL, load_ledger, pointer_unresolved } from './check_claims.js';
27
- import { collect as collectEnforcement, summarise as summariseEnforcement } from './check_enforcement_coverage.js';
27
+ import {
28
+ collect as collectEnforcement,
29
+ denominator_line as enforcementDenominatorLine,
30
+ summarise as summariseEnforcement,
31
+ } from './check_enforcement_coverage.js';
28
32
  import { collectSkillGaps } from './check_skill_gaps.js';
29
33
  import { loadRows as loadComparisonRows } from './check_comparison.js';
30
34
  import { computeStatus as domainSoundnessStatus } from './domain_soundness_status.js';
@@ -415,6 +419,13 @@ function render(): string {
415
419
  `${s.local_only} local-only · ${s.undeclared} undeclared (no \`enforced_by\` yet).`,
416
420
  );
417
421
  L.push('');
422
+ // The denominator, WITH the frame that produced it. Until 2026-08-23 the
423
+ // tree published five figures for this one property because every one was
424
+ // quoted without saying which population it was taken over. This line is
425
+ // the single sanctioned statement of it, and `check_enforcement_denominator`
426
+ // reds when a published doc restates a count instead of citing this block.
427
+ L.push(`\`${enforcementDenominatorLine(s.frames)}\``);
428
+ L.push('');
418
429
  L.push('| Rule | Effective level | Declared backstop(s) |');
419
430
  L.push('|---|---|---|');
420
431
  const declared = rows
@@ -434,11 +434,32 @@ function runLimitsMode(): number {
434
434
  /** The package's two projection-mode counts, one walk. Shared by both modes. */
435
435
  function projectionModeCounts(): ProjectionModeCounts {
436
436
  const stats = scoped_projection_stats(REPO, iter_skills());
437
+ // The tier split is a per-machine runtime artefact (gitignored), so absent is
438
+ // the normal state and must read as "unmeasured", never as zero.
439
+ let tierACount: number | null = null;
440
+ let tierBCount: number | null = null;
441
+ const tiersFile = path.join(REPO, 'agents', 'runtime', 'state', 'skill-tiers.json');
442
+ if (fs.existsSync(tiersFile)) {
443
+ try {
444
+ const parsed = JSON.parse(fs.readFileSync(tiersFile, 'utf-8')) as {
445
+ tier_a?: unknown;
446
+ tier_b?: unknown;
447
+ };
448
+ if (Array.isArray(parsed.tier_a) && Array.isArray(parsed.tier_b)) {
449
+ tierACount = parsed.tier_a.length;
450
+ tierBCount = parsed.tier_b.length;
451
+ }
452
+ } catch {
453
+ /* a malformed split is an absent split — never a partial count */
454
+ }
455
+ }
437
456
  return {
438
457
  scoped: stats.projected,
439
458
  legacyAll: stats.total,
440
459
  prunedUnderScoped: stats.pruned,
441
460
  activePacks: stats.active_packs,
461
+ tierACount,
462
+ tierBCount,
442
463
  };
443
464
  }
444
465
 
@@ -29,6 +29,7 @@ import process from 'node:process';
29
29
  import { fileURLToPath, pathToFileURL } from 'node:url';
30
30
  import YAML from 'yaml';
31
31
 
32
+ import { asOf } from './_lib/as_of.js';
32
33
  import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
33
34
 
34
35
  // src/scripts/check_always_budget.ts → parents[2] is the repo root
@@ -435,7 +436,7 @@ function recordTrend(totalExt: number, sizes: Array<[string, number, number]>):
435
436
 
436
437
  /** datetime.now(timezone.utc).isoformat(timespec="seconds") → ...+00:00. */
437
438
  function isoSeconds(): string {
438
- const d = new Date();
439
+ const d = asOf();
439
440
  const pad = (v: number): string => String(v).padStart(2, '0');
440
441
  return (
441
442
  `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())}` +
@@ -24,6 +24,7 @@ import * as fs from 'node:fs';
24
24
  import * as path from 'node:path';
25
25
  import { fileURLToPath, pathToFileURL } from 'node:url';
26
26
 
27
+ import { asOfMs } from './_lib/as_of.js';
27
28
  import { assertWatchlistResolves, DeadScopeError } from './_lib/scan_scope.js';
28
29
 
29
30
  const QUIET = process.argv.slice(2).includes('--quiet');
@@ -76,7 +77,7 @@ function check(): number {
76
77
  }
77
78
 
78
79
  const mtimeMs = fs.statSync(target).mtimeMs;
79
- const age_days = (Date.now() - mtimeMs) / 86400000;
80
+ const age_days = (asOfMs() - mtimeMs) / 86400000;
80
81
  if (age_days > STALE_DAYS) {
81
82
  notes.push(
82
83
  `ℹ️ .augmentignore is ${Math.trunc(age_days)} days old (threshold: ${STALE_DAYS}) — ` +
@@ -19,6 +19,7 @@ import * as fs from 'node:fs';
19
19
  import * as path from 'node:path';
20
20
  import { fileURLToPath, pathToFileURL } from 'node:url';
21
21
 
22
+ import { asOf } from './_lib/as_of.js';
22
23
  import { assertScanned, DeadScopeError } from './_lib/scan_scope.js';
23
24
 
24
25
  const _HERE = fileURLToPath(import.meta.url);
@@ -185,7 +186,7 @@ function parse_args(argv: readonly string[]): ParsedArgs {
185
186
 
186
187
  /** Today's date as an ordinal, in local time (mirrors date.today()). */
187
188
  function _todayOrdinal(): number {
188
- const now = new Date();
189
+ const now = asOf();
189
190
  return _dateOrdinal(now.getFullYear(), now.getMonth() + 1, now.getDate());
190
191
  }
191
192
 
@@ -1,6 +1,41 @@
1
1
  #!/usr/bin/env tsx
2
2
  /**
3
- * Guard against build-machine path leakage in the tracked install bundle.
3
+ * Guard against build-machine path leakage in the tracked install bundle AND in
4
+ * published Markdown.
5
+ *
6
+ * ## The published-.md scope (road-to-inbox-harvest-2026-08-e-command-surface-legibility Phase 0)
7
+ *
8
+ * The bundle roots below were the original scope. A second population ships the
9
+ * same leak class: every `.md` inside `package.json` `files[]` — 1,079 files —
10
+ * and a `/Users/<name>/…` in a shipped skill is the same defect as one in
11
+ * `install.mjs`.
12
+ *
13
+ * **It is EXTENDED here rather than given a second gate**, deliberately: this one
14
+ * already runs in CI, already carries the patterns, the username masking and the
15
+ * `scan_scope` dead-scope protection, and a sibling gate would duplicate all
16
+ * four.
17
+ *
18
+ * ### Why the floor is ZERO UNAPPROVED and not the measured 11
19
+ *
20
+ * The published-.md baseline measured **11 hits in 8 files, none of them a leak**
21
+ * (`agents/evidence/analysis/published-md-path-leakage-baseline.md`): three
22
+ * documentation examples, six occurrences inside the rules that FORBID the
23
+ * pattern and must quote it, two legitimately absolute paths.
24
+ *
25
+ * A numeric floor of 11 was rejected by both council seats, 2026-08-24, for one
26
+ * reason: it lets an approved hit disappear while a real leak takes its slot, and
27
+ * the count stays 11. So the floor is **0 unapproved matches**, and the eleven are
28
+ * pinned exceptions in `.path-leak-allow` — line-pinned, so an entry that drifts
29
+ * off its line stops matching and the gate REDS, which is the safe direction.
30
+ *
31
+ * ### And why NOT "exempt matches inside backticks"
32
+ *
33
+ * That was the other candidate, and it was rejected on a false-negative argument
34
+ * both seats found decisive: **a real leaked path is commonly formatted as code**,
35
+ * so exempting inline code and fenced blocks opens a channel that hides exactly
36
+ * the defect this gate exists to catch. It would also hide a skill author's
37
+ * accidental real path inside an example block — the contribution path where this
38
+ * class is most likely to arrive.
4
39
  *
5
40
  * road-to-feedback-9.2.0-followups Phase 4.1. Three 9.1 commits
6
41
  * (f8752443b, 5933bf1a9, f30adb5a1) each rebuilt `dist/install/install.mjs`
@@ -75,6 +110,40 @@ const BUNDLE_ROOTS: readonly string[] = [
75
110
  'dist/cli-delegate',
76
111
  ];
77
112
 
113
+ /**
114
+ * Published `.md` — the second population, derived from `package.json` `files[]`
115
+ * rather than guessed, so the scope is what the tarball actually ships. Roots
116
+ * only; the per-file filter below keeps it to `.md`.
117
+ */
118
+ const PUBLISHED_MD_ROOTS: readonly string[] = [
119
+ 'dist/agent-src',
120
+ 'docs/guidelines',
121
+ 'src/scripts',
122
+ // NOT `src/agent-src` wholesale: `files[]` ships only these two subtrees, and
123
+ // scanning the parent would gate content no consumer receives. Caught by this
124
+ // gate's own test, which asserts every root is inside `files[]`.
125
+ 'src/agent-src/scripts',
126
+ 'src/agent-src/templates/scripts',
127
+ 'agents/templates',
128
+ 'src/templates',
129
+ 'src/config',
130
+ ];
131
+
132
+ /** Named `.md` / text files `files[]` ships individually. */
133
+ const PUBLISHED_MD_FILES: readonly string[] = [
134
+ 'AGENTS.md',
135
+ 'CHANGELOG.md',
136
+ 'CONTRIBUTING.md',
137
+ 'MIGRATION.md',
138
+ 'README.md',
139
+ 'docs/contracts/persona-schema.md',
140
+ 'docs/contracts/provider-lifecycle.md',
141
+ 'docs/contracts/settings-classes.md',
142
+ ];
143
+
144
+ /** Repo-root allow file for audited published-`.md` exceptions. */
145
+ const ALLOW_FILE = '.path-leak-allow';
146
+
78
147
  interface LeakPattern {
79
148
  readonly name: string;
80
149
  readonly re: RegExp;
@@ -192,6 +261,49 @@ function _splitlines(text: string): string[] {
192
261
  return text.split('\n').filter((l) => l.length > 0);
193
262
  }
194
263
 
264
+ /**
265
+ * Parse `.path-leak-allow` into `path:line` keys.
266
+ *
267
+ * Line-pinned on purpose, and the trade-off is the same one `.secret-allow`
268
+ * documents for itself: an entry that drifts off its line stops matching and the
269
+ * gate REDS. That is the safe direction — someone re-audits and moves the pin —
270
+ * whereas a path-only entry would silently allow a real leak anywhere in the
271
+ * file. This tree has already been bitten by the opposite: a `.secret-allow` pin
272
+ * sat one line off on `main` for a day, covering nothing, invisible because that
273
+ * gate is diff-scoped.
274
+ */
275
+ export function parse_allow_file(text: string): Set<string> {
276
+ const out = new Set<string>();
277
+ for (const raw of text.split('\n')) {
278
+ const line = raw.replace(/#.*$/, '').trim();
279
+ if (line === '') continue;
280
+ out.add(line);
281
+ }
282
+ return out;
283
+ }
284
+
285
+ function allow_set(): Set<string> {
286
+ try {
287
+ return parse_allow_file(fs.readFileSync(path.join(REPO, ALLOW_FILE), 'utf-8'));
288
+ } catch {
289
+ return new Set();
290
+ }
291
+ }
292
+
293
+ /** Every tracked `.md` inside the published roots, plus the named files. */
294
+ function tracked_published_md(): string[] {
295
+ const seen = new Set<string>();
296
+ for (const root of PUBLISHED_MD_ROOTS) {
297
+ for (const rel of _splitlines(_git(['ls-files', root]))) {
298
+ if (rel.endsWith('.md')) seen.add(rel);
299
+ }
300
+ }
301
+ for (const rel of PUBLISHED_MD_FILES) {
302
+ for (const got of _splitlines(_git(['ls-files', rel]))) seen.add(got);
303
+ }
304
+ return [...seen].sort();
305
+ }
306
+
195
307
  /** Every tracked path under the bundle roots, deduped and sorted. */
196
308
  function tracked_bundle_files(): string[] {
197
309
  const seen = new Set<string>();
@@ -291,7 +403,12 @@ function parse_args(argv: readonly string[]): Options {
291
403
 
292
404
  function main(argv: readonly string[] = process.argv.slice(2)): number {
293
405
  const opts = parse_args(argv);
294
- const targets = opts.files.length > 0 ? opts.files : tracked_bundle_files();
406
+ const bundle = opts.files.length > 0 ? opts.files : tracked_bundle_files();
407
+ // Published `.md` joins the default target list. With explicit `--file`
408
+ // arguments it does NOT — an ad-hoc single-file run stays a single-file run,
409
+ // which is what the existing tests and the pre-push path rely on.
410
+ const published = opts.files.length > 0 ? [] : tracked_published_md();
411
+ const targets = [...bundle, ...published];
295
412
 
296
413
  // `git ls-files <untracked-root>` returns nothing, by design (BUNDLE_ROOTS
297
414
  // lists roots that may not be tracked yet). That tolerance is also the
@@ -305,8 +422,11 @@ function main(argv: readonly string[] = process.argv.slice(2)): number {
305
422
  assertScanned({
306
423
  gate: 'check_bundle_path_leakage',
307
424
  scanned: targets.length,
308
- units: 'bundle file(s)',
309
- roots: opts.files.length > 0 ? ['<explicit file arguments>'] : BUNDLE_ROOTS,
425
+ units: 'bundle + published-md file(s)',
426
+ roots:
427
+ opts.files.length > 0
428
+ ? ['<explicit file arguments>']
429
+ : [...BUNDLE_ROOTS, ...PUBLISHED_MD_ROOTS],
310
430
  });
311
431
  } catch (exc) {
312
432
  if (exc instanceof DeadScopeError) {
@@ -316,17 +436,48 @@ function main(argv: readonly string[] = process.argv.slice(2)): number {
316
436
  throw exc;
317
437
  }
318
438
 
319
- const hits = scan_files(targets);
439
+ const allowed = allow_set();
440
+ const all = scan_files(targets);
441
+ // The floor is ZERO UNAPPROVED, never a count. A pinned exception that has
442
+ // drifted off its line simply stops matching, so the hit resurfaces and the
443
+ // gate reds — deliberately, per the header.
444
+ const hits = all.filter((h) => !allowed.has(`${h.file}:${String(h.line)}`));
445
+ const suppressed = all.length - hits.length;
320
446
 
321
447
  if (hits.length > 0) {
322
448
  process.stderr.write(`${format_report(hits)}\n`);
449
+ // The per-pattern hints are bundle-shaped ("rebuild from a clean
450
+ // checkout"), which is the wrong instruction for a `.md` hit — nothing is
451
+ // rebuilt to fix prose. Published-md hits get their own line rather than
452
+ // a misleading one.
453
+ if (hits.some((h) => h.file.endsWith('.md'))) {
454
+ process.stderr.write(
455
+ ` NOTE: a \`.md\` hit is not fixed by rebuilding. Either anonymise the path,\n` +
456
+ ` or — if it IS the pattern being documented — pin it in ${ALLOW_FILE}.\n`,
457
+ );
458
+ }
459
+ if (suppressed > 0) {
460
+ process.stderr.write(
461
+ ` (${suppressed} further match(es) are pinned exceptions in ${ALLOW_FILE})\n`,
462
+ );
463
+ }
464
+ process.stderr.write(
465
+ ` A published-.md match that is the PATTERN BEING DOCUMENTED — a rule quoting\n` +
466
+ ` the shape it forbids, or an anonymised example — belongs in ${ALLOW_FILE}\n` +
467
+ ` as \`<path>:<line>\` with its reason above it. A real path does not.\n`,
468
+ );
323
469
  return 1;
324
470
  }
325
471
 
326
472
  if (!opts.quiet) {
473
+ // A gate that scans nothing and exits green is indistinguishable from a
474
+ // broken one, so the green path names both populations and the
475
+ // suppression count — an exception set that quietly grows is the failure
476
+ // mode a bare "no leakage" line would hide.
327
477
  process.stdout.write(
328
- `✅ check_bundle_path_leakage: no build-machine path leakage ` +
329
- `(${targets.length} tracked bundle file(s) scanned).\n`,
478
+ `✅ check_bundle_path_leakage: no unapproved path leakage ` +
479
+ `(${String(bundle.length)} bundle + ${String(published.length)} published-md ` +
480
+ `file(s) scanned, ${String(suppressed)} pinned exception(s)).\n`,
330
481
  );
331
482
  }
332
483
  return 0;
@@ -359,6 +510,10 @@ if (_isCliEntry() || process.argv[1] === _HERE) {
359
510
  export {
360
511
  REPO,
361
512
  BUNDLE_ROOTS,
513
+ PUBLISHED_MD_ROOTS,
514
+ PUBLISHED_MD_FILES,
515
+ ALLOW_FILE,
516
+ tracked_published_md,
362
517
  LEAK_PATTERNS,
363
518
  MAX_SNIPPET,
364
519
  MAX_HITS_SHOWN_PER_GROUP,