@event4u/agent-config 3.3.0 → 4.2.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 (561) hide show
  1. package/.agent-src/README.md +2 -2
  2. package/.agent-src/commands/agent-handoff.md +31 -2
  3. package/.agent-src/commands/agent-status.md +5 -5
  4. package/.agent-src/commands/agents/audit.md +8 -8
  5. package/.agent-src/commands/agents/init.md +25 -1
  6. package/.agent-src/commands/agents/optimize.md +3 -3
  7. package/.agent-src/commands/agents/user.md +1 -1
  8. package/.agent-src/commands/agents.md +1 -1
  9. package/.agent-src/commands/analyze-reference-repo.md +1 -1
  10. package/.agent-src/commands/check-current-md.md +8 -8
  11. package/.agent-src/commands/{compress.md → condense.md} +55 -55
  12. package/.agent-src/commands/context/create.md +7 -4
  13. package/.agent-src/commands/context/refactor.md +3 -1
  14. package/.agent-src/commands/feature/dev.md +1 -1
  15. package/.agent-src/commands/feature/explore.md +1 -1
  16. package/.agent-src/commands/feature/plan.md +10 -8
  17. package/.agent-src/commands/feature/refactor.md +3 -1
  18. package/.agent-src/commands/feature/roadmap.md +7 -4
  19. package/.agent-src/commands/fix/portability.md +3 -3
  20. package/.agent-src/commands/fix/refs.md +4 -4
  21. package/.agent-src/commands/ghostwriter.md +2 -2
  22. package/.agent-src/commands/memory/learn-low-impact.md +3 -3
  23. package/.agent-src/commands/module/explore.md +34 -8
  24. package/.agent-src/commands/optimize/agents-dir.md +9 -7
  25. package/.agent-src/commands/optimize/augmentignore.md +2 -2
  26. package/.agent-src/commands/optimize/skills.md +9 -9
  27. package/.agent-src/commands/post-as.md +1 -1
  28. package/.agent-src/commands/project-analyze.md +2 -2
  29. package/.agent-src/commands/project-health.md +3 -2
  30. package/.agent-src/commands/research/deep.md +1 -1
  31. package/.agent-src/commands/research/report.md +1 -1
  32. package/.agent-src/commands/research.md +1 -1
  33. package/.agent-src/commands/roadmap/ai-council.md +1 -1
  34. package/.agent-src/commands/roadmap/create.md +9 -4
  35. package/.agent-src/commands/rule-compliance-audit.md +1 -1
  36. package/.agent-src/commands/upstream-contribute.md +14 -14
  37. package/.agent-src/commands/video/from-script.md +1 -1
  38. package/.agent-src/commands/video/scene.md +1 -1
  39. package/.agent-src/commands/video/stitch.md +1 -1
  40. package/.agent-src/commands/video/storyboard.md +1 -1
  41. package/.agent-src/commands/video.md +1 -1
  42. package/.agent-src/contexts/augment-infrastructure.md +1 -1
  43. package/.agent-src/contexts/authority/commit-mechanics.md +15 -0
  44. package/.agent-src/contexts/authority/kernel-rule-edits.md +3 -3
  45. package/.agent-src/contexts/authority/scope-mechanics.md +1 -1
  46. package/.agent-src/contexts/communication/rules-auto/augment-source-of-truth-mechanics.md +28 -28
  47. package/.agent-src/contexts/communication/rules-auto/skill-quality-mechanics.md +4 -4
  48. package/.agent-src/contexts/communication/rules-auto/think-before-action-mechanics.md +2 -2
  49. package/.agent-src/contexts/contracts/artifact-engagement-flow.md +6 -6
  50. package/.agent-src/contexts/contracts/command-suggestion-flow.md +3 -3
  51. package/.agent-src/contexts/contracts/emergency-triage-block.md +4 -4
  52. package/.agent-src/contexts/contracts/frugality-charter.md +3 -3
  53. package/.agent-src/contexts/documentation-hierarchy.md +14 -7
  54. package/.agent-src/contexts/execution/autonomy-examples.md +1 -1
  55. package/.agent-src/contexts/execution/cheap-question-mechanics.md +39 -2
  56. package/.agent-src/contexts/execution/roadmap-process-loop.md +28 -5
  57. package/.agent-src/contexts/override-system.md +5 -5
  58. package/.agent-src/ghostwriter/fictional-fixture-v1.md +1 -1
  59. package/.agent-src/personas/advisors/first-principles.md +1 -1
  60. package/.agent-src/personas/hollywood-director.md +1 -1
  61. package/.agent-src/rules/architecture.md +5 -1
  62. package/.agent-src/rules/augment-edit-discipline.md +5 -5
  63. package/.agent-src/rules/augment-source-of-truth.md +15 -15
  64. package/.agent-src/rules/commit-conventions.md +1 -1
  65. package/.agent-src/rules/commit-policy.md +10 -0
  66. package/.agent-src/rules/domain-adoption-policy.md +3 -3
  67. package/.agent-src/rules/fast-path-marker-visibility.md +3 -3
  68. package/.agent-src/rules/finance-safety-floor.md +1 -1
  69. package/.agent-src/rules/framework-neutrality-in-generic-skills.md +8 -8
  70. package/.agent-src/rules/git-history-discipline.md +1 -1
  71. package/.agent-src/rules/improve-before-implement.md +2 -2
  72. package/.agent-src/rules/language-and-tone.md +2 -2
  73. package/.agent-src/rules/media-governance-routing.md +5 -5
  74. package/.agent-src/rules/no-attribution-footers.md +1 -0
  75. package/.agent-src/rules/no-cheap-questions.md +3 -0
  76. package/.agent-src/rules/no-decorative-emojis-in-git-surfaces.md +111 -0
  77. package/.agent-src/rules/no-pr-progress-comments.md +118 -0
  78. package/.agent-src/rules/no-roadmap-references.md +3 -3
  79. package/.agent-src/rules/non-destructive-by-default.md +1 -1
  80. package/.agent-src/rules/persona-governance.md +3 -3
  81. package/.agent-src/rules/preservation-guard.md +15 -15
  82. package/.agent-src/rules/roadmap-ci-steps-policy.md +7 -3
  83. package/.agent-src/rules/rule-type-governance.md +1 -1
  84. package/.agent-src/rules/skill-quality.md +1 -1
  85. package/.agent-src/rules/{caveman-speak.md → telegraph-speak.md} +15 -15
  86. package/.agent-src/rules/token-optimizer-maintenance.md +6 -6
  87. package/.agent-src/skills/agent-docs-writing/SKILL.md +17 -11
  88. package/.agent-src/skills/agents-md-thin-root/SKILL.md +9 -9
  89. package/.agent-src/skills/check-refs/SKILL.md +2 -2
  90. package/.agent-src/skills/code-refactoring/SKILL.md +2 -2
  91. package/.agent-src/skills/command-writing/SKILL.md +19 -19
  92. package/.agent-src/skills/comp-banding/SKILL.md +1 -1
  93. package/.agent-src/skills/condense-memory/SKILL.md +131 -0
  94. package/.agent-src/skills/context-authoring/SKILL.md +2 -2
  95. package/.agent-src/skills/context-document/SKILL.md +5 -3
  96. package/.agent-src/skills/copilot-agents-optimization/SKILL.md +3 -3
  97. package/.agent-src/skills/description-assist/SKILL.md +2 -2
  98. package/.agent-src/skills/git-workflow/SKILL.md +1 -1
  99. package/.agent-src/skills/guideline-writing/SKILL.md +5 -5
  100. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +4 -4
  101. package/.agent-src/skills/lint-skills/SKILL.md +3 -3
  102. package/.agent-src/skills/md-language-check/SKILL.md +2 -2
  103. package/.agent-src/skills/module-detect-on-the-fly/SKILL.md +138 -0
  104. package/.agent-src/skills/module-management/SKILL.md +166 -94
  105. package/.agent-src/skills/override-management/SKILL.md +1 -1
  106. package/.agent-src/skills/persona-writing/SKILL.md +5 -5
  107. package/.agent-src/skills/positioning-strategy/SKILL.md +1 -1
  108. package/.agent-src/skills/project-docs/SKILL.md +6 -4
  109. package/.agent-src/skills/readme-reviewer/SKILL.md +2 -2
  110. package/.agent-src/skills/roadmap-management/SKILL.md +13 -1
  111. package/.agent-src/skills/roadmap-writing/SKILL.md +4 -2
  112. package/.agent-src/skills/rule-refactor/SKILL.md +5 -5
  113. package/.agent-src/skills/rule-writing/SKILL.md +18 -18
  114. package/.agent-src/skills/script-writing/SKILL.md +1 -1
  115. package/.agent-src/skills/skill-improvement-pipeline/SKILL.md +6 -6
  116. package/.agent-src/skills/skill-management/SKILL.md +21 -21
  117. package/.agent-src/skills/skill-reviewer/SKILL.md +2 -2
  118. package/.agent-src/skills/skill-writing/SKILL.md +8 -8
  119. package/.agent-src/skills/skill-writing/evals/triggers.json +1 -1
  120. package/.agent-src/skills/token-optimizer/SKILL.md +4 -4
  121. package/.agent-src/skills/unit-economics-modeling/SKILL.md +1 -1
  122. package/.agent-src/skills/upstream-contribute/SKILL.md +17 -17
  123. package/.agent-src/templates/AGENTS.md +1 -0
  124. package/.agent-src/templates/agent-settings.md +24 -13
  125. package/.agent-src/templates/agents/agent-project-settings.example.yml +61 -2
  126. package/.agent-src/templates/command.md +5 -5
  127. package/.agent-src/templates/contexts.md +1 -1
  128. package/.agent-src/templates/copilot-instructions.md +8 -8
  129. package/.agent-src/templates/features.md +1 -1
  130. package/.agent-src/templates/hooks/pre-commit-frontmatter +2 -2
  131. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +3 -3
  132. package/.agent-src/templates/persona.md +2 -2
  133. package/.agent-src/templates/roadmaps.md +1 -1
  134. package/.agent-src/templates/rule.md +13 -13
  135. package/.agent-src/templates/scripts/memory_lookup.py +1 -1
  136. package/.agent-src/templates/scripts/memory_status.py +2 -2
  137. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +195 -1
  138. package/.agent-src/templates/scripts/work_engine/orchestration.py +1 -1
  139. package/.agent-src/templates/skill-archive-note.md +5 -5
  140. package/.agent-src/templates/skill.md +1 -1
  141. package/.claude-plugin/marketplace.json +4 -4
  142. package/AGENTS.md +16 -17
  143. package/CHANGELOG.md +216 -3
  144. package/CONTRIBUTING.md +31 -12
  145. package/README.md +21 -12
  146. package/config/agent-settings.template.yml +22 -2
  147. package/config/discovery/unassigned-artefacts.yml +24 -24
  148. package/config/profiles/full.ini +1 -1
  149. package/dist/cli/agent-config.js +52 -3
  150. package/dist/cli/agent-config.js.map +1 -1
  151. package/dist/cli/commands/uiServe.js +9 -0
  152. package/dist/cli/commands/uiServe.js.map +1 -1
  153. package/dist/cli/registry.js +2 -1
  154. package/dist/cli/registry.js.map +1 -1
  155. package/dist/discovery/deprecation-report.md +1 -1
  156. package/dist/discovery/discovery-manifest.json +649 -606
  157. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  158. package/dist/discovery/discovery-manifest.summary.md +4 -4
  159. package/dist/discovery/orphan-report.md +1 -1
  160. package/dist/discovery/packs.json +439 -437
  161. package/dist/discovery/trust-report.md +5 -5
  162. package/dist/discovery/workspaces.json +450 -448
  163. package/dist/install/atomic.js +92 -0
  164. package/dist/install/atomic.js.map +1 -0
  165. package/dist/install/conflict.js +196 -0
  166. package/dist/install/conflict.js.map +1 -0
  167. package/dist/install/detect.js +218 -0
  168. package/dist/install/detect.js.map +1 -0
  169. package/dist/install/paths.js +82 -0
  170. package/dist/install/paths.js.map +1 -0
  171. package/dist/install/plan.js +157 -0
  172. package/dist/install/plan.js.map +1 -0
  173. package/dist/install/txlog.js +140 -0
  174. package/dist/install/txlog.js.map +1 -0
  175. package/dist/install/types.js +19 -0
  176. package/dist/install/types.js.map +1 -0
  177. package/dist/install/wizard-plan.js +184 -0
  178. package/dist/install/wizard-plan.js.map +1 -0
  179. package/dist/mcp/registry-manifest.json +4 -4
  180. package/dist/router.json +67 -19
  181. package/dist/server/app.js +6 -0
  182. package/dist/server/app.js.map +1 -1
  183. package/dist/server/routes/install.js +358 -0
  184. package/dist/server/routes/install.js.map +1 -0
  185. package/dist/server/routes/wizard.js +468 -32
  186. package/dist/server/routes/wizard.js.map +1 -1
  187. package/dist/server/routes/workspace.js +396 -0
  188. package/dist/server/routes/workspace.js.map +1 -0
  189. package/dist/server/schemas/settings.js +5 -3
  190. package/dist/server/schemas/settings.js.map +1 -1
  191. package/dist/ui/assets/index-BDAhhpDV.js +40 -0
  192. package/dist/ui/assets/index-BDAhhpDV.js.map +1 -0
  193. package/dist/ui/assets/index-BXZILUxe.css +1 -0
  194. package/dist/ui/index.html +2 -2
  195. package/docs/MIGRATION.md +1 -1
  196. package/docs/adrs/cost/0001-hard-stop-hook.md +1 -1
  197. package/docs/adrs/router/0001-three-tier-routing.md +4 -4
  198. package/docs/adrs/schema/0001-json-schema-frontmatter.md +1 -1
  199. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +4 -4
  200. package/docs/adrs/{caveman → telegraph}/0001-default-off-until-bench.md +9 -9
  201. package/docs/adrs/telegraph/README.md +9 -0
  202. package/docs/architecture/augment-projection.md +4 -4
  203. package/docs/architecture/claude-bundle.md +1 -1
  204. package/docs/architecture/current-onboard-baseline.md +3 -3
  205. package/docs/architecture/multi-tool-projection.md +10 -10
  206. package/docs/architecture/source-projection.md +27 -27
  207. package/docs/architecture.md +19 -15
  208. package/docs/archive/CHANGELOG-pre-2.11.0.md +2 -2
  209. package/docs/archive/CHANGELOG-pre-2.15.0.md +3 -3
  210. package/docs/archive/CHANGELOG-pre-2.16.0.md +1 -1
  211. package/docs/archive/CHANGELOG-pre-2.2.0.md +70 -70
  212. package/docs/archive/CHANGELOG-pre-2.20.0.md +2 -2
  213. package/docs/archive/CHANGELOG-pre-2.25.0.md +15 -15
  214. package/docs/archive/CHANGELOG-pre-3.0.0.md +4 -4
  215. package/docs/archive/CHANGELOG-pre-3.1.0.md +2 -2
  216. package/docs/archive/CHANGELOG-pre-3.2.0.md +3 -3
  217. package/docs/benchmark.md +65 -0
  218. package/docs/benchmarks.md +16 -16
  219. package/docs/catalog.md +17 -15
  220. package/docs/contracts/CHANGELOG-conventions.md +1 -1
  221. package/docs/contracts/STABILITY.md +2 -2
  222. package/docs/contracts/adoption-signal-floor.md +110 -0
  223. package/docs/contracts/adr-chat-history-split.md +4 -4
  224. package/docs/contracts/adr-command-suggestion.md +4 -4
  225. package/docs/contracts/adr-gtm-context-spine.md +1 -1
  226. package/docs/contracts/adr-implement-ticket-runtime.md +4 -4
  227. package/docs/contracts/adr-install-user-type-axis.md +1 -1
  228. package/docs/contracts/adr-layout.md +2 -2
  229. package/docs/contracts/adr-product-ui-track.md +10 -10
  230. package/docs/contracts/adr-user-types-axis.md +3 -3
  231. package/docs/contracts/adr-wing4-context-spine.md +1 -1
  232. package/docs/contracts/agent-memory-contract.md +3 -3
  233. package/docs/contracts/agents-md-tech-stack.md +2 -2
  234. package/docs/contracts/ai-council-config.md +2 -2
  235. package/docs/contracts/at-rest-encryption.md +4 -0
  236. package/docs/contracts/audit-log-v1.md +1 -1
  237. package/docs/contracts/benchmark-ab-contract.md +101 -0
  238. package/docs/contracts/benchmark-corpus-spec.md +1 -1
  239. package/docs/contracts/branch-protection-policy.md +98 -0
  240. package/docs/contracts/ci-cost-budget.md +106 -0
  241. package/docs/contracts/ci-green-floor.md +141 -0
  242. package/docs/contracts/command-clusters.md +6 -6
  243. package/docs/contracts/command-surface-tiers.md +2 -2
  244. package/docs/contracts/command-taxonomy.md +2 -2
  245. package/docs/contracts/{compression-default-kill-criterion.md → condensation-default-kill-criterion.md} +29 -29
  246. package/docs/contracts/config-presets.md +1 -1
  247. package/docs/contracts/context-paths.md +3 -3
  248. package/docs/contracts/context-spine.md +1 -1
  249. package/docs/contracts/cost-summary-schema.md +12 -12
  250. package/docs/contracts/cross-wing-handoff.md +4 -4
  251. package/docs/contracts/daily-workspace.md +4 -0
  252. package/docs/contracts/decision-trace-v1.md +2 -2
  253. package/docs/contracts/discovery-manifest.md +4 -4
  254. package/docs/contracts/explain-modes.md +4 -0
  255. package/docs/contracts/file-ownership-matrix.json +3493 -3318
  256. package/docs/contracts/file-ownership-matrix.md +3 -3
  257. package/docs/contracts/frontmatter-contract.md +4 -4
  258. package/docs/contracts/ghostwriter-schema.md +3 -3
  259. package/docs/contracts/gui-wizard.md +110 -97
  260. package/docs/contracts/harness-expectations.md +123 -0
  261. package/docs/contracts/host-agent-protocol.md +4 -0
  262. package/docs/contracts/implement-ticket-flow.md +9 -9
  263. package/docs/contracts/install-scopes.md +77 -0
  264. package/docs/contracts/iron-law-overrides.txt +1 -1
  265. package/docs/contracts/kernel-membership.md +26 -26
  266. package/docs/contracts/linear-ai-rules-inclusion.md +1 -1
  267. package/docs/contracts/linter-structural-model.md +2 -2
  268. package/docs/contracts/load-context-budget-model.md +4 -4
  269. package/docs/contracts/load-context-schema.md +13 -13
  270. package/docs/contracts/local-analytics.md +4 -0
  271. package/docs/contracts/local-knowledge-ingestion.md +1 -1
  272. package/docs/contracts/mcp-cloud-scope.md +2 -2
  273. package/docs/contracts/mcp-phase-1-scope.md +3 -3
  274. package/docs/contracts/measurement-baseline.md +5 -5
  275. package/docs/contracts/mental-models.md +30 -30
  276. package/docs/contracts/multi-tool-projection-fidelity.md +4 -4
  277. package/docs/contracts/namespace.md +4 -4
  278. package/docs/contracts/orchestration-dsl-v1.md +7 -7
  279. package/docs/contracts/package-self-orientation.md +12 -12
  280. package/docs/contracts/persona-schema.md +6 -6
  281. package/docs/contracts/pilot/language-and-tone.md +1 -1
  282. package/docs/contracts/plain-language-surface.md +117 -0
  283. package/docs/contracts/profile-system.md +3 -3
  284. package/docs/contracts/release-pr-gating.md +103 -0
  285. package/docs/contracts/role-experience.md +3 -3
  286. package/docs/contracts/rule-classification.md +13 -13
  287. package/docs/contracts/rule-interactions.md +4 -4
  288. package/docs/contracts/rule-interactions.yml +30 -30
  289. package/docs/contracts/rule-priority-hierarchy.md +13 -13
  290. package/docs/contracts/rule-router.md +2 -2
  291. package/docs/contracts/safety-model.md +1 -1
  292. package/docs/contracts/skill-distribution-channels.md +61 -0
  293. package/docs/contracts/skill-domains.md +2 -2
  294. package/docs/contracts/smoke-contracts.md +5 -5
  295. package/docs/contracts/telegraph-telemetry.md +83 -0
  296. package/docs/contracts/trust-and-safety.md +5 -5
  297. package/docs/contracts/ui-stack-extension.md +7 -7
  298. package/docs/contracts/ui-track-flow.md +9 -9
  299. package/docs/contracts/user-type-schema.md +4 -4
  300. package/docs/contracts/workflow-packs.md +4 -4
  301. package/docs/contracts/workspace-documents.md +4 -0
  302. package/docs/customization.md +28 -8
  303. package/docs/decisions/ADR-001-kernel-swap-deferred.md +6 -6
  304. package/docs/decisions/ADR-002-kernel-bucket-overrides.md +11 -11
  305. package/docs/decisions/ADR-003-flat-cluster-subs-and-colon-syntax.md +2 -2
  306. package/docs/decisions/ADR-004-rule-governance-pruning.md +4 -4
  307. package/docs/decisions/ADR-005-subagent-worktrees.md +7 -7
  308. package/docs/decisions/ADR-011-domain-pack-readiness.md +6 -6
  309. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +3 -3
  310. package/docs/decisions/ADR-015-discovery-manifest-contract.md +3 -3
  311. package/docs/decisions/ADR-017-monorepo-physical-layout.md +10 -10
  312. package/docs/decisions/ADR-018-trust-and-safety-layer.md +6 -6
  313. package/docs/decisions/ADR-019-router-json-dist-location.md +2 -2
  314. package/docs/decisions/ADR-020-global-only-consumer-scope.md +2 -2
  315. package/docs/decisions/ADR-021-deployment-shape.md +3 -3
  316. package/docs/decisions/ADR-022-daily-workspace-decomposition.md +1 -1
  317. package/docs/decisions/ADR-027-changelog-machine-vs-manual.md +2 -2
  318. package/docs/decisions/ADR-028-root-layout.md +7 -7
  319. package/docs/decisions/ADR-029-multi-workspace-deferred.md +2 -2
  320. package/docs/decisions/ADR-rule-kernel-and-router.md +5 -5
  321. package/docs/deploy/connector-setup.md +2 -2
  322. package/docs/deploy/policy-cookbook.md +2 -2
  323. package/docs/deploy/team-deployment-posture.md +20 -0
  324. package/docs/development.md +17 -17
  325. package/docs/distribution/registries.md +32 -0
  326. package/docs/distribution/registry-submissions.md +85 -0
  327. package/docs/distribution/telemetry-schema.md +1 -1
  328. package/docs/getting-started-by-role.md +45 -3
  329. package/docs/getting-started.md +2 -2
  330. package/docs/guidelines/agent-infra/5w2h-analysis.md +3 -3
  331. package/docs/guidelines/agent-infra/ask-when-uncertain-demos.md +1 -1
  332. package/docs/guidelines/agent-infra/asking-and-brevity-examples.md +3 -3
  333. package/docs/guidelines/agent-infra/carve-out-predicates.md +3 -3
  334. package/docs/guidelines/agent-infra/critical-thinking.md +4 -4
  335. package/docs/guidelines/agent-infra/direct-answers-demos.md +1 -1
  336. package/docs/guidelines/agent-infra/first-principles.md +2 -2
  337. package/docs/guidelines/agent-infra/inversion-thinking.md +5 -5
  338. package/docs/guidelines/agent-infra/layered-settings.md +56 -2
  339. package/docs/guidelines/agent-infra/mental-models.md +3 -3
  340. package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -2
  341. package/docs/guidelines/agent-infra/rule-type-governance.md +1 -1
  342. package/docs/guidelines/agent-infra/scqa-framework.md +5 -5
  343. package/docs/guidelines/agent-infra/self-improvement-pipeline.md +2 -2
  344. package/docs/guidelines/agent-infra/six-hats.md +3 -3
  345. package/docs/guidelines/agent-infra/skill-quality-checklist.md +5 -5
  346. package/docs/guidelines/agent-infra/systems-thinking.md +1 -1
  347. package/docs/guidelines/agent-infra/verify-before-complete-demos.md +1 -1
  348. package/docs/guidelines/augment-portability-patterns.md +4 -4
  349. package/docs/guidelines/cross-role-handoff.md +2 -2
  350. package/docs/guidelines/php/php-coding-patterns.md +1 -1
  351. package/docs/guidelines/prompt-templates.md +6 -6
  352. package/docs/maintainers/dev-mode.md +1 -1
  353. package/docs/mcp.md +1 -1
  354. package/docs/parity/bench.json +3 -3
  355. package/docs/parity/ruflo.md +2 -2
  356. package/docs/profiles.md +11 -11
  357. package/docs/quality.md +11 -11
  358. package/docs/safety.md +3 -3
  359. package/docs/setup/mcp-client-config.md +1 -1
  360. package/docs/setup/mcp-r2-bootstrap.md +1 -1
  361. package/docs/setup/mcp-server-docker.md +3 -3
  362. package/docs/setup/per-ide/windsurf.md +1 -1
  363. package/docs/skills-catalog.md +8 -7
  364. package/docs/troubleshooting.md +1 -1
  365. package/docs/walkthroughs/daily-workspace-a11y.md +87 -0
  366. package/llms.txt +7 -6
  367. package/package.json +1 -1
  368. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  369. package/scripts/_archive/README.md +2 -2
  370. package/scripts/_archive/_backfill_skill_domains.py +3 -3
  371. package/scripts/_archive/_bootstrap_tier_frontmatter.py +3 -3
  372. package/scripts/_archive/_p43_bodies.py +10 -10
  373. package/scripts/_archive/{_p43_compress.py → _p43_condense.py} +5 -5
  374. package/scripts/_archive/_p4_migrate.py +7 -7
  375. package/scripts/_archive/_phase2_shim_helper.py +1 -1
  376. package/scripts/_archive/_pilot_council_question.py +5 -5
  377. package/scripts/_cli/explain_last/inputs.py +1 -1
  378. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  379. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  380. package/scripts/_lib/agent_settings.py +195 -1
  381. package/scripts/_lib/agent_src.py +19 -19
  382. package/scripts/_lib/bench_ab_cache.py +162 -0
  383. package/scripts/_lib/bench_ab_scoring.py +209 -0
  384. package/scripts/_lib/{bench_caveman.py → bench_telegraph.py} +21 -21
  385. package/scripts/_lib/{bench_caveman_report.py → bench_telegraph_report.py} +21 -21
  386. package/scripts/_lib/claude_desktop_bundler.py +5 -5
  387. package/scripts/_lib/module_detection.py +223 -0
  388. package/scripts/_lib/scope_guard.sh +162 -0
  389. package/scripts/_phase4_bucket.py +3 -3
  390. package/scripts/_pilot_measure.py +4 -4
  391. package/scripts/_tmp_scan_framework_leakage.py +1 -1
  392. package/scripts/adoption_report.py +195 -0
  393. package/scripts/adoption_snapshot.py +219 -0
  394. package/scripts/adoption_status.py +166 -0
  395. package/scripts/ai-video/lib/parse-blueprint.sh +1 -1
  396. package/scripts/ai_council/advisors.py +5 -5
  397. package/scripts/ai_council/compile_corpus.py +1 -1
  398. package/scripts/ai_council/one_off_archive/2026-05/_one_off_budget_v2_audit.py +3 -3
  399. package/scripts/ai_council/one_off_archive/2026-05/_one_off_context_layer_v1_review.py +2 -2
  400. package/scripts/ai_council/one_off_archive/2026-05/_one_off_inject_quiet_flag.py +1 -1
  401. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_v2.sh +1 -1
  402. package/scripts/ai_council/one_off_archive/2026-05/_one_off_measure_verbosity.sh +1 -1
  403. package/scripts/ai_council/one_off_archive/2026-05/_one_off_nondestructive_inline_audit.py +3 -3
  404. package/scripts/ai_council/one_off_archive/2026-05/_one_off_per_task.sh +1 -1
  405. package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase6_trigger_jaccard.py +1 -1
  406. package/scripts/ai_council/one_off_archive/2026-05/_one_off_phase_2a_budget_rebalance.py +6 -6
  407. package/scripts/ai_council/one_off_archive/2026-05/_one_off_rebalancing_audit.py +1 -1
  408. package/scripts/ai_council/one_off_archive/2026-05/_one_off_tier_retrofit.py +6 -6
  409. package/scripts/annotate_discovery.py +13 -13
  410. package/scripts/apply_modules_config.py +290 -0
  411. package/scripts/audit_adr_coverage.py +2 -2
  412. package/scripts/audit_auto_rules.py +2 -2
  413. package/scripts/audit_cloud_compatibility.py +3 -3
  414. package/scripts/audit_command_surface.py +9 -9
  415. package/scripts/audit_likelihood.py +2 -2
  416. package/scripts/audit_user_type_axis.py +2 -2
  417. package/scripts/bench_ab_cache_dispatch.py +68 -0
  418. package/scripts/bench_ab_clone.py +170 -0
  419. package/scripts/bench_ab_diff.py +227 -0
  420. package/scripts/bench_ab_integrity.py +143 -0
  421. package/scripts/bench_ab_run.py +235 -0
  422. package/scripts/bench_ab_task_runner.py +369 -0
  423. package/scripts/bench_ab_tracka_run.py +202 -0
  424. package/scripts/{bench_compress_memory.py → bench_condense_memory.py} +16 -16
  425. package/scripts/bench_run.py +33 -33
  426. package/scripts/bench_runner.py +2 -2
  427. package/scripts/bootstrap.sh +99 -0
  428. package/scripts/build_cloud_bundle.py +6 -6
  429. package/scripts/build_discovery_manifest.py +7 -7
  430. package/scripts/build_linear_digest.py +3 -3
  431. package/scripts/build_rule_trigger_matrix.py +8 -8
  432. package/scripts/chat_history.py +5 -5
  433. package/scripts/check_always_budget.py +11 -5
  434. package/scripts/check_augment_description_cap.py +3 -3
  435. package/scripts/check_cluster_patterns.py +2 -2
  436. package/scripts/check_command_count_messaging.py +3 -3
  437. package/scripts/{check_compression.py → check_condensation.py} +34 -34
  438. package/scripts/{check_compressed_paths.py → check_condensed_paths.py} +8 -8
  439. package/scripts/check_context_paths.py +7 -7
  440. package/scripts/check_council_layout.py +2 -2
  441. package/scripts/check_council_references.py +9 -9
  442. package/scripts/check_iron_law_prominence.py +2 -2
  443. package/scripts/check_kernel_rule_bundle.py +2 -2
  444. package/scripts/check_module_management_neutral.py +149 -0
  445. package/scripts/check_no_roadmap_refs.py +9 -9
  446. package/scripts/check_portability.py +3 -3
  447. package/scripts/check_public_catalog_links.py +4 -4
  448. package/scripts/check_references.py +7 -6
  449. package/scripts/check_release_pr_shape.py +112 -0
  450. package/scripts/check_reply_consistency.py +3 -3
  451. package/scripts/check_safety_floor_untouched.py +1 -1
  452. package/scripts/check_template_pin_drift.py +5 -5
  453. package/scripts/check_token_optimizer_freshness.py +3 -3
  454. package/scripts/ci_status.py +301 -0
  455. package/scripts/ci_time_ratio.py +1 -1
  456. package/scripts/cleanup_other_scope.sh +146 -0
  457. package/scripts/compile_router.py +10 -10
  458. package/scripts/{compress.py → condense.py} +64 -64
  459. package/scripts/condense.sh +18 -0
  460. package/scripts/{compress_memory.py → condense_memory.py} +33 -33
  461. package/scripts/config/presets.py +2 -2
  462. package/scripts/config/profiles.py +1 -1
  463. package/scripts/cost_by_conversation.py +3 -3
  464. package/scripts/cost_summary.py +7 -7
  465. package/scripts/count_token_optimizer_usage.sh +1 -1
  466. package/scripts/gen_discovery_baseline.py +5 -5
  467. package/scripts/generate_index.py +6 -6
  468. package/scripts/generate_ownership_matrix.py +10 -10
  469. package/scripts/generate_pack_manifests.py +1 -1
  470. package/scripts/ghostwriter_fixture_allowlist.txt +1 -1
  471. package/scripts/install +3 -3
  472. package/scripts/install-hooks.sh +6 -6
  473. package/scripts/install.py +273 -45
  474. package/scripts/install.sh +187 -1
  475. package/scripts/inventory_frontmatter.py +2 -2
  476. package/scripts/iron_law_sha.py +3 -3
  477. package/scripts/lint_agents_layout.py +14 -7
  478. package/scripts/lint_agents_md.py +4 -4
  479. package/scripts/lint_archived_skills.py +3 -3
  480. package/scripts/lint_artefact_frontmatter.py +2 -2
  481. package/scripts/lint_bench_ab.py +172 -0
  482. package/scripts/lint_bench_corpus.py +1 -1
  483. package/scripts/lint_command_tiers.py +5 -5
  484. package/scripts/lint_context_spine_usage.py +1 -1
  485. package/scripts/lint_framework_leakage.py +7 -7
  486. package/scripts/lint_framework_leakage_allowlist.json +152 -84
  487. package/scripts/lint_ghostwriter_source.py +3 -3
  488. package/scripts/lint_handoffs.py +1 -1
  489. package/scripts/lint_load_context.py +11 -11
  490. package/scripts/lint_media_policy_linkage.py +5 -5
  491. package/scripts/lint_namespace.py +1 -1
  492. package/scripts/lint_no_new_atomic_commands.py +2 -2
  493. package/scripts/lint_orchestration_dsl.py +1 -1
  494. package/scripts/lint_pack_boundaries.py +2 -2
  495. package/scripts/lint_persona_governance.py +4 -4
  496. package/scripts/lint_role_experiences.py +237 -0
  497. package/scripts/lint_rule_interactions.py +2 -2
  498. package/scripts/lint_rule_tiers.py +1 -1
  499. package/scripts/lint_trust_coherence.py +2 -2
  500. package/scripts/mcp_registry_submit.sh +187 -0
  501. package/scripts/mcp_server/tools.py +1 -1
  502. package/scripts/measure_frugality_savings.py +10 -10
  503. package/scripts/measure_patterns.py +1 -1
  504. package/scripts/measure_projection_bytes.py +5 -5
  505. package/scripts/measure_rule_budget.py +3 -3
  506. package/scripts/measure_skill_reduction.py +1 -1
  507. package/scripts/memory_lookup.py +1 -1
  508. package/scripts/memory_status.py +2 -2
  509. package/scripts/migrate_command_suggestions.py +3 -3
  510. package/scripts/mine_session.py +1 -1
  511. package/scripts/move_artefact.py +3 -3
  512. package/scripts/new_skill.py +2 -2
  513. package/scripts/pack_mcp_content.py +9 -9
  514. package/scripts/plan_physical_move.py +6 -6
  515. package/scripts/print_required_checks.py +196 -0
  516. package/scripts/probe_skill_registration.py +413 -0
  517. package/scripts/propose_modules_config.py +145 -0
  518. package/scripts/prototype_lint_contradictions.py +1 -1
  519. package/scripts/recruit_preflight.sh +152 -0
  520. package/scripts/refine_ticket_detect.py +3 -3
  521. package/scripts/release.py +20 -0
  522. package/scripts/render_benchmark_md.py +308 -0
  523. package/scripts/roadmap_progress_hook.py +1 -1
  524. package/scripts/run_skill_evals.py +2 -2
  525. package/scripts/runtime_registry.py +4 -4
  526. package/scripts/schemas/command.schema.json +4 -4
  527. package/scripts/schemas/rule.schema.json +5 -5
  528. package/scripts/schemas/skill.schema.json +3 -3
  529. package/scripts/schemas/user-type.schema.json +1 -1
  530. package/scripts/score_skill_selection.py +1 -1
  531. package/scripts/skill_collision_clusters.py +2 -2
  532. package/scripts/skill_linter.py +81 -81
  533. package/scripts/skill_overlap.py +5 -5
  534. package/scripts/skill_tools/audit_persona_coverage.py +2 -2
  535. package/scripts/skill_tools/audit_user_type_coverage.py +2 -2
  536. package/scripts/skill_tools/run_block_d_eval.py +1 -1
  537. package/scripts/skill_tools/score_skill_relevance.py +1 -1
  538. package/scripts/skill_tools/suggest_skill_for_task.py +1 -1
  539. package/scripts/skill_trigger_eval.py +3 -3
  540. package/scripts/smoke/kernel.sh +7 -1
  541. package/scripts/smoke/router.sh +5 -5
  542. package/scripts/smoke/skills.sh +1 -1
  543. package/scripts/smoke_quickstart.py +1 -1
  544. package/scripts/snapshot_agent_outputs.py +3 -3
  545. package/scripts/spotcheck_thin_root.py +1 -1
  546. package/scripts/{caveman_stats.py → telegraph_stats.py} +18 -18
  547. package/scripts/update_counts.py +1 -1
  548. package/scripts/validate_decision_engine.py +1 -1
  549. package/scripts/validate_frontmatter.py +1 -1
  550. package/scripts/validate_safe_paths.py +3 -3
  551. package/scripts/{validate_caveman_carveouts.py → validate_telegraph_carveouts.py} +7 -7
  552. package/scripts/verify_roadmap_closure.py +6 -6
  553. package/templates/consumer-settings/ONBOARDING.md +41 -0
  554. package/.agent-src/commands/install-via-agent.md +0 -129
  555. package/.agent-src/skills/compress-memory/SKILL.md +0 -131
  556. package/dist/ui/assets/index-D-DY1ywI.js +0 -35
  557. package/dist/ui/assets/index-D-DY1ywI.js.map +0 -1
  558. package/dist/ui/assets/index-Dqfhmg-d.css +0 -1
  559. package/docs/adrs/caveman/README.md +0 -9
  560. package/docs/contracts/caveman-telemetry.md +0 -83
  561. package/scripts/compress.sh +0 -18
@@ -0,0 +1,145 @@
1
+ #!/usr/bin/env python3
2
+ """Propose a ``modules:`` block for ``.agent-project-settings.yml``.
3
+
4
+ Phase B Step 2 of road-to-configurable-modules. Wraps the pure
5
+ :mod:`scripts._lib.module_detection` helper in a CLI surface that the
6
+ installer, the GUI wizard, and the ``/agents init`` command can all call
7
+ without re-implementing the detection table.
8
+
9
+ Usage:
10
+ python3 scripts/propose_modules_config.py # interactive
11
+ python3 scripts/propose_modules_config.py --json # machine-readable
12
+ python3 scripts/propose_modules_config.py --project <path> # custom root
13
+
14
+ Exit codes:
15
+ 0 — candidates surfaced (or none found, with ``modules.enabled: false``)
16
+ 2 — invalid arguments / unreachable path
17
+
18
+ The CLI never writes files. Callers consume the JSON / TTY output and
19
+ patch ``.agent-project-settings.yml`` themselves (preserves comments +
20
+ ordering per the layered-settings contract).
21
+ """
22
+ from __future__ import annotations
23
+
24
+ import argparse
25
+ import json
26
+ import sys
27
+ from pathlib import Path
28
+
29
+ # Re-export so consumers can import either path.
30
+ sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
31
+
32
+ from scripts._lib.module_detection import ( # noqa: E402
33
+ ModuleCandidate,
34
+ detect_module_roots,
35
+ )
36
+
37
+
38
+ def _candidate_to_dict(cand: ModuleCandidate) -> dict[str, str]:
39
+ return {
40
+ "path": cand.path,
41
+ "stack": cand.stack,
42
+ "namespace_template_guess": cand.namespace_template_guess,
43
+ "confidence": cand.confidence,
44
+ }
45
+
46
+
47
+ def _render_interactive(candidates: list[ModuleCandidate]) -> None:
48
+ """Print a numbered-options block — the same shape ``/agents init`` shows."""
49
+ if not candidates:
50
+ print("⚠️ No module roots detected.")
51
+ print()
52
+ print(
53
+ "Skipping `modules:` config. Re-run after adding a module "
54
+ "directory (app/Modules/, src/Module/, packages/, internal/, ...)."
55
+ )
56
+ return
57
+ print("📦 Detected module-root candidates:")
58
+ print()
59
+ print(" # Path Stack Confidence Namespace template")
60
+ print(" ─ ──────────────── ─────────────── ────────── ────────────────────")
61
+ for idx, cand in enumerate(candidates, start=1):
62
+ ns = cand.namespace_template_guess or "—"
63
+ print(
64
+ f" {idx:>1} {cand.path:<16} {cand.stack:<15}"
65
+ f" {cand.confidence:<10} {ns}"
66
+ )
67
+ print()
68
+ print("Suggested `modules:` block (paste into .agent-project-settings.yml):")
69
+ print()
70
+ print("modules:")
71
+ print(" enabled: true")
72
+ print(f" root_paths: [{', '.join(c.path for c in candidates)}]")
73
+ primary_ns = next(
74
+ (c.namespace_template_guess for c in candidates
75
+ if c.namespace_template_guess),
76
+ "",
77
+ )
78
+ if primary_ns:
79
+ print(f" namespace_template: '{primary_ns}'")
80
+ else:
81
+ print(" # namespace_template: '' # stack has no PHP-style namespace")
82
+ print(" agent_folder: agents")
83
+ print(" skip_dirs: [.module-template, .example]")
84
+
85
+
86
+ def _resolve_project_root(arg: str | None) -> Path:
87
+ if arg:
88
+ root = Path(arg).expanduser().resolve()
89
+ else:
90
+ root = Path.cwd().resolve()
91
+ if not root.is_dir():
92
+ print(
93
+ f"error: project root is not a directory: {root}",
94
+ file=sys.stderr,
95
+ )
96
+ sys.exit(2)
97
+ return root
98
+
99
+
100
+ def main(argv: list[str]) -> int:
101
+ parser = argparse.ArgumentParser(
102
+ prog="propose_modules_config.py",
103
+ description=(
104
+ "Detect module-root candidates and propose a `modules:` block "
105
+ "for .agent-project-settings.yml. Pure read-only scan."
106
+ ),
107
+ )
108
+ parser.add_argument(
109
+ "--project",
110
+ default=None,
111
+ help="project root (default: cwd)",
112
+ )
113
+ parser.add_argument(
114
+ "--json",
115
+ action="store_true",
116
+ help="emit machine-readable JSON instead of the TTY table",
117
+ )
118
+ args = parser.parse_args(argv)
119
+ root = _resolve_project_root(args.project)
120
+ candidates = detect_module_roots(root)
121
+ if args.json:
122
+ payload = {
123
+ "project_root": str(root),
124
+ "candidates": [_candidate_to_dict(c) for c in candidates],
125
+ "proposed_block": {
126
+ "enabled": bool(candidates),
127
+ "root_paths": [c.path for c in candidates],
128
+ "namespace_template": next(
129
+ (c.namespace_template_guess for c in candidates
130
+ if c.namespace_template_guess),
131
+ "",
132
+ ),
133
+ "agent_folder": "agents",
134
+ "skip_dirs": [".module-template", ".example"],
135
+ },
136
+ }
137
+ json.dump(payload, sys.stdout, indent=2)
138
+ sys.stdout.write("\n")
139
+ return 0
140
+ _render_interactive(candidates)
141
+ return 0
142
+
143
+
144
+ if __name__ == "__main__":
145
+ raise SystemExit(main(sys.argv[1:]))
@@ -31,7 +31,7 @@ import time
31
31
  from pathlib import Path
32
32
 
33
33
  REPO = Path(__file__).resolve().parent.parent
34
- SRC = REPO / ".agent-src.uncompressed"
34
+ SRC = REPO / ".agent-src.uncondensed"
35
35
 
36
36
  ARTIFACT_DIRS = {
37
37
  "rule": SRC / "rules",
@@ -0,0 +1,152 @@
1
+ #!/usr/bin/env bash
2
+ # Recruit-session day-of pre-flight checks.
3
+ #
4
+ # Phase B Step 2 of road-to-adoption-proof-and-ci-green.md. Run this
5
+ # 30 minutes before a recruit session — exits non-zero on any failure
6
+ # so a missed prereq pushes the session rather than burning it.
7
+ #
8
+ # Checks (all ≤ 5 s total runtime):
9
+ #
10
+ # 1. Provider keys present — ANTHROPIC_API_KEY or OPENAI_API_KEY in env,
11
+ # OR AGENT_CONFIG_DRYRUN=true (dry-run session task).
12
+ # 2. Workspace state clean — ~/.augment/ has no in-progress experiments.
13
+ # 3. agents/recruit-sessions/ writable.
14
+ # 4. task ci green at HEAD — last 'task ci' run summary is clean.
15
+ # 5. Screen recording tool installed — one of obs / loom-cli /
16
+ # zoom-cli / riverside present (best-effort detection).
17
+ #
18
+ # Output: one line per check, prefixed ✅ / ❌. Exit codes:
19
+ # 0 — every check passed.
20
+ # 1 — at least one check failed.
21
+ #
22
+ # CLI:
23
+ # bash scripts/recruit_preflight.sh [--quiet] [--dry-run-allowed]
24
+ #
25
+ # --quiet Suppress per-check rows; print summary only.
26
+ # --dry-run-allowed Accept AGENT_CONFIG_DRYRUN=true as the provider
27
+ # keys check (default false — explicit keys needed).
28
+ #
29
+ # Tests live at tests/test_recruit_preflight.sh (fixture-driven).
30
+
31
+ set -euo pipefail
32
+
33
+ QUIET=false
34
+ DRY_RUN_ALLOWED=false
35
+ for arg in "$@"; do
36
+ case "$arg" in
37
+ --quiet) QUIET=true ;;
38
+ --dry-run-allowed) DRY_RUN_ALLOWED=true ;;
39
+ -h|--help)
40
+ sed -n '2,28p' "$0" | sed 's/^# //'
41
+ exit 0
42
+ ;;
43
+ *) echo "recruit_preflight: unknown arg: $arg" >&2; exit 2 ;;
44
+ esac
45
+ done
46
+
47
+ REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
48
+ PASS=0
49
+ FAIL=0
50
+
51
+ _emit() {
52
+ if [ "$QUIET" = false ]; then
53
+ echo "$1"
54
+ fi
55
+ }
56
+
57
+ _check() {
58
+ local label="$1"
59
+ local ok="$2"
60
+ local detail="${3:-}"
61
+ if [ "$ok" = "true" ]; then
62
+ _emit "✅ ${label}${detail:+ — ${detail}}"
63
+ PASS=$((PASS + 1))
64
+ else
65
+ _emit "❌ ${label}${detail:+ — ${detail}}"
66
+ FAIL=$((FAIL + 1))
67
+ fi
68
+ }
69
+
70
+ # 1. Provider keys present (or dry-run accepted)
71
+ if [ -n "${ANTHROPIC_API_KEY:-}" ] || [ -n "${OPENAI_API_KEY:-}" ]; then
72
+ _check "provider keys" true "anthropic / openai env var set"
73
+ elif [ "$DRY_RUN_ALLOWED" = true ] && [ "${AGENT_CONFIG_DRYRUN:-}" = "true" ]; then
74
+ _check "provider keys" true "dry-run mode accepted"
75
+ else
76
+ _check "provider keys" false "set ANTHROPIC_API_KEY or OPENAI_API_KEY (or pass --dry-run-allowed)"
77
+ fi
78
+
79
+ # 2. Workspace state clean — ~/.augment/ has no in-progress experiments.
80
+ # "In-progress" is defined as any file under ~/.augment/ modified within
81
+ # the last 60 minutes whose name suggests a session / experiment / draft.
82
+ AUGMENT_DIR="${HOME}/.augment"
83
+ if [ ! -d "$AUGMENT_DIR" ]; then
84
+ _check "workspace clean" true "no ~/.augment/ — fresh user"
85
+ else
86
+ RECENT=$(find "$AUGMENT_DIR" -type f \
87
+ \( -name '*session*' -o -name '*experiment*' -o -name '*draft*' \) \
88
+ -mmin -60 2>/dev/null | head -1 || true)
89
+ if [ -z "$RECENT" ]; then
90
+ _check "workspace clean" true "no recent session/experiment files"
91
+ else
92
+ _check "workspace clean" false "recent file: $(basename "$RECENT")"
93
+ fi
94
+ fi
95
+
96
+ # 3. agents/recruit-sessions/ writable.
97
+ RECRUIT_DIR="$REPO_ROOT/agents/recruit-sessions"
98
+ if [ ! -d "$RECRUIT_DIR" ]; then
99
+ _check "recruit dir writable" false "missing: $RECRUIT_DIR"
100
+ elif [ ! -w "$RECRUIT_DIR" ]; then
101
+ _check "recruit dir writable" false "not writable: $RECRUIT_DIR"
102
+ else
103
+ _check "recruit dir writable" true "$RECRUIT_DIR"
104
+ fi
105
+
106
+ # 4. task ci green at HEAD — look at the last 'task ci' marker if it
107
+ # exists. /tmp/agent-config-ci-start.txt is written by _ci-start
108
+ # at the start of every 'task ci' run; /tmp/agent-config-ci-end.txt
109
+ # by _ci-end on success. Pre-flight passes when both exist AND
110
+ # end > start AND no .agent-src.uncondensed file is newer than end.
111
+ START_MARKER="/tmp/agent-config-ci-start.txt"
112
+ END_MARKER="/tmp/agent-config-ci-end.txt"
113
+ if [ ! -f "$START_MARKER" ] || [ ! -f "$END_MARKER" ]; then
114
+ # Soft pass — no marker yet on a fresh checkout. The session does
115
+ # not need a green CI in the past 30 days; it needs no obvious red.
116
+ _check "task ci green" true "no recent ci marker (acceptable on fresh checkout)"
117
+ else
118
+ START_TS=$(cat "$START_MARKER")
119
+ END_TS=$(cat "$END_MARKER")
120
+ if [ "$END_TS" -gt "$START_TS" ]; then
121
+ _check "task ci green" true "last run completed (end=$END_TS, start=$START_TS)"
122
+ else
123
+ _check "task ci green" false "last run incomplete (start=$START_TS, end=$END_TS)"
124
+ fi
125
+ fi
126
+
127
+ # 5. Screen recording tool — best-effort presence check.
128
+ RECORDING_TOOL=""
129
+ for tool in obs-cli obs loom riverside zoom; do
130
+ if command -v "$tool" >/dev/null 2>&1; then
131
+ RECORDING_TOOL="$tool"
132
+ break
133
+ fi
134
+ done
135
+ if [ -n "$RECORDING_TOOL" ]; then
136
+ _check "recording tool" true "$RECORDING_TOOL on PATH"
137
+ else
138
+ # Browser-based recorders (Loom web, Zoom web, Riverside web) leave
139
+ # nothing on the PATH; the maintainer is presumed to test the clip
140
+ # the day before per _runbook.md § Scheduling. Soft pass with a hint.
141
+ _check "recording tool" true "no CLI recording tool detected — verify the browser/desktop app is open"
142
+ fi
143
+
144
+ if [ "$QUIET" = false ]; then
145
+ echo ""
146
+ fi
147
+ echo "recruit_preflight: ${PASS} pass / ${FAIL} fail"
148
+
149
+ if [ "$FAIL" -gt 0 ]; then
150
+ exit 1
151
+ fi
152
+ exit 0
@@ -2,7 +2,7 @@
2
2
  """Deterministic detection helper for the refine-ticket skill.
3
3
 
4
4
  Reads the detection-map.yml from
5
- .agent-src.uncompressed/skills/refine-ticket/ (or the projected copy),
5
+ .agent-src.uncondensed/skills/refine-ticket/ (or the projected copy),
6
6
  takes ticket body text, and returns a structured decision — which
7
7
  sub-skills should fire, which keywords matched, and an
8
8
  orchestration-notes line per sub-skill ready to fold into the skill
@@ -34,7 +34,7 @@ except ImportError as exc:
34
34
  REPO_ROOT = Path(__file__).resolve().parent.parent
35
35
 
36
36
  # Post-monorepo Phase 4 the detection map lives under any package's
37
- # .agent-src.uncompressed/. Discover it via the shared helper; fall
37
+ # .agent-src.uncondensed/. Discover it via the shared helper; fall
38
38
  # back to the legacy flat path so consumers and older sub-trees still
39
39
  # work.
40
40
  import sys as _sys # noqa: E402
@@ -54,7 +54,7 @@ def _discover_default_map() -> Path:
54
54
  return candidate
55
55
  return (
56
56
  REPO_ROOT
57
- / ".agent-src.uncompressed"
57
+ / ".agent-src.uncondensed"
58
58
  / "skills"
59
59
  / "refine-ticket"
60
60
  / "detection-map.yml"
@@ -33,6 +33,16 @@ Each step prints what it's about to do before doing it, so a crash
33
33
  leaves a recoverable trail.
34
34
 
35
35
  Stdlib-only (Python 3.10+). No third-party runtime dependencies.
36
+
37
+ See also:
38
+ - docs/contracts/release-pr-gating.md — release-PR shape, cut surface,
39
+ kept surface, fail-closed contract.
40
+ - docs/contracts/branch-protection-policy.md — per-PR-shape
41
+ required-check matrix; `task ci:required-checks` previews it.
42
+ - docs/contracts/ci-cost-budget.md — measured baselines + quarterly
43
+ review cadence.
44
+ - .github/workflows/release-validation.yml — the tight release-PR
45
+ validation jobs (release-shape, changelog-entry, version-consistency).
36
46
  """
37
47
 
38
48
  from __future__ import annotations
@@ -623,6 +633,16 @@ def print_preview(plan: Plan) -> None:
623
633
  print(plan.changelog_entry.rstrip())
624
634
  print("─" * 72)
625
635
  print()
636
+ print("Release-PR CI shape (docs/contracts/release-pr-gating.md):")
637
+ print(
638
+ " will run: Consistency · Smoke Contracts · Migration Dry-Run · "
639
+ "Release Validation · Release Guard (post-tag, ~30 s)"
640
+ )
641
+ print(
642
+ " will skip: Tests (install / aux / python / node / windows-lockfile-export) · "
643
+ "Public Install Smoke — heavy install matrices cannot be regressed by a release-shape diff"
644
+ )
645
+ print()
626
646
 
627
647
 
628
648
  def confirm(prompt: str) -> bool:
@@ -0,0 +1,308 @@
1
+ #!/usr/bin/env python3
2
+ """Render `docs/benchmark.md` from the latest paired A/B bench reports.
3
+
4
+ Phase 5 Step 1 of `agents/roadmaps/road-to-package-impact-benchmark.md`.
5
+
6
+ Reads:
7
+ - internal/bench/reports/ab/{stamp}-ab-tracka-{with,without}.json (latest pair)
8
+ - internal/bench/reports/ab/{stamp}-ab-trackb-{with,without}.json (latest pair)
9
+ - any matching diff under internal/bench/reports/ab/diff/
10
+
11
+ Emits: `docs/benchmark.md`. The renderer is deterministic — it does not run
12
+ any bench; it only formats existing reports. `task bench:ab` calls this last;
13
+ `task bench:ab:diff` calls it alone.
14
+
15
+ Sections of the rendered file:
16
+ - Headline (delta table)
17
+ - Track A — behavioural
18
+ - Track B — task completion
19
+ - Methodology (target shape, corpus versions, claude CLI version, timestamps)
20
+ - History (last 5 runs)
21
+
22
+ If no reports exist yet, the script writes a placeholder document explaining
23
+ how to produce one — never errors out, so the file is always a real
24
+ description of the current bench state.
25
+ """
26
+ from __future__ import annotations
27
+
28
+ import argparse
29
+ import json
30
+ import sys
31
+ from datetime import datetime, timezone
32
+ from pathlib import Path
33
+
34
+ REPO_ROOT = Path(__file__).resolve().parent.parent
35
+ REPORTS_DIR = REPO_ROOT / "internal" / "bench" / "reports" / "ab"
36
+ DIFF_DIR = REPORTS_DIR / "diff"
37
+ OUT_PATH = REPO_ROOT / "docs" / "benchmark.md"
38
+
39
+ REQUIRED_SECTIONS = (
40
+ "## Headline",
41
+ "## Track A",
42
+ "## Track B",
43
+ "## Methodology",
44
+ "## History",
45
+ )
46
+
47
+
48
+ def utc_iso() -> str:
49
+ return datetime.now(timezone.utc).isoformat(timespec="seconds")
50
+
51
+
52
+ def latest_pair(corpus: str) -> tuple[Path | None, Path | None]:
53
+ """Return the (with, without) report pair for a corpus, both with the same stamp.
54
+
55
+ If only one variant has a fresh report, the other position is None.
56
+ """
57
+ with_reports = sorted(REPORTS_DIR.glob(f"*-{corpus}-with.json"))
58
+ without_reports = sorted(REPORTS_DIR.glob(f"*-{corpus}-without.json"))
59
+ if not with_reports and not without_reports:
60
+ return None, None
61
+ # Latest of each — they don't have to share stamps; the diff handles that.
62
+ return (
63
+ with_reports[-1] if with_reports else None,
64
+ without_reports[-1] if without_reports else None,
65
+ )
66
+
67
+
68
+ def latest_diff(corpus: str) -> Path | None:
69
+ diffs = sorted(DIFF_DIR.glob(f"*-{corpus}-diff.json"))
70
+ return diffs[-1] if diffs else None
71
+
72
+
73
+ def safe_load(path: Path | None) -> dict:
74
+ if path is None or not path.exists():
75
+ return {}
76
+ try:
77
+ return json.loads(path.read_text())
78
+ except json.JSONDecodeError:
79
+ return {}
80
+
81
+
82
+ def fmt_pct(value: float | None) -> str:
83
+ if value is None:
84
+ return "—"
85
+ return f"{value * 100:.1f}%"
86
+
87
+
88
+ def fmt_num(value: float | None, places: int = 2) -> str:
89
+ if value is None:
90
+ return "—"
91
+ return f"{value:.{places}f}"
92
+
93
+
94
+ def render_headline(track_a: dict, track_b: dict) -> str:
95
+ a_results = (track_a.get("with") or {}).get("results", {})
96
+ a_without = (track_a.get("without") or {}).get("results", {})
97
+ b_results = (track_b.get("with") or {}).get("results", {})
98
+ b_without = (track_b.get("without") or {}).get("results", {})
99
+ a_with_acc = a_results.get("trigger_accuracy")
100
+ a_wo_acc = a_without.get("trigger_accuracy")
101
+ b_with_comp = b_results.get("completion_rate")
102
+ b_wo_comp = b_without.get("completion_rate")
103
+ lines = [
104
+ "## Headline",
105
+ "",
106
+ "| Metric | with | without | delta |",
107
+ "|---|---|---|---|",
108
+ f"| Track A trigger-accuracy | {fmt_pct(a_with_acc)} | {fmt_pct(a_wo_acc)} | "
109
+ f"{fmt_pct((a_with_acc or 0) - (a_wo_acc or 0))} |",
110
+ f"| Track B completion-rate | {fmt_pct(b_with_comp)} | {fmt_pct(b_wo_comp)} | "
111
+ f"{fmt_pct((b_with_comp or 0) - (b_wo_comp or 0))} |",
112
+ f"| Track B mean wall-time | {fmt_num(b_results.get('mean_wall_time'))}s "
113
+ f"| {fmt_num(b_without.get('mean_wall_time'))}s | "
114
+ f"{fmt_num((b_results.get('mean_wall_time') or 0) - (b_without.get('mean_wall_time') or 0))}s |",
115
+ f"| Track B ask-vs-act ratio | {fmt_num(b_results.get('ask_vs_act_ratio'), 3)} "
116
+ f"| {fmt_num(b_without.get('ask_vs_act_ratio'), 3)} | — |",
117
+ "",
118
+ ]
119
+ return "\n".join(lines)
120
+
121
+
122
+ def render_track_a(track_a: dict) -> str:
123
+ with_data = (track_a.get("with") or {}).get("results", {})
124
+ without_data = (track_a.get("without") or {}).get("results", {})
125
+ lines = ["## Track A — Behavioural eval", ""]
126
+ if not with_data and not without_data:
127
+ lines.append("_No Track A reports yet. Run `task bench:ab:track-a`._")
128
+ lines.append("")
129
+ return "\n".join(lines)
130
+ lines.extend(
131
+ [
132
+ f"- with → **{fmt_pct(with_data.get('trigger_accuracy'))}** "
133
+ f"({with_data.get('matched', 0)}/{with_data.get('total', 0)})",
134
+ f"- without → **{fmt_pct(without_data.get('trigger_accuracy'))}** "
135
+ f"({without_data.get('matched', 0)}/{without_data.get('total', 0)})",
136
+ f"- integrity OK: `{track_a.get('with', {}).get('integrity_ok', '—')}`",
137
+ "",
138
+ "Per-target presence (sample):",
139
+ "",
140
+ ]
141
+ )
142
+ per_target = with_data.get("per_target_present", {})
143
+ for i, (target, score) in enumerate(sorted(per_target.items())):
144
+ if i >= 10:
145
+ lines.append(f"- … {len(per_target) - 10} more")
146
+ break
147
+ lines.append(f"- `{target}` → with={score}, without=0")
148
+ lines.append("")
149
+ return "\n".join(lines)
150
+
151
+
152
+ def render_track_b(track_b: dict) -> str:
153
+ lines = ["## Track B — Task completion", ""]
154
+ with_data = (track_b.get("with") or {}).get("results", {})
155
+ without_data = (track_b.get("without") or {}).get("results", {})
156
+ mode = with_data.get("mode") or without_data.get("mode") or "—"
157
+ lines.append(f"- Mode: `{mode}`")
158
+ if not with_data and not without_data:
159
+ lines.append("")
160
+ lines.append("_No Track B reports yet. Run `task bench:ab:track-b`._")
161
+ lines.append("")
162
+ return "\n".join(lines)
163
+ lines.extend(
164
+ [
165
+ f"- with → **{fmt_pct(with_data.get('completion_rate'))}** "
166
+ f"({with_data.get('passed', 0)}/{with_data.get('total', 0)})",
167
+ f"- without → **{fmt_pct(without_data.get('completion_rate'))}** "
168
+ f"({without_data.get('passed', 0)}/{without_data.get('total', 0)})",
169
+ "",
170
+ "Per-category:",
171
+ "",
172
+ "| Category | with | without | delta |",
173
+ "|---|---|---|---|",
174
+ ]
175
+ )
176
+ with_cats = with_data.get("per_category", {})
177
+ without_cats = without_data.get("per_category", {})
178
+ for cat in sorted(set(with_cats) | set(without_cats)):
179
+ w = with_cats.get(cat, {}).get("completion_rate") or 0
180
+ wo = without_cats.get(cat, {}).get("completion_rate") or 0
181
+ lines.append(
182
+ f"| {cat} | {fmt_pct(w)} | {fmt_pct(wo)} | {fmt_pct(w - wo)} |"
183
+ )
184
+ lines.append("")
185
+ return "\n".join(lines)
186
+
187
+
188
+ def render_methodology(track_a: dict, track_b: dict) -> str:
189
+ with_report = track_a.get("with") or track_b.get("with") or {}
190
+ cache_key = with_report.get("cache_key", {})
191
+ lines = [
192
+ "## Methodology",
193
+ "",
194
+ "- **Target shape:** Shape A (neutral TypeScript fixture under `internal/bench/ab/fixture/`).",
195
+ "- **Variants:** `with` clone inherits `.claude/`, `.augment/`, `AGENTS.md`, "
196
+ "`CLAUDE.md` from the package root; `without` does not.",
197
+ "- **Integrity:** `python3 scripts/bench_ab_integrity.py` exits 0 on every run "
198
+ "(clones differ only at the agent-config surface).",
199
+ "- **Scoring:** structural only (no LLM judge). See `scripts/_lib/bench_ab_scoring.py`.",
200
+ "",
201
+ "Cache key for the latest run:",
202
+ "",
203
+ ]
204
+ if cache_key:
205
+ for k in ("corpus_hash", "claude_cli_version", "target_shape_hash"):
206
+ lines.append(f"- `{k}`: `{cache_key.get(k, '—')}`")
207
+ else:
208
+ lines.append("- _no cache key recorded yet_")
209
+ lines.append("")
210
+ lines.append(f"- **Last rendered:** `{utc_iso()}`")
211
+ lines.append("")
212
+ return "\n".join(lines)
213
+
214
+
215
+ def render_history() -> str:
216
+ lines = ["## History", "", "Last 5 runs (per corpus):", ""]
217
+ for corpus in ("ab-tracka", "ab-trackb"):
218
+ lines.append(f"### `{corpus}`")
219
+ lines.append("")
220
+ reports = sorted(
221
+ REPORTS_DIR.glob(f"*-{corpus}-with.json"), reverse=True
222
+ )[:5]
223
+ if not reports:
224
+ lines.append("_no runs yet_")
225
+ lines.append("")
226
+ continue
227
+ for report in reports:
228
+ try:
229
+ data = json.loads(report.read_text())
230
+ except json.JSONDecodeError:
231
+ continue
232
+ results = data.get("results") or {}
233
+ metric = (
234
+ results.get("trigger_accuracy")
235
+ if corpus == "ab-tracka"
236
+ else results.get("completion_rate")
237
+ )
238
+ lines.append(f"- `{data.get('stamp', '—')}` → {fmt_pct(metric)}")
239
+ lines.append("")
240
+ return "\n".join(lines)
241
+
242
+
243
+ def render_placeholder() -> str:
244
+ return (
245
+ "# Package-Impact A/B Benchmark\n"
246
+ "\n"
247
+ "_No A/B bench reports yet._ Produce one with:\n"
248
+ "\n"
249
+ "```sh\n"
250
+ "task bench:ab\n"
251
+ "```\n"
252
+ "\n"
253
+ "Methodology lives in `agents/roadmaps/road-to-package-impact-benchmark.md` "
254
+ "and `internal/bench/ab/README.md`.\n"
255
+ f"\n_Last rendered: {utc_iso()}_\n"
256
+ )
257
+
258
+
259
+ def render(quiet: bool = False) -> int:
260
+ a_with, a_without = latest_pair("ab-tracka")
261
+ b_with, b_without = latest_pair("ab-trackb")
262
+ track_a = {"with": safe_load(a_with), "without": safe_load(a_without)}
263
+ track_b = {"with": safe_load(b_with), "without": safe_load(b_without)}
264
+ have_data = bool(
265
+ track_a["with"] or track_a["without"] or track_b["with"] or track_b["without"]
266
+ )
267
+ if not have_data:
268
+ OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
269
+ OUT_PATH.write_text(render_placeholder())
270
+ if not quiet:
271
+ sys.stdout.write(
272
+ f"render_benchmark_md: no reports — wrote placeholder to {OUT_PATH.relative_to(REPO_ROOT)}\n"
273
+ )
274
+ return 0
275
+ parts = [
276
+ "# Package-Impact A/B Benchmark",
277
+ "",
278
+ "> Generated by `scripts/render_benchmark_md.py`. Source of truth: "
279
+ "`internal/bench/reports/ab/`. Re-render anytime with `task bench:ab:diff`.",
280
+ "",
281
+ render_headline(track_a, track_b),
282
+ render_track_a(track_a),
283
+ render_track_b(track_b),
284
+ render_methodology(track_a, track_b),
285
+ render_history(),
286
+ ]
287
+ OUT_PATH.parent.mkdir(parents=True, exist_ok=True)
288
+ OUT_PATH.write_text("\n".join(parts))
289
+ if not quiet:
290
+ sys.stdout.write(
291
+ f"render_benchmark_md: wrote {OUT_PATH.relative_to(REPO_ROOT)}\n"
292
+ )
293
+ return 0
294
+
295
+
296
+ def parse_args(argv: list[str]) -> argparse.Namespace:
297
+ parser = argparse.ArgumentParser(description="Render docs/benchmark.md from A/B reports.")
298
+ parser.add_argument("--quiet", action="store_true", help="Suppress stdout.")
299
+ return parser.parse_args(argv)
300
+
301
+
302
+ def main(argv: list[str] | None = None) -> int:
303
+ args = parse_args(argv if argv is not None else sys.argv[1:])
304
+ return render(quiet=args.quiet)
305
+
306
+
307
+ if __name__ == "__main__":
308
+ raise SystemExit(main())
@@ -100,7 +100,7 @@ def _resolve_regenerator(consumer_root: Path) -> Path | None:
100
100
  for candidate in (
101
101
  consumer_root / ".augment" / "scripts" / "update_roadmap_progress.py",
102
102
  consumer_root / ".agent-src" / "scripts" / "update_roadmap_progress.py",
103
- consumer_root / ".agent-src.uncompressed" / "scripts" / "update_roadmap_progress.py",
103
+ consumer_root / ".agent-src.uncondensed" / "scripts" / "update_roadmap_progress.py",
104
104
  ):
105
105
  if candidate.is_file():
106
106
  return candidate