@event4u/agent-config 7.5.0 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (429) hide show
  1. package/.claude-plugin/marketplace.json +8 -1
  2. package/AGENTS.md +9 -9
  3. package/CHANGELOG.md +317 -260
  4. package/README.md +35 -5
  5. package/dist/agent-src/commands/analytics/prune.md +1 -1
  6. package/dist/agent-src/commands/analytics/show.md +1 -1
  7. package/dist/agent-src/commands/analyze/decision.md +2 -2
  8. package/dist/agent-src/commands/analyze/incident.md +2 -2
  9. package/dist/agent-src/commands/analyze/near-miss.md +2 -2
  10. package/dist/agent-src/commands/analyze/postmortem.md +2 -2
  11. package/dist/agent-src/commands/analyze/premortem.md +2 -2
  12. package/dist/agent-src/commands/cost-report.md +25 -0
  13. package/dist/agent-src/commands/evals/analyze.json +30 -0
  14. package/dist/agent-src/commands/evals/mission-upgrade.json +30 -0
  15. package/dist/agent-src/commands/implement-ticket.md +1 -1
  16. package/dist/agent-src/commands/knowledge/forget.md +1 -1
  17. package/dist/agent-src/commands/knowledge/ingest.md +1 -1
  18. package/dist/agent-src/commands/knowledge/list.md +1 -1
  19. package/dist/agent-src/commands/memory/load.md +12 -11
  20. package/dist/agent-src/commands/memory/promote.md +30 -0
  21. package/dist/agent-src/commands/memory/propose.md +16 -2
  22. package/dist/agent-src/commands/mission/upgrade.md +1 -1
  23. package/dist/agent-src/commands/module/explore.md +11 -7
  24. package/dist/agent-src/commands/optimize-project.md +243 -0
  25. package/dist/agent-src/commands/optimize.md +5 -0
  26. package/dist/agent-src/commands/pr/create.md +37 -8
  27. package/dist/agent-src/commands/prediction-pool.md +2 -2
  28. package/dist/agent-src/commands/profile/activate.md +3 -3
  29. package/dist/agent-src/commands/profile/deactivate.md +2 -2
  30. package/dist/agent-src/commands/profile/show.md +3 -3
  31. package/dist/agent-src/commands/research/deep.md +5 -0
  32. package/dist/agent-src/commands/research/report.md +2 -1
  33. package/dist/agent-src/commands/roadmap/create.md +88 -10
  34. package/dist/agent-src/commands/roadmap/materialize.md +1 -1
  35. package/dist/agent-src/commands/roadmap/process-full.md +15 -2
  36. package/dist/agent-src/commands/roadmap/process-phase.md +18 -6
  37. package/dist/agent-src/commands/roadmap/process-step.md +4 -0
  38. package/dist/agent-src/commands/roadmap.md +1 -1
  39. package/dist/agent-src/commands/security-audit-config.md +1 -1
  40. package/dist/agent-src/commands/sync-agent-settings.md +1 -1
  41. package/dist/agent-src/commands/sync-gitignore/fix.md +42 -6
  42. package/dist/agent-src/commands/team-knowledge/bootstrap.md +106 -0
  43. package/dist/agent-src/commands/team-knowledge/consolidate.md +105 -0
  44. package/dist/agent-src/commands/team-knowledge.md +64 -0
  45. package/dist/agent-src/contexts/authority/commit-mechanics.md +8 -0
  46. package/dist/agent-src/contexts/authority/destructive-mechanics.md +11 -0
  47. package/dist/agent-src/contexts/authority/scope-mechanics.md +25 -0
  48. package/dist/agent-src/contexts/communication/rules-auto/reply-close-mechanics.md +43 -0
  49. package/dist/agent-src/contexts/contracts/agents-md-anatomy.md +1 -1
  50. package/dist/agent-src/contexts/contracts/artifact-engagement-flow.md +2 -2
  51. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -0
  52. package/dist/agent-src/contexts/execution/auto-dispatch-classification.md +14 -4
  53. package/dist/agent-src/contexts/execution/autonomy-mechanics.md +11 -0
  54. package/dist/agent-src/contexts/execution/orchestration-telemetry.md +32 -8
  55. package/dist/agent-src/contexts/execution/roadmap-execution-contract.md +107 -0
  56. package/dist/agent-src/contexts/execution/roadmap-process-loop.md +71 -15
  57. package/dist/agent-src/contexts/execution/subagent-steering.md +41 -1
  58. package/dist/agent-src/contexts/override-system.md +1 -1
  59. package/dist/agent-src/personas/brand-strategist.md +0 -1
  60. package/dist/agent-src/personas/data-integrity.md +66 -0
  61. package/dist/agent-src/personas/design-director.md +0 -1
  62. package/dist/agent-src/personas/performance-engineer.md +66 -0
  63. package/dist/agent-src/personas/production-validator.md +73 -0
  64. package/dist/agent-src/rules/agent-authority.md +3 -4
  65. package/dist/agent-src/rules/analysis-skill-routing.md +3 -5
  66. package/dist/agent-src/rules/architecture.md +2 -4
  67. package/dist/agent-src/rules/artifact-drafting-protocol.md +35 -6
  68. package/dist/agent-src/rules/artifact-engagement-recording.md +2 -4
  69. package/dist/agent-src/rules/ask-when-uncertain.md +10 -14
  70. package/dist/agent-src/rules/augment-edit-discipline.md +3 -5
  71. package/dist/agent-src/rules/autonomous-execution.md +3 -5
  72. package/dist/agent-src/rules/brand-consistency.md +3 -5
  73. package/dist/agent-src/rules/brand-source-of-truth.md +3 -5
  74. package/dist/agent-src/rules/cli-output-handling.md +4 -6
  75. package/dist/agent-src/rules/command-suggestion-policy.md +3 -5
  76. package/dist/agent-src/rules/commit-conventions.md +3 -5
  77. package/dist/agent-src/rules/commit-policy.md +18 -10
  78. package/dist/agent-src/rules/content-quoting-floor.md +88 -0
  79. package/dist/agent-src/rules/context-hygiene.md +3 -5
  80. package/dist/agent-src/rules/copilot-routing.md +4 -6
  81. package/dist/agent-src/rules/decision-revisit-gate.md +120 -0
  82. package/dist/agent-src/rules/delegation-policy.md +10 -6
  83. package/dist/agent-src/rules/design-fidelity.md +3 -5
  84. package/dist/agent-src/rules/devcontainer-routing.md +4 -6
  85. package/dist/agent-src/rules/direct-answers.md +13 -17
  86. package/dist/agent-src/rules/docker-commands.md +3 -5
  87. package/dist/agent-src/rules/domain-adoption-policy.md +3 -5
  88. package/dist/agent-src/rules/domain-safety-disclaimer.md +3 -5
  89. package/dist/agent-src/rules/domain-safety-pii.md +3 -5
  90. package/dist/agent-src/rules/domain-safety-retention.md +3 -5
  91. package/dist/agent-src/rules/downstream-changes.md +3 -4
  92. package/dist/agent-src/rules/engineering-safety-floor.md +3 -5
  93. package/dist/agent-src/rules/external-reference-deep-dive.md +3 -5
  94. package/dist/agent-src/rules/fast-path-marker-visibility.md +3 -5
  95. package/dist/agent-src/rules/finance-safety-floor.md +3 -6
  96. package/dist/agent-src/rules/framework-neutrality-in-generic-skills.md +3 -5
  97. package/dist/agent-src/rules/git-history-discipline.md +3 -5
  98. package/dist/agent-src/rules/guidelines.md +2 -4
  99. package/dist/agent-src/rules/icon-consistency.md +3 -5
  100. package/dist/agent-src/rules/image-likeness-and-rights.md +3 -5
  101. package/dist/agent-src/rules/improve-before-implement.md +5 -5
  102. package/dist/agent-src/rules/invite-challenge.md +3 -5
  103. package/dist/agent-src/rules/language-and-tone.md +13 -15
  104. package/dist/agent-src/rules/laravel-routing.md +3 -5
  105. package/dist/agent-src/rules/laravel-translations.md +3 -5
  106. package/dist/agent-src/rules/legal-safety-floor.md +3 -5
  107. package/dist/agent-src/rules/lethal-trifecta-guard.md +3 -5
  108. package/dist/agent-src/rules/linked-projects-onboarding-gate.md +4 -7
  109. package/dist/agent-src/rules/low-impact-corpus-privacy-floor.md +3 -5
  110. package/dist/agent-src/rules/markdown-safe-codeblocks.md +2 -4
  111. package/dist/agent-src/rules/media-governance-routing.md +3 -5
  112. package/dist/agent-src/rules/media-sync-ground-truth.md +3 -5
  113. package/dist/agent-src/rules/minimal-safe-diff.md +5 -5
  114. package/dist/agent-src/rules/missing-tool-handling.md +3 -5
  115. package/dist/agent-src/rules/model-recommendation.md +4 -6
  116. package/dist/agent-src/rules/no-attribution-footers.md +3 -5
  117. package/dist/agent-src/rules/no-cheap-questions.md +5 -8
  118. package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +3 -6
  119. package/dist/agent-src/rules/no-pr-progress-comments.md +3 -6
  120. package/dist/agent-src/rules/no-roadmap-references.md +3 -5
  121. package/dist/agent-src/rules/non-destructive-by-default.md +11 -13
  122. package/dist/agent-src/rules/notes-first-reasoning.md +3 -5
  123. package/dist/agent-src/rules/onboarding-gate.md +4 -6
  124. package/dist/agent-src/rules/output-discipline.md +3 -5
  125. package/dist/agent-src/rules/package-ci-checks.md +3 -5
  126. package/dist/agent-src/rules/persona-governance.md +2 -4
  127. package/dist/agent-src/rules/php-coding.md +3 -5
  128. package/dist/agent-src/rules/preservation-guard.md +2 -4
  129. package/dist/agent-src/rules/provider-lifecycle-discipline.md +3 -5
  130. package/dist/agent-src/rules/reviewer-awareness.md +5 -6
  131. package/dist/agent-src/rules/roadmap-ci-steps-policy.md +3 -5
  132. package/dist/agent-src/rules/roadmap-progress-sync.md +5 -5
  133. package/dist/agent-src/rules/role-mode-adherence.md +2 -4
  134. package/dist/agent-src/rules/rule-type-governance.md +3 -5
  135. package/dist/agent-src/rules/runtime-safety.md +2 -4
  136. package/dist/agent-src/rules/scope-control.md +10 -11
  137. package/dist/agent-src/rules/security-sensitive-stop.md +4 -5
  138. package/dist/agent-src/rules/size-enforcement.md +2 -4
  139. package/dist/agent-src/rules/skill-improvement-trigger.md +3 -5
  140. package/dist/agent-src/rules/skill-quality.md +3 -5
  141. package/dist/agent-src/rules/slash-command-routing-policy.md +3 -5
  142. package/dist/agent-src/rules/source-confidentiality.md +3 -5
  143. package/dist/agent-src/rules/source-discovery-gate.md +3 -5
  144. package/dist/agent-src/rules/source-of-truth.md +3 -5
  145. package/dist/agent-src/rules/strategy-safety-floor.md +3 -5
  146. package/dist/agent-src/rules/symfony-routing.md +4 -6
  147. package/dist/agent-src/rules/telegraph-speak.md +4 -5
  148. package/dist/agent-src/rules/think-before-action.md +7 -4
  149. package/dist/agent-src/rules/token-budget-discipline.md +29 -5
  150. package/dist/agent-src/rules/token-efficiency.md +3 -5
  151. package/dist/agent-src/rules/token-optimizer-maintenance.md +3 -5
  152. package/dist/agent-src/rules/tool-safety.md +2 -4
  153. package/dist/agent-src/rules/ui-audit-gate.md +3 -6
  154. package/dist/agent-src/rules/untrusted-input-defense.md +3 -5
  155. package/dist/agent-src/rules/upstream-proposal.md +4 -6
  156. package/dist/agent-src/rules/user-interaction.md +7 -5
  157. package/dist/agent-src/rules/user-interrupt-priority.md +17 -8
  158. package/dist/agent-src/rules/verify-before-complete.md +12 -22
  159. package/dist/agent-src/scripts/archive_completed_roadmaps.ts +3 -3
  160. package/dist/agent-src/scripts/update_roadmap_progress.ts +197 -7
  161. package/dist/agent-src/skills/adr-create/SKILL.md +48 -42
  162. package/dist/agent-src/skills/agent-docs-writing/SKILL.md +18 -0
  163. package/dist/agent-src/skills/agent-security-review/SKILL.md +1 -1
  164. package/dist/agent-src/skills/ai-council/SKILL.md +14 -1
  165. package/dist/agent-src/skills/blameless-post-mortem/SKILL.md +0 -3
  166. package/dist/agent-src/skills/brand/SKILL.md +1 -1
  167. package/dist/agent-src/skills/brand-identity/SKILL.md +3 -3
  168. package/dist/agent-src/skills/brand-strategy/SKILL.md +1 -1
  169. package/dist/agent-src/skills/brand-to-tokens/SKILL.md +3 -3
  170. package/dist/agent-src/skills/canvas-design/SKILL.md +6 -0
  171. package/dist/agent-src/skills/check-refs/SKILL.md +7 -4
  172. package/dist/agent-src/skills/code-review/SKILL.md +1 -0
  173. package/dist/agent-src/skills/complexity-first-planning/SKILL.md +6 -5
  174. package/dist/agent-src/skills/condense-memory/SKILL.md +11 -11
  175. package/dist/agent-src/skills/context-document/SKILL.md +17 -0
  176. package/dist/agent-src/skills/corpus-grounding/SKILL.md +3 -3
  177. package/dist/agent-src/skills/decision-record/SKILL.md +6 -0
  178. package/dist/agent-src/skills/decision-review/SKILL.md +5 -3
  179. package/dist/agent-src/skills/deep-reading-analyst/SKILL.md +6 -1
  180. package/dist/agent-src/skills/design-intelligence/SKILL.md +5 -2
  181. package/dist/agent-src/skills/design-intelligence/references/design-languages.md +1 -1
  182. package/dist/agent-src/skills/design-tokens/SKILL.md +10 -4
  183. package/dist/agent-src/skills/design-variations/SKILL.md +127 -0
  184. package/dist/agent-src/skills/design-variations/evals/triggers.json +17 -0
  185. package/dist/agent-src/skills/emit-tickets/SKILL.md +4 -4
  186. package/dist/agent-src/skills/fe-design/SKILL.md +20 -0
  187. package/dist/agent-src/skills/html-deck/SKILL.md +123 -0
  188. package/dist/agent-src/skills/html-deck/evals/triggers.json +17 -0
  189. package/dist/agent-src/skills/html-deck/templates/deck-shell.html +77 -0
  190. package/dist/agent-src/skills/judge-code-quality/SKILL.md +1 -0
  191. package/dist/agent-src/skills/laravel/SKILL.md +0 -1
  192. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +46 -0
  193. package/dist/agent-src/skills/lint-skills/SKILL.md +6 -6
  194. package/dist/agent-src/skills/md-language-check/SKILL.md +3 -3
  195. package/dist/agent-src/skills/memory-consolidation/SKILL.md +66 -1
  196. package/dist/agent-src/skills/migration-architect/SKILL.md +1 -0
  197. package/dist/agent-src/skills/module-detect-on-the-fly/SKILL.md +2 -2
  198. package/dist/agent-src/skills/performance-analysis/SKILL.md +2 -0
  199. package/dist/agent-src/skills/prediction-pool-optimizer/SKILL.md +4 -4
  200. package/dist/agent-src/skills/premortem/SKILL.md +0 -3
  201. package/dist/agent-src/skills/project-analysis-core/SKILL.md +16 -0
  202. package/dist/agent-src/skills/reasoning-orchestrator/SKILL.md +3 -1
  203. package/dist/agent-src/skills/release-comms/SKILL.md +46 -45
  204. package/dist/agent-src/skills/roadmap-management/SKILL.md +21 -0
  205. package/dist/agent-src/skills/roadmap-writing/SKILL.md +32 -2
  206. package/dist/agent-src/skills/root-cause-frameworks/SKILL.md +0 -3
  207. package/dist/agent-src/skills/security-audit/SKILL.md +1 -0
  208. package/dist/agent-src/skills/skill-improvement-pipeline/SKILL.md +4 -0
  209. package/dist/agent-src/skills/source-discovery/SKILL.md +22 -3
  210. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +33 -14
  211. package/dist/agent-src/skills/subagent-orchestration/prompts/README.md +11 -0
  212. package/dist/agent-src/skills/subagent-orchestration/prompts/do-in-steps.md +8 -0
  213. package/dist/agent-src/skills/systematic-debugging/SKILL.md +29 -0
  214. package/dist/agent-src/skills/threat-modeling/SKILL.md +2 -2
  215. package/dist/agent-src/skills/typography-system/SKILL.md +2 -2
  216. package/dist/agent-src/skills/verify-completion-evidence/SKILL.md +2 -0
  217. package/dist/agent-src/skills/wireframe/SKILL.md +118 -0
  218. package/dist/agent-src/skills/wireframe/evals/triggers.json +17 -0
  219. package/dist/agent-src/templates/agent-settings.md +22 -1
  220. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  221. package/dist/agent-src/templates/command.md +2 -2
  222. package/dist/agent-src/templates/contexts/knowledge-pages.md +116 -0
  223. package/dist/agent-src/templates/hooks/pre-commit-frontmatter +1 -1
  224. package/dist/agent-src/templates/roadmaps.md +70 -2
  225. package/dist/agent-src/templates/rule.md +1 -1
  226. package/dist/agent-src/templates/scripts/README.md +3 -3
  227. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +109 -0
  228. package/dist/agent-src/templates/tickets.md +8 -8
  229. package/dist/cli/commands/recordTriggerEval.test.js +1 -1
  230. package/dist/cli/commands/recordTriggerEval.test.js.map +1 -1
  231. package/dist/cli/initRouting.js +4 -2
  232. package/dist/cli/initRouting.js.map +1 -1
  233. package/dist/cli/registry.js +1 -0
  234. package/dist/cli/registry.js.map +1 -1
  235. package/dist/discovery/deprecation-report.md +1 -1
  236. package/dist/discovery/discovery-manifest.json +718 -240
  237. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  238. package/dist/discovery/discovery-manifest.summary.md +8 -8
  239. package/dist/discovery/orphan-report.md +1 -1
  240. package/dist/discovery/packs.json +43 -28
  241. package/dist/discovery/trust-report.md +12 -11
  242. package/dist/discovery/workspaces.json +29 -18
  243. package/dist/install/preflight.js +173 -0
  244. package/dist/install/preflight.js.map +1 -0
  245. package/dist/mcp/registry-manifest.json +4 -4
  246. package/dist/router.json +1 -1
  247. package/dist/server/routes/settings.js +4 -0
  248. package/dist/server/routes/settings.js.map +1 -1
  249. package/dist/server/schemas/settings.js +3 -1
  250. package/dist/server/schemas/settings.js.map +1 -1
  251. package/docs/CLAIMS.md +108 -0
  252. package/docs/MIGRATION.md +3 -3
  253. package/docs/architecture.md +5 -5
  254. package/docs/archive/CHANGELOG-pre-8.0.0.md +301 -0
  255. package/docs/benchmark.md +133 -2
  256. package/docs/benchmark.pinned.yml +31 -0
  257. package/docs/capability-matrix.md +1 -0
  258. package/docs/catalog.md +70 -60
  259. package/docs/command-flows.md +15 -3
  260. package/docs/comparison.yaml +35 -0
  261. package/docs/contracts/agents-layout.md +148 -0
  262. package/docs/contracts/brand-token-consumption.md +5 -0
  263. package/docs/contracts/capability-boundary.md +5 -0
  264. package/docs/contracts/command-category-governance.md +5 -0
  265. package/docs/contracts/command-clusters.md +1 -0
  266. package/docs/contracts/command-surface-tiers.md +1 -1
  267. package/docs/contracts/conformance.md +84 -0
  268. package/docs/contracts/creative-pack-boundary.md +5 -0
  269. package/docs/contracts/discovery-manifest.schema.json +5 -4
  270. package/docs/contracts/file-ownership-matrix.json +4605 -985
  271. package/docs/contracts/governance-enforcement-projection.md +5 -0
  272. package/docs/contracts/gui-wizard.md +1 -1
  273. package/docs/contracts/hook-architecture-v1.md +2 -2
  274. package/docs/contracts/implement-ticket-flow.md +1 -1
  275. package/docs/contracts/kernel-membership.md +13 -0
  276. package/docs/contracts/mcp-tool-inventory.md +23 -23
  277. package/docs/contracts/no-runtime-boundary.md +6 -1
  278. package/docs/contracts/review-lens-schema.md +5 -0
  279. package/docs/contracts/rule-router.md +102 -8
  280. package/docs/contracts/skill-bundled-assets.md +1 -1
  281. package/docs/contracts/skill-dry-run.md +1 -1
  282. package/docs/contracts/subagent-boundary.md +5 -0
  283. package/docs/contracts/ticket-bundle-format.md +9 -4
  284. package/docs/contracts/tier-3-contrib-plugin.md +2 -2
  285. package/docs/contracts/write-engine.md +3 -0
  286. package/docs/customization.md +87 -15
  287. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +1 -1
  288. package/docs/decisions/ADR-109-subagent-v1-contract.md +246 -0
  289. package/docs/decisions/ADR-110-discipline-profile-resolution-locus.md +105 -0
  290. package/docs/decisions/INDEX.md +2 -0
  291. package/docs/distribution/awesome-list-submission.md +46 -0
  292. package/docs/distribution/launch-story-draft.md +58 -0
  293. package/docs/end-to-end-walkthroughs.md +2 -2
  294. package/docs/getting-started.md +2 -2
  295. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +24 -0
  296. package/docs/guidelines/agent-infra/corpus-grounding-authoring.md +1 -1
  297. package/docs/guidelines/agent-infra/linked-projects-onboarding-gate.md +2 -2
  298. package/docs/guidelines/agent-infra/missing-tool-handling.md +3 -3
  299. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +2 -2
  300. package/docs/guidelines/augment-portability-patterns.md +1 -1
  301. package/docs/guidelines/code-clarity.md +19 -0
  302. package/docs/guidelines/design-antipatterns-triggers.json +2 -1
  303. package/docs/guidelines/design-antipatterns.md +10 -1
  304. package/docs/guidelines/design-modes.md +6 -0
  305. package/docs/guidelines/php/general.md +9 -1
  306. package/docs/guidelines/php/php-coding-patterns.md +7 -0
  307. package/docs/guides/cross-repo-retrieval.md +1 -1
  308. package/docs/guides/frontend-design-corpus-refresh.md +2 -2
  309. package/docs/guides/local-analytics.md +4 -4
  310. package/docs/guides/skill-discovery.md +1 -1
  311. package/docs/guides/skill-preview.md +1 -1
  312. package/docs/hook-payload-capture.md +6 -6
  313. package/docs/install-friction-report.md +66 -0
  314. package/docs/installation.md +1 -1
  315. package/docs/maintainers/optional-media-deps.md +50 -0
  316. package/docs/mcp-server.md +11 -12
  317. package/docs/media/proof-demo.cast +14 -0
  318. package/docs/media/proof-demo.gif +0 -0
  319. package/docs/migration/consumer-template-consumption-model.md +1 -1
  320. package/docs/migration/divergences/bench-stats-float-precision.md +1 -1
  321. package/docs/migration/node-floor.md +1 -1
  322. package/docs/migration/yaml-roundtrip-spike.md +1 -1
  323. package/docs/personas.md +16 -5
  324. package/docs/positioning-evidence.md +86 -0
  325. package/docs/proof.md +86 -0
  326. package/docs/skills-catalog.md +1 -1
  327. package/docs/troubleshooting.md +8 -8
  328. package/docs/wedge/production-validator/README.md +57 -0
  329. package/docs/wedge/production-validator/production-validator.md +56 -0
  330. package/docs/wizard.md +2 -2
  331. package/package.json +1 -1
  332. package/src/config/agent-settings.template.yml +59 -4
  333. package/src/config/agents-paths.yml +254 -0
  334. package/src/config/budgets.yml +16 -0
  335. package/src/config/discovery/packs.yml +1 -0
  336. package/src/config/discovery/unassigned-artefacts.yml +2 -0
  337. package/src/config/gitignore-block.txt +25 -0
  338. package/src/config/host-capabilities.yml +31 -0
  339. package/src/config/profiles/balanced.ini +4 -0
  340. package/src/config/profiles/full.ini +4 -0
  341. package/src/config/profiles/minimal.ini +4 -0
  342. package/src/scripts/_cli/cmd_conformance.ts +716 -0
  343. package/src/scripts/_cli/cmd_doctor.ts +23 -2
  344. package/src/scripts/_cli/cmd_fleet.ts +401 -0
  345. package/src/scripts/_cli/cmd_preflight.ts +159 -0
  346. package/src/scripts/_dispatch.bash +10 -0
  347. package/src/scripts/_lib/knowledge_events.ts +193 -0
  348. package/src/scripts/_lib/subagent_steering.ts +115 -3
  349. package/src/scripts/_lib/text_similarity.ts +75 -0
  350. package/src/scripts/ai-video/test-pipeline.sh +1 -1
  351. package/src/scripts/ai_council/clients.ts +19 -3
  352. package/src/scripts/append_contested.ts +112 -0
  353. package/src/scripts/audit_auto_rules.ts +11 -1
  354. package/src/scripts/audit_mcp_tools.ts +25 -11
  355. package/src/scripts/bench_ab_v2_run.ts +527 -40
  356. package/src/scripts/bench_ab_v2_stats.ts +6 -0
  357. package/src/scripts/bench_matrix.ts +266 -0
  358. package/src/scripts/bootstrap_knowledge.ts +267 -0
  359. package/src/scripts/build_discovery_manifest.ts +42 -2
  360. package/src/scripts/build_proof.ts +214 -0
  361. package/src/scripts/check_always_budget.ts +3 -0
  362. package/src/scripts/check_augment_description_cap.ts +2 -2
  363. package/src/scripts/check_claims.ts +270 -0
  364. package/src/scripts/check_comparison.ts +79 -0
  365. package/src/scripts/check_generated_artefact_headers.ts +109 -0
  366. package/src/scripts/check_generator_output_coverage.ts +142 -0
  367. package/src/scripts/check_gitignore_freshness.ts +127 -0
  368. package/src/scripts/check_knowledge_pages.ts +210 -0
  369. package/src/scripts/check_knowledge_sharing.ts +162 -0
  370. package/src/scripts/check_media_deps.ts +91 -0
  371. package/src/scripts/check_memory_contradiction.ts +280 -0
  372. package/src/scripts/check_memory_similarity.ts +134 -0
  373. package/src/scripts/check_quality_regression.ts +56 -10
  374. package/src/scripts/check_references.ts +3 -1
  375. package/src/scripts/check_release_pr_shape.ts +4 -0
  376. package/src/scripts/check_site_links.ts +135 -0
  377. package/src/scripts/check_skill_gaps.ts +99 -0
  378. package/src/scripts/check_token_quality_golden.ts +197 -11
  379. package/src/scripts/check_tracked_but_ignored.ts +67 -0
  380. package/src/scripts/cluster_near_miss_patterns.ts +0 -0
  381. package/src/scripts/compile_router.ts +30 -3
  382. package/src/scripts/condense.ts +350 -14
  383. package/src/scripts/consolidate_knowledge_events.ts +192 -0
  384. package/src/scripts/degrade_to_pointer.ts +136 -0
  385. package/src/scripts/design_slop_rules.test.ts +15 -0
  386. package/src/scripts/design_slop_rules.ts +28 -0
  387. package/src/scripts/emit_knowledge_event.ts +158 -0
  388. package/src/scripts/export_replay_corpus.ts +187 -0
  389. package/src/scripts/external_sources_denylist.json +7 -2
  390. package/src/scripts/fold_intake.ts +281 -0
  391. package/src/scripts/generate_capability_matrix.ts +9 -1
  392. package/src/scripts/generate_knowledge_index.ts +222 -0
  393. package/src/scripts/hook_manifest.yaml +26 -14
  394. package/src/scripts/hooks/dispatch_hook.ts +18 -0
  395. package/src/scripts/hot_context_hook.ts +372 -0
  396. package/src/scripts/install +47 -0
  397. package/src/scripts/install-hooks.sh +17 -0
  398. package/src/scripts/inventory_meta_layers.ts +11 -0
  399. package/src/scripts/janitor.ts +258 -0
  400. package/src/scripts/lint_agents_layout.ts +74 -15
  401. package/src/scripts/lint_bench_ab.ts +4 -1
  402. package/src/scripts/lint_featured_skills.ts +0 -0
  403. package/src/scripts/lint_framework_leakage_allowlist.json +26 -3
  404. package/src/scripts/lint_knowledge_scale.ts +250 -0
  405. package/src/scripts/lint_legal_pack.ts +67 -0
  406. package/src/scripts/lint_persona_governance.ts +8 -3
  407. package/src/scripts/lint_regression.ts +15 -0
  408. package/src/scripts/lint_roadmap_blockers.ts +202 -0
  409. package/src/scripts/lint_roadmap_complexity.ts +81 -2
  410. package/src/scripts/lint_subagent_determinism.ts +125 -0
  411. package/src/scripts/measure_augment_budget.ts +46 -6
  412. package/src/scripts/measure_patterns.ts +4 -3
  413. package/src/scripts/measure_skill_reduction.ts +6 -6
  414. package/src/scripts/migration_status.ts +6 -2
  415. package/src/scripts/mine_missing_guardrails.ts +189 -0
  416. package/src/scripts/parity/phase_gate.ts +1 -1
  417. package/src/scripts/parity/replay.ts +21 -0
  418. package/src/scripts/project_thin_rules.ts +120 -16
  419. package/src/scripts/release.ts +39 -1
  420. package/src/scripts/render_benchmark_composite.ts +378 -0
  421. package/src/scripts/roadmap_progress_hook.ts +101 -43
  422. package/src/scripts/schemas/skill.schema.json +27 -0
  423. package/src/scripts/schemas/subagent.schema.json +106 -0
  424. package/src/scripts/skill_linter.ts +1 -0
  425. package/src/scripts/smoke/kernel.sh +5 -4
  426. package/src/scripts/surface-tiers.yml +1 -0
  427. package/src/scripts/sync_gitignore.ts +4 -0
  428. package/src/scripts/update_skill_candidates.ts +172 -0
  429. package/src/scripts/validate_frontmatter.ts +1 -0
@@ -46,6 +46,12 @@ const COMPARISONS: Array<[string, string, string]> = [
46
46
  // renders ONLY when a `package-recursive` arm is present — existing runs
47
47
  // (no such arm) are byte-identical, golden parity preserved.
48
48
  ['package-recursive', 'package', 'recursion novel lift (D₂ − D₁)'],
49
+ // Cost-factor sweep (2026-07): trimmed rule-subset arms vs vanilla — how
50
+ // much of the weak-host lift survives at a fraction of the loaded-context
51
+ // cost. Arm-guarded like the rows above: rendered only when present.
52
+ ['rules-kernel-dc', 'vanilla', 'kernel+downstream rules lift'],
53
+ ['rules-balanced', 'vanilla', 'balanced-profile rules lift'],
54
+ ['package', 'rules-kernel-dc', 'full package residual over kernel+downstream'],
49
55
  ];
50
56
 
51
57
  // ── CPython math.erf / math.comb ports ────────────────────────────────────
@@ -0,0 +1,266 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Bench matrix runner — road-to-flow-learnings Phase 3.
4
+ *
5
+ * Declares one matrix (task-family × host × arm) in a YAML file and expands
6
+ * it into the EXISTING `bench_ab_v2_run.ts` invocations — no new runner, no
7
+ * new science. The paired design is preserved by construction: all arms of a
8
+ * cell run inside ONE runner invocation (pairing happens per task inside the
9
+ * runner), so a cell = (host × family) and the arm axis rides along.
10
+ *
11
+ * Matrix YAML shape:
12
+ *
13
+ * families: [trapE, capH] # archetype values from the corpus
14
+ * hosts: [claude, codex]
15
+ * arms: [vanilla, package]
16
+ * seeds: 3
17
+ * model: claude-haiku-4-5
18
+ * budget: 1.0
19
+ *
20
+ * `--expand` (default) prints the deterministic invocation plan — one line
21
+ * per cell — and never spends. `--run` executes the cells sequentially
22
+ * (live API spend; operator-gated).
23
+ *
24
+ * Exit: 0 ok · 1 a live cell failed · 2 config error.
25
+ */
26
+
27
+ import { spawnSync } from 'node:child_process';
28
+ import * as fs from 'node:fs';
29
+ import * as path from 'node:path';
30
+ import process from 'node:process';
31
+ import { fileURLToPath, pathToFileURL } from 'node:url';
32
+
33
+ import { parse as parseYaml } from 'yaml';
34
+
35
+ import { ARMS, CODEX_VALID_ARMS } from './bench_ab_v2_run.js';
36
+
37
+ const _HERE = fileURLToPath(import.meta.url);
38
+ export const REPO_ROOT = path.resolve(path.dirname(_HERE), '..', '..');
39
+ const DEFAULT_CORPUS = path.join(REPO_ROOT, 'internal', 'bench', 'corpora', 'ab-trackb-v2.yaml');
40
+ const RUNNER = path.join(REPO_ROOT, 'src', 'scripts', 'bench_ab_v2_run.ts');
41
+
42
+ type Dict = Record<string, unknown>;
43
+
44
+ const VALID_HOSTS = ['claude', 'codex'] as const;
45
+
46
+ export interface MatrixSpec {
47
+ readonly families: readonly string[];
48
+ readonly hosts: readonly string[];
49
+ readonly arms: readonly string[];
50
+ readonly seeds: number;
51
+ readonly model: string;
52
+ readonly budget: number;
53
+ readonly timeout: number;
54
+ }
55
+
56
+ export class MatrixConfigError extends Error {}
57
+
58
+ function strList(obj: Dict, key: string): string[] {
59
+ const raw = obj[key];
60
+ if (!Array.isArray(raw) || raw.length === 0 || !raw.every((v) => typeof v === 'string')) {
61
+ throw new MatrixConfigError(`\`${key}\` must be a non-empty string list`);
62
+ }
63
+ return raw as string[];
64
+ }
65
+
66
+ /** Parse + validate the matrix YAML against the runner's own registries. */
67
+ export function parseMatrixSpec(text: string): MatrixSpec {
68
+ let raw: unknown;
69
+ try {
70
+ raw = parseYaml(text);
71
+ } catch (exc) {
72
+ throw new MatrixConfigError(`matrix config does not parse: ${(exc as Error).message}`);
73
+ }
74
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
75
+ throw new MatrixConfigError('matrix config must be a mapping');
76
+ }
77
+ const obj = raw as Dict;
78
+ const spec: MatrixSpec = {
79
+ families: strList(obj, 'families'),
80
+ hosts: strList(obj, 'hosts'),
81
+ arms: strList(obj, 'arms'),
82
+ seeds: typeof obj['seeds'] === 'number' ? (obj['seeds'] as number) : 3,
83
+ model: typeof obj['model'] === 'string' ? (obj['model'] as string) : 'claude-haiku-4-5',
84
+ budget: typeof obj['budget'] === 'number' ? (obj['budget'] as number) : 1.0,
85
+ timeout: typeof obj['timeout'] === 'number' ? (obj['timeout'] as number) : 180,
86
+ };
87
+ for (const h of spec.hosts) {
88
+ if (!VALID_HOSTS.includes(h as (typeof VALID_HOSTS)[number])) {
89
+ throw new MatrixConfigError(`unknown host '${h}' (valid: ${VALID_HOSTS.join(', ')})`);
90
+ }
91
+ }
92
+ for (const a of spec.arms) {
93
+ if (!(a in ARMS)) {
94
+ throw new MatrixConfigError(`unknown arm '${a}' (valid: ${Object.keys(ARMS).join(', ')})`);
95
+ }
96
+ }
97
+ if (spec.hosts.includes('codex')) {
98
+ for (const a of spec.arms) {
99
+ if (!CODEX_VALID_ARMS.includes(a)) {
100
+ throw new MatrixConfigError(
101
+ `arm '${a}' is not valid for host codex (valid: ${CODEX_VALID_ARMS.join(', ')})`,
102
+ );
103
+ }
104
+ }
105
+ }
106
+ if (!Number.isInteger(spec.seeds) || spec.seeds < 1) {
107
+ throw new MatrixConfigError('`seeds` must be a positive integer');
108
+ }
109
+ return spec;
110
+ }
111
+
112
+ /** Group corpus task ids by archetype (the family axis). */
113
+ export function familyTaskIds(corpusText: string): Map<string, string[]> {
114
+ const corpus = parseYaml(corpusText, { version: '1.1' }) as Dict | null;
115
+ const tasks = Array.isArray(corpus?.['tasks']) ? (corpus?.['tasks'] as Dict[]) : [];
116
+ const out = new Map<string, string[]>();
117
+ for (const t of tasks) {
118
+ const family = String(t['archetype'] ?? '');
119
+ const id = String(t['id'] ?? '');
120
+ if (!family || !id) continue;
121
+ const list = out.get(family) ?? [];
122
+ list.push(id);
123
+ out.set(family, list);
124
+ }
125
+ return out;
126
+ }
127
+
128
+ /** One expanded cell — a single runner invocation covering all matrix arms. */
129
+ export interface MatrixCell {
130
+ readonly host: string;
131
+ readonly family: string;
132
+ readonly taskIds: readonly string[];
133
+ readonly argv: readonly string[];
134
+ }
135
+
136
+ /**
137
+ * Deterministic expansion: cells in (host, family) document order. Throws
138
+ * {@link MatrixConfigError} when a family matches zero corpus tasks — a
139
+ * silent empty cell would read as coverage that never ran.
140
+ */
141
+ export function expandMatrix(spec: MatrixSpec, corpusText: string, mode: 'dry-run' | 'live'): MatrixCell[] {
142
+ const byFamily = familyTaskIds(corpusText);
143
+ const cells: MatrixCell[] = [];
144
+ for (const host of spec.hosts) {
145
+ for (const family of spec.families) {
146
+ const taskIds = byFamily.get(family) ?? [];
147
+ if (taskIds.length === 0) {
148
+ throw new MatrixConfigError(
149
+ `family '${family}' matches no corpus task (known: ${[...byFamily.keys()].join(', ')})`,
150
+ );
151
+ }
152
+ cells.push({
153
+ host,
154
+ family,
155
+ taskIds,
156
+ argv: [
157
+ RUNNER,
158
+ '--arms', spec.arms.join(','),
159
+ '--tasks', taskIds.join(','),
160
+ '--seeds', String(spec.seeds),
161
+ '--model', spec.model,
162
+ '--budget', String(spec.budget),
163
+ '--timeout', String(spec.timeout),
164
+ '--host', host,
165
+ '--mode', mode,
166
+ ],
167
+ });
168
+ }
169
+ }
170
+ return cells;
171
+ }
172
+
173
+ /** One line per cell — the snapshot-tested plan format. */
174
+ export function planLines(cells: readonly MatrixCell[]): string[] {
175
+ return cells.map(
176
+ (c) =>
177
+ `cell host=${c.host} family=${c.family} tasks=${c.taskIds.length} :: ` +
178
+ `bench_ab_v2_run ${c.argv.slice(1).join(' ')}`,
179
+ );
180
+ }
181
+
182
+ const USAGE =
183
+ 'usage: bench_matrix [-h] --config matrix.yaml [--corpus PATH] [--expand | --run]\n';
184
+
185
+ export function main(argv: string[] | null = null): number {
186
+ const args = argv !== null ? Array.from(argv) : process.argv.slice(2);
187
+ let configPath: string | null = null;
188
+ let corpusPath = DEFAULT_CORPUS;
189
+ let run = false;
190
+ let i = 0;
191
+ while (i < args.length) {
192
+ const a = args[i] as string;
193
+ if (a === '-h' || a === '--help') {
194
+ process.stdout.write(USAGE);
195
+ return 0;
196
+ }
197
+ if (a === '--run') {
198
+ run = true;
199
+ } else if (a === '--expand') {
200
+ run = false;
201
+ } else if (a === '--config' || a.startsWith('--config=')) {
202
+ configPath = a.includes('=') ? a.slice(a.indexOf('=') + 1) : String(args[(i += 1)] ?? '');
203
+ } else if (a === '--corpus' || a.startsWith('--corpus=')) {
204
+ corpusPath = a.includes('=') ? a.slice(a.indexOf('=') + 1) : String(args[(i += 1)] ?? '');
205
+ } else {
206
+ process.stderr.write(USAGE);
207
+ process.stderr.write(`bench_matrix: error: unrecognized argument ${a}\n`);
208
+ return 2;
209
+ }
210
+ i += 1;
211
+ }
212
+ if (!configPath || !fs.existsSync(configPath)) {
213
+ process.stderr.write(USAGE);
214
+ process.stderr.write('bench_matrix: error: --config path missing or not found\n');
215
+ return 2;
216
+ }
217
+ if (!fs.existsSync(corpusPath)) {
218
+ process.stderr.write(`bench_matrix: error: corpus not found: ${corpusPath}\n`);
219
+ return 2;
220
+ }
221
+ let cells: MatrixCell[];
222
+ try {
223
+ const spec = parseMatrixSpec(fs.readFileSync(configPath, 'utf-8'));
224
+ cells = expandMatrix(spec, fs.readFileSync(corpusPath, 'utf-8'), run ? 'live' : 'dry-run');
225
+ } catch (exc) {
226
+ if (exc instanceof MatrixConfigError) {
227
+ process.stderr.write(`bench_matrix: error: ${exc.message}\n`);
228
+ return 2;
229
+ }
230
+ throw exc;
231
+ }
232
+
233
+ for (const line of planLines(cells)) {
234
+ process.stdout.write(`${line}\n`);
235
+ }
236
+ if (!run) {
237
+ process.stdout.write(`bench_matrix: EXPAND — ${cells.length} cell(s). No spend.\n`);
238
+ return 0;
239
+ }
240
+ // Live execution: sequential by design — the runner already parallelises
241
+ // nothing internally, and live bench spend must stay easy to abort.
242
+ for (const [idx, cell] of cells.entries()) {
243
+ process.stderr.write(`bench_matrix: [${idx + 1}/${cells.length}] host=${cell.host} family=${cell.family}\n`);
244
+ const proc = spawnSync(process.execPath, ['--import', 'tsx', ...cell.argv], {
245
+ stdio: 'inherit',
246
+ cwd: REPO_ROOT,
247
+ });
248
+ if (proc.status !== 0) {
249
+ process.stderr.write(
250
+ `bench_matrix: cell failed (exit ${proc.status}) — aborting remaining cells\n`,
251
+ );
252
+ return 1;
253
+ }
254
+ }
255
+ process.stdout.write(`bench_matrix: ${cells.length} cell(s) complete.\n`);
256
+ return 0;
257
+ }
258
+
259
+ // --- CLI entry ---
260
+
261
+ const _isCliEntry =
262
+ process.argv[1] !== undefined &&
263
+ import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
264
+ if (_isCliEntry || process.argv[1] === _HERE) {
265
+ process.exitCode = main(process.argv.slice(2));
266
+ }
@@ -0,0 +1,267 @@
1
+ #!/usr/bin/env tsx
2
+ /**
3
+ * Project familiarization bootstrap — road-to-knowledge-system Phase 6.
4
+ * Deterministic, static-analysis-only seed for a fresh consumer project:
5
+ * scans directory NAMES and known config FILENAMES only — never reads file
6
+ * CONTENTS beyond the project's own manifest files, so secrets/PII/business
7
+ * logic can never leak into the staged output by construction (the same
8
+ * exclusion-by-construction principle as PII-safe log schemas: a script that
9
+ * cannot read arbitrary file bodies has no redaction pass to fail).
10
+ *
11
+ * Every detected fact carries an evidence pointer (the path that proves it).
12
+ * Every inferential line (a suggestion the human still has to confirm) is
13
+ * marked `[HUMAN: verify]` — this script never invents a claim.
14
+ *
15
+ * Output goes to a GITIGNORED staging directory, never directly to
16
+ * `agents/knowledge/`. The `/team-knowledge bootstrap` command reviews the
17
+ * staged pages with the user before moving anything into the tracked tree.
18
+ *
19
+ * Usage:
20
+ * bootstrap_knowledge.ts [--dir <repo-root>] [--staging-dir <dir>]
21
+ *
22
+ * Exit codes: 0 = staged, 1 = usage error.
23
+ */
24
+ import * as fs from 'node:fs';
25
+ import * as path from 'node:path';
26
+ import process from 'node:process';
27
+ import { fileURLToPath } from 'node:url';
28
+
29
+ const PROG = 'bootstrap_knowledge.ts';
30
+ const DEFAULT_STAGING_DIR = path.join('agents', '.bootstrap-staging');
31
+
32
+ // Directory names never worth surfacing as "project structure" — build
33
+ // output, dependency caches, and VCS internals.
34
+ const NOISE_DIRS = new Set([
35
+ 'node_modules', 'vendor', '.git', 'dist', 'build', '.next', '.nuxt',
36
+ 'coverage', '.venv', 'venv', '__pycache__', '.turbo', '.cache',
37
+ ]);
38
+
39
+ interface ManifestSignal {
40
+ ecosystem: string;
41
+ file: string;
42
+ }
43
+
44
+ const MANIFEST_FILES: ManifestSignal[] = [
45
+ { ecosystem: 'Node/JS/TS', file: 'package.json' },
46
+ { ecosystem: 'PHP/Composer', file: 'composer.json' },
47
+ { ecosystem: 'Python', file: 'pyproject.toml' },
48
+ { ecosystem: 'Python (legacy)', file: 'requirements.txt' },
49
+ { ecosystem: 'Go', file: 'go.mod' },
50
+ { ecosystem: 'Ruby', file: 'Gemfile' },
51
+ { ecosystem: 'Rust', file: 'Cargo.toml' },
52
+ ];
53
+
54
+ // Per standards-from-config's own detection list — existence only, never content.
55
+ const STANDARDS_CONFIG_FILES = [
56
+ '.editorconfig', '.eslintrc.json', '.eslintrc.js', 'eslint.config.js',
57
+ '.prettierrc', '.prettierrc.json', 'biome.json', 'tsconfig.json',
58
+ 'pint.json', '.php-cs-fixer.dist.php', 'phpcs.xml',
59
+ 'ruff.toml', 'setup.cfg', '.rubocop.yml', '.golangci.yml',
60
+ ];
61
+
62
+ const TEST_CONFIG_FILES = [
63
+ 'jest.config.js', 'jest.config.ts', 'vitest.config.ts', 'vitest.config.js',
64
+ 'phpunit.xml', 'phpunit.xml.dist', 'pytest.ini', 'pest.config.php',
65
+ ];
66
+
67
+ export interface DetectedFact {
68
+ label: string;
69
+ evidence: string; // the file/dir path proving this fact
70
+ }
71
+
72
+ export interface BootstrapResult {
73
+ manifests: DetectedFact[];
74
+ topLevelDirs: DetectedFact[];
75
+ standardsConfigs: DetectedFact[];
76
+ testConfigs: DetectedFact[];
77
+ }
78
+
79
+ function exists(p: string): boolean {
80
+ try {
81
+ fs.accessSync(p);
82
+ return true;
83
+ } catch {
84
+ return false;
85
+ }
86
+ }
87
+
88
+ /** Pure detection over a given root — filenames and directory names only, never file content. */
89
+ export function detect(root: string): BootstrapResult {
90
+ const manifests: DetectedFact[] = [];
91
+ for (const m of MANIFEST_FILES) {
92
+ if (exists(path.join(root, m.file))) manifests.push({ label: m.ecosystem, evidence: m.file });
93
+ }
94
+
95
+ let topLevelDirs: DetectedFact[] = [];
96
+ try {
97
+ topLevelDirs = fs
98
+ .readdirSync(root, { withFileTypes: true })
99
+ .filter((e) => e.isDirectory() && !e.name.startsWith('.') && !NOISE_DIRS.has(e.name))
100
+ .map((e) => ({ label: e.name, evidence: `${e.name}/` }))
101
+ .sort((a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0));
102
+ } catch {
103
+ topLevelDirs = [];
104
+ }
105
+
106
+ const standardsConfigs = STANDARDS_CONFIG_FILES.filter((f) => exists(path.join(root, f))).map((f) => ({
107
+ label: f,
108
+ evidence: f,
109
+ }));
110
+
111
+ const testConfigs = TEST_CONFIG_FILES.filter((f) => exists(path.join(root, f))).map((f) => ({
112
+ label: f,
113
+ evidence: f,
114
+ }));
115
+
116
+ return { manifests, topLevelDirs, standardsConfigs, testConfigs };
117
+ }
118
+
119
+ function renderStructurePage(result: BootstrapResult): string {
120
+ const lines: string[] = [
121
+ '---',
122
+ 'type: concept',
123
+ '---',
124
+ '',
125
+ '# Project Structure',
126
+ '',
127
+ '_Staged by `src/scripts/bootstrap_knowledge.ts` — review before committing._',
128
+ '',
129
+ '## Detected package manifests',
130
+ '',
131
+ ];
132
+ if (result.manifests.length === 0) {
133
+ lines.push('- No known manifest file found. `[HUMAN: verify]` — name the ecosystem.');
134
+ } else {
135
+ for (const m of result.manifests) lines.push(`- ${m.label} (\`${m.evidence}\`)`);
136
+ }
137
+ lines.push('', '## Top-level directories', '');
138
+ if (result.topLevelDirs.length === 0) {
139
+ lines.push('- None detected.');
140
+ } else {
141
+ for (const d of result.topLevelDirs) {
142
+ lines.push(`- \`${d.evidence}\` — \`[HUMAN: verify]\` purpose/ownership`);
143
+ }
144
+ }
145
+ lines.push('');
146
+ return lines.join('\n');
147
+ }
148
+
149
+ function renderStandardsPage(result: BootstrapResult): string {
150
+ const lines: string[] = [
151
+ '---',
152
+ 'type: concept',
153
+ '---',
154
+ '',
155
+ '# Coding Standards (config-derived seed)',
156
+ '',
157
+ '_Staged by `src/scripts/bootstrap_knowledge.ts` — this lists WHICH config',
158
+ 'files exist, not their content. Run `standards-from-config` for the full',
159
+ 'pointer+digest derivation before relying on this page._',
160
+ '',
161
+ ];
162
+ if (result.standardsConfigs.length === 0) {
163
+ lines.push('- No recognized lint/format config found. `[HUMAN: verify]`.');
164
+ } else {
165
+ for (const c of result.standardsConfigs) lines.push(`- \`${c.evidence}\` present — \`[HUMAN: verify]\` derive the actual rule via \`standards-from-config\``);
166
+ }
167
+ lines.push('', '## Test framework', '');
168
+ if (result.testConfigs.length === 0) {
169
+ lines.push('- No recognized test config found. `[HUMAN: verify]`.');
170
+ } else {
171
+ for (const t of result.testConfigs) lines.push(`- \`${t.evidence}\` present`);
172
+ }
173
+ lines.push('');
174
+ return lines.join('\n');
175
+ }
176
+
177
+ const MODULES_PAGE = [
178
+ '---',
179
+ 'type: concept',
180
+ '---',
181
+ '',
182
+ '# Module Structure',
183
+ '',
184
+ '_Staged by `src/scripts/bootstrap_knowledge.ts` as an EMPTY seed — module',
185
+ 'boundaries require reading actual code, which this deterministic bootstrap',
186
+ 'never does. Run `module-detect-on-the-fly` to fill this in, or delete this',
187
+ 'page if the project has no module system._',
188
+ '',
189
+ '`[HUMAN: verify]` — run module-detect-on-the-fly and fill this page in.',
190
+ '',
191
+ ].join('\n');
192
+
193
+ const API_CONVENTIONS_PAGE = [
194
+ '---',
195
+ 'type: procedure',
196
+ '---',
197
+ '',
198
+ '# API Conventions',
199
+ '',
200
+ '_Staged by `src/scripts/bootstrap_knowledge.ts` as an EMPTY seed — API shapes',
201
+ 'are learned from real request/response observation (`api_shape_learned`',
202
+ 'events), which this deterministic bootstrap never fabricates._',
203
+ '',
204
+ '`[HUMAN: verify]` — this page fills in as `api_shape_learned` events',
205
+ 'consolidate, or via manual documentation.',
206
+ '',
207
+ ].join('\n');
208
+
209
+ const COMMON_MISTAKES_PAGE = [
210
+ '---',
211
+ 'type: session',
212
+ '---',
213
+ '',
214
+ '# Common Mistakes',
215
+ '',
216
+ '_Staged by `src/scripts/bootstrap_knowledge.ts` as an EMPTY seed — this fills',
217
+ 'in from `mistake_made` events as the team works, never fabricated up front._',
218
+ '',
219
+ ].join('\n');
220
+
221
+ export function stagePages(root: string, stagingDir: string): void {
222
+ const result = detect(root);
223
+ fs.mkdirSync(path.join(stagingDir, 'concepts'), { recursive: true });
224
+ fs.mkdirSync(path.join(stagingDir, 'procedures'), { recursive: true });
225
+ fs.mkdirSync(path.join(stagingDir, 'sessions'), { recursive: true });
226
+
227
+ fs.writeFileSync(path.join(stagingDir, 'concepts', 'structure.md'), renderStructurePage(result), 'utf8');
228
+ fs.writeFileSync(path.join(stagingDir, 'concepts', 'standards.md'), renderStandardsPage(result), 'utf8');
229
+ fs.writeFileSync(path.join(stagingDir, 'concepts', 'modules.md'), MODULES_PAGE, 'utf8');
230
+ fs.writeFileSync(path.join(stagingDir, 'procedures', 'api-conventions.md'), API_CONVENTIONS_PAGE, 'utf8');
231
+ fs.writeFileSync(path.join(stagingDir, 'sessions', 'common-mistakes.md'), COMMON_MISTAKES_PAGE, 'utf8');
232
+ }
233
+
234
+ function printUsage(): void {
235
+ process.stdout.write(`usage: ${PROG} [--dir DIR] [--staging-dir DIR]\n`);
236
+ }
237
+
238
+ export function main(argv: string[]): number {
239
+ let dir = process.cwd();
240
+ let stagingDir = DEFAULT_STAGING_DIR;
241
+
242
+ for (let i = 0; i < argv.length; i++) {
243
+ const arg = argv[i];
244
+ if (arg === '-h' || arg === '--help') {
245
+ printUsage();
246
+ return 0;
247
+ } else if (arg === '--dir') {
248
+ dir = argv[++i] ?? dir;
249
+ } else if (arg === '--staging-dir') {
250
+ stagingDir = argv[++i] ?? stagingDir;
251
+ } else {
252
+ process.stderr.write(`${PROG}: error: unrecognized argument: ${arg}\n`);
253
+ printUsage();
254
+ return 1;
255
+ }
256
+ }
257
+
258
+ stagePages(dir, stagingDir);
259
+ process.stdout.write(
260
+ `${PROG}: staged 5 template page(s) under ${stagingDir}/ — review before moving into agents/knowledge/.\n`,
261
+ );
262
+ return 0;
263
+ }
264
+
265
+ if (fileURLToPath(import.meta.url) === path.resolve(process.argv[1] ?? '')) {
266
+ process.exit(main(process.argv.slice(2)));
267
+ }
@@ -152,7 +152,7 @@ const _TRUST_REQ = ['level', 'confidence', 'human_review_required'] as const;
152
152
  const _INSTALL_REQ = ['default', 'removable'] as const;
153
153
  const _LIFECYCLE_VALUES = ['active', 'experimental', 'deprecated', 'archived'] as const;
154
154
  const _TRUST_VALUES = ['core', 'professional', 'experimental', 'advisory', 'restricted'] as const;
155
- const _CATEGORY_VALUES = ['skill', 'rule', 'command', 'template'] as const;
155
+ const _CATEGORY_VALUES = ['skill', 'rule', 'command', 'template', 'subagent'] as const;
156
156
 
157
157
  // build_discovery_manifest._FRONTMATTER_RE (imported from validate_frontmatter
158
158
  // in Python; the literal pattern is `^---\n(.*?)\n---\n` with re.DOTALL).
@@ -164,6 +164,7 @@ const _CATEGORY_SCHEMA: Record<string, string> = {
164
164
  skill: 'skill',
165
165
  rule: 'rule',
166
166
  command: 'command',
167
+ subagent: 'subagent',
167
168
  };
168
169
 
169
170
  // --- Filesystem helpers reproducing pathlib semantics ------------------------
@@ -414,6 +415,14 @@ function* _iter_artefacts(): Generator<[string, string]> {
414
415
  }
415
416
  yield [p, 'template'];
416
417
  }
418
+ // ADR-109: subagents are the 5th discovery category. Appended last so the
419
+ // existing skills→rules→commands→templates ordering is undisturbed. They
420
+ // carry the minimal subagent-v1 schema (no workspaces/packs/install); the
421
+ // `_classify` subagent branch derives the manifest payload (default-off,
422
+ // packs:[]) — static projection only, never runtime-dispatched.
423
+ for (const p of _collect('subagents', '*.md')) {
424
+ yield [p, 'subagent'];
425
+ }
417
426
  }
418
427
 
419
428
  function _trusted(p: string): boolean {
@@ -450,10 +459,41 @@ function _classify(
450
459
  fm: JsonObject | null,
451
460
  wsIds: Set<string>,
452
461
  packIds: Set<string>,
462
+ category?: string,
453
463
  ): [JsonObject | null, string | null] {
454
464
  if (fm === null) {
455
465
  return [null, 'missing or unparseable frontmatter'];
456
466
  }
467
+ // ADR-109 (Option B): subagents do NOT carry workspaces/packs/install — their
468
+ // schema is deliberately minimal and they are default-off, opt-in-by-name
469
+ // (never pack-scoped). Derive the manifest payload from the subagent-v1
470
+ // fields instead of the pack/workspace contract. `packs: []` is legitimate
471
+ // ("recommended for no one"); manifest consumers guard against empty packs.
472
+ if (category === 'subagent') {
473
+ const lc = fm['lifecycle'];
474
+ if (!(_LIFECYCLE_VALUES as readonly Json[]).includes(lc)) {
475
+ return [null, `lifecycle: invalid value '${String(lc)}'`];
476
+ }
477
+ const trust = fm['trust'];
478
+ if (!_isObject(trust) || _TRUST_REQ.some((k) => !(k in trust))) {
479
+ return [null, `trust: missing required key(s) ${_pyTupleRepr(_TRUST_REQ)}`];
480
+ }
481
+ if (!(_TRUST_VALUES as readonly Json[]).includes(trust['level'])) {
482
+ return [null, `trust.level: invalid '${String(trust['level'])}'`];
483
+ }
484
+ const payload: JsonObject = {
485
+ workspaces: [],
486
+ packs: [],
487
+ lifecycle: lc,
488
+ trust: {
489
+ level: trust['level'],
490
+ confidence: trust['confidence'],
491
+ human_review_required: trust['human_review_required'],
492
+ },
493
+ install: { default: false, removable: true },
494
+ };
495
+ return [payload, null];
496
+ }
457
497
  const missing = _FM_KEYS.filter((k) => !(k in fm));
458
498
  if (missing.length > 0) {
459
499
  return [null, `missing required key(s): ${missing.join(', ')}`];
@@ -596,7 +636,7 @@ function _build(strict: boolean): [JsonObject, JsonObject[]] {
596
636
  continue;
597
637
  }
598
638
  const fm = _parse(p, category);
599
- const [payload, reason] = _classify(fm, wsIds, packIds);
639
+ const [payload, reason] = _classify(fm, wsIds, packIds, category);
600
640
  if (reason !== null) {
601
641
  unassigned.push({ path: rel, category, reason });
602
642
  continue;