@event4u/agent-config 7.4.0 → 8.0.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 (469) hide show
  1. package/.claude-plugin/marketplace.json +11 -1
  2. package/AGENTS.md +9 -9
  3. package/CHANGELOG.md +373 -0
  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/review-changes.md +14 -7
  34. package/dist/agent-src/commands/roadmap/create.md +88 -10
  35. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  36. package/dist/agent-src/commands/roadmap/process-full.md +15 -2
  37. package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
  38. package/dist/agent-src/commands/roadmap/process-step.md +4 -0
  39. package/dist/agent-src/commands/roadmap.md +1 -1
  40. package/dist/agent-src/commands/security-audit-config.md +1 -1
  41. package/dist/agent-src/commands/sync-agent-settings.md +1 -1
  42. package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
  43. package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
  44. package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
  45. package/dist/agent-src/commands/team-knowledge.md +64 -0
  46. package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
  47. package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
  48. package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
  49. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
  50. package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  51. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
  52. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
  53. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
  54. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
  55. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
  56. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
  57. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
  58. package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
  59. package/dist/agent-src/contexts/override-system.md +1 -1
  60. package/dist/agent-src/personas/brand-strategist.md +0 -1
  61. package/dist/agent-src/personas/data-integrity.md +66 -0
  62. package/dist/agent-src/personas/design-director.md +0 -1
  63. package/dist/agent-src/personas/performance-engineer.md +66 -0
  64. package/dist/agent-src/personas/production-validator.md +73 -0
  65. package/dist/agent-src/rules/agent-authority.md +3 -4
  66. package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
  67. package/dist/agent-src/rules/architecture.md +2 -4
  68. package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
  69. package/dist/agent-src/rules/artifact-engagement-recording.md +11 -4
  70. package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
  71. package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
  72. package/dist/agent-src/rules/autonomous-execution.md +3 -5
  73. package/dist/agent-src/rules/brand-consistency.md +3 -5
  74. package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
  75. package/dist/agent-src/rules/cli-output-handling.md +4 -6
  76. package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
  77. package/dist/agent-src/rules/commit-conventions.md +3 -5
  78. package/dist/agent-src/rules/commit-policy.md +8 -10
  79. package/dist/agent-src/rules/content-quoting-floor.md +88 -0
  80. package/dist/agent-src/rules/context-hygiene.md +3 -5
  81. package/dist/agent-src/rules/copilot-routing.md +4 -6
  82. package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
  83. package/dist/agent-src/rules/delegation-policy.md +10 -6
  84. package/dist/agent-src/rules/design-fidelity.md +3 -5
  85. package/dist/agent-src/rules/devcontainer-routing.md +4 -6
  86. package/dist/agent-src/rules/direct-answers.md +13 -17
  87. package/dist/agent-src/rules/docker-commands.md +3 -5
  88. package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
  89. package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
  90. package/dist/agent-src/rules/domain-safety-pii.md +7 -8
  91. package/dist/agent-src/rules/domain-safety-retention.md +3 -5
  92. package/dist/agent-src/rules/downstream-changes.md +3 -4
  93. package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
  94. package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
  95. package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
  96. package/dist/agent-src/rules/finance-safety-floor.md +3 -6
  97. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
  98. package/dist/agent-src/rules/git-history-discipline.md +3 -5
  99. package/dist/agent-src/rules/guidelines.md +2 -4
  100. package/dist/agent-src/rules/icon-consistency.md +4 -5
  101. package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
  102. package/dist/agent-src/rules/improve-before-implement.md +5 -5
  103. package/dist/agent-src/rules/invite-challenge.md +3 -5
  104. package/dist/agent-src/rules/language-and-tone.md +13 -15
  105. package/dist/agent-src/rules/laravel-routing.md +3 -5
  106. package/dist/agent-src/rules/laravel-translations.md +3 -5
  107. package/dist/agent-src/rules/legal-safety-floor.md +5 -7
  108. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
  109. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
  110. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
  111. package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
  112. package/dist/agent-src/rules/media-governance-routing.md +3 -5
  113. package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
  114. package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
  115. package/dist/agent-src/rules/missing-tool-handling.md +3 -5
  116. package/dist/agent-src/rules/model-recommendation.md +4 -6
  117. package/dist/agent-src/rules/no-attribution-footers.md +3 -5
  118. package/dist/agent-src/rules/no-cheap-questions.md +5 -8
  119. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
  120. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
  121. package/dist/agent-src/rules/no-roadmap-references.md +3 -5
  122. package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
  123. package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
  124. package/dist/agent-src/rules/onboarding-gate.md +4 -6
  125. package/dist/agent-src/rules/output-discipline.md +3 -5
  126. package/dist/agent-src/rules/package-ci-checks.md +3 -5
  127. package/dist/agent-src/rules/persona-governance.md +2 -4
  128. package/dist/agent-src/rules/php-coding.md +3 -5
  129. package/dist/agent-src/rules/preservation-guard.md +2 -4
  130. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
  131. package/dist/agent-src/rules/reviewer-awareness.md +5 -6
  132. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
  133. package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
  134. package/dist/agent-src/rules/role-mode-adherence.md +2 -4
  135. package/dist/agent-src/rules/rule-type-governance.md +3 -5
  136. package/dist/agent-src/rules/runtime-safety.md +2 -4
  137. package/dist/agent-src/rules/scope-control.md +10 -11
  138. package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
  139. package/dist/agent-src/rules/size-enforcement.md +2 -4
  140. package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
  141. package/dist/agent-src/rules/skill-quality.md +3 -5
  142. package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
  143. package/dist/agent-src/rules/source-confidentiality.md +3 -5
  144. package/dist/agent-src/rules/source-discovery-gate.md +3 -5
  145. package/dist/agent-src/rules/source-of-truth.md +3 -5
  146. package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
  147. package/dist/agent-src/rules/symfony-routing.md +4 -6
  148. package/dist/agent-src/rules/telegraph-speak.md +4 -5
  149. package/dist/agent-src/rules/think-before-action.md +7 -4
  150. package/dist/agent-src/rules/token-budget-discipline.md +29 -5
  151. package/dist/agent-src/rules/token-efficiency.md +3 -5
  152. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
  153. package/dist/agent-src/rules/tool-safety.md +2 -4
  154. package/dist/agent-src/rules/ui-audit-gate.md +3 -6
  155. package/dist/agent-src/rules/untrusted-input-defense.md +11 -10
  156. package/dist/agent-src/rules/upstream-proposal.md +4 -6
  157. package/dist/agent-src/rules/user-interaction.md +7 -5
  158. package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
  159. package/dist/agent-src/rules/verify-before-complete.md +12 -22
  160. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
  161. package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
  162. package/dist/agent-src/skills/adr-create/SKILL.md +52 -42
  163. package/dist/agent-src/skills/adversarial-review/SKILL.md +1 -1
  164. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
  165. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  166. package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
  167. package/dist/agent-src/skills/blade-ui/SKILL.md +4 -0
  168. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
  169. package/dist/agent-src/skills/brand/SKILL.md +1 -1
  170. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
  171. package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
  172. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +5 -4
  173. package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
  174. package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
  175. package/dist/agent-src/skills/code-review/SKILL.md +5 -0
  176. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
  177. package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
  178. package/dist/agent-src/skills/context-authoring/SKILL.md +1 -1
  179. package/dist/agent-src/skills/context-document/SKILL.md +17 -0
  180. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
  181. package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
  182. package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
  183. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
  184. package/dist/agent-src/skills/design-intelligence/SKILL.md +45 -2
  185. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  186. package/dist/agent-src/skills/design-review/SKILL.md +23 -11
  187. package/dist/agent-src/skills/design-system-capture/SKILL.md +41 -0
  188. package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +62 -0
  189. package/dist/agent-src/skills/design-tokens/SKILL.md +11 -4
  190. package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
  191. package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
  192. package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
  193. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +6 -0
  194. package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
  195. package/dist/agent-src/skills/flux/SKILL.md +4 -0
  196. package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
  197. package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
  198. package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
  199. package/dist/agent-src/skills/iconography/SKILL.md +1 -0
  200. package/dist/agent-src/skills/image-editing/evals/triggers.json +13 -13
  201. package/dist/agent-src/skills/judge-artifact-completeness/SKILL.md +136 -0
  202. package/dist/agent-src/skills/judge-artifact-completeness/calibration/fixtures.json +149 -0
  203. package/dist/agent-src/skills/judge-artifact-completeness/evals/triggers.json +17 -0
  204. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/architecture-score.json +73 -0
  205. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/pr-review-score.json +65 -0
  206. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/roadmap-score.json +73 -0
  207. package/dist/agent-src/skills/judge-artifact-completeness/rubrics/ticket-quality-score.json +73 -0
  208. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
  209. package/dist/agent-src/skills/judge-injection-defense/SKILL.md +99 -0
  210. package/dist/agent-src/skills/judge-injection-defense/calibration/fixtures.json +24 -0
  211. package/dist/agent-src/skills/judge-injection-defense/evals/triggers.json +17 -0
  212. package/dist/agent-src/skills/judge-injection-defense/fixtures/behavioral-fixtures.json +63 -0
  213. package/dist/agent-src/skills/judge-injection-defense/fixtures/coverage-report.md +53 -0
  214. package/dist/agent-src/skills/judge-injection-defense/fixtures/perturbation-taxonomy.json +110 -0
  215. package/dist/agent-src/skills/judge-synthesis/SKILL.md +134 -0
  216. package/dist/agent-src/skills/judge-synthesis/evals/triggers.json +17 -0
  217. package/dist/agent-src/skills/laravel/SKILL.md +0 -1
  218. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
  219. package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
  220. package/dist/agent-src/skills/logo-generation/SKILL.md +1 -1
  221. package/dist/agent-src/skills/markitdown/SKILL.md +1 -1
  222. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
  223. package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
  224. package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
  225. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
  226. package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
  227. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
  228. package/dist/agent-src/skills/premortem/SKILL.md +0 -3
  229. package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
  230. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +18 -0
  231. package/dist/agent-src/skills/react-shadcn-ui/reference/registry.md +59 -0
  232. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
  233. package/dist/agent-src/skills/refine-ticket/SKILL.md +5 -1
  234. package/dist/agent-src/skills/release-comms/SKILL.md +47 -46
  235. package/dist/agent-src/skills/roadmap-management/SKILL.md +25 -0
  236. package/dist/agent-src/skills/roadmap-writing/SKILL.md +33 -3
  237. package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
  238. package/dist/agent-src/skills/script-writing/SKILL.md +1 -1
  239. package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
  240. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
  241. package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
  242. package/dist/agent-src/skills/sql-writing/SKILL.md +1 -1
  243. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
  244. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
  245. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
  246. package/dist/agent-src/skills/systematic-debugging/SKILL.md +30 -1
  247. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +4 -0
  248. package/dist/agent-src/skills/testing-anti-patterns/SKILL.md +1 -1
  249. package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
  250. package/dist/agent-src/skills/token-optimizer/SKILL.md +1 -1
  251. package/dist/agent-src/skills/typography-system/SKILL.md +4 -3
  252. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
  253. package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
  254. package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
  255. package/dist/agent-src/templates/agent-settings.md +22 -1
  256. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  257. package/dist/agent-src/templates/command.md +2 -2
  258. package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
  259. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
  260. package/dist/agent-src/templates/roadmaps.md +70 -2
  261. package/dist/agent-src/templates/rule.md +1 -1
  262. package/dist/agent-src/templates/scripts/README.md +3 -3
  263. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
  264. package/dist/agent-src/templates/tickets.md +8 -8
  265. package/dist/cli/commands/recordTriggerEval.test.js +1 -1
  266. package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
  267. package/dist/cli/initRouting.js +4 -2
  268. package/dist/cli/initRouting.js.map +1 -1
  269. package/dist/cli/registry.js +1 -0
  270. package/dist/cli/registry.js.map +1 -1
  271. package/dist/discovery/deprecation-report.md +1 -1
  272. package/dist/discovery/discovery-manifest.json +802 -258
  273. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  274. package/dist/discovery/discovery-manifest.summary.md +8 -8
  275. package/dist/discovery/orphan-report.md +1 -1
  276. package/dist/discovery/packs.json +46 -28
  277. package/dist/discovery/trust-report.md +12 -11
  278. package/dist/discovery/workspaces.json +32 -18
  279. package/dist/install/preflight.js +173 -0
  280. package/dist/install/preflight.js.map +1 -0
  281. package/dist/mcp/registry-manifest.json +4 -4
  282. package/dist/router.json +1 -1
  283. package/dist/server/routes/settings.js +4 -0
  284. package/dist/server/routes/settings.js.map +1 -1
  285. package/dist/server/schemas/settings.js +6 -1
  286. package/dist/server/schemas/settings.js.map +1 -1
  287. package/docs/CLAIMS.md +108 -0
  288. package/docs/MIGRATION.md +3 -3
  289. package/docs/architecture.md +6 -6
  290. package/docs/benchmark.md +133 -2
  291. package/docs/benchmark.pinned.yml +31 -0
  292. package/docs/capability-matrix.md +1 -0
  293. package/docs/catalog.md +92 -74
  294. package/docs/command-flows.md +16 -4
  295. package/docs/comparison.yaml +35 -0
  296. package/docs/contracts/agents-layout.md +148 -0
  297. package/docs/contracts/brand-token-consumption.md +5 -0
  298. package/docs/contracts/capability-boundary.md +5 -0
  299. package/docs/contracts/command-category-governance.md +5 -0
  300. package/docs/contracts/command-clusters.md +1 -0
  301. package/docs/contracts/command-surface-tiers.md +1 -1
  302. package/docs/contracts/conformance.md +84 -0
  303. package/docs/contracts/creative-pack-boundary.md +5 -0
  304. package/docs/contracts/discovery-manifest.schema.json +5 -4
  305. package/docs/contracts/file-ownership-matrix.json +4605 -985
  306. package/docs/contracts/governance-enforcement-projection.md +5 -0
  307. package/docs/contracts/gui-wizard.md +1 -1
  308. package/docs/contracts/hook-architecture-v1.md +2 -2
  309. package/docs/contracts/implement-ticket-flow.md +1 -1
  310. package/docs/contracts/kernel-membership.md +13 -0
  311. package/docs/contracts/mcp-tool-inventory.md +23 -23
  312. package/docs/contracts/no-runtime-boundary.md +6 -1
  313. package/docs/contracts/review-lens-schema.md +5 -0
  314. package/docs/contracts/rule-router.md +102 -8
  315. package/docs/contracts/skill-bundled-assets.md +1 -1
  316. package/docs/contracts/skill-dry-run.md +1 -1
  317. package/docs/contracts/subagent-boundary.md +5 -0
  318. package/docs/contracts/ticket-bundle-format.md +9 -4
  319. package/docs/contracts/tier-3-contrib-plugin.md +2 -2
  320. package/docs/contracts/write-engine.md +3 -0
  321. package/docs/customization.md +87 -15
  322. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
  323. package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
  324. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
  325. package/docs/decisions/INDEX.md +2 -0
  326. package/docs/distribution/awesome-list-submission.md +46 -0
  327. package/docs/distribution/launch-story-draft.md +58 -0
  328. package/docs/end-to-end-walkthroughs.md +2 -2
  329. package/docs/getting-started.md +2 -2
  330. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
  331. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
  332. package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
  333. package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
  334. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  335. package/docs/guidelines/augment-portability-patterns.md +1 -1
  336. package/docs/guidelines/code-clarity.md +19 -0
  337. package/docs/guidelines/design-antipatterns-triggers.json +2 -1
  338. package/docs/guidelines/design-antipatterns.md +35 -0
  339. package/docs/guidelines/design-canon.md +62 -0
  340. package/docs/guidelines/design-modes.md +6 -0
  341. package/docs/guidelines/php/general.md +9 -1
  342. package/docs/guidelines/php/php-coding-patterns.md +7 -0
  343. package/docs/guides/cross-repo-retrieval.md +1 -1
  344. package/docs/guides/frontend-design-corpus-refresh.md +2 -2
  345. package/docs/guides/local-analytics.md +4 -4
  346. package/docs/guides/skill-discovery.md +1 -1
  347. package/docs/guides/skill-preview.md +1 -1
  348. package/docs/hook-payload-capture.md +6 -6
  349. package/docs/install-friction-report.md +66 -0
  350. package/docs/installation.md +1 -1
  351. package/docs/maintainers/optional-media-deps.md +50 -0
  352. package/docs/mcp-server.md +11 -12
  353. package/docs/media/proof-demo.cast +14 -0
  354. package/docs/media/proof-demo.gif +0 -0
  355. package/docs/migration/consumer-template-consumption-model.md +1 -1
  356. package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
  357. package/docs/migration/node-floor.md +1 -1
  358. package/docs/migration/yaml-roundtrip-spike.md +1 -1
  359. package/docs/personas.md +16 -5
  360. package/docs/positioning-evidence.md +86 -0
  361. package/docs/proof.md +86 -0
  362. package/docs/skills-catalog.md +1 -1
  363. package/docs/troubleshooting.md +8 -8
  364. package/docs/wedge/production-validator/README.md +57 -0
  365. package/docs/wedge/production-validator/production-validator.md +56 -0
  366. package/docs/wizard.md +2 -2
  367. package/package.json +1 -1
  368. package/src/config/agent-settings.template.yml +71 -4
  369. package/src/config/agents-paths.yml +254 -0
  370. package/src/config/budgets.yml +16 -0
  371. package/src/config/discovery/packs.yml +1 -0
  372. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  373. package/src/config/gitignore-block.txt +25 -0
  374. package/src/config/host-capabilities.yml +31 -0
  375. package/src/config/profiles/balanced.ini +4 -0
  376. package/src/config/profiles/full.ini +4 -0
  377. package/src/config/profiles/minimal.ini +4 -0
  378. package/src/scripts/_cli/cmd_conformance.ts +716 -0
  379. package/src/scripts/_cli/cmd_doctor.ts +23 -2
  380. package/src/scripts/_cli/cmd_fleet.ts +401 -0
  381. package/src/scripts/_cli/cmd_preflight.ts +159 -0
  382. package/src/scripts/_dispatch.bash +10 -0
  383. package/src/scripts/_lib/knowledge_events.ts +193 -0
  384. package/src/scripts/_lib/subagent_steering.ts +115 -3
  385. package/src/scripts/_lib/text_similarity.ts +75 -0
  386. package/src/scripts/ai-video/test-pipeline.sh +1 -1
  387. package/src/scripts/ai_council/clients.ts +19 -3
  388. package/src/scripts/append_contested.ts +112 -0
  389. package/src/scripts/audit_auto_rules.ts +11 -1
  390. package/src/scripts/audit_mcp_tools.ts +25 -11
  391. package/src/scripts/bench_ab_v2_run.ts +527 -40
  392. package/src/scripts/bench_ab_v2_stats.ts +6 -0
  393. package/src/scripts/bench_matrix.ts +266 -0
  394. package/src/scripts/bootstrap_knowledge.ts +267 -0
  395. package/src/scripts/build_discovery_manifest.ts +42 -2
  396. package/src/scripts/build_proof.ts +214 -0
  397. package/src/scripts/check_always_budget.ts +3 -0
  398. package/src/scripts/check_augment_description_cap.ts +2 -2
  399. package/src/scripts/check_claims.ts +270 -0
  400. package/src/scripts/check_comparison.ts +79 -0
  401. package/src/scripts/check_generated_artefact_headers.ts +109 -0
  402. package/src/scripts/check_generator_output_coverage.ts +142 -0
  403. package/src/scripts/check_gitignore_freshness.ts +127 -0
  404. package/src/scripts/check_knowledge_pages.ts +210 -0
  405. package/src/scripts/check_knowledge_sharing.ts +162 -0
  406. package/src/scripts/check_media_deps.ts +91 -0
  407. package/src/scripts/check_memory_contradiction.ts +280 -0
  408. package/src/scripts/check_memory_similarity.ts +134 -0
  409. package/src/scripts/check_quality_regression.ts +56 -10
  410. package/src/scripts/check_references.ts +3 -1
  411. package/src/scripts/check_release_pr_shape.ts +4 -0
  412. package/src/scripts/check_site_links.ts +135 -0
  413. package/src/scripts/check_skill_gaps.ts +99 -0
  414. package/src/scripts/check_token_quality_golden.ts +197 -11
  415. package/src/scripts/check_tracked_but_ignored.ts +67 -0
  416. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  417. package/src/scripts/compile_router.ts +30 -3
  418. package/src/scripts/condense.ts +350 -14
  419. package/src/scripts/consolidate_knowledge_events.ts +192 -0
  420. package/src/scripts/degrade_to_pointer.ts +136 -0
  421. package/src/scripts/design_slop_rules.test.ts +208 -0
  422. package/src/scripts/design_slop_rules.ts +530 -0
  423. package/src/scripts/emit_knowledge_event.ts +158 -0
  424. package/src/scripts/export_replay_corpus.ts +187 -0
  425. package/src/scripts/external_sources_denylist.json +14 -3
  426. package/src/scripts/fold_intake.ts +281 -0
  427. package/src/scripts/generate_capability_matrix.ts +9 -1
  428. package/src/scripts/generate_knowledge_index.ts +222 -0
  429. package/src/scripts/hook_manifest.yaml +40 -17
  430. package/src/scripts/hooks/design_slop_hook.ts +181 -0
  431. package/src/scripts/hooks/dispatch_hook.ts +18 -0
  432. package/src/scripts/hot_context_hook.ts +372 -0
  433. package/src/scripts/install +47 -0
  434. package/src/scripts/install-hooks.sh +17 -0
  435. package/src/scripts/inventory_meta_layers.ts +11 -0
  436. package/src/scripts/janitor.ts +258 -0
  437. package/src/scripts/lint_agent_security.ts +1 -0
  438. package/src/scripts/lint_agents_layout.ts +74 -15
  439. package/src/scripts/lint_bench_ab.ts +4 -1
  440. package/src/scripts/lint_confusables.ts +197 -0
  441. package/src/scripts/lint_design_slop.ts +245 -0
  442. package/src/scripts/lint_featured_skills.ts +0 -0
  443. package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
  444. package/src/scripts/lint_knowledge_scale.ts +250 -0
  445. package/src/scripts/lint_legal_pack.ts +67 -0
  446. package/src/scripts/lint_persona_governance.ts +8 -3
  447. package/src/scripts/lint_regression.ts +15 -0
  448. package/src/scripts/lint_roadmap_blockers.ts +202 -0
  449. package/src/scripts/lint_roadmap_complexity.ts +81 -2
  450. package/src/scripts/lint_subagent_determinism.ts +125 -0
  451. package/src/scripts/measure_augment_budget.ts +46 -6
  452. package/src/scripts/measure_patterns.ts +4 -3
  453. package/src/scripts/measure_skill_reduction.ts +6 -6
  454. package/src/scripts/migration_status.ts +6 -2
  455. package/src/scripts/mine_missing_guardrails.ts +189 -0
  456. package/src/scripts/parity/phase_gate.ts +1 -1
  457. package/src/scripts/parity/replay.ts +21 -0
  458. package/src/scripts/project_thin_rules.ts +120 -16
  459. package/src/scripts/release.ts +39 -1
  460. package/src/scripts/render_benchmark_composite.ts +378 -0
  461. package/src/scripts/roadmap_progress_hook.ts +101 -43
  462. package/src/scripts/schemas/skill.schema.json +27 -0
  463. package/src/scripts/schemas/subagent.schema.json +106 -0
  464. package/src/scripts/skill_linter.ts +1 -0
  465. package/src/scripts/smoke/kernel.sh +5 -4
  466. package/src/scripts/surface-tiers.yml +1 -0
  467. package/src/scripts/sync_gitignore.ts +4 -0
  468. package/src/scripts/update_skill_candidates.ts +172 -0
  469. package/src/scripts/validate_frontmatter.ts +1 -0
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * A4 — Ablation-mining (learning-loop #1). Correlate rule *absence* with failure
4
+ * across INDEPENDENT runs (distinct `work_id`) and surface *missing-guardrail*
5
+ * candidates for the human to promote via `learning-to-rule-or-skill`.
6
+ *
7
+ * Read-only over `audit-log-v1` (`agents/runtime/state/audit/*.jsonl`). Raw
8
+ * counts only — NO auto-promotion, NO mutation. Correlation, not causation:
9
+ * every candidate carries the confounding caveat. A candidate is a *question*
10
+ * for a human, never an answer.
11
+ *
12
+ * Signal (per phase P, rule R):
13
+ * - `success_with_rule` = success lines in P where R ∈ rules_applied
14
+ * - `failure_without_rule` = blocked/error lines in P where R ∉ rules_applied
15
+ * R is a candidate when its absence co-occurs with failure often enough
16
+ * (`failure_without_rule` ≥ --min-count, over ≥2 distinct failing work_ids)
17
+ * AND R is otherwise a success-associated rule in P (`success_with_rule` ≥ 1).
18
+ *
19
+ * Exit 0 always (an empty audit log is a valid state, not an error).
20
+ */
21
+ import * as fs from 'node:fs';
22
+ import * as path from 'node:path';
23
+ import { fileURLToPath, pathToFileURL } from 'node:url';
24
+
25
+ const _HERE = fileURLToPath(import.meta.url);
26
+ export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
27
+ export const DEFAULT_AUDIT_DIR = path.join(ROOT, 'agents', 'runtime', 'state', 'audit');
28
+ export const SCHEMA_VERSION = 1;
29
+ const FAILURE_OUTCOMES = new Set(['blocked', 'error']);
30
+
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ type Rec = Record<string, any>;
33
+
34
+ /** Read audit-log-v1 phase records from `*.jsonl` (or one `<month>.jsonl`). */
35
+ export function loadRecords(auditDir: string, month: string | null = null): Rec[] {
36
+ const out: Rec[] = [];
37
+ let files: string[];
38
+ if (month) {
39
+ files = [path.join(auditDir, `${month}.jsonl`)];
40
+ } else {
41
+ let names: string[] = [];
42
+ try {
43
+ names = fs.readdirSync(auditDir);
44
+ } catch {
45
+ return out;
46
+ }
47
+ files = names.filter((n) => n.endsWith('.jsonl')).sort().map((n) => path.join(auditDir, n));
48
+ }
49
+ for (const p of files) {
50
+ let text: string;
51
+ try {
52
+ text = fs.readFileSync(p, 'utf-8');
53
+ } catch {
54
+ continue;
55
+ }
56
+ for (const raw of text.split('\n')) {
57
+ const line = raw.trim();
58
+ if (!line) continue;
59
+ let rec: Rec;
60
+ try {
61
+ rec = JSON.parse(line) as Rec;
62
+ } catch {
63
+ continue;
64
+ }
65
+ if (rec.schema_version !== SCHEMA_VERSION) continue;
66
+ if (rec.type === 'supersede' || rec.type === 'note') continue;
67
+ if (typeof rec.phase !== 'string' || typeof rec.outcome !== 'string') continue;
68
+ if (!Array.isArray(rec.rules_applied)) continue;
69
+ out.push(rec);
70
+ }
71
+ }
72
+ return out;
73
+ }
74
+
75
+ export interface Candidate {
76
+ phase: string;
77
+ rule: string;
78
+ success_with_rule: number;
79
+ failure_without_rule: number;
80
+ failure_work_ids: string[];
81
+ success_without_rule: number;
82
+ failure_with_rule: number;
83
+ }
84
+
85
+ export function mineCandidates(records: Rec[], minCount: number): Candidate[] {
86
+ const phases = new Set<string>();
87
+ const rules = new Set<string>();
88
+ for (const r of records) {
89
+ phases.add(r.phase as string);
90
+ for (const rule of r.rules_applied as string[]) rules.add(rule);
91
+ }
92
+ const out: Candidate[] = [];
93
+ for (const phase of [...phases].sort()) {
94
+ const inPhase = records.filter((r) => r.phase === phase);
95
+ for (const rule of [...rules].sort()) {
96
+ let succWith = 0;
97
+ let succWithout = 0;
98
+ let failWith = 0;
99
+ const failWithoutIds = new Set<string>();
100
+ for (const r of inPhase) {
101
+ const has = (r.rules_applied as string[]).includes(rule);
102
+ const isSuccess = r.outcome === 'success';
103
+ const isFailure = FAILURE_OUTCOMES.has(r.outcome as string);
104
+ if (isSuccess && has) succWith += 1;
105
+ else if (isSuccess && !has) succWithout += 1;
106
+ else if (isFailure && has) failWith += 1;
107
+ else if (isFailure && !has) {
108
+ failWithoutIds.add(typeof r.work_id === 'string' ? r.work_id : (r.id as string));
109
+ }
110
+ }
111
+ const failWithout = failWithoutIds.size;
112
+ // Candidate: absence co-occurs with failure across ≥2 distinct runs,
113
+ // and the rule is otherwise success-associated in this phase.
114
+ if (failWithout >= minCount && failWithout >= 2 && succWith >= 1) {
115
+ out.push({
116
+ phase,
117
+ rule,
118
+ success_with_rule: succWith,
119
+ failure_without_rule: failWithout,
120
+ failure_work_ids: [...failWithoutIds].sort(),
121
+ success_without_rule: succWithout,
122
+ failure_with_rule: failWith,
123
+ });
124
+ }
125
+ }
126
+ }
127
+ // Strongest signal first: most distinct failing runs, then most successes-with.
128
+ out.sort(
129
+ (a, b) =>
130
+ b.failure_without_rule - a.failure_without_rule ||
131
+ b.success_with_rule - a.success_with_rule ||
132
+ (a.phase < b.phase ? -1 : a.phase > b.phase ? 1 : a.rule < b.rule ? -1 : 1),
133
+ );
134
+ return out;
135
+ }
136
+
137
+ const CONFOUND_NOTE =
138
+ 'Correlation, NOT causation. A rule absent from failing runs may reflect the ' +
139
+ 'task type or phase shape, not a missing guardrail. Low N inflates noise. ' +
140
+ 'Each candidate is a question for a human — promote (or reject) only via ' +
141
+ 'learning-to-rule-or-skill. Never auto-add a rule from this output.';
142
+
143
+ export function main(argv: string[] = process.argv.slice(2)): number {
144
+ let auditDir = DEFAULT_AUDIT_DIR;
145
+ let month: string | null = null;
146
+ let minCount = 2;
147
+ let asJson = false;
148
+ for (let i = 0; i < argv.length; i += 1) {
149
+ const a = argv[i];
150
+ if (a === '--audit-dir') auditDir = argv[++i] ?? auditDir;
151
+ else if (a === '--month') month = argv[++i] ?? null;
152
+ else if (a === '--min-count') minCount = parseInt(argv[++i] ?? '2', 10) || 2;
153
+ else if (a === '--json') asJson = true;
154
+ }
155
+ const records = loadRecords(auditDir, month);
156
+ const candidates = mineCandidates(records, minCount);
157
+ if (asJson) {
158
+ process.stdout.write(
159
+ JSON.stringify(
160
+ { schema_version: SCHEMA_VERSION, records: records.length, min_count: minCount, confounding: CONFOUND_NOTE, candidates },
161
+ null,
162
+ 2,
163
+ ) + '\n',
164
+ );
165
+ return 0;
166
+ }
167
+ if (records.length === 0) {
168
+ process.stdout.write('missing-guardrails: no audit-log-v1 records found (nothing to mine).\n');
169
+ return 0;
170
+ }
171
+ if (candidates.length === 0) {
172
+ process.stdout.write(`missing-guardrails: ${records.length} record(s), 0 candidates (min-count ${minCount}).\n`);
173
+ return 0;
174
+ }
175
+ process.stdout.write(`missing-guardrails: ${candidates.length} candidate(s) from ${records.length} record(s):\n\n`);
176
+ for (const c of candidates) {
177
+ process.stdout.write(
178
+ ` [${c.phase}] rule '${c.rule}' — absent in ${c.failure_without_rule} failing run(s), ` +
179
+ `present in ${c.success_with_rule} success(es). ` +
180
+ `(fail-with-rule ${c.failure_with_rule}, success-without ${c.success_without_rule})\n`,
181
+ );
182
+ }
183
+ process.stdout.write(`\n⚠️ ${CONFOUND_NOTE}\n`);
184
+ return 0;
185
+ }
186
+
187
+ const _isCli =
188
+ process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
189
+ if (_isCli) process.exit(main());
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * phase_gate.ts — Python→TypeScript migration phase gate.
4
4
  *
5
- * Phase 1 Step 10 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
5
+ * Phase 1 Step 10 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
6
6
  *
7
7
  * Reads `src/scripts/parity/phase-manifest.json` and enforces:
8
8
  *
@@ -196,6 +196,27 @@ export function runReplay(options: ReplayOptions): ReplayReport {
196
196
  const tsScript = `${scriptBase}.ts`;
197
197
  const tsxCommand = resolveTsxCommand(cwd);
198
198
 
199
+ // Local python-skip guard (teardown D2): the replay harness is migration
200
+ // tooling — it byte-compares a live `python3 <script>.py` run against the
201
+ // tsx twin, which requires BOTH the runtime and the original `.py` to
202
+ // exist. Post-teardown neither holds; fail fast with a clear message
203
+ // instead of a spawn error, so the python-free-env shim retirement does
204
+ // not depend on porting this harness to a frozen-golden design.
205
+ if (spawnSync("python3", ["--version"], { encoding: "utf8" }).status !== 0) {
206
+ return {
207
+ script: options.script,
208
+ status: "fail",
209
+ cases: options.caseDirs.map((caseDir) => ({
210
+ caseDir,
211
+ diffs: [],
212
+ error:
213
+ "python3 unavailable — the golden-replay harness needs the pre-teardown " +
214
+ "python runtime plus the original .py; freeze the baseline to a TS golden " +
215
+ "instead (teardown D2 medium-term).",
216
+ })),
217
+ };
218
+ }
219
+
199
220
  const cases: CaseResult[] = [];
200
221
  for (const caseDirRaw of options.caseDirs) {
201
222
  const caseDir = path.resolve(cwd, caseDirRaw);
@@ -68,6 +68,70 @@ export function kernel_ids(): Set<string> {
68
68
  return new Set();
69
69
  }
70
70
 
71
+ /**
72
+ * id → workspaces for every non-kernel router entry (router.json schema v2,
73
+ * road-to-request-scoped-rule-load Phase 1). Rules absent from the map (or
74
+ * with an empty list) fail safe: they stay in scope.
75
+ */
76
+ export function rule_workspaces_map(): Map<string, string[]> {
77
+ const data = JSON.parse(fs.readFileSync(ROUTER, 'utf-8')) as Record<string, unknown>;
78
+ const map = new Map<string, string[]>();
79
+ for (const tier of ['tier_1', 'tier_2']) {
80
+ const entries = data[tier];
81
+ if (!Array.isArray(entries)) continue;
82
+ for (const e of entries) {
83
+ const obj = e as Record<string, unknown>;
84
+ const ws = Array.isArray(obj.workspaces) ? obj.workspaces.map((w) => String(w)) : [];
85
+ map.set(String(obj.id), ws);
86
+ }
87
+ }
88
+ return map;
89
+ }
90
+
91
+ /**
92
+ * Whether a rule id survives a workspace scope. Kernel always survives;
93
+ * `scope === null` = legacy-all. An out-of-scope non-kernel rule is dropped
94
+ * entirely — neither body nor pointer line (the pointer floor shrinks with
95
+ * consumer scoping).
96
+ */
97
+ export function id_in_scope(
98
+ rule_id: string,
99
+ scope: readonly string[] | null,
100
+ kernel: ReadonlySet<string>,
101
+ wsMap: ReadonlyMap<string, string[]>,
102
+ fallback_ws: readonly string[] = [],
103
+ ): boolean {
104
+ if (scope === null || kernel.has(rule_id)) {
105
+ return true;
106
+ }
107
+ // Router map first (schema v2); `type: manual` rules are reference-only
108
+ // and never emitted to the router — their frontmatter is the fallback.
109
+ const ws = wsMap.get(rule_id) ?? fallback_ws;
110
+ if (ws.length === 0) {
111
+ return true; // untagged / unknown → fail safe
112
+ }
113
+ return ws.some((w) => scope.includes(w));
114
+ }
115
+
116
+ /** `workspaces:` list parsed straight from a rule file's frontmatter. */
117
+ export function fm_workspaces(text: string): string[] {
118
+ const [fm] = split_frontmatter(text);
119
+ // Flow style: `workspaces: [a, b, c]`
120
+ const flow = /^workspaces:[ \t]*\[([^\]]*)\]/m.exec(fm);
121
+ if (flow) {
122
+ return (flow[1] as string)
123
+ .split(',')
124
+ .map((s) => s.trim().replace(/^["']|["']$/g, ''))
125
+ .filter((s) => s.length > 0);
126
+ }
127
+ // Block style; tolerate the list being the LAST frontmatter key.
128
+ const m = /^workspaces:[ \t]*\n((?:[ \t]+-[ \t]+.*(?:\n|$))+)/m.exec(fm);
129
+ if (!m) {
130
+ return [];
131
+ }
132
+ return [...(m[1] as string).matchAll(/-[ \t]+(\S+)/g)].map((x) => x[1] as string);
133
+ }
134
+
71
135
  /** Return [frontmatter_including_fences, body]. Empty fm if none. */
72
136
  export function split_frontmatter(text: string): [string, string] {
73
137
  if (text.startsWith('---\n')) {
@@ -123,12 +187,19 @@ export function thin_entry(rule_id: string, text: string): string {
123
187
  }
124
188
 
125
189
  /** Map {filename: thin_or_full_text} for every rule. Kernel stays full. */
126
- export function build_thin(rules_dir: string = RULES_SOURCE): Map<string, string> {
190
+ export function build_thin(
191
+ rules_dir: string = RULES_SOURCE,
192
+ scope: readonly string[] | null = null,
193
+ ): Map<string, string> {
127
194
  const kernel = kernel_ids();
195
+ const wsMap = scope !== null ? rule_workspaces_map() : new Map<string, string[]>();
128
196
  const out = new Map<string, string>();
129
197
  for (const p of _globSortedMd(rules_dir)) {
130
198
  const text = fs.readFileSync(p, 'utf-8');
131
199
  const stem = path.basename(p).replace(/\.md$/, '');
200
+ if (!id_in_scope(stem, scope, kernel, wsMap, fm_workspaces(text))) {
201
+ continue; // out of workspace scope — no body, no pointer line
202
+ }
132
203
  out.set(path.basename(p), kernel.has(stem) ? text : thin_entry(stem, text));
133
204
  }
134
205
  return out;
@@ -163,12 +234,24 @@ function _python_round1(x: number): number {
163
234
  return r / 10;
164
235
  }
165
236
 
166
- /** Eager vs thin token footprint for the rule layer. */
167
- export function measure(rules_dir: string = RULES_SOURCE): ThinMeasure {
237
+ /** Eager vs thin token footprint for the rule layer (scope applies to both arms). */
238
+ export function measure(
239
+ rules_dir: string = RULES_SOURCE,
240
+ scope: readonly string[] | null = null,
241
+ ): ThinMeasure {
168
242
  const kernel = kernel_ids();
169
- const mdPaths = _globSortedMd(rules_dir);
243
+ const wsMap = scope !== null ? rule_workspaces_map() : new Map<string, string[]>();
244
+ const mdPaths = _globSortedMd(rules_dir).filter((p) =>
245
+ id_in_scope(
246
+ path.basename(p).replace(/\.md$/, ''),
247
+ scope,
248
+ kernel,
249
+ wsMap,
250
+ fm_workspaces(fs.readFileSync(p, 'utf-8')),
251
+ ),
252
+ );
170
253
  const eager_blob = mdPaths.map((p) => fs.readFileSync(p, 'utf-8')).join('');
171
- const thin_blob = [...build_thin(rules_dir).values()].join('');
254
+ const thin_blob = [...build_thin(rules_dir, scope).values()].join('');
172
255
  const eager = token_count.measure(eager_blob);
173
256
  const thin = token_count.measure(thin_blob);
174
257
  const n = mdPaths.length;
@@ -198,9 +281,13 @@ export function measure(rules_dir: string = RULES_SOURCE): ThinMeasure {
198
281
  }
199
282
 
200
283
  /** Write thin rule files to `out_dir`; return the count written. */
201
- export function write_thin(out_dir: string, rules_dir: string = RULES_SOURCE): number {
284
+ export function write_thin(
285
+ out_dir: string,
286
+ rules_dir: string = RULES_SOURCE,
287
+ scope: readonly string[] | null = null,
288
+ ): number {
202
289
  fs.mkdirSync(out_dir, { recursive: true });
203
- const files = build_thin(rules_dir);
290
+ const files = build_thin(rules_dir, scope);
204
291
  for (const [name, text] of files) {
205
292
  fs.writeFileSync(path.join(out_dir, name), text, 'utf-8');
206
293
  }
@@ -293,22 +380,26 @@ interface ParsedArgs {
293
380
  measure: boolean;
294
381
  out: string | null;
295
382
  json: boolean;
383
+ workspaces: string[] | null;
296
384
  }
297
385
 
298
386
  // argparse `prog` defaults to basename(sys.argv[0]) → `project_thin_rules.py`.
299
- const _USAGE = 'usage: project_thin_rules.py [-h] [--measure] [--out OUT] [--json]\n';
387
+ const _USAGE =
388
+ 'usage: project_thin_rules.py [-h] [--measure] [--out OUT] [--json] [--workspaces WS]\n';
300
389
 
301
- // Full `-h` help block, byte-identical to argparse's rendering.
390
+ // Full `-h` help block.
302
391
  const _HELP =
303
392
  _USAGE +
304
393
  '\n' +
305
394
  'Thin-projection of the rule layer (lean-initial-context build-out, Phase 3.1).\n' +
306
395
  '\n' +
307
396
  'optional arguments:\n' +
308
- ' -h, --help show this help message and exit\n' +
309
- ' --measure print the eager-vs-thin token delta\n' +
310
- ' --out OUT write thin rule files to this dir\n' +
311
- ' --json\n';
397
+ ' -h, --help show this help message and exit\n' +
398
+ ' --measure print the eager-vs-thin token delta\n' +
399
+ ' --out OUT write thin rule files to this dir\n' +
400
+ ' --json\n' +
401
+ ' --workspaces WS comma-separated workspace scope (router.json v2 fields);\n' +
402
+ ' kernel always survives, out-of-scope rules drop entirely\n';
312
403
 
313
404
  function _argError(msg: string): never {
314
405
  process.stderr.write(_USAGE);
@@ -317,7 +408,7 @@ function _argError(msg: string): never {
317
408
  }
318
409
 
319
410
  function parse_args(argv: string[]): ParsedArgs {
320
- const out: ParsedArgs = { measure: false, out: null, json: false };
411
+ const out: ParsedArgs = { measure: false, out: null, json: false, workspaces: null };
321
412
  for (let i = 0; i < argv.length; i += 1) {
322
413
  const a = argv[i] as string;
323
414
  if (a === '-h' || a === '--help') {
@@ -336,6 +427,19 @@ function parse_args(argv: string[]): ParsedArgs {
336
427
  i += 1;
337
428
  } else if (a.startsWith('--out=')) {
338
429
  out.out = a.slice('--out='.length);
430
+ } else if (a === '--workspaces') {
431
+ const next = argv[i + 1];
432
+ if (next === undefined) {
433
+ _argError('argument --workspaces: expected one argument');
434
+ }
435
+ out.workspaces = next.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
436
+ i += 1;
437
+ } else if (a.startsWith('--workspaces=')) {
438
+ out.workspaces = a
439
+ .slice('--workspaces='.length)
440
+ .split(',')
441
+ .map((s) => s.trim())
442
+ .filter((s) => s.length > 0);
339
443
  } else {
340
444
  _argError(`unrecognized arguments: ${a}`);
341
445
  }
@@ -357,12 +461,12 @@ export function main(argv: string[] | null = null): number {
357
461
  const args = parse_args(argv ?? process.argv.slice(2));
358
462
 
359
463
  if (args.out !== null) {
360
- const n = write_thin(args.out);
464
+ const n = write_thin(args.out, RULES_SOURCE, args.workspaces);
361
465
  process.stdout.write(`wrote ${n} thin rule files → ${args.out}\n`);
362
466
  return 0;
363
467
  }
364
468
 
365
- const m = measure();
469
+ const m = measure(RULES_SOURCE, args.workspaces);
366
470
  if (args.json) {
367
471
  // `saved_pct` is a Python float (round(..., 1)); wrap it so an
368
472
  // integer-valued result still renders as `N.0` (json.dumps parity).
@@ -151,6 +151,18 @@ class CalledProcessError extends Error {
151
151
  const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
152
152
  const PACKAGE_JSON = path.join(REPO_ROOT, 'package.json');
153
153
  const MARKETPLACE_JSON = path.join(REPO_ROOT, '.claude-plugin', 'marketplace.json');
154
+ // Source-of-truth project-settings template. Carries an `agent_config_version`
155
+ // pin that check_template_pin_drift requires to equal package.json.version. We
156
+ // bump the src twin here; `task release-prepare` (run right after the bump)
157
+ // regenerates the dist/agent-src/ twin from it.
158
+ const PROJECT_TEMPLATE = path.join(
159
+ REPO_ROOT,
160
+ 'src',
161
+ 'agent-src',
162
+ 'templates',
163
+ 'agents',
164
+ 'agent-project-settings.example.yml',
165
+ );
154
166
  const CHANGELOG = path.join(REPO_ROOT, 'CHANGELOG.md');
155
167
  const MAIN_BRANCH = 'main';
156
168
  const REMOTE = 'origin';
@@ -879,6 +891,29 @@ function set_marketplace_version(p: string, version: string): void {
879
891
  fs.writeFileSync(p, jsonDumpsIndent(data, 2) + '\n', 'utf-8');
880
892
  }
881
893
 
894
+ function set_template_pin(p: string, version: string): void {
895
+ // Rewrite the single `agent_config_version:` line in place, preserving the
896
+ // rest of the YAML byte-for-byte. Quoted value to match the existing pin
897
+ // style and check_template_pin_drift's tolerant parse.
898
+ const text = fs.readFileSync(p, 'utf-8');
899
+ const lines = text.split('\n');
900
+ let found = false;
901
+ for (let i = 0; i < lines.length; i += 1) {
902
+ if (/^\s*agent_config_version\s*:/.test(lines[i]!)) {
903
+ lines[i] = lines[i]!.replace(
904
+ /^(\s*agent_config_version\s*:\s*).*/,
905
+ `$1"${version}"`,
906
+ );
907
+ found = true;
908
+ break;
909
+ }
910
+ }
911
+ if (!found) {
912
+ die(`set_template_pin: no \`agent_config_version:\` line in ${p}`);
913
+ }
914
+ fs.writeFileSync(p, lines.join('\n'), 'utf-8');
915
+ }
916
+
882
917
  // ─── preflight ────────────────────────────────────────────────────────────────
883
918
 
884
919
  /**
@@ -982,6 +1017,7 @@ function print_preview(plan: Plan): void {
982
1017
  process.stdout.write('Files to change:\n');
983
1018
  process.stdout.write(` · ${path.relative(REPO_ROOT, PACKAGE_JSON)}\n`);
984
1019
  process.stdout.write(` · ${path.relative(REPO_ROOT, MARKETPLACE_JSON)}\n`);
1020
+ process.stdout.write(` · ${path.relative(REPO_ROOT, PROJECT_TEMPLATE)}\n`);
985
1021
  process.stdout.write(` · ${path.relative(REPO_ROOT, CHANGELOG)}\n`);
986
1022
  process.stdout.write(' · regenerated derived files via `task release-prepare`\n');
987
1023
  process.stdout.write(
@@ -1204,9 +1240,10 @@ function execute(
1204
1240
  if (resume && current_pkg === plan.target) {
1205
1241
  _step(2, total, `Files already at ${plan.target} — skip bump`);
1206
1242
  } else {
1207
- _step(2, total, 'Bump package.json + marketplace.json, prepend CHANGELOG');
1243
+ _step(2, total, 'Bump package.json + marketplace.json + template pin, prepend CHANGELOG');
1208
1244
  set_package_version(PACKAGE_JSON, plan.target);
1209
1245
  set_marketplace_version(MARKETPLACE_JSON, plan.target);
1246
+ set_template_pin(PROJECT_TEMPLATE, plan.target);
1210
1247
  prepend_changelog(CHANGELOG, plan.changelog_entry);
1211
1248
  }
1212
1249
 
@@ -1727,6 +1764,7 @@ export {
1727
1764
  prepend_changelog,
1728
1765
  set_package_version,
1729
1766
  set_marketplace_version,
1767
+ set_template_pin,
1730
1768
  resolve_bump,
1731
1769
  _detect_in_flight_target,
1732
1770
  print_preview,