@event4u/agent-config 7.5.0 → 8.1.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 (429) hide show
  1. package/.claude-plugin/marketplace.json +8 -1
  2. package/AGENTS.md +9 -9
  3. package/CHANGELOG.md +317 -260
  4. package/README.md +35 -5
  5. package/dist/agent-src/commands/analytics/prune.md +1 -1
  6. package/dist/agent-src/commands/analytics/show.md +1 -1
  7. package/dist/agent-src/commands/analyze/decision.md +2 -2
  8. package/dist/agent-src/commands/analyze/incident.md +2 -2
  9. package/dist/agent-src/commands/analyze/near-miss.md +2 -2
  10. package/dist/agent-src/commands/analyze/postmortem.md +2 -2
  11. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  12. package/dist/agent-src/commands/cost-report.md +25 -0
  13. package/dist/agent-src/commands/evals/analyze.json +30 -0
  14. package/dist/agent-src/commands/evals/mission-upgrade.json +30 -0
  15. package/dist/agent-src/commands/implement-ticket.md +1 -1
  16. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  17. package/dist/agent-src/commands/knowledge/ingest.md +1 -1
  18. package/dist/agent-src/commands/knowledge/list.md +1 -1
  19. package/dist/agent-src/commands/memory/load.md +12 -11
  20. package/dist/agent-src/commands/memory/promote.md +30 -0
  21. package/dist/agent-src/commands/memory/propose.md +16 -2
  22. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  23. package/dist/agent-src/commands/module/explore.md +11 -7
  24. package/dist/agent-src/commands/optimize-project.md +243 -0
  25. package/dist/agent-src/commands/optimize.md +5 -0
  26. package/dist/agent-src/commands/pr/create.md +37 -8
  27. package/dist/agent-src/commands/prediction-pool.md +2 -2
  28. package/dist/agent-src/commands/profile/activate.md +3 -3
  29. package/dist/agent-src/commands/profile/deactivate.md +2 -2
  30. package/dist/agent-src/commands/profile/show.md +3 -3
  31. package/dist/agent-src/commands/research/deep.md +5 -0
  32. package/dist/agent-src/commands/research/report.md +2 -1
  33. package/dist/agent-src/commands/roadmap/create.md +88 -10
  34. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  35. package/dist/agent-src/commands/roadmap/process-full.md +15 -2
  36. package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
  37. package/dist/agent-src/commands/roadmap/process-step.md +4 -0
  38. package/dist/agent-src/commands/roadmap.md +1 -1
  39. package/dist/agent-src/commands/security-audit-config.md +1 -1
  40. package/dist/agent-src/commands/sync-agent-settings.md +1 -1
  41. package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
  42. package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
  43. package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
  44. package/dist/agent-src/commands/team-knowledge.md +64 -0
  45. package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
  46. package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
  47. package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
  48. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
  49. package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  50. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
  51. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
  52. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
  53. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
  54. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
  55. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
  56. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
  57. package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
  58. package/dist/agent-src/contexts/override-system.md +1 -1
  59. package/dist/agent-src/personas/brand-strategist.md +0 -1
  60. package/dist/agent-src/personas/data-integrity.md +66 -0
  61. package/dist/agent-src/personas/design-director.md +0 -1
  62. package/dist/agent-src/personas/performance-engineer.md +66 -0
  63. package/dist/agent-src/personas/production-validator.md +73 -0
  64. package/dist/agent-src/rules/agent-authority.md +3 -4
  65. package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
  66. package/dist/agent-src/rules/architecture.md +2 -4
  67. package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
  68. package/dist/agent-src/rules/artifact-engagement-recording.md +2 -4
  69. package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
  70. package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
  71. package/dist/agent-src/rules/autonomous-execution.md +3 -5
  72. package/dist/agent-src/rules/brand-consistency.md +3 -5
  73. package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
  74. package/dist/agent-src/rules/cli-output-handling.md +4 -6
  75. package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
  76. package/dist/agent-src/rules/commit-conventions.md +3 -5
  77. package/dist/agent-src/rules/commit-policy.md +18 -10
  78. package/dist/agent-src/rules/content-quoting-floor.md +88 -0
  79. package/dist/agent-src/rules/context-hygiene.md +3 -5
  80. package/dist/agent-src/rules/copilot-routing.md +4 -6
  81. package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
  82. package/dist/agent-src/rules/delegation-policy.md +10 -6
  83. package/dist/agent-src/rules/design-fidelity.md +3 -5
  84. package/dist/agent-src/rules/devcontainer-routing.md +4 -6
  85. package/dist/agent-src/rules/direct-answers.md +13 -17
  86. package/dist/agent-src/rules/docker-commands.md +3 -5
  87. package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
  88. package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
  89. package/dist/agent-src/rules/domain-safety-pii.md +3 -5
  90. package/dist/agent-src/rules/domain-safety-retention.md +3 -5
  91. package/dist/agent-src/rules/downstream-changes.md +3 -4
  92. package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
  93. package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
  94. package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
  95. package/dist/agent-src/rules/finance-safety-floor.md +3 -6
  96. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
  97. package/dist/agent-src/rules/git-history-discipline.md +3 -5
  98. package/dist/agent-src/rules/guidelines.md +2 -4
  99. package/dist/agent-src/rules/icon-consistency.md +3 -5
  100. package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
  101. package/dist/agent-src/rules/improve-before-implement.md +5 -5
  102. package/dist/agent-src/rules/invite-challenge.md +3 -5
  103. package/dist/agent-src/rules/language-and-tone.md +13 -15
  104. package/dist/agent-src/rules/laravel-routing.md +3 -5
  105. package/dist/agent-src/rules/laravel-translations.md +3 -5
  106. package/dist/agent-src/rules/legal-safety-floor.md +3 -5
  107. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
  108. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
  109. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
  110. package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
  111. package/dist/agent-src/rules/media-governance-routing.md +3 -5
  112. package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
  113. package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
  114. package/dist/agent-src/rules/missing-tool-handling.md +3 -5
  115. package/dist/agent-src/rules/model-recommendation.md +4 -6
  116. package/dist/agent-src/rules/no-attribution-footers.md +3 -5
  117. package/dist/agent-src/rules/no-cheap-questions.md +5 -8
  118. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
  119. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
  120. package/dist/agent-src/rules/no-roadmap-references.md +3 -5
  121. package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
  122. package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
  123. package/dist/agent-src/rules/onboarding-gate.md +4 -6
  124. package/dist/agent-src/rules/output-discipline.md +3 -5
  125. package/dist/agent-src/rules/package-ci-checks.md +3 -5
  126. package/dist/agent-src/rules/persona-governance.md +2 -4
  127. package/dist/agent-src/rules/php-coding.md +3 -5
  128. package/dist/agent-src/rules/preservation-guard.md +2 -4
  129. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
  130. package/dist/agent-src/rules/reviewer-awareness.md +5 -6
  131. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
  132. package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
  133. package/dist/agent-src/rules/role-mode-adherence.md +2 -4
  134. package/dist/agent-src/rules/rule-type-governance.md +3 -5
  135. package/dist/agent-src/rules/runtime-safety.md +2 -4
  136. package/dist/agent-src/rules/scope-control.md +10 -11
  137. package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
  138. package/dist/agent-src/rules/size-enforcement.md +2 -4
  139. package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
  140. package/dist/agent-src/rules/skill-quality.md +3 -5
  141. package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
  142. package/dist/agent-src/rules/source-confidentiality.md +3 -5
  143. package/dist/agent-src/rules/source-discovery-gate.md +3 -5
  144. package/dist/agent-src/rules/source-of-truth.md +3 -5
  145. package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
  146. package/dist/agent-src/rules/symfony-routing.md +4 -6
  147. package/dist/agent-src/rules/telegraph-speak.md +4 -5
  148. package/dist/agent-src/rules/think-before-action.md +7 -4
  149. package/dist/agent-src/rules/token-budget-discipline.md +29 -5
  150. package/dist/agent-src/rules/token-efficiency.md +3 -5
  151. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
  152. package/dist/agent-src/rules/tool-safety.md +2 -4
  153. package/dist/agent-src/rules/ui-audit-gate.md +3 -6
  154. package/dist/agent-src/rules/untrusted-input-defense.md +3 -5
  155. package/dist/agent-src/rules/upstream-proposal.md +4 -6
  156. package/dist/agent-src/rules/user-interaction.md +7 -5
  157. package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
  158. package/dist/agent-src/rules/verify-before-complete.md +12 -22
  159. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
  160. package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
  161. package/dist/agent-src/skills/adr-create/SKILL.md +48 -42
  162. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
  163. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  164. package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
  165. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
  166. package/dist/agent-src/skills/brand/SKILL.md +1 -1
  167. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
  168. package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
  169. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -3
  170. package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
  171. package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
  172. package/dist/agent-src/skills/code-review/SKILL.md +1 -0
  173. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
  174. package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
  175. package/dist/agent-src/skills/context-document/SKILL.md +17 -0
  176. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
  177. package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
  178. package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
  179. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
  180. package/dist/agent-src/skills/design-intelligence/SKILL.md +5 -2
  181. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  182. package/dist/agent-src/skills/design-tokens/SKILL.md +10 -4
  183. package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
  184. package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
  185. package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
  186. package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
  187. package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
  188. package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
  189. package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
  190. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
  191. package/dist/agent-src/skills/laravel/SKILL.md +0 -1
  192. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
  193. package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
  194. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
  195. package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
  196. package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
  197. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
  198. package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
  199. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
  200. package/dist/agent-src/skills/premortem/SKILL.md +0 -3
  201. package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
  202. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
  203. package/dist/agent-src/skills/release-comms/SKILL.md +46 -45
  204. package/dist/agent-src/skills/roadmap-management/SKILL.md +21 -0
  205. package/dist/agent-src/skills/roadmap-writing/SKILL.md +32 -2
  206. package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
  207. package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
  208. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
  209. package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
  210. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
  211. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
  212. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
  213. package/dist/agent-src/skills/systematic-debugging/SKILL.md +29 -0
  214. package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
  215. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  216. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
  217. package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
  218. package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
  219. package/dist/agent-src/templates/agent-settings.md +22 -1
  220. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  221. package/dist/agent-src/templates/command.md +2 -2
  222. package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
  223. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
  224. package/dist/agent-src/templates/roadmaps.md +70 -2
  225. package/dist/agent-src/templates/rule.md +1 -1
  226. package/dist/agent-src/templates/scripts/README.md +3 -3
  227. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
  228. package/dist/agent-src/templates/tickets.md +8 -8
  229. package/dist/cli/commands/recordTriggerEval.test.js +1 -1
  230. package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
  231. package/dist/cli/initRouting.js +4 -2
  232. package/dist/cli/initRouting.js.map +1 -1
  233. package/dist/cli/registry.js +1 -0
  234. package/dist/cli/registry.js.map +1 -1
  235. package/dist/discovery/deprecation-report.md +1 -1
  236. package/dist/discovery/discovery-manifest.json +718 -240
  237. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  238. package/dist/discovery/discovery-manifest.summary.md +8 -8
  239. package/dist/discovery/orphan-report.md +1 -1
  240. package/dist/discovery/packs.json +43 -28
  241. package/dist/discovery/trust-report.md +12 -11
  242. package/dist/discovery/workspaces.json +29 -18
  243. package/dist/install/preflight.js +173 -0
  244. package/dist/install/preflight.js.map +1 -0
  245. package/dist/mcp/registry-manifest.json +4 -4
  246. package/dist/router.json +1 -1
  247. package/dist/server/routes/settings.js +4 -0
  248. package/dist/server/routes/settings.js.map +1 -1
  249. package/dist/server/schemas/settings.js +3 -1
  250. package/dist/server/schemas/settings.js.map +1 -1
  251. package/docs/CLAIMS.md +108 -0
  252. package/docs/MIGRATION.md +3 -3
  253. package/docs/architecture.md +5 -5
  254. package/docs/archive/CHANGELOG-pre-8.0.0.md +301 -0
  255. package/docs/benchmark.md +133 -2
  256. package/docs/benchmark.pinned.yml +31 -0
  257. package/docs/capability-matrix.md +1 -0
  258. package/docs/catalog.md +70 -60
  259. package/docs/command-flows.md +15 -3
  260. package/docs/comparison.yaml +35 -0
  261. package/docs/contracts/agents-layout.md +148 -0
  262. package/docs/contracts/brand-token-consumption.md +5 -0
  263. package/docs/contracts/capability-boundary.md +5 -0
  264. package/docs/contracts/command-category-governance.md +5 -0
  265. package/docs/contracts/command-clusters.md +1 -0
  266. package/docs/contracts/command-surface-tiers.md +1 -1
  267. package/docs/contracts/conformance.md +84 -0
  268. package/docs/contracts/creative-pack-boundary.md +5 -0
  269. package/docs/contracts/discovery-manifest.schema.json +5 -4
  270. package/docs/contracts/file-ownership-matrix.json +4605 -985
  271. package/docs/contracts/governance-enforcement-projection.md +5 -0
  272. package/docs/contracts/gui-wizard.md +1 -1
  273. package/docs/contracts/hook-architecture-v1.md +2 -2
  274. package/docs/contracts/implement-ticket-flow.md +1 -1
  275. package/docs/contracts/kernel-membership.md +13 -0
  276. package/docs/contracts/mcp-tool-inventory.md +23 -23
  277. package/docs/contracts/no-runtime-boundary.md +6 -1
  278. package/docs/contracts/review-lens-schema.md +5 -0
  279. package/docs/contracts/rule-router.md +102 -8
  280. package/docs/contracts/skill-bundled-assets.md +1 -1
  281. package/docs/contracts/skill-dry-run.md +1 -1
  282. package/docs/contracts/subagent-boundary.md +5 -0
  283. package/docs/contracts/ticket-bundle-format.md +9 -4
  284. package/docs/contracts/tier-3-contrib-plugin.md +2 -2
  285. package/docs/contracts/write-engine.md +3 -0
  286. package/docs/customization.md +87 -15
  287. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
  288. package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
  289. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
  290. package/docs/decisions/INDEX.md +2 -0
  291. package/docs/distribution/awesome-list-submission.md +46 -0
  292. package/docs/distribution/launch-story-draft.md +58 -0
  293. package/docs/end-to-end-walkthroughs.md +2 -2
  294. package/docs/getting-started.md +2 -2
  295. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
  296. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
  297. package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
  298. package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
  299. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  300. package/docs/guidelines/augment-portability-patterns.md +1 -1
  301. package/docs/guidelines/code-clarity.md +19 -0
  302. package/docs/guidelines/design-antipatterns-triggers.json +2 -1
  303. package/docs/guidelines/design-antipatterns.md +10 -1
  304. package/docs/guidelines/design-modes.md +6 -0
  305. package/docs/guidelines/php/general.md +9 -1
  306. package/docs/guidelines/php/php-coding-patterns.md +7 -0
  307. package/docs/guides/cross-repo-retrieval.md +1 -1
  308. package/docs/guides/frontend-design-corpus-refresh.md +2 -2
  309. package/docs/guides/local-analytics.md +4 -4
  310. package/docs/guides/skill-discovery.md +1 -1
  311. package/docs/guides/skill-preview.md +1 -1
  312. package/docs/hook-payload-capture.md +6 -6
  313. package/docs/install-friction-report.md +66 -0
  314. package/docs/installation.md +1 -1
  315. package/docs/maintainers/optional-media-deps.md +50 -0
  316. package/docs/mcp-server.md +11 -12
  317. package/docs/media/proof-demo.cast +14 -0
  318. package/docs/media/proof-demo.gif +0 -0
  319. package/docs/migration/consumer-template-consumption-model.md +1 -1
  320. package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
  321. package/docs/migration/node-floor.md +1 -1
  322. package/docs/migration/yaml-roundtrip-spike.md +1 -1
  323. package/docs/personas.md +16 -5
  324. package/docs/positioning-evidence.md +86 -0
  325. package/docs/proof.md +86 -0
  326. package/docs/skills-catalog.md +1 -1
  327. package/docs/troubleshooting.md +8 -8
  328. package/docs/wedge/production-validator/README.md +57 -0
  329. package/docs/wedge/production-validator/production-validator.md +56 -0
  330. package/docs/wizard.md +2 -2
  331. package/package.json +1 -1
  332. package/src/config/agent-settings.template.yml +59 -4
  333. package/src/config/agents-paths.yml +254 -0
  334. package/src/config/budgets.yml +16 -0
  335. package/src/config/discovery/packs.yml +1 -0
  336. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  337. package/src/config/gitignore-block.txt +25 -0
  338. package/src/config/host-capabilities.yml +31 -0
  339. package/src/config/profiles/balanced.ini +4 -0
  340. package/src/config/profiles/full.ini +4 -0
  341. package/src/config/profiles/minimal.ini +4 -0
  342. package/src/scripts/_cli/cmd_conformance.ts +716 -0
  343. package/src/scripts/_cli/cmd_doctor.ts +23 -2
  344. package/src/scripts/_cli/cmd_fleet.ts +401 -0
  345. package/src/scripts/_cli/cmd_preflight.ts +159 -0
  346. package/src/scripts/_dispatch.bash +10 -0
  347. package/src/scripts/_lib/knowledge_events.ts +193 -0
  348. package/src/scripts/_lib/subagent_steering.ts +115 -3
  349. package/src/scripts/_lib/text_similarity.ts +75 -0
  350. package/src/scripts/ai-video/test-pipeline.sh +1 -1
  351. package/src/scripts/ai_council/clients.ts +19 -3
  352. package/src/scripts/append_contested.ts +112 -0
  353. package/src/scripts/audit_auto_rules.ts +11 -1
  354. package/src/scripts/audit_mcp_tools.ts +25 -11
  355. package/src/scripts/bench_ab_v2_run.ts +527 -40
  356. package/src/scripts/bench_ab_v2_stats.ts +6 -0
  357. package/src/scripts/bench_matrix.ts +266 -0
  358. package/src/scripts/bootstrap_knowledge.ts +267 -0
  359. package/src/scripts/build_discovery_manifest.ts +42 -2
  360. package/src/scripts/build_proof.ts +214 -0
  361. package/src/scripts/check_always_budget.ts +3 -0
  362. package/src/scripts/check_augment_description_cap.ts +2 -2
  363. package/src/scripts/check_claims.ts +270 -0
  364. package/src/scripts/check_comparison.ts +79 -0
  365. package/src/scripts/check_generated_artefact_headers.ts +109 -0
  366. package/src/scripts/check_generator_output_coverage.ts +142 -0
  367. package/src/scripts/check_gitignore_freshness.ts +127 -0
  368. package/src/scripts/check_knowledge_pages.ts +210 -0
  369. package/src/scripts/check_knowledge_sharing.ts +162 -0
  370. package/src/scripts/check_media_deps.ts +91 -0
  371. package/src/scripts/check_memory_contradiction.ts +280 -0
  372. package/src/scripts/check_memory_similarity.ts +134 -0
  373. package/src/scripts/check_quality_regression.ts +56 -10
  374. package/src/scripts/check_references.ts +3 -1
  375. package/src/scripts/check_release_pr_shape.ts +4 -0
  376. package/src/scripts/check_site_links.ts +135 -0
  377. package/src/scripts/check_skill_gaps.ts +99 -0
  378. package/src/scripts/check_token_quality_golden.ts +197 -11
  379. package/src/scripts/check_tracked_but_ignored.ts +67 -0
  380. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  381. package/src/scripts/compile_router.ts +30 -3
  382. package/src/scripts/condense.ts +350 -14
  383. package/src/scripts/consolidate_knowledge_events.ts +192 -0
  384. package/src/scripts/degrade_to_pointer.ts +136 -0
  385. package/src/scripts/design_slop_rules.test.ts +15 -0
  386. package/src/scripts/design_slop_rules.ts +28 -0
  387. package/src/scripts/emit_knowledge_event.ts +158 -0
  388. package/src/scripts/export_replay_corpus.ts +187 -0
  389. package/src/scripts/external_sources_denylist.json +7 -2
  390. package/src/scripts/fold_intake.ts +281 -0
  391. package/src/scripts/generate_capability_matrix.ts +9 -1
  392. package/src/scripts/generate_knowledge_index.ts +222 -0
  393. package/src/scripts/hook_manifest.yaml +26 -14
  394. package/src/scripts/hooks/dispatch_hook.ts +18 -0
  395. package/src/scripts/hot_context_hook.ts +372 -0
  396. package/src/scripts/install +47 -0
  397. package/src/scripts/install-hooks.sh +17 -0
  398. package/src/scripts/inventory_meta_layers.ts +11 -0
  399. package/src/scripts/janitor.ts +258 -0
  400. package/src/scripts/lint_agents_layout.ts +74 -15
  401. package/src/scripts/lint_bench_ab.ts +4 -1
  402. package/src/scripts/lint_featured_skills.ts +0 -0
  403. package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
  404. package/src/scripts/lint_knowledge_scale.ts +250 -0
  405. package/src/scripts/lint_legal_pack.ts +67 -0
  406. package/src/scripts/lint_persona_governance.ts +8 -3
  407. package/src/scripts/lint_regression.ts +15 -0
  408. package/src/scripts/lint_roadmap_blockers.ts +202 -0
  409. package/src/scripts/lint_roadmap_complexity.ts +81 -2
  410. package/src/scripts/lint_subagent_determinism.ts +125 -0
  411. package/src/scripts/measure_augment_budget.ts +46 -6
  412. package/src/scripts/measure_patterns.ts +4 -3
  413. package/src/scripts/measure_skill_reduction.ts +6 -6
  414. package/src/scripts/migration_status.ts +6 -2
  415. package/src/scripts/mine_missing_guardrails.ts +189 -0
  416. package/src/scripts/parity/phase_gate.ts +1 -1
  417. package/src/scripts/parity/replay.ts +21 -0
  418. package/src/scripts/project_thin_rules.ts +120 -16
  419. package/src/scripts/release.ts +39 -1
  420. package/src/scripts/render_benchmark_composite.ts +378 -0
  421. package/src/scripts/roadmap_progress_hook.ts +101 -43
  422. package/src/scripts/schemas/skill.schema.json +27 -0
  423. package/src/scripts/schemas/subagent.schema.json +106 -0
  424. package/src/scripts/skill_linter.ts +1 -0
  425. package/src/scripts/smoke/kernel.sh +5 -4
  426. package/src/scripts/surface-tiers.yml +1 -0
  427. package/src/scripts/sync_gitignore.ts +4 -0
  428. package/src/scripts/update_skill_candidates.ts +172 -0
  429. package/src/scripts/validate_frontmatter.ts +1 -0
@@ -16,6 +16,23 @@
16
16
  * ./scripts-run src/scripts/check_token_quality_golden
17
17
  * ./scripts-run src/scripts/check_token_quality_golden --json
18
18
  * ./scripts-run src/scripts/check_token_quality_golden --require-complete
19
+ * ./scripts-run src/scripts/check_token_quality_golden --scope consumer
20
+ *
21
+ * Scope-aware coverage (road-to-golden-set-coverage Phase 0): `--scope
22
+ * consumer|maintainer|all` filters the coverage universe by the router's v2
23
+ * `workspaces:` fields — consumer = kernel + every rule NOT exclusively
24
+ * `agent-config-maintainer`; maintainer = the exclusively-maintainer rest;
25
+ * `all` (default) = today's behaviour. The consumer thin/scoped flips gate on
26
+ * `--require-complete --scope consumer`; a maintainer-side flip would gate on
27
+ * `--scope all`.
28
+ *
29
+ * Prompt↔trigger falsifiability (Phase 3): every tagged rule must have ≥1
30
+ * router trigger the task actually exercises — keyword/phrase = substring of
31
+ * the prompt; intent = every alpha word (>2 chars) present (trigger_coverage
32
+ * semantics); path_prefix/file_pattern/command are satisfiable via the
33
+ * optional per-task `context_files:` / `command:` fields. Kernel rules always
34
+ * fire. "Covered" therefore means FIRES, not mentioned. Structural check —
35
+ * always on.
19
36
  *
20
37
  * Exit codes: 0 valid (scaffold or complete) · 1 file error · 2 invalid / incomplete-when-required.
21
38
  */
@@ -37,6 +54,8 @@ const LABEL_STATUS = ['stub', 'labelled'];
37
54
 
38
55
  type Json = Record<string, unknown>;
39
56
 
57
+ export type Scope = 'consumer' | 'maintainer' | 'all';
58
+
40
59
  /** Collect every rule id from the router (kernel strings + tier_* objects). */
41
60
  export function router_rule_ids(router: Json): Set<string> {
42
61
  const ids = new Set<string>();
@@ -53,6 +72,102 @@ export function router_rule_ids(router: Json): Set<string> {
53
72
  return ids;
54
73
  }
55
74
 
75
+ /**
76
+ * Rule universe for a scope, from the router's v2 `workspaces:` fields.
77
+ * Kernel is always consumer-facing (it ships unconditionally). A non-kernel
78
+ * rule is maintainer-scope iff its workspaces are exactly
79
+ * ['agent-config-maintainer']; missing/empty workspaces count as consumer
80
+ * (fail-safe, mirrors the projection filter).
81
+ */
82
+ export function scoped_rule_ids(router: Json, scope: Scope): Set<string> {
83
+ const all = router_rule_ids(router);
84
+ if (scope === 'all') return all;
85
+ const kernel = new Set(Array.isArray(router.kernel) ? (router.kernel as string[]) : []);
86
+ const out = new Set<string>();
87
+ for (const key of ['tier_1', 'tier_2']) {
88
+ const arr = router[key];
89
+ if (!Array.isArray(arr)) continue;
90
+ for (const entry of arr) {
91
+ const obj = entry as Json;
92
+ const id = obj.id as string;
93
+ const ws = Array.isArray(obj.workspaces) ? (obj.workspaces as string[]) : [];
94
+ const maintainerOnly = ws.length === 1 && ws[0] === 'agent-config-maintainer';
95
+ if (scope === 'consumer' ? !maintainerOnly : maintainerOnly) out.add(id);
96
+ }
97
+ }
98
+ if (scope === 'consumer') for (const k of kernel) out.add(k);
99
+ return out;
100
+ }
101
+
102
+ /** Router entries (non-kernel) as id → triggers, for the fires-check. */
103
+ export function router_triggers(router: Json): Map<string, Array<Record<string, string>>> {
104
+ const map = new Map<string, Array<Record<string, string>>>();
105
+ for (const key of ['tier_1', 'tier_2']) {
106
+ const arr = router[key];
107
+ if (!Array.isArray(arr)) continue;
108
+ for (const entry of arr) {
109
+ const obj = entry as Json;
110
+ map.set(obj.id as string, Array.isArray(obj.triggers) ? (obj.triggers as Array<Record<string, string>>) : []);
111
+ }
112
+ }
113
+ return map;
114
+ }
115
+
116
+ // trigger_coverage.ts word semantics: lowercase alpha-led tokens, len > 2.
117
+ const _WORD = /[a-z][a-z0-9_]+/g;
118
+
119
+ function _tokens(text: string): Set<string> {
120
+ const out = new Set<string>();
121
+ const low = text.toLowerCase();
122
+ _WORD.lastIndex = 0;
123
+ let m: RegExpExecArray | null;
124
+ while ((m = _WORD.exec(low)) !== null) {
125
+ if (m[0].length > 2) out.add(m[0]);
126
+ }
127
+ return out;
128
+ }
129
+
130
+ /**
131
+ * Whether a task exercises ≥1 trigger of the rule (prompt↔trigger
132
+ * falsifiability, Phase 3). Kernel rules always fire.
133
+ */
134
+ export function task_fires_rule(
135
+ task: { prompt: string; context_files?: string[]; command?: string },
136
+ ruleId: string,
137
+ router: Json,
138
+ ): boolean {
139
+ const kernel = new Set(Array.isArray(router.kernel) ? (router.kernel as string[]) : []);
140
+ if (kernel.has(ruleId)) return true;
141
+ const triggers = router_triggers(router).get(ruleId) ?? [];
142
+ const low = task.prompt.toLowerCase();
143
+ const toks = _tokens(task.prompt);
144
+ const files = Array.isArray(task.context_files) ? task.context_files : [];
145
+ const cmd = typeof task.command === 'string' ? task.command : '';
146
+ for (const trig of triggers) {
147
+ if ('keyword' in trig || 'phrase' in trig) {
148
+ const needle = String(trig.keyword ?? trig.phrase).toLowerCase();
149
+ if (needle && low.includes(needle)) return true;
150
+ } else if ('intent' in trig) {
151
+ const words = _tokens(String(trig.intent));
152
+ if (words.size > 0 && [...words].every((w) => toks.has(w))) return true;
153
+ } else if ('path_prefix' in trig) {
154
+ const prefix = String(trig.path_prefix);
155
+ if (files.some((f) => f.startsWith(prefix))) return true;
156
+ } else if ('file_pattern' in trig) {
157
+ const pat = String(trig.file_pattern);
158
+ // Glob-lite: '*' matches any run; anchor on basename like Cursor does.
159
+ const re = new RegExp('^' + pat.split('*').map((s) => s.replace(/[.+?^${}()|[\]\\]/g, '\\$&')).join('.*') + '$');
160
+ if (files.some((f) => re.test(f) || re.test(path.basename(f)))) return true;
161
+ } else if ('command' in trig) {
162
+ const c = String(trig.command);
163
+ if (cmd && (cmd === c || cmd === `/${c.replace(/^\//, '')}` || cmd.replace(/^\//, '') === c.replace(/^\//, ''))) {
164
+ return true;
165
+ }
166
+ }
167
+ }
168
+ return false;
169
+ }
170
+
56
171
  export interface GoldenReport {
57
172
  ok: boolean;
58
173
  errors: string[];
@@ -60,6 +175,7 @@ export interface GoldenReport {
60
175
  labelled: number;
61
176
  stubs: number;
62
177
  covered: number;
178
+ covered_ids: string[];
63
179
  uncovered: string[];
64
180
  scenarios: Record<string, number>;
65
181
  missing_scenarios: string[];
@@ -73,8 +189,13 @@ function _isTodoRubric(rubric: unknown): boolean {
73
189
  );
74
190
  }
75
191
 
76
- /** Pure validation + coverage. `ruleIds` is the authoritative rule universe. */
77
- export function validate(corpus: Json, ruleIds: Set<string>): GoldenReport {
192
+ /**
193
+ * Pure validation + coverage. `ruleIds` is the authoritative rule universe
194
+ * (scope-filtered by the caller). When `router` is provided, the
195
+ * prompt↔trigger falsifiability check runs: a tagged rule whose triggers the
196
+ * task provably does NOT exercise is a structural error.
197
+ */
198
+ export function validate(corpus: Json, ruleIds: Set<string>, router: Json | null = null): GoldenReport {
78
199
  const errors: string[] = [];
79
200
  const tasks = Array.isArray(corpus.tasks) ? (corpus.tasks as Json[]) : null;
80
201
  if (corpus.corpus_id !== 'token-quality-golden') {
@@ -89,6 +210,7 @@ export function validate(corpus: Json, ruleIds: Set<string>): GoldenReport {
89
210
  labelled: 0,
90
211
  stubs: 0,
91
212
  covered: 0,
213
+ covered_ids: [],
92
214
  uncovered: [...ruleIds].sort(),
93
215
  scenarios: {},
94
216
  missing_scenarios: [...REQUIRED_SCENARIOS],
@@ -116,8 +238,33 @@ export function validate(corpus: Json, ruleIds: Set<string>): GoldenReport {
116
238
  for (const r of rules) {
117
239
  if (typeof r !== 'string' || !ruleIds.has(r)) {
118
240
  errors.push(`${where}: unknown rule id ${JSON.stringify(r)}`);
119
- } else {
120
- covered.add(r);
241
+ continue;
242
+ }
243
+ covered.add(r);
244
+ // Prompt↔trigger falsifiability — "covered" must mean FIRES.
245
+ // `no_fire: true` inverts the check for corner-case tasks that
246
+ // deliberately test NON-activation (the rule must NOT fire).
247
+ if (router !== null && typeof task.prompt === 'string') {
248
+ const fires = task_fires_rule(
249
+ task as { prompt: string; context_files?: string[]; command?: string },
250
+ r,
251
+ router,
252
+ );
253
+ const noFire = task.no_fire === true;
254
+ const kernel = new Set(Array.isArray(router.kernel) ? (router.kernel as string[]) : []);
255
+ if (noFire && kernel.has(r)) {
256
+ errors.push(`${where}: no_fire is invalid for kernel rule \`${r}\` (kernel always fires)`);
257
+ } else if (noFire && fires) {
258
+ errors.push(
259
+ `${where}: no_fire task, but rule \`${r}\` DOES fire on the prompt — ` +
260
+ 'the non-activation corner-case is broken',
261
+ );
262
+ } else if (!noFire && !fires) {
263
+ errors.push(
264
+ `${where}: tagged rule \`${r}\` has no router trigger the prompt exercises ` +
265
+ '(add a matching keyword/phrase to the prompt, or context_files:/command:, or re-tag)',
266
+ );
267
+ }
121
268
  }
122
269
  }
123
270
 
@@ -163,6 +310,7 @@ export function validate(corpus: Json, ruleIds: Set<string>): GoldenReport {
163
310
  labelled,
164
311
  stubs,
165
312
  covered: covered.size,
313
+ covered_ids: [...covered].sort(),
166
314
  uncovered,
167
315
  scenarios,
168
316
  missing_scenarios,
@@ -180,13 +328,26 @@ function _readJson(file: string): Json | null {
180
328
  function main(argv: string[]): number {
181
329
  const asJson = argv.includes('--json');
182
330
  const requireComplete = argv.includes('--require-complete');
183
- for (const a of argv) {
331
+ let scope: Scope = 'all';
332
+ for (let i = 0; i < argv.length; i += 1) {
333
+ const a = argv[i] as string;
334
+ if (a === '--scope') {
335
+ const v = argv[(i += 1)];
336
+ if (v !== 'consumer' && v !== 'maintainer' && v !== 'all') {
337
+ process.stderr.write('error: --scope must be consumer | maintainer | all\n');
338
+ return 1;
339
+ }
340
+ scope = v;
341
+ continue;
342
+ }
184
343
  if (!['--json', '--require-complete', '-h', '--help'].includes(a)) {
185
344
  process.stderr.write(`error: unknown argument: ${a}\n`);
186
345
  return 1;
187
346
  }
188
347
  if (a === '-h' || a === '--help') {
189
- process.stdout.write('usage: check_token_quality_golden [--json] [--require-complete]\n');
348
+ process.stdout.write(
349
+ 'usage: check_token_quality_golden [--json] [--require-complete] [--scope consumer|maintainer|all]\n',
350
+ );
190
351
  return 0;
191
352
  }
192
353
  }
@@ -204,21 +365,46 @@ function main(argv: string[]): number {
204
365
  return 1;
205
366
  }
206
367
  const ruleIds = router_rule_ids(router);
207
- const report = validate(corpus, ruleIds);
368
+ // Structure (incl. the fires-check) always validates against the FULL
369
+ // universe — a maintainer-rule tag is not "unknown" under consumer scope.
370
+ const report = validate(corpus, ruleIds, router);
208
371
 
372
+ // Coverage accounting runs against the SCOPED universe: which flip is
373
+ // being gated decides what "complete" means.
374
+ const scopedIds = scoped_rule_ids(router, scope);
375
+ const coveredScoped = report.covered_ids.filter((r) => scopedIds.has(r));
376
+ const uncoveredScoped = [...scopedIds].filter((r) => !report.covered_ids.includes(r)).sort();
377
+ // Stubs only block completion when they tag in-scope rules.
209
378
  const incomplete =
210
- report.stubs > 0 || report.uncovered.length > 0 || report.missing_scenarios.length > 0;
379
+ report.stubs > 0 || uncoveredScoped.length > 0 || report.missing_scenarios.length > 0;
211
380
 
212
381
  if (asJson) {
213
- process.stdout.write(JSON.stringify({ ...report, require_complete: requireComplete, incomplete }, null, 2) + '\n');
382
+ process.stdout.write(
383
+ JSON.stringify(
384
+ {
385
+ ...report,
386
+ scope,
387
+ scope_universe: scopedIds.size,
388
+ scope_covered: coveredScoped.length,
389
+ scope_uncovered: uncoveredScoped,
390
+ require_complete: requireComplete,
391
+ incomplete,
392
+ },
393
+ null,
394
+ 2,
395
+ ) + '\n',
396
+ );
214
397
  } else {
215
398
  for (const e of report.errors) process.stdout.write(`❌ ${e}\n`);
216
399
  process.stdout.write(
217
400
  `golden set: ${report.task_count} task(s) · ${report.labelled} labelled · ${report.stubs} stub · ` +
218
401
  `coverage ${report.covered}/${ruleIds.size} rules\n`,
219
402
  );
220
- if (report.uncovered.length > 0) {
221
- process.stdout.write(`⚠️ ${report.uncovered.length} rule(s) uncovered (operator to add tasks)\n`);
403
+ process.stdout.write(
404
+ `scope ${scope}: coverage ${coveredScoped.length}/${scopedIds.size} rules\n`,
405
+ );
406
+ if (uncoveredScoped.length > 0) {
407
+ process.stdout.write(`⚠️ ${uncoveredScoped.length} in-scope rule(s) uncovered (operator to add tasks)\n`);
222
408
  }
223
409
  if (report.missing_scenarios.length > 0) {
224
410
  process.stdout.write(`⚠️ missing required scenario(s): ${report.missing_scenarios.join(', ')}\n`);
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Phase 5.2 — Detect files that are tracked by git but now ignored
4
+ * (the class of drift where an ignore pattern was added AFTER the file
5
+ * was committed, so the file stays in the index even though git would
6
+ * no longer add it fresh).
7
+ *
8
+ * Reports the exact `git rm --cached <path>` commands to fix the issue.
9
+ * NEVER executes them automatically — git ops are user-owned per the
10
+ * git-ops permission gates (scope-control rule).
11
+ *
12
+ * Exit codes:
13
+ * 0 — no tracked-but-ignored files found
14
+ * 1 — one or more tracked-but-ignored files found
15
+ * 2 — git command failed or not in a git repo
16
+ */
17
+ import { execSync } from 'node:child_process';
18
+ import { fileURLToPath, pathToFileURL } from 'node:url';
19
+ import * as path from 'node:path';
20
+
21
+ const _HERE = fileURLToPath(import.meta.url);
22
+
23
+ function main(argv?: readonly string[]): number {
24
+ const args = argv ?? process.argv.slice(2);
25
+ const quiet = args.includes('--quiet');
26
+
27
+ let output: string;
28
+ try {
29
+ output = execSync('git ls-files -ci --exclude-standard', {
30
+ encoding: 'utf-8',
31
+ cwd: process.cwd(),
32
+ }).trim();
33
+ } catch {
34
+ process.stdout.write(`❌ git ls-files failed — not in a git repo or git not available\n`);
35
+ return 2;
36
+ }
37
+
38
+ if (!output) {
39
+ if (!quiet) {
40
+ process.stdout.write(`✅ No tracked-but-ignored files found.\n`);
41
+ }
42
+ return 0;
43
+ }
44
+
45
+ const files = output.split('\n').filter(Boolean);
46
+ process.stdout.write(
47
+ `❌ ${files.length} file${files.length === 1 ? '' : 's'} are tracked by git but now ignored:\n\n`,
48
+ );
49
+ for (const f of files) {
50
+ process.stdout.write(` ${f}\n`);
51
+ }
52
+ process.stdout.write(
53
+ `\nTo fix, run:\n\n git rm --cached \\\n ` +
54
+ files.join(' \\\n ') +
55
+ `\n\nThen commit the result. The files stay on disk (only removed from the index).\n`,
56
+ );
57
+ return 1;
58
+ }
59
+
60
+ const _isCliEntry =
61
+ process.argv[1] !== undefined &&
62
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
63
+ if (_isCliEntry || process.argv[1] === _HERE) {
64
+ process.exit(main());
65
+ }
66
+
67
+ export { main };
@@ -42,7 +42,13 @@ export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
42
42
  export const RULES_DIR = path.join(ROOT, '.agent-src.uncondensed', 'rules');
43
43
  export const OUT_PATH = path.join(ROOT, 'dist', 'router.json');
44
44
  const SETTINGS_PATH = project_settings_path(ROOT);
45
- export const SCHEMA_VERSION = 1;
45
+ // v2 (2026-07-07, road-to-request-scoped-rule-load Phase 0): every non-kernel
46
+ // entry additionally carries `workspaces:` and `packs:` copied verbatim from
47
+ // rule frontmatter, so projection/install-time consumer scoping can filter
48
+ // rule pointers by installation. Additive only — v1 readers ignore unknown
49
+ // keys. Kernel entries stay bare id strings: the kernel is unconditional and
50
+ // workspace-independent by definition.
51
+ export const SCHEMA_VERSION = 2;
46
52
 
47
53
  // Compile-time rule toggles. Maps rule-id → settings predicate.
48
54
  // Rule omitted from router.json when predicate returns False.
@@ -223,7 +229,16 @@ function _collect(): JsonObject {
223
229
  const routes_to = ((fm['routes_to'] as Json[] | null | undefined) ?? [])
224
230
  .map((x) => String(x))
225
231
  .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
226
- const entry: JsonObject = { id: rule_id, triggers, routes_to };
232
+ // v2: scoping fields, verbatim from frontmatter (sorted for
233
+ // determinism). `lint_artefact_frontmatter` guarantees both keys are
234
+ // non-empty lists of known ids on every rule source file.
235
+ const workspaces = ((fm['workspaces'] as Json[] | null | undefined) ?? [])
236
+ .map((x) => String(x))
237
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
238
+ const packs = ((fm['packs'] as Json[] | null | undefined) ?? [])
239
+ .map((x) => String(x))
240
+ .sort((a, b) => (a < b ? -1 : a > b ? 1 : 0));
241
+ const entry: JsonObject = { id: rule_id, triggers, routes_to, workspaces, packs };
227
242
  (tiered[tier] as JsonObject[]).push(entry);
228
243
  }
229
244
  for (const k of Object.keys(tiered)) {
@@ -245,9 +260,21 @@ export function build(): JsonObject {
245
260
  kernel: collected['kernel'],
246
261
  tier_1: collected['tier_1'],
247
262
  tier_2: collected['tier_2'],
263
+ // Profiles name the ALWAYS-HONOURED rule surface per discipline tier
264
+ // (ADR-110). Trigger routing of tier_1/tier_2 stays active under every
265
+ // profile — configuration-independent per ADR-040. Entries without the
266
+ // `__` wrapper are individual rule ids.
267
+ //
268
+ // `balanced` (kernel + tier_1 by SIZE) was RETIRED 2026-07-07: it
269
+ // measured a NULL discipline lift (p=0.81, docs/benchmark.md
270
+ // § Cost-factor sweep) because the size cut missed the lift-carrying
271
+ // `downstream-changes`. Its successor `essential` is cut by measured
272
+ // content (council: weak-host-lift-tiering-verdict). Legacy
273
+ // `rule_loading_tier: balanced` settings map to `essential` via
274
+ // resolve_discipline_profile().
248
275
  profiles: {
249
276
  minimal: ['__kernel__'],
250
- balanced: ['__kernel__', '__tier_1__'],
277
+ essential: ['__kernel__', 'downstream-changes'],
251
278
  full: ['__kernel__', '__tier_1__', '__tier_2__'],
252
279
  },
253
280
  };