@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,378 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Per-pinned-section renderer for the curated composite `docs/benchmark.md`
4
+ * (road-to-flow-learnings Phase 3).
5
+ *
6
+ * The composite is DELIBERATELY not a single-latest-report render (a
7
+ * single-report render would bury one host's finding — the in-file rationale
8
+ * stands). This script keeps that decision and removes only the manual
9
+ * table-editing step: each `<!-- pinned:<id> -->` … `<!-- /pinned:<id> -->`
10
+ * marker region in the doc is regenerated INDEPENDENTLY from ITS pinned
11
+ * report (`docs/benchmark.pinned.yml`); every line outside the markers —
12
+ * curated headings, verdict framing, findings prose, the history section —
13
+ * is preserved byte-for-byte.
14
+ *
15
+ * Section modes:
16
+ * - `honesty-labels` — the generated "Honesty labels" block.
17
+ * - `stats-body` — the full generated stats body (verdict bullets +
18
+ * interpretation + tables + methodology).
19
+ * - `compact-table` — one 3-row capability/discipline/tokens table for
20
+ * `package` vs `vanilla`.
21
+ * - `arm-cost-table` — the per-arm cost-factor table (lift per arm vs
22
+ * vanilla; labels curated in the manifest).
23
+ *
24
+ * Deterministic: same pinned inputs → byte-identical output. Pinned reports
25
+ * are operator-local (untracked); when a report is missing the script exits
26
+ * 0 with a skip notice so CI stays green — it can only verify where the
27
+ * pinned inputs exist.
28
+ *
29
+ * Exit: 0 ok/skip · 1 `--check` drift · 2 config error.
30
+ */
31
+
32
+ import * as fs from 'node:fs';
33
+ import * as path from 'node:path';
34
+ import process from 'node:process';
35
+ import { fileURLToPath, pathToFileURL } from 'node:url';
36
+
37
+ import { parse as parseYaml } from 'yaml';
38
+
39
+ import { analyse, compare, gate_verdict, mean_tokens_by_arm, to_markdown } from './bench_ab_v2_stats.js';
40
+
41
+ const _HERE = fileURLToPath(import.meta.url);
42
+ export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
43
+ const DOC_PATH = path.join(REPO_ROOT, 'docs', 'benchmark.md');
44
+ const MANIFEST_PATH = path.join(REPO_ROOT, 'docs', 'benchmark.pinned.yml');
45
+
46
+ type Dict = Record<string, unknown>;
47
+
48
+ export class CompositeConfigError extends Error {}
49
+
50
+ export interface PinnedSection {
51
+ readonly id: string;
52
+ readonly report: string;
53
+ readonly mode: 'honesty-labels' | 'stats-body' | 'compact-table' | 'arm-cost-table';
54
+ /** arm-cost-table only: ordered arm list with curated labels. */
55
+ readonly arms?: ReadonlyArray<{ id: string; label: string }>;
56
+ }
57
+
58
+ export function parseManifest(text: string): PinnedSection[] {
59
+ const raw = parseYaml(text) as Dict | null;
60
+ const sections = raw?.['sections'];
61
+ if (!Array.isArray(sections) || sections.length === 0) {
62
+ throw new CompositeConfigError('`sections:` must be a non-empty list');
63
+ }
64
+ const modes = new Set(['honesty-labels', 'stats-body', 'compact-table', 'arm-cost-table']);
65
+ return sections.map((s, i) => {
66
+ const e = s as Dict;
67
+ const id = String(e['id'] ?? '');
68
+ const report = String(e['report'] ?? '');
69
+ const mode = String(e['mode'] ?? '');
70
+ if (!id || !report || !modes.has(mode)) {
71
+ throw new CompositeConfigError(`sections[${i}] needs id, report, and a valid mode`);
72
+ }
73
+ const armsRaw = e['arms'];
74
+ let arms: Array<{ id: string; label: string }> | undefined;
75
+ if (armsRaw !== undefined) {
76
+ if (!Array.isArray(armsRaw)) {
77
+ throw new CompositeConfigError(`sections[${i}].arms must be a list`);
78
+ }
79
+ arms = armsRaw.map((a) => {
80
+ const ar = a as Dict;
81
+ return { id: String(ar['id'] ?? ''), label: String(ar['label'] ?? '') };
82
+ });
83
+ }
84
+ return { id, report, mode: mode as PinnedSection['mode'], ...(arms ? { arms } : {}) };
85
+ });
86
+ }
87
+
88
+ // ---------------------------------------------------------------------------
89
+ // Section renderers — every value comes from the section's OWN pinned report.
90
+ // ---------------------------------------------------------------------------
91
+
92
+ function loadReport(reportPath: string): { analysis: Dict; payload: Dict } {
93
+ const payload = JSON.parse(fs.readFileSync(reportPath, 'utf-8')) as Dict;
94
+ const analysis = analyse(payload);
95
+ // Mirror the stats CLI: the gate verdict is merged before rendering.
96
+ analysis['gate'] = gate_verdict(analysis);
97
+ return { analysis, payload };
98
+ }
99
+
100
+ /** Unwrap the stats module's PyFloat wrapper (duck-typed — the class is private). */
101
+ function num(v: unknown): number {
102
+ if (v !== null && typeof v === 'object' && 'value' in (v as Dict)) {
103
+ return Number((v as { value: unknown }).value);
104
+ }
105
+ return Number(v);
106
+ }
107
+
108
+ /** Python float repr for p-values / effect sizes: `1` → `1.0`, `0.81` → `0.81`. */
109
+ function pyf(v: unknown): string {
110
+ const n = num(v);
111
+ if (!Number.isFinite(n)) return String(n);
112
+ return Number.isInteger(n) ? `${n}.0` : String(n);
113
+ }
114
+
115
+ /** Slice a generated full render between two headings (end exclusive of next `## `). */
116
+ function sliceFrom(md: string, startHeadingPrefix: string, includeHeading: boolean): string {
117
+ const lines = md.split('\n');
118
+ const start = lines.findIndex((l) => l.startsWith(startHeadingPrefix));
119
+ if (start < 0) {
120
+ throw new CompositeConfigError(`generated render lacks heading ${startHeadingPrefix}`);
121
+ }
122
+ return lines.slice(includeHeading ? start : start + 1).join('\n').trimEnd();
123
+ }
124
+
125
+ export function renderHonestyLabels(reportPath: string): string {
126
+ const { analysis, payload } = loadReport(reportPath);
127
+ const md = to_markdown(analysis, payload);
128
+ const lines = md.split('\n');
129
+ const start = lines.findIndex((l) => l.startsWith('## Honesty labels'));
130
+ const end = lines.findIndex((l, i) => i > start && l.startsWith('## '));
131
+ if (start < 0 || end < 0) {
132
+ throw new CompositeConfigError('generated render lacks the honesty-labels block');
133
+ }
134
+ // Body only — the curated doc owns the section heading.
135
+ return lines.slice(start + 1, end).join('\n').trim();
136
+ }
137
+
138
+ export function renderStatsBody(reportPath: string): string {
139
+ const { analysis, payload } = loadReport(reportPath);
140
+ const md = to_markdown(analysis, payload);
141
+ // Everything from the verdict bullets (line after `## Gate verdict`) to EOF:
142
+ // verdict bullets + interpretation + per-arm tables + status buckets +
143
+ // methodology. The curated doc supplies its own retitled section heading.
144
+ return sliceFrom(md, '## Gate verdict:', false).trim();
145
+ }
146
+
147
+ const fmtInt = (n: number): string => Math.round(n).toLocaleString('en-US');
148
+
149
+ function armRuns(rec: Dict, arm: string): Dict[] {
150
+ const runs = (rec['arms'] as Dict | undefined)?.[arm];
151
+ return Array.isArray(runs) ? (runs as Dict[]) : [];
152
+ }
153
+
154
+ function disciplineMean(records: Dict[], arm: string): number {
155
+ let sum = 0;
156
+ let n = 0;
157
+ for (const rec of records) {
158
+ for (const r of armRuns(rec, arm)) {
159
+ if (r['errored']) continue;
160
+ const d = Number(r['discipline_score'] ?? NaN);
161
+ if (Number.isFinite(d)) {
162
+ sum += d;
163
+ n += 1;
164
+ }
165
+ }
166
+ }
167
+ return n > 0 ? sum / n : 0;
168
+ }
169
+
170
+ function meanTokens(records: Dict[], arm: string): number {
171
+ const per = mean_tokens_by_arm(records, [arm]) as Dict;
172
+ return Number((per[arm] as Dict | undefined)?.['mean_tokens'] ?? 0);
173
+ }
174
+
175
+ export function renderCompactTable(reportPath: string): string {
176
+ const { payload } = loadReport(reportPath);
177
+ const records = (payload['records'] as Dict[] | undefined) ?? [];
178
+ const host = String(payload['model'] ?? 'unknown');
179
+ const cmp = compare(records, 'package', 'vanilla') as Dict;
180
+ const nPairs = Number(cmp['n_pairs'] ?? 0);
181
+ const cap = cmp['capability'] as Dict;
182
+ const disc = cmp['discipline'] as Dict;
183
+ const tv = meanTokens(records, 'vanilla');
184
+ const tp = meanTokens(records, 'package');
185
+ const capB = num(cap['rate_baseline']);
186
+ const capT = num(cap['rate_treatment']);
187
+ const discB = num(disc['mean_baseline']);
188
+ const discT = num(disc['mean_treatment']);
189
+ const dPP = Math.round((capT - capB) * 100);
190
+ const ratio = tv > 0 ? ` (~${Math.round(tp / tv)}×)` : '';
191
+ const sign = (v: number, f: (x: number) => string): string =>
192
+ v < 0 ? `−${f(Math.abs(v))}` : `+${f(v)}`;
193
+ return [
194
+ `| axis | vanilla | package | Δ | test |`,
195
+ `|---|---|---|---|---|`,
196
+ `| capability (pass-rate) | ${Math.round(capB * 100)}% | ${Math.round(capT * 100)}% | ` +
197
+ `${sign(dPP, (x) => String(x))}pp | McNemar p=${pyf(cap['mcnemar_p'])}, h=${pyf(cap['cohens_h'])} |`,
198
+ `| discipline (0–1) | ${discB.toFixed(3)} | ${discT.toFixed(3)} | ` +
199
+ `${sign(discT - discB, (x) => x.toFixed(3))} | Wilcoxon p=${pyf(disc['wilcoxon_p'])}, ` +
200
+ `rb=${pyf(disc['rank_biserial'])} (n≠0=${disc['n_nonzero']}) |`,
201
+ `| mean tokens/run | ${fmtInt(tv)} | ${fmtInt(tp)} | ${sign(tp - tv, fmtInt)}${ratio} | — |`,
202
+ ``,
203
+ `(host \`${host}\`, n=${nPairs} pairs — generated from the pinned report)`,
204
+ ].join('\n');
205
+ }
206
+
207
+ export function renderArmCostTable(
208
+ reportPath: string,
209
+ arms: ReadonlyArray<{ id: string; label: string }>,
210
+ ): string {
211
+ const { payload } = loadReport(reportPath);
212
+ const records = (payload['records'] as Dict[] | undefined) ?? [];
213
+ const baseTokens = meanTokens(records, 'vanilla');
214
+ const rows: string[] = [
215
+ `| arm | loaded content | injected chars | mean tokens/run | cost factor | mean discipline | lift vs vanilla |`,
216
+ `|---|---|---|---|---|---|---|`,
217
+ ];
218
+ for (const arm of arms) {
219
+ const t = meanTokens(records, arm.id);
220
+ const factor = baseTokens > 0 ? (t / baseTokens).toFixed(1) : '?';
221
+ const disc = disciplineMean(records, arm.id);
222
+ let injected = 0;
223
+ for (const rec of records) {
224
+ for (const r of armRuns(rec, arm.id)) {
225
+ injected = Math.max(injected, Number(r['injected_chars'] ?? 0));
226
+ }
227
+ }
228
+ if (arm.id === 'vanilla') {
229
+ rows.push(
230
+ `| \`vanilla\` | ${arm.label} | 0 | ${fmtInt(t)} | 1.0× | ${disc.toFixed(3)} | — |`,
231
+ );
232
+ continue;
233
+ }
234
+ const cmp = compare(records, arm.id, 'vanilla') as Dict;
235
+ const d = cmp['discipline'] as Dict;
236
+ const delta = num(d['mean_delta']);
237
+ const p = num(d['wilcoxon_p']);
238
+ const deltaStr = `${delta < 0 ? '−' : '+'}${Math.abs(delta).toFixed(3)}`;
239
+ const lift =
240
+ p < 0.05
241
+ ? `**${deltaStr} (p=${pyf(d['wilcoxon_p'])}, significant)**`
242
+ : `${deltaStr} (p=${pyf(d['wilcoxon_p'])}, **NULL**)`;
243
+ rows.push(
244
+ `| \`${arm.id}\` | ${arm.label} | ${fmtInt(injected)} | ${fmtInt(t)} | ` +
245
+ `**${factor}×** | ${disc.toFixed(3)} | ${lift} |`,
246
+ );
247
+ }
248
+ rows.push('');
249
+ rows.push('(generated from the pinned report — curated labels from `docs/benchmark.pinned.yml`)');
250
+ return rows.join('\n');
251
+ }
252
+
253
+ export function renderSection(section: PinnedSection, repoRoot: string = REPO_ROOT): string {
254
+ const reportPath = path.isAbsolute(section.report)
255
+ ? section.report
256
+ : path.join(repoRoot, section.report);
257
+ switch (section.mode) {
258
+ case 'honesty-labels':
259
+ return renderHonestyLabels(reportPath);
260
+ case 'stats-body':
261
+ return renderStatsBody(reportPath);
262
+ case 'compact-table':
263
+ return renderCompactTable(reportPath);
264
+ case 'arm-cost-table':
265
+ if (!section.arms || section.arms.length === 0) {
266
+ throw new CompositeConfigError(`section '${section.id}' (arm-cost-table) needs arms`);
267
+ }
268
+ return renderArmCostTable(reportPath, section.arms);
269
+ }
270
+ }
271
+
272
+ // ---------------------------------------------------------------------------
273
+ // Marker splice — pure, unit-tested.
274
+ // ---------------------------------------------------------------------------
275
+
276
+ export function markerBounds(id: string): [string, string] {
277
+ return [`<!-- pinned:${id} -->`, `<!-- /pinned:${id} -->`];
278
+ }
279
+
280
+ /**
281
+ * Replace every marker region with its rendered content; everything outside
282
+ * the markers is preserved byte-for-byte. Throws on a missing or unbalanced
283
+ * marker so drift never passes silently.
284
+ */
285
+ export function spliceMarkers(doc: string, contentById: ReadonlyMap<string, string>): string {
286
+ let out = doc;
287
+ for (const [id, content] of contentById) {
288
+ const [begin, end] = markerBounds(id);
289
+ const b = out.indexOf(begin);
290
+ const e = out.indexOf(end);
291
+ if (b < 0 || e < 0 || e < b) {
292
+ throw new CompositeConfigError(`marker pair for '${id}' missing or unbalanced in the doc`);
293
+ }
294
+ out = `${out.slice(0, b + begin.length)}\n${content}\n${out.slice(e)}`;
295
+ }
296
+ return out;
297
+ }
298
+
299
+ // ---------------------------------------------------------------------------
300
+ // CLI.
301
+ // ---------------------------------------------------------------------------
302
+
303
+ const USAGE = 'usage: render_benchmark_composite [-h] [--check]\n';
304
+
305
+ export function main(argv: string[] | null = null): number {
306
+ const args = argv !== null ? Array.from(argv) : process.argv.slice(2);
307
+ let check = false;
308
+ for (const a of args) {
309
+ if (a === '-h' || a === '--help') {
310
+ process.stdout.write(USAGE);
311
+ return 0;
312
+ }
313
+ if (a === '--check') {
314
+ check = true;
315
+ } else {
316
+ process.stderr.write(USAGE);
317
+ return 2;
318
+ }
319
+ }
320
+ let sections: PinnedSection[];
321
+ try {
322
+ sections = parseManifest(fs.readFileSync(MANIFEST_PATH, 'utf-8'));
323
+ } catch (exc) {
324
+ process.stderr.write(`render_benchmark_composite: error: ${(exc as Error).message}\n`);
325
+ return 2;
326
+ }
327
+ const missing = sections.filter(
328
+ (s) => !fs.existsSync(path.isAbsolute(s.report) ? s.report : path.join(REPO_ROOT, s.report)),
329
+ );
330
+ if (missing.length > 0) {
331
+ process.stdout.write(
332
+ `render_benchmark_composite: SKIP — pinned report(s) not present locally ` +
333
+ `(${missing.map((m) => m.id).join(', ')}); nothing rendered.\n`,
334
+ );
335
+ return 0;
336
+ }
337
+ const contentById = new Map<string, string>();
338
+ try {
339
+ for (const s of sections) {
340
+ contentById.set(s.id, renderSection(s));
341
+ }
342
+ const doc = fs.readFileSync(DOC_PATH, 'utf-8');
343
+ const next = spliceMarkers(doc, contentById);
344
+ if (check) {
345
+ if (next !== doc) {
346
+ process.stderr.write(
347
+ 'render_benchmark_composite: DRIFT — docs/benchmark.md pinned sections ' +
348
+ 'do not match their pinned reports; re-run without --check.\n',
349
+ );
350
+ return 1;
351
+ }
352
+ process.stdout.write('render_benchmark_composite: clean — pinned sections match.\n');
353
+ return 0;
354
+ }
355
+ if (next !== doc) {
356
+ fs.writeFileSync(DOC_PATH, next);
357
+ process.stdout.write(`render_benchmark_composite: wrote docs/benchmark.md (${contentById.size} section(s)).\n`);
358
+ } else {
359
+ process.stdout.write('render_benchmark_composite: no changes.\n');
360
+ }
361
+ return 0;
362
+ } catch (exc) {
363
+ if (exc instanceof CompositeConfigError) {
364
+ process.stderr.write(`render_benchmark_composite: error: ${exc.message}\n`);
365
+ return 2;
366
+ }
367
+ throw exc;
368
+ }
369
+ }
370
+
371
+ // --- CLI entry ---
372
+
373
+ const _isCliEntry =
374
+ process.argv[1] !== undefined &&
375
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
376
+ if (_isCliEntry || process.argv[1] === _HERE) {
377
+ process.exitCode = main(process.argv.slice(2));
378
+ }
@@ -67,11 +67,14 @@ export const DASHBOARD_PATH = "agents/roadmaps-progress.md";
67
67
  export const REGEN_NAME = "update_roadmap_progress.ts";
68
68
  // Distributed-content script subtrees that may ship the regenerator,
69
69
  // in priority order. Project-scoped installs land it under .augment/ or
70
- // dist/agent-src/; the package itself carries the same projection.
70
+ // dist/agent-src/; the package itself carries the same projection, and the
71
+ // source checkout carries it under src/agent-src/scripts (so a standalone,
72
+ // env-less invocation from the source tree still resolves it).
71
73
  export const DIST_SCRIPT_SUBDIRS = [
72
74
  path.join(".augment", "scripts"),
73
75
  path.join("dist/agent-src", "scripts"),
74
76
  path.join(".agent-src.uncondensed", "scripts"),
77
+ path.join("src/agent-src", "scripts"),
75
78
  ];
76
79
  // Set by the dispatcher (scripts/hooks/dispatch_hook) to its own resolved
77
80
  // package root, so a globally-installed binary (ADR-020 global-only) can
@@ -177,15 +180,54 @@ export function _is_roadmap_touch(p: string): boolean {
177
180
  return true;
178
181
  }
179
182
 
183
+ /**
184
+ * The repo root whose dashboard an edited roadmap path belongs to, or null
185
+ * when the path is not a roadmap touch.
186
+ *
187
+ * The dashboard the hook must regenerate is the one in the SAME repo as the
188
+ * edited roadmap — which is not necessarily `--project-dir`. An autonomous
189
+ * agent (or a monorepo dev) routinely edits `…/<worktree>/agents/roadmaps/x.md`
190
+ * while the session's project dir is a sibling checkout; keying off
191
+ * `--project-dir` alone silently skipped those edits and let the worktree's
192
+ * dashboard drift. So:
193
+ * - an ABSOLUTE path containing `/agents/roadmaps/` resolves to the prefix
194
+ * before that segment (the edited file's own repo root), wherever it is;
195
+ * - a RELATIVE roadmap path resolves to `consumer_root` (the Augment
196
+ * repo-relative case, where the file genuinely sits under `--project-dir`).
197
+ */
198
+ export function _target_root(p: string, consumer_root: string): string | null {
199
+ const norm = p.replace(/\\/g, "/");
200
+ if (path.isAbsolute(norm)) {
201
+ const marker = "/" + ROADMAP_PREFIX; // "/agents/roadmaps/"
202
+ const idx = norm.indexOf(marker);
203
+ if (idx < 0) {
204
+ return null;
205
+ }
206
+ const rel = norm.slice(idx + 1); // "agents/roadmaps/…"
207
+ if (!_is_roadmap_touch(rel)) {
208
+ return null;
209
+ }
210
+ return norm.slice(0, idx) || "/";
211
+ }
212
+ return _is_roadmap_touch(norm) ? consumer_root : null;
213
+ }
214
+
180
215
  /**
181
216
  * Package roots to search for the shipped regenerator, in priority order,
182
217
  * when the consumer carries no project-local copy.
183
218
  *
184
219
  * 1. ``AGENT_CONFIG_PACKAGE_ROOT`` — the dispatcher passes its own
185
220
  * resolved package root.
186
- * 2. This hook's own location (``<pkg>/src/scripts/roadmap_progress_hook.ts``
187
- * → ``<pkg>/src``) — last-resort fallback for standalone invocation.
188
- * Mirrors the Python `Path(__file__).resolve().parent.parent` walk.
221
+ * 2. This hook's own location — last-resort fallback for a standalone
222
+ * invocation the dispatcher never wrapped. The hook ships at
223
+ * ``<pkg>/src/scripts/roadmap_progress_hook.ts``, so BOTH ``<pkg>/src``
224
+ * (one dir up from ``scripts/``) AND ``<pkg>`` are searched: the shipped
225
+ * regenerator lives under ``<pkg>/dist/agent-src/scripts`` (built /
226
+ * installed) or ``<pkg>/src/agent-src/scripts`` (source), i.e. under
227
+ * ``<pkg>`` — NOT under ``<pkg>/src``. The previous single
228
+ * ``parent.parent`` walk stopped at ``<pkg>/src`` and therefore never
229
+ * found the regenerator when the env var was unset (silent no-op → the
230
+ * dashboard drifted with no signal).
189
231
  */
190
232
  export function _package_roots(): string[] {
191
233
  const roots: string[] = [];
@@ -193,7 +235,9 @@ export function _package_roots(): string[] {
193
235
  if (env_root) {
194
236
  roots.push(_expanduser(env_root));
195
237
  }
196
- roots.push(path.dirname(path.dirname(path.resolve(__filename))));
238
+ const scriptsDir = path.dirname(path.resolve(__filename)); // <pkg>/src/scripts
239
+ roots.push(path.dirname(scriptsDir)); // <pkg>/src
240
+ roots.push(path.dirname(path.dirname(scriptsDir))); // <pkg>
197
241
  return roots;
198
242
  }
199
243
 
@@ -300,33 +344,17 @@ export function run(
300
344
  return 0;
301
345
  }
302
346
 
303
- const paths = _candidate_paths(payload).map((p) => _relativize(p, consumer_root));
304
- if (!paths.some((p) => _is_roadmap_touch(p))) {
305
- return 0;
306
- }
307
-
308
- const script = _resolve_regenerator(consumer_root);
309
- if (script === null) {
310
- // Phase 1 of road-to-hooks-actually-fire-in-consumers: log dispatch
311
- // issue directly (this hook runs as a subprocess from the universal
312
- // dispatcher; routing through the dispatcher would add latency for
313
- // no benefit).
314
- try {
315
- log_dispatch_issue(
316
- consumer_root,
317
- "roadmap-progress",
318
- "prerequisite_missing",
319
- "update_roadmap_progress.ts not found at any of: " +
320
- ".augment/scripts/, dist/agent-src/scripts/, " +
321
- "src/agent-src/scripts/",
322
- "./agent-config hooks:install --regen " + "(or ./agent-config init)",
323
- );
324
- } catch {
325
- // observability never breaks the hook
326
- }
327
- if (verbose) {
328
- process.stderr.write("roadmap-progress-hook: regenerator not found, skipping\n");
347
+ // Each touched roadmap regenerates the dashboard of ITS OWN repo (which may
348
+ // be a worktree/sibling of `consumer_root`, not consumer_root itself). Dedupe
349
+ // so N edits in one repo regenerate once.
350
+ const targetRoots = new Set<string>();
351
+ for (const p of _candidate_paths(payload)) {
352
+ const root = _target_root(p, consumer_root);
353
+ if (root !== null) {
354
+ targetRoots.add(root);
329
355
  }
356
+ }
357
+ if (targetRoots.size === 0) {
330
358
  return 0;
331
359
  }
332
360
 
@@ -339,18 +367,48 @@ export function run(
339
367
  return 0;
340
368
  }
341
369
 
342
- try {
343
- // The regenerator is a `.ts` script; run it through tsx (resolved from
344
- // a node_modules/.bin found by walking up from the regenerator's dir,
345
- // falling back to `npx tsx`), mirroring the dispatcher's `.ts` concerns.
346
- const inv = _resolve_tsx_invocation(script);
347
- spawnSync(inv.command, inv.args, {
348
- cwd: consumer_root,
349
- stdio: ["ignore", "ignore", "ignore"],
350
- timeout: 30000,
351
- });
352
- } catch {
353
- // never propagate regenerator failures into the agent loop
370
+ for (const root of targetRoots) {
371
+ const script = _resolve_regenerator(root);
372
+ if (script === null) {
373
+ // Phase 1 of road-to-hooks-actually-fire-in-consumers: log dispatch
374
+ // issue directly (this hook runs as a subprocess from the universal
375
+ // dispatcher; routing through the dispatcher would add latency for
376
+ // no benefit).
377
+ try {
378
+ log_dispatch_issue(
379
+ root,
380
+ "roadmap-progress",
381
+ "prerequisite_missing",
382
+ "update_roadmap_progress.ts not found at any of: " +
383
+ ".augment/scripts/, dist/agent-src/scripts/, " +
384
+ "src/agent-src/scripts/",
385
+ "./agent-config hooks:install --regen " + "(or ./agent-config init)",
386
+ );
387
+ } catch {
388
+ // observability never breaks the hook
389
+ }
390
+ if (verbose) {
391
+ process.stderr.write(
392
+ `roadmap-progress-hook: regenerator not found for ${root}, skipping\n`,
393
+ );
394
+ }
395
+ continue;
396
+ }
397
+
398
+ try {
399
+ // The regenerator is a `.ts` script; run it through tsx (resolved from
400
+ // a node_modules/.bin found by walking up from the regenerator's dir,
401
+ // falling back to `npx tsx`), mirroring the dispatcher's `.ts` concerns.
402
+ // `--repo-root` + cwd pin the regeneration to the edited file's own repo.
403
+ const inv = _resolve_tsx_invocation(script);
404
+ spawnSync(inv.command, [...inv.args, "--repo-root", root], {
405
+ cwd: root,
406
+ stdio: ["ignore", "ignore", "ignore"],
407
+ timeout: 30000,
408
+ });
409
+ } catch {
410
+ // never propagate regenerator failures into the agent loop
411
+ }
354
412
  }
355
413
 
356
414
  if (verbose) {
@@ -187,6 +187,33 @@
187
187
  "type": "string",
188
188
  "enum": ["lean", "standard", "rich"],
189
189
  "description": "Token-cost class for this skill. `lean` (default): subject to telegraph-speak condensation and thin-projector trimming; optimize for <500 tokens. `standard`: balanced guidance, normal condensation. `rich`: exempt from telegraph-speak and thin-projector trimming; detailed examples preserved; eager-load eligible; ≤15% of skills in a suite may be `rich` (CI-enforced). A `rich` skill MUST carry a '## Why this skill is rich' section explaining the irreducible complexity that makes condensation harmful. Governed by `token-budget-discipline` rule + `tokens.rich_skills` consumer setting. See docs/guidelines/token-budget-governance.md."
190
+ },
191
+ "parallelizable": {
192
+ "type": "string",
193
+ "enum": ["steps", "files", "independent"],
194
+ "description": "Classifier signal for auto-dispatch. 'steps' = ordered multi-step plan → do-in-steps. 'files' = N independent files of the same shape → do-in-parallel. 'independent' = N independent same-shape targets (not files) → do-in-parallel. Omit for skills that are always single-pass. Read by auto-dispatch-classification.md classifier signal 1."
195
+ },
196
+ "gaps": {
197
+ "type": "array",
198
+ "description": "B6 — honest-null known limitations. Human-curated (NOT auto-discovered), not all skills. Each entry documents a real limitation and cites a witness test that reproduces it. Rendered on the proof page's 'Known Limits'; check_skill_gaps enforces every witness path exists. The offensive-transparency surface a headline-benchmark cannot ship.",
199
+ "items": {
200
+ "type": "object",
201
+ "additionalProperties": false,
202
+ "required": ["description", "witness"],
203
+ "properties": {
204
+ "description": {
205
+ "type": "string",
206
+ "minLength": 1,
207
+ "maxLength": 280,
208
+ "description": "The limitation, stated honestly (what the skill does NOT do / where it fails)."
209
+ },
210
+ "witness": {
211
+ "type": "string",
212
+ "minLength": 1,
213
+ "description": "Repo-relative path to a test that reproduces/demonstrates this limitation (passes while the gap is real; a failing witness = stale gap to remove)."
214
+ }
215
+ }
216
+ }
190
217
  }
191
218
  }
192
219
  }