@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
@@ -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('');
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * A4 — Ablation-mining (learning-loop #1). Correlate rule *absence* with failure
4
+ * across INDEPENDENT runs (distinct `work_id`) and surface *missing-guardrail*
5
+ * candidates for the human to promote via `learning-to-rule-or-skill`.
6
+ *
7
+ * Read-only over `audit-log-v1` (`agents/runtime/state/audit/*.jsonl`). Raw
8
+ * counts only — NO auto-promotion, NO mutation. Correlation, not causation:
9
+ * every candidate carries the confounding caveat. A candidate is a *question*
10
+ * for a human, never an answer.
11
+ *
12
+ * Signal (per phase P, rule R):
13
+ * - `success_with_rule` = success lines in P where R ∈ rules_applied
14
+ * - `failure_without_rule` = blocked/error lines in P where R ∉ rules_applied
15
+ * R is a candidate when its absence co-occurs with failure often enough
16
+ * (`failure_without_rule` ≥ --min-count, over ≥2 distinct failing work_ids)
17
+ * AND R is otherwise a success-associated rule in P (`success_with_rule` ≥ 1).
18
+ *
19
+ * Exit 0 always (an empty audit log is a valid state, not an error).
20
+ */
21
+ import * as fs from 'node:fs';
22
+ import * as path from 'node:path';
23
+ import { fileURLToPath, pathToFileURL } from 'node:url';
24
+
25
+ const _HERE = fileURLToPath(import.meta.url);
26
+ export const ROOT = path.resolve(path.dirname(_HERE), '..', '..');
27
+ export const DEFAULT_AUDIT_DIR = path.join(ROOT, 'agents', 'runtime', 'state', 'audit');
28
+ export const SCHEMA_VERSION = 1;
29
+ const FAILURE_OUTCOMES = new Set(['blocked', 'error']);
30
+
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ type Rec = Record<string, any>;
33
+
34
+ /** Read audit-log-v1 phase records from `*.jsonl` (or one `<month>.jsonl`). */
35
+ export function loadRecords(auditDir: string, month: string | null = null): Rec[] {
36
+ const out: Rec[] = [];
37
+ let files: string[];
38
+ if (month) {
39
+ files = [path.join(auditDir, `${month}.jsonl`)];
40
+ } else {
41
+ let names: string[] = [];
42
+ try {
43
+ names = fs.readdirSync(auditDir);
44
+ } catch {
45
+ return out;
46
+ }
47
+ files = names.filter((n) => n.endsWith('.jsonl')).sort().map((n) => path.join(auditDir, n));
48
+ }
49
+ for (const p of files) {
50
+ let text: string;
51
+ try {
52
+ text = fs.readFileSync(p, 'utf-8');
53
+ } catch {
54
+ continue;
55
+ }
56
+ for (const raw of text.split('\n')) {
57
+ const line = raw.trim();
58
+ if (!line) continue;
59
+ let rec: Rec;
60
+ try {
61
+ rec = JSON.parse(line) as Rec;
62
+ } catch {
63
+ continue;
64
+ }
65
+ if (rec.schema_version !== SCHEMA_VERSION) continue;
66
+ if (rec.type === 'supersede' || rec.type === 'note') continue;
67
+ if (typeof rec.phase !== 'string' || typeof rec.outcome !== 'string') continue;
68
+ if (!Array.isArray(rec.rules_applied)) continue;
69
+ out.push(rec);
70
+ }
71
+ }
72
+ return out;
73
+ }
74
+
75
+ export interface Candidate {
76
+ phase: string;
77
+ rule: string;
78
+ success_with_rule: number;
79
+ failure_without_rule: number;
80
+ failure_work_ids: string[];
81
+ success_without_rule: number;
82
+ failure_with_rule: number;
83
+ }
84
+
85
+ export function mineCandidates(records: Rec[], minCount: number): Candidate[] {
86
+ const phases = new Set<string>();
87
+ const rules = new Set<string>();
88
+ for (const r of records) {
89
+ phases.add(r.phase as string);
90
+ for (const rule of r.rules_applied as string[]) rules.add(rule);
91
+ }
92
+ const out: Candidate[] = [];
93
+ for (const phase of [...phases].sort()) {
94
+ const inPhase = records.filter((r) => r.phase === phase);
95
+ for (const rule of [...rules].sort()) {
96
+ let succWith = 0;
97
+ let succWithout = 0;
98
+ let failWith = 0;
99
+ const failWithoutIds = new Set<string>();
100
+ for (const r of inPhase) {
101
+ const has = (r.rules_applied as string[]).includes(rule);
102
+ const isSuccess = r.outcome === 'success';
103
+ const isFailure = FAILURE_OUTCOMES.has(r.outcome as string);
104
+ if (isSuccess && has) succWith += 1;
105
+ else if (isSuccess && !has) succWithout += 1;
106
+ else if (isFailure && has) failWith += 1;
107
+ else if (isFailure && !has) {
108
+ failWithoutIds.add(typeof r.work_id === 'string' ? r.work_id : (r.id as string));
109
+ }
110
+ }
111
+ const failWithout = failWithoutIds.size;
112
+ // Candidate: absence co-occurs with failure across ≥2 distinct runs,
113
+ // and the rule is otherwise success-associated in this phase.
114
+ if (failWithout >= minCount && failWithout >= 2 && succWith >= 1) {
115
+ out.push({
116
+ phase,
117
+ rule,
118
+ success_with_rule: succWith,
119
+ failure_without_rule: failWithout,
120
+ failure_work_ids: [...failWithoutIds].sort(),
121
+ success_without_rule: succWithout,
122
+ failure_with_rule: failWith,
123
+ });
124
+ }
125
+ }
126
+ }
127
+ // Strongest signal first: most distinct failing runs, then most successes-with.
128
+ out.sort(
129
+ (a, b) =>
130
+ b.failure_without_rule - a.failure_without_rule ||
131
+ b.success_with_rule - a.success_with_rule ||
132
+ (a.phase < b.phase ? -1 : a.phase > b.phase ? 1 : a.rule < b.rule ? -1 : 1),
133
+ );
134
+ return out;
135
+ }
136
+
137
+ const CONFOUND_NOTE =
138
+ 'Correlation, NOT causation. A rule absent from failing runs may reflect the ' +
139
+ 'task type or phase shape, not a missing guardrail. Low N inflates noise. ' +
140
+ 'Each candidate is a question for a human — promote (or reject) only via ' +
141
+ 'learning-to-rule-or-skill. Never auto-add a rule from this output.';
142
+
143
+ export function main(argv: string[] = process.argv.slice(2)): number {
144
+ let auditDir = DEFAULT_AUDIT_DIR;
145
+ let month: string | null = null;
146
+ let minCount = 2;
147
+ let asJson = false;
148
+ for (let i = 0; i < argv.length; i += 1) {
149
+ const a = argv[i];
150
+ if (a === '--audit-dir') auditDir = argv[++i] ?? auditDir;
151
+ else if (a === '--month') month = argv[++i] ?? null;
152
+ else if (a === '--min-count') minCount = parseInt(argv[++i] ?? '2', 10) || 2;
153
+ else if (a === '--json') asJson = true;
154
+ }
155
+ const records = loadRecords(auditDir, month);
156
+ const candidates = mineCandidates(records, minCount);
157
+ if (asJson) {
158
+ process.stdout.write(
159
+ JSON.stringify(
160
+ { schema_version: SCHEMA_VERSION, records: records.length, min_count: minCount, confounding: CONFOUND_NOTE, candidates },
161
+ null,
162
+ 2,
163
+ ) + '\n',
164
+ );
165
+ return 0;
166
+ }
167
+ if (records.length === 0) {
168
+ process.stdout.write('missing-guardrails: no audit-log-v1 records found (nothing to mine).\n');
169
+ return 0;
170
+ }
171
+ if (candidates.length === 0) {
172
+ process.stdout.write(`missing-guardrails: ${records.length} record(s), 0 candidates (min-count ${minCount}).\n`);
173
+ return 0;
174
+ }
175
+ process.stdout.write(`missing-guardrails: ${candidates.length} candidate(s) from ${records.length} record(s):\n\n`);
176
+ for (const c of candidates) {
177
+ process.stdout.write(
178
+ ` [${c.phase}] rule '${c.rule}' — absent in ${c.failure_without_rule} failing run(s), ` +
179
+ `present in ${c.success_with_rule} success(es). ` +
180
+ `(fail-with-rule ${c.failure_with_rule}, success-without ${c.success_without_rule})\n`,
181
+ );
182
+ }
183
+ process.stdout.write(`\n⚠️ ${CONFOUND_NOTE}\n`);
184
+ return 0;
185
+ }
186
+
187
+ const _isCli =
188
+ process.argv[1] !== undefined && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
189
+ if (_isCli) process.exit(main());
@@ -2,7 +2,7 @@
2
2
  /**
3
3
  * phase_gate.ts — Python→TypeScript migration phase gate.
4
4
  *
5
- * Phase 1 Step 10 of `agents/roadmaps/road-to-typescript-only-scripts.md`.
5
+ * Phase 1 Step 10 of `agents/roadmaps/archive/road-to-typescript-only-scripts.md`.
6
6
  *
7
7
  * Reads `src/scripts/parity/phase-manifest.json` and enforces:
8
8
  *
@@ -196,6 +196,27 @@ export function runReplay(options: ReplayOptions): ReplayReport {
196
196
  const tsScript = `${scriptBase}.ts`;
197
197
  const tsxCommand = resolveTsxCommand(cwd);
198
198
 
199
+ // Local python-skip guard (teardown D2): the replay harness is migration
200
+ // tooling — it byte-compares a live `python3 <script>.py` run against the
201
+ // tsx twin, which requires BOTH the runtime and the original `.py` to
202
+ // exist. Post-teardown neither holds; fail fast with a clear message
203
+ // instead of a spawn error, so the python-free-env shim retirement does
204
+ // not depend on porting this harness to a frozen-golden design.
205
+ if (spawnSync("python3", ["--version"], { encoding: "utf8" }).status !== 0) {
206
+ return {
207
+ script: options.script,
208
+ status: "fail",
209
+ cases: options.caseDirs.map((caseDir) => ({
210
+ caseDir,
211
+ diffs: [],
212
+ error:
213
+ "python3 unavailable — the golden-replay harness needs the pre-teardown " +
214
+ "python runtime plus the original .py; freeze the baseline to a TS golden " +
215
+ "instead (teardown D2 medium-term).",
216
+ })),
217
+ };
218
+ }
219
+
199
220
  const cases: CaseResult[] = [];
200
221
  for (const caseDirRaw of options.caseDirs) {
201
222
  const caseDir = path.resolve(cwd, caseDirRaw);