@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
@@ -19,7 +19,7 @@ This contract defines the **schema** of the file-ownership matrix: the
19
19
  machine-readable JSON at `docs/contracts/file-ownership-matrix.json` and
20
20
  the human-readable mirror at
21
21
  `agents/settings/contexts/structural/file-ownership-matrix.md`. Both are
22
- regenerated from `.agent-src.uncompressed/` by the generator and locked
22
+ regenerated from `.agent-src.uncondensed/` by the generator and locked
23
23
  by CI.
24
24
 
25
25
  **Status:** internal-locked (`stability: beta`). Schema bumps require a
@@ -49,7 +49,7 @@ The JSON document is a single object:
49
49
  {
50
50
  "version": 1,
51
51
  "generated_by": "scripts/generate_ownership_matrix.py",
52
- "source_of_truth": ".agent-src.uncompressed/",
52
+ "source_of_truth": ".agent-src.uncondensed/",
53
53
  "files": {
54
54
  "<repo-root-relative path>": {
55
55
  "kind": "rule | skill | command | context | persona",
@@ -111,7 +111,7 @@ backstop; the consistency gate fails if regeneration drifts.
111
111
  ## Scope notes (v1)
112
112
 
113
113
  - **Greppable surface:** `rules/`, `skills/`, `commands/`, `contexts/`,
114
- `personas/` under `.agent-src.uncompressed/`. Generated tool
114
+ `personas/` under `.agent-src.uncondensed/`. Generated tool
115
115
  projections (`.augment/`, `.claude/`, `.cursor/`, …) are intentionally
116
116
  ignored — they are downstream of the source of truth.
117
117
  - **`skill:` frontmatter in rules** (named in roadmap 0.1.2) is reserved.
@@ -10,7 +10,7 @@ keep-beta-until: 2026-08-19
10
10
  > ADR is the decision; this file is the worked-example reference linters,
11
11
  > installer, and contributors cite at runtime.
12
12
 
13
- Every `.md` artefact under `.agent-src.uncompressed/` MUST declare the five
13
+ Every `.md` artefact under `.agent-src.uncondensed/` MUST declare the five
14
14
  ADR-013 discovery keys. The release-time manifest builder
15
15
  (`scripts/build_discovery_manifest.py`) derives all workspace/pack assignment
16
16
  from these alone — **no manual workspace or pack list is ever maintained**.
@@ -118,7 +118,7 @@ the linter rejects that collision.
118
118
  | Surface | What runs | When |
119
119
  |---|---|---|
120
120
  | Local | `task lint-artefact-frontmatter` | manual / pre-commit |
121
- | Pre-commit | `pre-commit-roadmap-progress` template | when `.agent-src.uncompressed/*.md`, `config/discovery/*.yml`, or the linter itself is staged |
121
+ | Pre-commit | `pre-commit-roadmap-progress` template | when `.agent-src.uncondensed/*.md`, `config/discovery/*.yml`, or the linter itself is staged |
122
122
  | CI | `task ci` → `lint-artefact-frontmatter` | every push / PR |
123
123
 
124
124
  Install the pre-commit hook with:
@@ -133,8 +133,8 @@ are staged.
133
133
 
134
134
  ## Roundtrip invariant
135
135
 
136
- Frontmatter survives the `task sync` compression pipeline. Path-bearing
136
+ Frontmatter survives the `task sync` condensation pipeline. Path-bearing
137
137
  keys (`load_context`) may be rewritten relative to the projected location,
138
138
  but the five Phase-1 keys above are byte-stable between
139
- `.agent-src.uncompressed/`, `.agent-src/`, and `.augment/`. Enforced by
139
+ `.agent-src.uncondensed/`, `.agent-src/`, and `.augment/`. Enforced by
140
140
  `tests/test_frontmatter_roundtrip.py`.
@@ -25,7 +25,7 @@ explicit `accept` step on `/ghostwriter:fetch` re-runs.
25
25
  profiles live here. **Gitignored by default** via the package-managed
26
26
  `.gitignore` block. A `--shared` opt-in to commit profiles is
27
27
  deferred to v2; only the doc note lands in v1.
28
- - **Package source** — `.agent-src.uncompressed/ghostwriter/` ships
28
+ - **Package source** — `.agent-src.uncondensed/ghostwriter/` ships
29
29
  the README, this schema doc, and `fictional: true` fixtures only.
30
30
  **Zero real-person profiles ever ship with the OSS package.** A CI
31
31
  lint (`task lint-ghostwriter-source`) enforces this rule by failing
@@ -181,7 +181,7 @@ attribution stays deterministic.
181
181
  fixtures are schema examples for a single canonical name; aliases are a
182
182
  consumer-only deployment feature. The package-source lint
183
183
  (`task lint-ghostwriter-source`) fails on `aliases:` in
184
- `.agent-src.uncompressed/ghostwriter/`.
184
+ `.agent-src.uncondensed/ghostwriter/`.
185
185
 
186
186
  ### Settings toggle (consumer-only)
187
187
 
@@ -293,7 +293,7 @@ instead of merging.
293
293
 
294
294
  The lint runs in `task ci` and fails on:
295
295
 
296
- 1. Any file under `.agent-src.uncompressed/ghostwriter/` whose stem is
296
+ 1. Any file under `.agent-src.uncondensed/ghostwriter/` whose stem is
297
297
  **not** on the fixture allowlist (`scripts/ghostwriter_fixture_allowlist.txt`).
298
298
  2. Any allowlisted file missing `fictional: true` in frontmatter.
299
299
  3. Any package-source file (`fictional: true`) carrying an `aliases:`
@@ -8,20 +8,27 @@ keep-beta-until: 2026-08-19
8
8
  > Companion to the agent-mode protocol
9
9
  > ([`installer-agent-mode.md`](installer-agent-mode.md)) and the
10
10
  > trust-and-safety layer ([`trust-and-safety.md`](trust-and-safety.md)).
11
- > The wizard is a thin HTTP wrapper around the same install plan, the
12
- > same lockfile, and the same atomic-write semantics as the CLI/TUI
13
- > paths. It is **optional by design** — the CLI is the canonical entry
14
- > point; the wizard exists for non-technical users who want a visual
15
- > picker.
11
+ > The wizard is a thin HTTP wrapper: it is a **selection front-end**, and
12
+ > every real write goes through the single installer
13
+ > `scripts/install.py --apply-payload` (D12 / ADR-020). It is **optional by
14
+ > design** the CLI is the canonical entry point; the wizard exists for
15
+ > non-technical users who want a visual picker.
16
16
 
17
17
  ## Source of truth
18
18
 
19
- - Server: [`packages/core/installer/src/gui/server.ts`](../../packages/core/installer/src/gui/server.ts)
20
- - Handlers: [`packages/core/installer/src/gui/handlers.ts`](../../packages/core/installer/src/gui/handlers.ts)
21
- - Security primitives: [`packages/core/installer/src/gui/security.ts`](../../packages/core/installer/src/gui/security.ts)
22
- - Inlined SPA: [`packages/core/installer/src/gui/static-assets.ts`](../../packages/core/installer/src/gui/static-assets.ts)
23
- - Transaction log: [`packages/core/installer/src/gui/transaction-log.ts`](../../packages/core/installer/src/gui/transaction-log.ts)
24
- - Tests: [`packages/core/installer/tests/gui-*.test.ts`](../../packages/core/installer/tests/)
19
+ The GUI is a Fastify server (`src/server/`) serving a Preact SPA
20
+ (`src/ui/`), booted by the `install` / `setup` / `ui:serve` CLI
21
+ subcommands. The legacy `packages/core/installer/src/gui/*` tree was
22
+ retired; the single real installer is `scripts/install.py`.
23
+
24
+ - Server app + security hooks: [`src/server/app.ts`](../../src/server/app.ts) (Host allow-list, Origin allow-list, CSRF token — `onRequest` hooks)
25
+ - Wizard routes (incl. the real-apply bridge): [`src/server/routes/wizard.ts`](../../src/server/routes/wizard.ts)
26
+ - Read-only install routes (detect / plan-preview / recovery / legacy-v3): [`src/server/routes/install.ts`](../../src/server/routes/install.ts)
27
+ - Atomic / 2PC writes: [`src/server/io/atomicWrite.ts`](../../src/server/io/atomicWrite.ts), [`atomicMultiWrite.ts`](../../src/server/io/atomicMultiWrite.ts)
28
+ - SPA: [`src/ui/`](../../src/ui/) (entry `src/ui/pages/WizardPage.tsx`)
29
+ - CLI boot + `WIZARD_READY` contract: [`src/cli/commands/uiServe.ts`](../../src/cli/commands/uiServe.ts)
30
+ - The single installer (all real writes): [`scripts/install.py`](../../scripts/install.py)
31
+ - Tests: [`tests/server/`](../../tests/server/) + [`tests/e2e/`](../../tests/e2e/)
25
32
 
26
33
  ## Local-only invariant
27
34
 
@@ -34,126 +41,132 @@ no cross-origin asset, no remote endpoint — CSP
34
41
  ## Boot sequence
35
42
 
36
43
  ```
37
- npx @event4u/agent-config init --gui [--gui-port=<n>] [--no-open] [--gui-idle=<s>]
44
+ agent-config install (or `setup`, or `init` scripts/install.py spawns
45
+ `node dist/cli/agent-config.js install --no-open`)
38
46
 
39
- ├─► inspect agents/runtime/gui/server.pid abort if live
40
- ├─► load dist/discovery/discovery-manifest.json (walks up from CWD)
41
- ├─► generate per-server CSRF token (64-hex)
42
- ├─► http.createServer + listen({ host: '127.0.0.1', port: 0 })
43
- ├─► write agents/runtime/gui/server.pid (POSIX pid, single line)
44
- ├─► default-spawn the OS browser opener (skipped with --no-open)
45
- └─► return GuiServerHandle { url, port, csrfToken, pidFile, close }
47
+ ├─► pick a free loopback port; mint a per-server bearer/CSRF token
48
+ ├─► Fastify listen({ host: '127.0.0.1', port })
49
+ ├─► print `WIZARD_READY <url>` on stdout (url carries `?token=…` + `#/…`)
50
+ ├─► open the OS browser at <url> (skipped with --no-open / headless)
51
+ └─► serve until Ctrl-C
46
52
  ```
47
53
 
48
- Idle timeout (default 600 s, configurable via `--gui-idle`) is keyed on
49
- the **last HTTP request timestamp**, not on SSE event activity.
54
+ `init` is the consumer entry point: it delegates to `scripts/install.py`,
55
+ which on a TTY with a display and no `--no-ui` / `CI` / explicit
56
+ `--tools=` — spawns the `install` subcommand with `--no-open` and waits for
57
+ the `WIZARD_READY <url>` handshake (progressive 10/20/40/80 s budget) before
58
+ printing the URL banner. Headless / CI / `--no-ui` / explicit `--tools=`
59
+ installs run the non-interactive `install.py` path directly and never boot
60
+ the GUI.
61
+
62
+ ### `WIZARD_READY` stdout contract
63
+
64
+ The server emits exactly one line on stdout when it has bound:
65
+
66
+ ```
67
+ WIZARD_READY http://127.0.0.1:<port>/?token=<token>#/<route>
68
+ ```
69
+
70
+ The supervisor matches `^WIZARD_READY (http://(127.0.0.1|localhost):\d+/\S*)$`
71
+ (no `url=` prefix; the query/hash are part of the captured URL). The line is
72
+ unconditional so headless CI can detect "Fastify bound" without polling the
73
+ port.
50
74
 
51
75
  ## Endpoints
52
76
 
53
- | Method | Path | Purpose |
54
- |--------|------------------|------------------------------------------------------|
55
- | GET | `/` | SPA shell with CSRF token injected via `<meta>` |
56
- | GET | `/app.css` | Static stylesheet |
57
- | GET | `/app.js` | Inlined SPA logic |
58
- | GET | `/api/manifest` | `{ manifest, sha256 }` — bytes-identical to disk |
59
- | GET | `/api/auto-detect` | `{ signals: { composer, package, pyproject } }` |
60
- | POST | `/api/preview` | `{ plan, lockfileSha256 }` for current selection |
61
- | POST | `/api/apply` | SSE: `plan-file`, `progress`, `done`, `error` |
62
- | POST | `/api/cancel` | Flush in-flight transaction log, close SSE stream |
63
-
64
- All POSTs require:
65
-
66
- 1. `Origin` header matching `http://127.0.0.1:<port>` or
67
- `http://localhost:<port>`.
68
- 2. Body field `csrf` matching the per-server token (timing-safe
69
- compare in `security.ts`).
70
-
71
- A bad CSRF returns `403` with no body. A bad Origin or Host returns
72
- `403` with a short plaintext reason.
73
-
74
- ## Transaction log + rollback
75
-
76
- Every `POST /api/apply` writes append-only JSONL entries to
77
- `<projectRoot>/agents/runtime/gui/install-<ts>.log`. Shapes are
78
- declared in
79
- [`types.ts § TransactionLogEntry`](../../packages/core/installer/src/gui/types.ts):
80
-
81
- - `start` workspaces + packs selected
82
- - `plan` — one entry per planned write (`path`, `pack`)
83
- - `commit` `filesWritten`, `lockfileSha256`
84
- - `cancel` explicit `POST /api/cancel`
85
- - `error` terminating failure with `message`
86
-
87
- The next `--gui` boot inspects the most recent log and offers to roll
88
- back if it ended on `start`/`plan`/`error` without a matching
89
- `commit`/`cancel`. The CLI path consumes the same log, so a mid-install
90
- crash can be undone from either entry point.
77
+ Versioned under `/api/v1/`. Selected routes:
78
+
79
+ | Method | Path | Purpose |
80
+ |--------|-------------------------------|-------------------------------------------------------------------------|
81
+ | GET | `/` | SPA shell (token passed via the `?token=` query) |
82
+ | GET | `/api/v1/wizard/state` | Resumable partial wizard state |
83
+ | POST | `/api/v1/wizard/state` | Persist state between steps |
84
+ | GET | `/api/v1/wizard/manifest` | Locked discovery-manifest (extended mode) |
85
+ | GET | `/api/v1/wizard/auto-detect` | Project-signal evidence for the `ai-tools` step (extended mode) |
86
+ | POST | `/api/v1/wizard/finish` | 2PC commit of settings + user-identity |
87
+ | POST | `/api/v1/wizard/apply` | **Single real-apply route.** `dry_run:true` → buffered plan preview; otherwise SSE-streams `scripts/install.py --apply-payload` |
88
+ | GET | `/api/v1/install/detect` | Scope + project shape + tool presence |
89
+ | POST | `/api/v1/install/plan` | Plan preview (per-tool file counts + conflicts) for the Review step |
90
+ | GET | `/api/v1/install/recovery` | Interrupted-run recovery state |
91
+ | GET | `/api/v1/install/legacy-v3` | v3-install detection (backup screen) |
92
+
93
+ The TypeScript apply engine and its `POST /api/v1/install/apply` SSE route
94
+ were removed (road-to-single-install-source-of-truth § Phase 3). All real
95
+ writes now flow through `POST /api/v1/wizard/apply` `scripts/install.py`.
96
+
97
+ Every request passes three `onRequest` hooks in
98
+ [`src/server/app.ts`](../../src/server/app.ts): a `Host`-header allow-list,
99
+ an `Origin` allow-list (browser-issued requests), and a per-server bearer
100
+ token (`Authorization: Bearer <token>`, minted at boot, surfaced in the
101
+ `?token=` URL). A bad token / Host / Origin returns `403`.
102
+
103
+ ## Real apply — single source of truth
104
+
105
+ `POST /api/v1/wizard/apply` is the only write path:
106
+
107
+ - `dry_run: true` spawns `install.py --apply-payload <tmp> --dry-run` and
108
+ returns the buffered plan-summary text (used by the Review preview).
109
+ - otherwise → spawns `install.py --apply-payload <tmp>` (real apply) and
110
+ **streams** the installer's NDJSON stdout
111
+ (`{type:"file",…}` / `{type:"done"|"error"}`) mapped to the SSE frames the
112
+ SPA consumes. The child is killed if the client disconnects
113
+ (abort-on-disconnect, Finding #24). The installer owns its own
114
+ transactional state (the user-scope lockfile + project manifest), so the
115
+ GUI does not maintain a parallel transaction log.
91
116
 
92
117
  ## SSE event framing
93
118
 
94
- Every `POST /api/apply` event is `data: <json>\n\n`. The terminal event
95
- is one of:
119
+ Each real-apply event is `data: <json>\n\n`. Frames:
96
120
 
97
121
  ```jsonc
98
- { "type": "done", "filesWritten": 12, "lockfileSha256": "<64-hex>" }
99
- { "type": "error", "message": "<reason>" }
122
+ { "type": "progress", "file": "<tool>", "status": "deployed", "written": 1, "total": 3 }
123
+ { "type": "done", "summary": { "written": 3, "total": 3 } }
124
+ { "type": "error", "code": "<code>", "message": "<reason>", "recoverable": false }
100
125
  ```
101
126
 
102
- The browser closes the EventSource on either; the server flushes the
103
- transaction log and unblocks the idle timer.
104
-
105
- ## Tarball budget
106
-
107
- GUI assets under `packages/core/installer/src/gui/` (inlined HTML +
108
- CSS + JS in `static-assets.ts`) must stay **≤ 200 KB compiled**. The
109
- constraint is enforced by reviewer judgment for now; a CI check is
110
- tracked under the Phase 6 follow-ups.
127
+ The browser stops reading on `done` / `error`; the server ends the stream.
111
128
 
112
129
  ## Security failure modes covered
113
130
 
114
- - **Remote exploitation** — loopback bind, Host allowlist, Origin
115
- allowlist, CSRF token, CSP `default-src 'self'`.
116
- - **DNS rebinding** — Host header check covers POSTs that omit
117
- `Origin` (form posts).
118
- - **Zombie servers** — ephemeral port + PID file + last-request idle
119
- timer. Stale PIDs (process gone) are silently overwritten on next
120
- boot; live PIDs block boot with a helpful message.
121
- - **Mid-install crash** — transaction log + boot-time rollback prompt.
122
- - **Hidden state** — closing the tab triggers idle timeout; no
123
- cross-tab session.
131
+ - **Remote exploitation** — loopback bind, Host allow-list, Origin
132
+ allow-list, per-server bearer token.
133
+ - **DNS rebinding** — Host header check covers POSTs that omit `Origin`.
134
+ - **Mid-install crash** — `scripts/install.py` owns the user-scope
135
+ lockfile + project manifest; the recovery routes
136
+ (`/api/v1/install/recovery`) surface an interrupted run on next boot.
124
137
 
125
138
  ## Non-goals (documented contract)
126
139
 
127
- - Not a hosted SaaS — no auth, no account model, no telemetry.
128
- - Not a settings editorread-only on the lockfile; writes go
129
- through the same install plan as the CLI.
130
- - Not a CI surface — every operation is reachable via `--gui-port=0
131
- --no-open` is supported for headless smoke tests, but the canonical
132
- CI path is the flag-driven non-interactive CLI.
140
+ - Not a hosted SaaS — no auth account model, no telemetry.
141
+ - Not a parallel installerthe GUI is a selection front-end; every
142
+ real write goes through `scripts/install.py --apply-payload`.
143
+ - Not a CI surface — `--no-open` headless boots are supported for smoke
144
+ tests, but the canonical CI path is the flag-driven non-interactive CLI.
133
145
 
134
146
  ## Apply payload — versioning handshake (road-to-global-only-install Phase 0.4 · D12)
135
147
 
136
- `/api/apply` accepts a discriminated-union body keyed on
148
+ `POST /api/v1/wizard/apply` accepts a discriminated-union body keyed on
137
149
  `schema_version`. The full JSON Schema lives at
138
- [`schemas/wizard-apply-payload.schema.json`](../../schemas/wizard-apply-payload.schema.json).
150
+ [`internal/schemas/wizard-apply-payload.schema.json`](../../internal/schemas/wizard-apply-payload.schema.json).
139
151
 
140
152
  | `schema_version` | Variant | Shape |
141
153
  |---|---|---|
142
154
  | `"installer-v1"` | `InstallerPayloadV1` | `{ ai_tools[], configs{}, dry_run? }` — legacy Installer-GUI, AI tools only. |
143
155
  | `"wizard-v2"` | `WizardPayloadV2` | `{ tools[], packs[], settings{}, scope_to_project_only?, dry_run? }` — unified 9-step wizard. |
144
156
 
145
- **D12 (locked).** Single `/api/apply` endpoint with a `schema_version`
157
+ **D12 (locked).** Single apply endpoint with a `schema_version`
146
158
  discriminator — **not** two endpoints with a shared Python backend.
147
- Reasoning: one bind, one CSRF token, one transaction log; the
159
+ Reasoning: one bind, one token, one installer; the
148
160
  Python `scripts/install.py` payload-router branches on
149
161
  `schema_version` before any disk write. The dual-endpoint variant was
150
- considered and rejected for doubling the CSRF + idle-timer surface
151
- with no observability gain.
162
+ considered and rejected for doubling the surface with no gain.
152
163
 
153
164
  `schema_version` is **required**. Servers MUST reject any body that
154
- lacks it (HTTP 400, single-line error pointing at the schema). This
155
- locks the contract before Phase 1 implementation so no implicit fork
156
- can sneak in at Phase 1.5.
165
+ lacks it (HTTP 4xx, single-line error pointing at the schema). The
166
+ real-apply path is now wired end-to-end
167
+ (road-to-single-install-source-of-truth § Phases 1–2): `install.py`
168
+ translates the payload into the canonical install and streams NDJSON
169
+ progress back to the GUI.
157
170
 
158
171
  ## Unified 9-step flow (road-to-global-only-install § Phase 1.6)
159
172
 
@@ -0,0 +1,123 @@
1
+ # Harness Expectations — when AI tool behaviour looks like a package bug but isn't
2
+
3
+ **Status:** Active (Phase D of `road-to-clean-skill-distribution-channels.md`)
4
+ **Owner:** maintainer-team
5
+ **Inputs:** Phase D roadmap steps + the 2026-05-25 misdiagnosis chat session that opened this track.
6
+
7
+ ## The case for this document
8
+
9
+ On 2026-05-25 a Claude Code session surfaced three behaviours that looked like `event4u/agent-config` bugs. Two of the three turned out to be **host-harness behaviour** the package has no control over. The third (cross-scope skill drift) was a real package-side bug fixed in Phases A–C. This document captures the host-side three so the next agent / onboarding session / opened issue does not re-run the misdiagnosis loop.
10
+
11
+ ## Class A — Plugin-namespaced peer skills
12
+
13
+ ### Symptom
14
+
15
+ The session shows skills under namespaces like `codex:`, `cc-gemini-plugin:`, or another `<vendor>:` prefix:
16
+
17
+ ```
18
+ - codex:setup
19
+ - cc-gemini-plugin:gemini-agent
20
+ - codex:rescue
21
+ ```
22
+
23
+ These names do NOT appear in `event4u/agent-config`'s skill catalog, the README, or the contracts.
24
+
25
+ ### What's actually happening
26
+
27
+ Claude Code (and similar harnesses) supports **sibling plugins** in addition to the primary `event4u/agent-config` install. Each sibling plugin owns its own skills, namespaced by the plugin id. The harness surfaces every loaded plugin's skills in the same `<available_skills>` list during the session.
28
+
29
+ - `codex:*` skills come from a sibling plugin that wraps the Codex CLI.
30
+ - `cc-gemini-plugin:*` skills come from a sibling plugin that wraps Gemini-CLI integration.
31
+
32
+ `event4u/agent-config` does not ship, control, or update these plugins. They are independent installs by independent maintainers.
33
+
34
+ ### What the package can do
35
+
36
+ Nothing — sibling plugins are out of scope by construction. The user can:
37
+
38
+ - Remove the sibling plugin if it is unwanted (via the harness's plugin management — outside this package).
39
+ - Ignore the namespaced names; they will not collide with this package's skill IDs because the prefix differs.
40
+
41
+ ### Where to look for the true source
42
+
43
+ Per Claude Code: `claude plugin list` (or equivalent) shows every loaded plugin. Each `<vendor>:` namespace traces back to a plugin row in that listing. Bug reports for those skills go to the respective plugin maintainer.
44
+
45
+ ## Class B — Deferred tools that need ToolSearch
46
+
47
+ ### Symptom
48
+
49
+ A session sees a `<system-reminder>` block like:
50
+
51
+ ```
52
+ The following deferred tools are now available via ToolSearch.
53
+ Their schemas are NOT loaded — calling them directly will fail with
54
+ InputValidationError. Use ToolSearch with query "select:<name>[,<name>...]"
55
+ to load tool schemas before calling them:
56
+ TaskCreate
57
+ WebFetch
58
+ Monitor
59
+ mcp__claude_ai_Linear__authenticate
60
+ ...
61
+ ```
62
+
63
+ The named tools are real — they show up in the harness's runtime — but the agent cannot call them directly because the tool **schema** isn't loaded yet.
64
+
65
+ ### What's actually happening
66
+
67
+ Claude Code's tool-loading is **context-budgeted**. The full tool registry (TaskCreate, WebFetch, every MCP tool from every registered server, etc.) can be many kilobytes of JSON-schema. Loading every schema on every turn would blow the context budget for routine reads. The harness solves this by registering tool **names** up-front and deferring schema load until `ToolSearch` is called — that's the on-ramp.
68
+
69
+ This is not a package issue, and `event4u/agent-config` cannot pre-load these schemas — the harness owns the budget.
70
+
71
+ ### What the package can do
72
+
73
+ Nothing — the loading strategy is the harness's contract with the model. Skills that want to use a deferred tool must:
74
+
75
+ 1. Run `ToolSearch` with `select:<name>` to load the schema.
76
+ 2. Call the tool with the now-known parameters.
77
+
78
+ Skills in this package that need deferred tools document the load step explicitly (see `agents-md-thin-root` § Tool loading for the pattern).
79
+
80
+ ### Where to look for the true source
81
+
82
+ Per Claude Code's documentation on tool surfaces and the `ToolSearch` primitive. The package does not own this behaviour.
83
+
84
+ ## Class C — Duplicate skill registration (real package bug, fixed in Phases A–C)
85
+
86
+ ### Symptom
87
+
88
+ The same skill appears twice in `<available_skills>` with different `description:` strings, or behaves inconsistently across calls.
89
+
90
+ ### What's actually happening
91
+
92
+ A user-global install (e.g. `~/.claude/skills/`) and a project-local install (`./.claude/skills/`) coexist at **different versions**. The harness loads both. The earlier register wins the description in some calls, the later in others.
93
+
94
+ Unlike Classes A and B, this is a real package-side issue.
95
+
96
+ ### What the package does
97
+
98
+ 1. **Default install is filesystem-only** ([`skill-distribution-channels.md`](skill-distribution-channels.md)).
99
+ 2. **Pre-flight scope guard** refuses installs that would create cross-scope drift ([`install-scopes.md`](install-scopes.md)).
100
+ 3. **Post-install probe** surfaces any remaining drift after install (`task probe:skills`).
101
+ 4. **Cleanup script** for stale other-scope installs (`bash scripts/cleanup_other_scope.sh --confirm`).
102
+
103
+ ### Where to look for the true source
104
+
105
+ ```bash
106
+ task probe:skills
107
+ ```
108
+
109
+ The probe lists every duplicate / drift finding with the exact source paths so the cause is visible in one read.
110
+
111
+ ## When in doubt — diagnostic sequence
112
+
113
+ 1. Run `task probe:skills` — rules out Class C.
114
+ 2. If the suspicious skill carries a `<vendor>:` prefix you don't recognise → Class A. Check `claude plugin list`.
115
+ 3. If the harness logs `deferred tools … available via ToolSearch` → Class B. The skill needs an explicit `ToolSearch` step.
116
+ 4. None of the above → file an issue at https://github.com/event4u-app/agent-config with the output of `task probe:skills` attached.
117
+
118
+ ## See also
119
+
120
+ - [`skill-distribution-channels.md`](skill-distribution-channels.md) — canonical channel per tool.
121
+ - [`install-scopes.md`](install-scopes.md) — scope guard contract.
122
+ - [`agents/evidence/audits/2026-05-distribution-channels/`](../../agents/evidence/audits/2026-05-distribution-channels/) — the underlying audits.
123
+ - [`README.md` § Harness expectations](../../README.md#harness-expectations) — front-of-house pointer to this contract.
@@ -1,3 +1,7 @@
1
+ ---
2
+ stability: experimental
3
+ ---
4
+
1
5
  # Host-Agent Protocol Contract
2
6
 
3
7
  > **Status** · v0 / inventory · 2026-05-24. The daily workspace shells out to
@@ -12,7 +12,7 @@ keep-beta-until: 2026-08-12
12
12
  > - **Created:** 2026-04-22
13
13
  > - **Status:** Phase 1 shipped 2026-04-23 — `DeliveryState` +
14
14
  > dispatcher live under
15
- > [`.agent-src.uncompressed/templates/scripts/implement_ticket/`](../../.agent-src.uncompressed/templates/scripts/implement_ticket/).
15
+ > [`.agent-src.uncondensed/templates/scripts/implement_ticket/`](../../.agent-src.uncondensed/templates/scripts/implement_ticket/).
16
16
  > Step wiring (Phase 2) still open. Schema **v1** envelope
17
17
  > (`work_engine.state` / `work_engine.migration.v0_to_v1`) shipped
18
18
  > 2026-04-27 as R1 Phase 2 — see [State schema v1](#state-schema-v1)
@@ -265,7 +265,7 @@ Bounded per the top-level roadmap rule:
265
265
  - **Four allowed types:** `domain-invariants`,
266
266
  `architecture-decisions`, `incident-learnings`,
267
267
  `historical-patterns`. All four exist in the
268
- [templates directory](../../.agent-src.uncompressed/templates/agents/memory/).
268
+ [templates directory](../../.agent-src.uncondensed/templates/agents/memory/).
269
269
  - **Keys:** files touched by the plan, symbols referenced by the
270
270
  ticket.
271
271
  - **Decision-change rule:** a memory hit that did not change an
@@ -278,7 +278,7 @@ Bounded per the top-level roadmap rule:
278
278
 
279
279
  Read from `.agent-settings.yml` `roles.active_role` and resolved
280
280
  via `resolve_policy()` in
281
- [`persona_policy.py`](../../.agent-src.uncompressed/templates/scripts/implement_ticket/persona_policy.py).
281
+ [`persona_policy.py`](../../.agent-src.uncondensed/templates/scripts/implement_ticket/persona_policy.py).
282
282
  Policies live alongside the dispatcher so the flow can consume
283
283
  them directly; the shared
284
284
  [`role-contracts`](../../docs/guidelines/agent-infra/role-contracts.md)
@@ -319,7 +319,7 @@ skill.
319
319
  When a step returns `blocked`, the orchestrator:
320
320
 
321
321
  1. Emits the numbered questions per
322
- [`user-interaction`](../../.agent-src.uncompressed/rules/user-interaction.md).
322
+ [`user-interaction`](../../.agent-src.uncondensed/rules/user-interaction.md).
323
323
  2. Writes a partial report up to the last successful step.
324
324
  3. Exits with a `blocked` status — no guess, no fallback.
325
325
 
@@ -332,7 +332,7 @@ the context. V1 explicitly does **not** attempt resumable sessions.
332
332
  Every step declares — in code — the conditions under which it
333
333
  can return `blocked`. The declarations live as module-level
334
334
  `AMBIGUITIES` tuples (see
335
- [`directives/backend/__init__.py`](../../.agent-src.uncompressed/templates/scripts/work_engine/directives/backend/__init__.py)
335
+ [`directives/backend/__init__.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/backend/__init__.py)
336
336
  `.all_ambiguities()`). The
337
337
  [`test_ambiguity_coverage.py`](../../tests/implement_ticket/test_ambiguity_coverage.py)
338
338
  suite locks the contract: adding a new `blocked` path without
@@ -377,7 +377,7 @@ empty, but all headings are present unless explicitly marked
377
377
  because nothing was changed.
378
378
 
379
379
  Implementation: see
380
- [`directives/backend/report.py`](../../.agent-src.uncompressed/templates/scripts/work_engine/directives/backend/report.py).
380
+ [`directives/backend/report.py`](../../.agent-src.uncondensed/templates/scripts/work_engine/directives/backend/report.py).
381
381
  Section renderers are pure and deterministic; consumers can rely
382
382
  on the heading order and on each section either rendering with
383
383
  content or being omitted per the rules above.
@@ -621,6 +621,6 @@ are blocked by `freeze-guard.yml::manifest-integrity` at PR time.
621
621
  - [`../../.github/workflows/freeze-guard.yml`](../../.github/workflows/freeze-guard.yml) — manifest-integrity + live-replay gates
622
622
  - [`agent-memory-contract.md`](agent-memory-contract.md)
623
623
  - [`../../docs/guidelines/agent-infra/role-contracts.md`](../../docs/guidelines/agent-infra/role-contracts.md)
624
- - [`../../.agent-src.uncompressed/rules/user-interaction.md`](../../.agent-src.uncompressed/rules/user-interaction.md)
625
- - [`../../.agent-src.uncompressed/rules/scope-control.md`](../../.agent-src.uncompressed/rules/scope-control.md)
626
- - [`../../.agent-src.uncompressed/rules/minimal-safe-diff.md`](../../.agent-src.uncompressed/rules/minimal-safe-diff.md)
624
+ - [`../../.agent-src.uncondensed/rules/user-interaction.md`](../../.agent-src.uncondensed/rules/user-interaction.md)
625
+ - [`../../.agent-src.uncondensed/rules/scope-control.md`](../../.agent-src.uncondensed/rules/scope-control.md)
626
+ - [`../../.agent-src.uncondensed/rules/minimal-safe-diff.md`](../../.agent-src.uncondensed/rules/minimal-safe-diff.md)
@@ -0,0 +1,77 @@
1
+ # Install Scopes — user-global vs project-local
2
+
3
+ **Status:** Active (locked 2026-05-25 via Phase B of `road-to-clean-skill-distribution-channels.md`)
4
+ **Owner:** maintainer-team
5
+ **Inputs:** [`docs/contracts/skill-distribution-channels.md`](skill-distribution-channels.md), [`agents/evidence/audits/2026-05-distribution-channels/03-installer-scope-flow.md`](../../agents/evidence/audits/2026-05-distribution-channels/03-installer-scope-flow.md)
6
+
7
+ ## Rule
8
+
9
+ `event4u/agent-config` may be installed at **one** of two scopes per developer machine:
10
+
11
+ | Scope | Lives at | Default for | Rationale |
12
+ |---|---|---|---|
13
+ | **project-local** | `<project-root>/.augment/`, `<project-root>/.claude/skills/`, … | Application repos | The skills, rules, and personas are pinned alongside the code they serve. The install is reproducible from the repo. |
14
+ | **user-global** | `~/.augment/`, `~/.claude/skills/`, … | Tooling repos / dotfiles | The same skills follow the developer across every project they touch. Useful when no specific repo "owns" the install. |
15
+
16
+ Installing at **both** scopes simultaneously is the failure mode the canonical-channel contract prevents — the host harness loads both registrations, and any version drift surfaces as duplicate skills with stale frontmatter (the 2026-05-25 bug).
17
+
18
+ ## The installer enforces this
19
+
20
+ `scripts/install.sh` runs `scripts/_lib/scope_guard.sh` before any file write:
21
+
22
+ 1. **`OK`** — no install at the other scope. Proceed.
23
+ 2. **`WARN`** — install at the other scope, same version. Same content; duplicate registration but no drift. Surface a warning, proceed.
24
+ 3. **`DRIFT`** — install at the other scope, different version. Block with a numbered-options prompt:
25
+
26
+ ```
27
+ 1. Abort install — fix drift first (recommended)
28
+ 2. Upgrade the OTHER scope first
29
+ 3. Force install at this scope — accept drift (set SCOPE_GUARD_BYPASS=1)
30
+ 4. Clean the other scope (bash scripts/cleanup_other_scope.sh --confirm)
31
+ ```
32
+
33
+ Non-interactive shells default to **abort**. CI runs and the orchestrator set `SCOPE_GUARD_BYPASS=1` to skip the gate.
34
+
35
+ The `agent-config setup` wizard exposes the same check at `GET /api/v1/wizard/scope-guard` (extended-mode endpoint). The first wizard step renders the verdict before the user picks an install scope.
36
+
37
+ ## How to clean a stale other-scope install
38
+
39
+ Use the companion script:
40
+
41
+ ```bash
42
+ # Dry-run (default) — list what would be removed
43
+ bash scripts/cleanup_other_scope.sh --user
44
+
45
+ # Confirm and delete
46
+ bash scripts/cleanup_other_scope.sh --user --confirm
47
+
48
+ # Narrow to a single tool
49
+ bash scripts/cleanup_other_scope.sh --user --confirm --tools=claude-code
50
+
51
+ # Remove from a specific project root
52
+ bash scripts/cleanup_other_scope.sh --project /path/to/proj --confirm
53
+ ```
54
+
55
+ The script refuses to delete anything without `--confirm` per `non-destructive-by-default`. It only touches the tool-scoped paths the contract names (`.claude/skills/`, `.augment/`, `.cursor/rules/`, `.clinerules/`, `.windsurf/rules/`, `.github/copilot-instructions.md`); the rest of the scope root is never modified.
56
+
57
+ ## When to pick which scope
58
+
59
+ - **App repo** (Laravel, Next.js, monorepo) → project-local. The skills/rules ship with the code; CI installs them deterministically.
60
+ - **Tooling repo** (dotfiles, personal sandbox) → user-global. The install follows the developer.
61
+ - **Both apply** (a tooling repo that also has project-specific overrides) → project-local for the overrides, no user-global install. The override mechanism at `agents/overrides/` covers the divergence.
62
+
63
+ The scope guard does **not** make the picking decision; it enforces "one scope per machine at one version".
64
+
65
+ ## Failure modes the guard catches
66
+
67
+ - A user installed `event4u/agent-config` globally a year ago, then `npx`d a recent project that pulled v3.x into `./.claude/skills/`. Same skill ID, different frontmatter on disk. Without the guard, the Claude session sees both registrations and the agent reasons against the wrong description.
68
+ - A maintainer ran `scripts/install.sh --target=$HOME` for a quick test and forgot to clean up. The next project install at the same scope spawns a drift the user has no easy way to debug.
69
+ - A CI run on a worker that previously cached `~/.claude/skills/` from a stale prior job. `CI=true` skips the gate, but the probe (Phase C) catches it post-install.
70
+
71
+ ## See also
72
+
73
+ - [`docs/contracts/skill-distribution-channels.md`](skill-distribution-channels.md) — per-tool canonical channel.
74
+ - [`scripts/_lib/scope_guard.sh`](../../scripts/_lib/scope_guard.sh) — guard implementation.
75
+ - [`scripts/cleanup_other_scope.sh`](../../scripts/cleanup_other_scope.sh) — companion cleanup.
76
+ - [`tests/test_cleanup_other_scope.py`](../../tests/test_cleanup_other_scope.py) — safety regression.
77
+ - [`README.md` § Installation](../../README.md) — consumer-facing install path.