@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,202 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Hard-gate linter for the roadmap `## Blockers` contract
4
+ * (`templates/roadmaps.md` rule 20 / `roadmap-ci-steps-policy` siblings).
5
+ *
6
+ * Validates, for every active roadmap under `agents/roadmaps/*.md`:
7
+ *
8
+ * 1. Every `### blocker: <id>` entry declares all five required fields
9
+ * (Status, Owner, Blocks, What to do, Resolved when).
10
+ * 2. Every inline `<!-- blocked-by: <id> -->` annotation resolves to a
11
+ * `### blocker: <id>` entry declared in the SAME file.
12
+ *
13
+ * Fenced code blocks are stripped before scanning so a roadmap that shows
14
+ * the `## Blockers` shape as a documentation example is not flagged.
15
+ *
16
+ * Exit codes: 0 = clean / no active roadmaps, 1 = violations.
17
+ */
18
+
19
+ import * as fs from 'node:fs';
20
+ import * as path from 'node:path';
21
+ import { fileURLToPath, pathToFileURL } from 'node:url';
22
+
23
+ const _HERE = fileURLToPath(import.meta.url);
24
+ const QUIET = process.argv.slice(2).includes('--quiet');
25
+
26
+ const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
27
+ const ROADMAP_GLOB = 'agents/roadmaps/*.md';
28
+
29
+ const FENCED_CODE_RE = /^[ \t]*```[^\n]*\n[\s\S]*?^[ \t]*```[ \t]*$/gm;
30
+ const BLOCKERS_SECTION_RE = /^##[ \t]+Blockers[ \t]*$/im;
31
+ const NEXT_H2_RE = /^##[ \t]+\S/m;
32
+ const BLOCKER_HEADING_RE = /^###[ \t]+blocker:[ \t]*(.+?)[ \t]*$/gim;
33
+ // Only a real checkbox line (`- [ ] … <!-- blocked-by: id -->`) counts — a
34
+ // wrapped continuation line or inline-code documentation example of the
35
+ // syntax (as this very lint script's own roadmap step describes it) must
36
+ // not be mistaken for a live cross-reference.
37
+ const BLOCKED_BY_LINE_RE = /^-[ \t]*\[[ xX~-]\].*<!--[ \t]*blocked-by:[ \t]*([a-z0-9-]+)[ \t]*-->/i;
38
+
39
+ const REQUIRED_FIELDS: ReadonlyArray<readonly [string, RegExp]> = [
40
+ ['Status', /^-[ \t]*\*\*Status:\*\*/im],
41
+ ['Owner', /^-[ \t]*\*\*Owner:\*\*/im],
42
+ ['Blocks', /^-[ \t]*\*\*Blocks:\*\*/im],
43
+ ['What to do', /^-[ \t]*\*\*What to do:\*\*/im],
44
+ ['Resolved when', /^-[ \t]*\*\*Resolved when:\*\*/im],
45
+ ];
46
+
47
+ interface Violation {
48
+ line: number;
49
+ message: string;
50
+ }
51
+
52
+ /** 1-based line number of a character offset. */
53
+ function _lineAt(text: string, index: number): number {
54
+ let n = 1;
55
+ for (let i = 0; i < index && i < text.length; i++) {
56
+ if (text.charCodeAt(i) === 10) {
57
+ n += 1;
58
+ }
59
+ }
60
+ return n;
61
+ }
62
+
63
+ /** Blank out fenced code blocks, preserving line count and offsets. */
64
+ function _stripFencedCode(text: string): string {
65
+ return text.replace(FENCED_CODE_RE, (m) => '\n'.repeat((m.match(/\n/g) ?? []).length));
66
+ }
67
+
68
+ function _scan(rawText: string): Violation[] {
69
+ const violations: Violation[] = [];
70
+ const text = _stripFencedCode(rawText);
71
+ const declaredIds = new Set<string>();
72
+
73
+ const sectionMatch = BLOCKERS_SECTION_RE.exec(text);
74
+ if (sectionMatch) {
75
+ const sectionStart = sectionMatch.index + sectionMatch[0].length;
76
+ const rest = text.slice(sectionStart);
77
+ const h2 = NEXT_H2_RE.exec(rest);
78
+ const sectionEnd = h2 ? sectionStart + h2.index : text.length;
79
+ const section = text.slice(sectionStart, sectionEnd);
80
+
81
+ BLOCKER_HEADING_RE.lastIndex = 0;
82
+ const heads: Array<{ start: number; end: number; id: string }> = [];
83
+ let hm: RegExpExecArray | null;
84
+ while ((hm = BLOCKER_HEADING_RE.exec(section)) !== null) {
85
+ heads.push({
86
+ start: hm.index,
87
+ end: hm.index + hm[0].length,
88
+ id: (hm[1] as string).trim(),
89
+ });
90
+ if (hm.index === BLOCKER_HEADING_RE.lastIndex) {
91
+ BLOCKER_HEADING_RE.lastIndex++;
92
+ }
93
+ }
94
+ for (let i = 0; i < heads.length; i++) {
95
+ const cur = heads[i] as { start: number; end: number; id: string };
96
+ declaredIds.add(cur.id);
97
+ const bodyEnd = i + 1 < heads.length ? (heads[i + 1] as { start: number }).start : section.length;
98
+ const body = section.slice(cur.end, bodyEnd);
99
+ const missing = REQUIRED_FIELDS.filter(([, re]) => !re.test(body)).map(([name]) => name);
100
+ if (missing.length) {
101
+ violations.push({
102
+ line: _lineAt(text, sectionStart + cur.start),
103
+ message: `blocker '${cur.id}' missing required field(s): ${missing.join(', ')}`,
104
+ });
105
+ }
106
+ }
107
+ }
108
+
109
+ const lines = text.split('\n');
110
+ for (let i = 0; i < lines.length; i++) {
111
+ // A real annotation is bare markdown (an actual checkbox + HTML
112
+ // comment); an inline-code-quoted mention (`` `<!-- blocked-by: id -->` ``,
113
+ // e.g. this very lint script's own roadmap step documenting the
114
+ // syntax) is prose, not a live cross-reference — blank inline code
115
+ // spans before matching.
116
+ const cleaned = (lines[i] as string).replace(/`[^`\n]*`/g, (m) => ' '.repeat(m.length));
117
+ const m = BLOCKED_BY_LINE_RE.exec(cleaned);
118
+ if (!m) {
119
+ continue;
120
+ }
121
+ const id = m[1] as string;
122
+ if (!declaredIds.has(id)) {
123
+ violations.push({
124
+ line: i + 1,
125
+ message:
126
+ `blocked-by references unknown blocker id '${id}' ` +
127
+ `(no matching '### blocker: ${id}' in this file)`,
128
+ });
129
+ }
130
+ }
131
+ violations.sort((a, b) => a.line - b.line);
132
+ return violations;
133
+ }
134
+
135
+ /** Sorted `agents/roadmaps/*.md` (non-recursive — active roadmaps only). */
136
+ function _globRoadmaps(): string[] {
137
+ const dir = path.join(REPO_ROOT, 'agents', 'roadmaps');
138
+ let entries: fs.Dirent[];
139
+ try {
140
+ entries = fs.readdirSync(dir, { withFileTypes: true });
141
+ } catch {
142
+ return [];
143
+ }
144
+ const out: string[] = [];
145
+ for (const entry of entries) {
146
+ if (entry.isFile() && entry.name.endsWith('.md')) {
147
+ out.push(path.join(dir, entry.name));
148
+ }
149
+ }
150
+ return out.sort();
151
+ }
152
+
153
+ function _relPosix(target: string, root: string): string {
154
+ return path.relative(root, target).split(path.sep).join('/');
155
+ }
156
+
157
+ function main(): number {
158
+ const roadmaps = _globRoadmaps();
159
+ if (roadmaps.length === 0) {
160
+ if (!QUIET) {
161
+ process.stdout.write(`✅ no active roadmaps under ${ROADMAP_GLOB}\n`);
162
+ }
163
+ return 0;
164
+ }
165
+ let failed = 0;
166
+ for (const roadmap of roadmaps) {
167
+ const rel = _relPosix(roadmap, REPO_ROOT);
168
+ const text = fs.readFileSync(roadmap, 'utf-8');
169
+ const violations = _scan(text);
170
+ if (violations.length) {
171
+ failed += 1;
172
+ process.stderr.write(`❌ ${rel}\n`);
173
+ for (const v of violations) {
174
+ process.stderr.write(` line ${v.line}: ${v.message}\n`);
175
+ }
176
+ } else if (!QUIET) {
177
+ process.stdout.write(`✅ ${rel}\n`);
178
+ }
179
+ }
180
+ if (failed) {
181
+ process.stderr.write(
182
+ `\n❌ ${failed} roadmap(s) violate the ## Blockers contract — ` +
183
+ 'see .augment/rules/roadmap-progress-sync.md and ' +
184
+ '.augment/templates/roadmaps.md rule 20\n',
185
+ );
186
+ return 1;
187
+ }
188
+ if (!QUIET) {
189
+ process.stdout.write(`\n✅ ${roadmaps.length} roadmap(s) blocker-contract-clean\n`);
190
+ }
191
+ return 0;
192
+ }
193
+
194
+ const _isCliEntry =
195
+ process.argv[1] !== undefined &&
196
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
197
+ if (_isCliEntry || process.argv[1] === _HERE) {
198
+ process.exit(main());
199
+ }
200
+
201
+ export { REPO_ROOT, ROADMAP_GLOB, REQUIRED_FIELDS, _scan, _globRoadmaps, main };
202
+ export type { Violation };
@@ -42,6 +42,9 @@ const COUNCIL_PAT = /^## Council Round \d+\b/m;
42
42
  const VERDICT_PAT = /^### Verdict\b/m;
43
43
  // re.compile(r"^complexity:\s*(lightweight|structural)\s*$", re.MULTILINE)
44
44
  const COMPLEXITY_PAT = /^complexity:\s*(lightweight|structural)\s*$/m;
45
+ // execution.mode (templates/roadmaps.md rule 18): nested under `execution:`.
46
+ const EXEC_MODE_PAT = /^execution:[^\S\n]*\n(?:[ \t]+(?!mode:).*\n)*[ \t]+mode:[ \t]*([^\s#]+)/m;
47
+ const EXEC_MODE_VALUES = new Set(['autonomous', 'phase-checkpoints', 'interactive']);
45
48
 
46
49
  // Plate / horizon detection — template rule 16 forbids time-boxed plates.
47
50
  const PLATE_PATS: ReadonlyArray<readonly [RegExp, string]> = [
@@ -161,7 +164,11 @@ function _check_no_plate(text: string, problems: string[]): void {
161
164
  }
162
165
  }
163
166
 
164
- function lint_roadmap(p: string, horizon_weeks: number): string[] {
167
+ function lint_roadmap(
168
+ p: string,
169
+ horizon_weeks: number,
170
+ warnings?: string[],
171
+ ): string[] {
165
172
  const text = fs.readFileSync(p, 'utf-8');
166
173
  const line_count = _countChar(text, '\n') + (text && !text.endsWith('\n') ? 1 : 0);
167
174
  const problems: string[] = [];
@@ -180,9 +187,77 @@ function lint_roadmap(p: string, horizon_weeks: number): string[] {
180
187
  if (horizon_weeks <= 0) {
181
188
  _check_no_plate(text, problems);
182
189
  }
190
+ _check_execution_mode(fm, problems);
191
+ if (warnings) {
192
+ _check_autonomous_authoring(text, fm, warnings);
193
+ }
183
194
  return problems;
184
195
  }
185
196
 
197
+ // Vague-step patterns (ask-when-uncertain trigger subset) — under
198
+ // execution.mode: autonomous these guarantee mid-run ambiguity halts,
199
+ // so they warn at authoring time instead. Warnings never fail the lint.
200
+ const VAGUE_STEP_PATS: Array<[RegExp, string]> = [
201
+ [/\b(improve|optimi[sz]e)\b(?!.*\bby\b)/i, "'improve / optimize' without a measurable target"],
202
+ [/\bmake (it|this|.{0,30}) (better|cleaner|nicer)\b/i, "'make it better/cleaner'"],
203
+ [/\bclean ?up\b(?!.*\(<)/i, "'clean up' without named scope"],
204
+ [/\bfix (this|it)\b/i, "'fix this' without a symptom"],
205
+ [/\buse best practices\b/i, "'use best practices'"],
206
+ [/\bhandle errors properly\b/i, "'handle errors properly'"],
207
+ ];
208
+
209
+ function _check_autonomous_authoring(text: string, fm: string, warnings: string[]): void {
210
+ const m = EXEC_MODE_PAT.exec(fm);
211
+ if (m === null || m[1]!.replace(/^['"]|['"]$/g, '') !== 'autonomous') {
212
+ return;
213
+ }
214
+ const deferred = _countMatches(/^\s*-\s*\[~\]/m, text);
215
+ if (deferred > 0) {
216
+ warnings.push(
217
+ `execution.mode: autonomous with ${deferred} pre-existing [~] deferred item(s) — ` +
218
+ 'the deferred-resolution archival gate (roadmap-progress-sync Iron Law 3) ' +
219
+ 'WILL interrupt the run at the end; resolve or re-author them now',
220
+ );
221
+ }
222
+ for (const rawLine of text.split('\n')) {
223
+ if (!/^\s*-\s*\[ \]/.test(rawLine)) {
224
+ continue;
225
+ }
226
+ for (const [re, label] of VAGUE_STEP_PATS) {
227
+ if (re.test(rawLine)) {
228
+ warnings.push(
229
+ `vague step under execution.mode: autonomous (${label}): ` +
230
+ `"${rawLine.trim().slice(0, 80)}" — vagueness resolves cheaply at ` +
231
+ 'authoring time, expensively as a mid-run ambiguity halt',
232
+ );
233
+ break;
234
+ }
235
+ }
236
+ }
237
+ }
238
+
239
+ function _check_execution_mode(fm: string, problems: string[]): void {
240
+ if (!fm || !/^execution:/m.test(fm)) {
241
+ return; // absent field = interactive default — valid
242
+ }
243
+ const m = EXEC_MODE_PAT.exec(fm);
244
+ if (m === null) {
245
+ problems.push(
246
+ "'execution:' frontmatter block present but no 'mode:' key found " +
247
+ "(expected execution.mode: autonomous | phase-checkpoints | interactive " +
248
+ 'per templates/roadmaps.md rule 18)',
249
+ );
250
+ return;
251
+ }
252
+ const value = m[1]!.replace(/^['"]|['"]$/g, '');
253
+ if (!EXEC_MODE_VALUES.has(value)) {
254
+ problems.push(
255
+ `unknown execution.mode '${value}' — allowed: autonomous | ` +
256
+ 'phase-checkpoints | interactive (templates/roadmaps.md rule 18)',
257
+ );
258
+ }
259
+ }
260
+
186
261
  function main(): number {
187
262
  const roadmaps = _globRoadmaps();
188
263
  const horizon_weeks = _read_horizon_weeks();
@@ -196,7 +271,11 @@ function main(): number {
196
271
  const summary: Array<[string, string]> = [];
197
272
  for (const roadmap of roadmaps) {
198
273
  const rel = _relPosix(roadmap, REPO_ROOT);
199
- const problems = lint_roadmap(roadmap, horizon_weeks);
274
+ const warnings: string[] = [];
275
+ const problems = lint_roadmap(roadmap, horizon_weeks, warnings);
276
+ for (const w of warnings) {
277
+ process.stderr.write(`⚠️ ${rel}\n - ${w}\n`);
278
+ }
200
279
  const text = fs.readFileSync(roadmap, 'utf-8');
201
280
  const complexity = _read_complexity(_frontmatter(text)) ?? 'untagged';
202
281
  summary.push([rel, complexity]);
@@ -0,0 +1,125 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Lint subagent determinism — the ADR-109 guarantees the schema mini-validator
4
+ * cannot express.
5
+ *
6
+ * `validate_frontmatter` (the schema gate) covers type / enum / required /
7
+ * pattern, but its mini-validator ignores JSON-Schema `const` and `uniqueItems`.
8
+ * This lint closes that gap for `src/subagents/*.md`:
9
+ *
10
+ * 1. `schema_version` MUST equal `subagent-v1` (schema `const`).
11
+ * 2. `discovery.visible` MUST be exactly `false` — default-off (schema `const`).
12
+ * 3. `tools` MUST have no duplicate entries (schema `uniqueItems`).
13
+ * 4. `name` MUST match the filename stem (addressable-handle invariant).
14
+ * 5. `name` MUST be globally unique across the subagent category
15
+ * (projection-path collision guard — two units would overwrite each other
16
+ * in `.claude/agents/`).
17
+ *
18
+ * Exit codes: 0 clean, 1 any violation.
19
+ *
20
+ * See ADR-109 (§ 6 determinism) and `src/scripts/schemas/subagent.schema.json`.
21
+ */
22
+
23
+ import * as fs from 'node:fs';
24
+ import * as path from 'node:path';
25
+ import { fileURLToPath, pathToFileURL } from 'node:url';
26
+
27
+ import { parse_frontmatter } from './validate_frontmatter.js';
28
+
29
+ const QUIET = process.argv.includes('--quiet');
30
+
31
+ const _HERE = fileURLToPath(import.meta.url);
32
+ const REPO = path.resolve(path.dirname(_HERE), '..', '..');
33
+ const SUBAGENT_DIR = path.join(REPO, 'src', 'subagents');
34
+
35
+ function _listSubagents(dir: string): string[] {
36
+ if (!fs.existsSync(dir)) {
37
+ return [];
38
+ }
39
+ return fs
40
+ .readdirSync(dir)
41
+ .filter((f) => f.endsWith('.md'))
42
+ .sort()
43
+ .map((f) => path.join(dir, f));
44
+ }
45
+
46
+ function main(dir: string = SUBAGENT_DIR): number {
47
+ const findings: string[] = [];
48
+ const namesSeen = new Map<string, string>();
49
+
50
+ for (const file of _listSubagents(dir)) {
51
+ const rel = path.relative(REPO, file);
52
+ const stem = path.basename(file, '.md');
53
+ const text = fs.readFileSync(file, 'utf-8');
54
+ const [data] = parse_frontmatter(text);
55
+ if (data === null || typeof data !== 'object' || Array.isArray(data)) {
56
+ findings.push(`${rel}: no parseable frontmatter`);
57
+ continue;
58
+ }
59
+ const fm = data as Record<string, unknown>;
60
+
61
+ if (fm.schema_version !== 'subagent-v1') {
62
+ findings.push(`${rel}: schema_version must be 'subagent-v1' (got ${JSON.stringify(fm.schema_version)})`);
63
+ }
64
+
65
+ const discovery = fm.discovery;
66
+ const visible =
67
+ discovery !== null && typeof discovery === 'object' && !Array.isArray(discovery)
68
+ ? (discovery as Record<string, unknown>).visible
69
+ : undefined;
70
+ if (visible !== false) {
71
+ findings.push(`${rel}: discovery.visible must be exactly false (default-off; got ${JSON.stringify(visible)})`);
72
+ }
73
+
74
+ const tools = fm.tools;
75
+ if (Array.isArray(tools)) {
76
+ const seen = new Set<unknown>();
77
+ const dupes = new Set<unknown>();
78
+ for (const t of tools) {
79
+ if (seen.has(t)) {
80
+ dupes.add(t);
81
+ }
82
+ seen.add(t);
83
+ }
84
+ if (dupes.size > 0) {
85
+ findings.push(`${rel}: tools has duplicate entr(y/ies): ${[...dupes].map((d) => JSON.stringify(d)).join(', ')}`);
86
+ }
87
+ }
88
+
89
+ const name = fm.name;
90
+ if (typeof name !== 'string' || name !== stem) {
91
+ findings.push(`${rel}: name must match the filename stem '${stem}' (got ${JSON.stringify(name)})`);
92
+ } else {
93
+ const prior = namesSeen.get(name);
94
+ if (prior !== undefined) {
95
+ findings.push(`${rel}: duplicate subagent name '${name}' (also in ${prior}) — projection-path collision`);
96
+ } else {
97
+ namesSeen.set(name, rel);
98
+ }
99
+ }
100
+ }
101
+
102
+ if (findings.length > 0) {
103
+ process.stdout.write('❌ subagent determinism:\n');
104
+ for (const f of findings.sort()) {
105
+ process.stdout.write(` - ${f}\n`);
106
+ }
107
+ return 1;
108
+ }
109
+
110
+ if (!QUIET) {
111
+ process.stdout.write(
112
+ `✅ subagent determinism: ${namesSeen.size} subagent(s) clean.\n`,
113
+ );
114
+ }
115
+ return 0;
116
+ }
117
+
118
+ const _isCliEntry =
119
+ process.argv[1] !== undefined &&
120
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
121
+ if (_isCliEntry) {
122
+ process.exit(main());
123
+ }
124
+
125
+ export { main };
@@ -16,8 +16,10 @@
16
16
  * 2. `always`-type rules under `.augment/rules/` — full body injected.
17
17
  * 3. `auto`-type rules — only a registry stub is injected per rule.
18
18
  *
19
- * The 49,512-char ceiling is the empirical limit observed against the
20
- * Augment Code workspace prompt (2026-05-08 baseline).
19
+ * The cap comes from `src/config/budgets.yml`
20
+ * (augment_workspace_guidelines) — the single source of truth for the
21
+ * budget gates. The internal cap is deliberately below the verified
22
+ * platform maximum recorded there.
21
23
  *
22
24
  * Exit codes: 0 = under fail threshold, 1 = at/above fail threshold,
23
25
  * 3 = internal error.
@@ -39,10 +41,48 @@ export const TREND_FILE = path.join(
39
41
  '.augment-budget-history.jsonl',
40
42
  );
41
43
 
42
- // Augment workspace-guidelines ceiling — empirical 2026-05-08.
43
- export const TOTAL_CAP = 49_512;
44
- export const WARN_THRESHOLD = 0.85;
45
- export const FAIL_THRESHOLD = 0.95;
44
+ // Budget caps — loaded from src/config/budgets.yml (single source of truth).
45
+ export const BUDGETS_FILE = path.join(REPO_ROOT, 'src', 'config', 'budgets.yml');
46
+
47
+ interface BudgetConfig {
48
+ platform_max_chars: number;
49
+ total_cap_chars: number;
50
+ warn_threshold: number;
51
+ fail_threshold: number;
52
+ }
53
+
54
+ function _load_budget_config(): BudgetConfig {
55
+ // Tiny purpose-built reader (keys are flat scalars) — avoids a hard yaml
56
+ // dependency in a script that must run before `npm ci` in some flows.
57
+ const text = fs.readFileSync(BUDGETS_FILE, 'utf-8');
58
+ const section = text.split(/^augment_workspace_guidelines:\s*$/m)[1] ?? '';
59
+ const num = (key: string): number => {
60
+ const m = new RegExp(`^\\s+${key}:\\s*([0-9.]+)\\s*$`, 'm').exec(section);
61
+ if (!m) {
62
+ throw new Error(`budgets.yml: missing augment_workspace_guidelines.${key}`);
63
+ }
64
+ return Number(m[1]);
65
+ };
66
+ const cfg: BudgetConfig = {
67
+ platform_max_chars: num('platform_max_chars'),
68
+ total_cap_chars: num('total_cap_chars'),
69
+ warn_threshold: num('warn_threshold'),
70
+ fail_threshold: num('fail_threshold'),
71
+ };
72
+ if (cfg.total_cap_chars > cfg.platform_max_chars) {
73
+ throw new Error(
74
+ `budgets.yml: total_cap_chars (${cfg.total_cap_chars}) must never exceed ` +
75
+ `platform_max_chars (${cfg.platform_max_chars})`,
76
+ );
77
+ }
78
+ return cfg;
79
+ }
80
+
81
+ const _BUDGET = _load_budget_config();
82
+ export const PLATFORM_MAX = _BUDGET.platform_max_chars;
83
+ export const TOTAL_CAP = _BUDGET.total_cap_chars;
84
+ export const WARN_THRESHOLD = _BUDGET.warn_threshold;
85
+ export const FAIL_THRESHOLD = _BUDGET.fail_threshold;
46
86
 
47
87
  // Stub template Augment injects for `type: auto` rules.
48
88
  function STUB(desc: string, p: string): string {
@@ -21,8 +21,9 @@
21
21
  * 7. Runtime boundary disclaimer
22
22
  * 8. Anti-sycophancy rules in "Do NOT"
23
23
  *
24
- * NOTE: the .py reads from the legacy `.agent-src.uncondensed/skills`
25
- * literal; this faithful twin replicates it byte-for-byte.
24
+ * NOTE: scans `src/skills` — the canonical source-of-truth skill library.
25
+ * (The pre-py2ts .py read the now-removed legacy condensed-source skills
26
+ * corpus; repointed here so the scanner runs on the live tree.)
26
27
  */
27
28
 
28
29
  import * as fs from 'node:fs';
@@ -32,7 +33,7 @@ import { fileURLToPath, pathToFileURL } from 'node:url';
32
33
  const _HERE = fileURLToPath(import.meta.url);
33
34
  // src/scripts/measure_patterns.ts → parents[2] is the repo root.
34
35
  const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
35
- const SKILLS_DIR = path.join(ROOT, '.agent-src.uncondensed', 'skills');
36
+ const SKILLS_DIR = path.join(ROOT, 'src', 'skills');
36
37
 
37
38
  type Tier = number | string;
38
39
 
@@ -20,11 +20,11 @@
20
20
  * measure_skill_reduction
21
21
  * measure_skill_reduction --json
22
22
  *
23
- * NOTE: the .py references the legacy `.agent-src.uncondensed/skills`
24
- * literal; this faithful twin replicates it byte-for-byte. When the
25
- * directory is absent the .py raises an uncaught FileNotFoundError
26
- * (iterdir on a missing dir) → exit 1, empty stdout; this twin mirrors
27
- * that by throwing, so the dispatcher / Node surfaces a non-zero exit.
23
+ * NOTE: scans `src/skills` — the canonical source-of-truth skill library.
24
+ * (The pre-py2ts .py read the now-removed legacy condensed-source skills
25
+ * corpus; repointed here so the scanner runs on the live tree.) When
26
+ * the directory is absent the scanner throws (iterdir on a missing dir) →
27
+ * non-zero exit, empty stdout.
28
28
  */
29
29
 
30
30
  import * as fs from 'node:fs';
@@ -35,7 +35,7 @@ import { parse as parseYaml } from 'yaml';
35
35
  const _HERE = fileURLToPath(import.meta.url);
36
36
  // src/scripts/measure_skill_reduction.ts → parents[2] is the repo root.
37
37
  const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
38
- const SKILLS_DIR = path.join(REPO_ROOT, '.agent-src.uncondensed', 'skills');
38
+ const SKILLS_DIR = path.join(REPO_ROOT, 'src', 'skills');
39
39
  const TARGET_REDUCTION = 0.4;
40
40
  const PHASE_3_USER_TYPES = ['consultant', 'creator'] as const;
41
41
 
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * migration_status.ts — Python→TypeScript migration dashboard.
4
4
  *
5
- * Phase 1 Step 13 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
5
+ * Phase 1 Step 13 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
6
6
  *
7
7
  * Counts the remaining tracked `.py` files (via `git ls-files '*.py'`),
8
8
  * buckets them into the roadmap's migration categories, compares each
@@ -100,6 +100,10 @@ const EXCLUDED_PREFIXES: readonly string[] = [
100
100
  '.claude/',
101
101
  '.augment/',
102
102
  'internal/bench/',
103
+ // Eval fixtures simulate CONSUMER project files (a python DB model the
104
+ // structure-grounding eval reads as foreign source) — carve-out, not
105
+ // package source. Same class as the internal/bench/ trap fixtures.
106
+ 'internal/evals/',
103
107
  'tmp/',
104
108
  '.tmp/',
105
109
  ];
@@ -225,7 +229,7 @@ function renderDashboard(
225
229
  lines.push('');
226
230
  lines.push(
227
231
  'Tracks remaining tracked `.py` files per roadmap phase of ' +
228
- '`agents/roadmaps/road-to-typescript-only-scripts.md`. ' +
232
+ '`agents/roadmaps/archive/road-to-typescript-only-scripts.md`. ' +
229
233
  'Baseline = Phase 1 snapshot (hardcoded in the script).',
230
234
  );
231
235
  lines.push('');