@event4u/agent-config 5.6.1 → 5.8.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 (225) hide show
  1. package/.agent-src/commands/agent-handoff.md +1 -1
  2. package/.agent-src/commands/agent-status.md +1 -1
  3. package/.agent-src/commands/agents/audit.md +1 -1
  4. package/.agent-src/commands/agents/init.md +1 -1
  5. package/.agent-src/commands/agents/user/accept.md +3 -3
  6. package/.agent-src/commands/agents/user/init.md +4 -4
  7. package/.agent-src/commands/agents/user/show.md +3 -3
  8. package/.agent-src/commands/agents/user/update.md +3 -3
  9. package/.agent-src/commands/agents/user.md +1 -1
  10. package/.agent-src/commands/agents.md +1 -1
  11. package/.agent-src/commands/analytics/prune.md +1 -1
  12. package/.agent-src/commands/analytics/show.md +1 -1
  13. package/.agent-src/commands/analytics.md +1 -1
  14. package/.agent-src/commands/bug-fix.md +1 -1
  15. package/.agent-src/commands/challenge-me.md +1 -1
  16. package/.agent-src/commands/chat-history/import.md +1 -1
  17. package/.agent-src/commands/chat-history/learn.md +1 -1
  18. package/.agent-src/commands/chat-history/show.md +1 -1
  19. package/.agent-src/commands/chat-history.md +1 -1
  20. package/.agent-src/commands/check-current-md.md +1 -1
  21. package/.agent-src/commands/condense.md +1 -1
  22. package/.agent-src/commands/context.md +1 -1
  23. package/.agent-src/commands/cost-report.md +13 -8
  24. package/.agent-src/commands/council.md +3 -3
  25. package/.agent-src/commands/create-pr/description-only.md +1 -1
  26. package/.agent-src/commands/create-pr.md +1 -1
  27. package/.agent-src/commands/e2e-heal.md +1 -1
  28. package/.agent-src/commands/e2e-plan.md +1 -1
  29. package/.agent-src/commands/feature.md +1 -1
  30. package/.agent-src/commands/fix/ci.md +1 -1
  31. package/.agent-src/commands/fix/portability.md +1 -1
  32. package/.agent-src/commands/fix/pr-bot-comments.md +1 -1
  33. package/.agent-src/commands/fix/pr-comments.md +1 -1
  34. package/.agent-src/commands/fix/pr-developer-comments.md +1 -1
  35. package/.agent-src/commands/fix/refs.md +1 -1
  36. package/.agent-src/commands/fix/seeder.md +1 -1
  37. package/.agent-src/commands/fix.md +1 -1
  38. package/.agent-src/commands/judge.md +1 -1
  39. package/.agent-src/commands/knowledge/cross-repo.md +1 -1
  40. package/.agent-src/commands/knowledge/forget.md +1 -1
  41. package/.agent-src/commands/knowledge/ingest.md +1 -1
  42. package/.agent-src/commands/knowledge/list.md +1 -1
  43. package/.agent-src/commands/knowledge.md +1 -1
  44. package/.agent-src/commands/memory/add.md +1 -1
  45. package/.agent-src/commands/memory/learn-low-impact.md +1 -1
  46. package/.agent-src/commands/memory/load.md +1 -1
  47. package/.agent-src/commands/memory/mine-session.md +1 -1
  48. package/.agent-src/commands/memory/promote.md +1 -1
  49. package/.agent-src/commands/memory/propose.md +1 -1
  50. package/.agent-src/commands/memory.md +1 -1
  51. package/.agent-src/commands/mode.md +1 -1
  52. package/.agent-src/commands/optimize/agents-dir.md +1 -1
  53. package/.agent-src/commands/optimize/augmentignore.md +1 -1
  54. package/.agent-src/commands/optimize/rtk.md +1 -1
  55. package/.agent-src/commands/optimize/skills.md +1 -1
  56. package/.agent-src/commands/optimize.md +1 -1
  57. package/.agent-src/commands/orchestrate.md +1 -1
  58. package/.agent-src/commands/override/create.md +1 -1
  59. package/.agent-src/commands/override/manage.md +1 -1
  60. package/.agent-src/commands/override.md +1 -1
  61. package/.agent-src/commands/package-reset.md +1 -1
  62. package/.agent-src/commands/prediction-pool.md +234 -0
  63. package/.agent-src/commands/profile/activate.md +81 -0
  64. package/.agent-src/commands/profile/deactivate.md +68 -0
  65. package/.agent-src/commands/profile/show.md +70 -0
  66. package/.agent-src/commands/profile.md +68 -0
  67. package/.agent-src/commands/project-health.md +1 -1
  68. package/.agent-src/commands/quality-fix.md +1 -1
  69. package/.agent-src/commands/roadmap/process-full.md +1 -1
  70. package/.agent-src/commands/roadmap/process-phase.md +1 -1
  71. package/.agent-src/commands/roadmap/process-step.md +1 -1
  72. package/.agent-src/commands/roadmap.md +1 -1
  73. package/.agent-src/commands/set-cost-profile.md +9 -9
  74. package/.agent-src/commands/skill/preview.md +3 -3
  75. package/.agent-src/commands/skill.md +1 -1
  76. package/.agent-src/commands/skills/discover.md +1 -1
  77. package/.agent-src/commands/skills.md +1 -1
  78. package/.agent-src/commands/sync-agent-settings.md +3 -3
  79. package/.agent-src/commands/sync-gitignore/fix.md +1 -1
  80. package/.agent-src/commands/sync-gitignore.md +1 -1
  81. package/.agent-src/commands/update-form-request-messages.md +1 -1
  82. package/.agent-src/presets/README.md +1 -1
  83. package/.agent-src/profiles/README.md +1 -1
  84. package/.agent-src/rules/non-destructive-by-default.md +2 -1
  85. package/.agent-src/skills/check-refs/SKILL.md +1 -1
  86. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -1
  87. package/.agent-src/skills/git-workflow/SKILL.md +1 -1
  88. package/.agent-src/skills/jira-integration/SKILL.md +1 -1
  89. package/.agent-src/skills/markitdown/SKILL.md +1 -1
  90. package/.agent-src/skills/prediction-pool-optimizer/SKILL.md +314 -0
  91. package/.agent-src/skills/prediction-pool-optimizer/evals/triggers.json +20 -0
  92. package/.agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +175 -0
  93. package/.agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +109 -0
  94. package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
  95. package/.agent-src/skills/script-writing/SKILL.md +1 -1
  96. package/.agent-src/skills/token-optimizer/SKILL.md +1 -1
  97. package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -1
  98. package/.agent-src/templates/agent-settings.md +7 -7
  99. package/.agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  100. package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +54 -6
  101. package/.agent-src/templates/scripts/work_engine/hook_bootstrap.py +1 -1
  102. package/.agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +9 -7
  103. package/.agent-src/templates/scripts/work_engine/hooks/settings.py +9 -10
  104. package/.agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +17 -4
  105. package/.claude-plugin/marketplace.json +370 -364
  106. package/CHANGELOG.md +108 -0
  107. package/README.md +2 -2
  108. package/config/agent-settings.template.yml +11 -2
  109. package/config/discovery/packs.yml +11 -0
  110. package/config/discovery/session-profiles.yml +37 -0
  111. package/config/discovery/workspaces.yml +1 -1
  112. package/config/profiles/balanced.ini +1 -1
  113. package/config/profiles/full.ini +1 -1
  114. package/config/profiles/minimal.ini +1 -1
  115. package/dist/discovery/deprecation-report.md +1 -1
  116. package/dist/discovery/discovery-manifest.json +254 -100
  117. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  118. package/dist/discovery/discovery-manifest.summary.md +4 -3
  119. package/dist/discovery/orphan-report.md +1 -1
  120. package/dist/discovery/packs.json +41 -6
  121. package/dist/discovery/trust-report.md +3 -3
  122. package/dist/discovery/workspaces.json +19 -6
  123. package/dist/mcp/registry-manifest.json +3 -3
  124. package/dist/server/io/substituteTemplate.js +3 -3
  125. package/dist/server/io/substituteTemplate.js.map +1 -1
  126. package/dist/server/routes/settings.js +2 -2
  127. package/dist/server/routes/settings.js.map +1 -1
  128. package/dist/server/schemas/settings.js +4 -2
  129. package/dist/server/schemas/settings.js.map +1 -1
  130. package/dist/ui/assets/{index-DVsyUMZe.js → index-5lFqAKL0.js} +2 -2
  131. package/dist/ui/assets/index-5lFqAKL0.js.map +1 -0
  132. package/dist/ui/index.html +1 -1
  133. package/docs/architecture/current-onboard-baseline.md +3 -3
  134. package/docs/architecture.md +2 -2
  135. package/docs/catalog.md +11 -5
  136. package/docs/contracts/adr-level-6-productization.md +1 -1
  137. package/docs/contracts/command-clusters.md +2 -0
  138. package/docs/contracts/config-presets.md +2 -2
  139. package/docs/contracts/cost-profile-defaults.md +5 -5
  140. package/docs/contracts/discovery-manifest.schema.json +1 -1
  141. package/docs/contracts/explain-trace.schema.json +3 -3
  142. package/docs/contracts/memory-visibility-v1.md +15 -7
  143. package/docs/contracts/profile-system.md +2 -2
  144. package/docs/contracts/session-profile-overlay.md +120 -0
  145. package/docs/contracts/settings-api.md +3 -3
  146. package/docs/contracts/value-report-schema.md +14 -1
  147. package/docs/customization.md +47 -5
  148. package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +47 -11
  149. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +16 -2
  150. package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +1 -1
  151. package/docs/decisions/ADR-036-global-install-browser-wizard-handoff.md +106 -0
  152. package/docs/decisions/ADR-037-cost-profile-untangle.md +117 -0
  153. package/docs/decisions/ADR-038-canonical-settings-path.md +66 -0
  154. package/docs/decisions/ADR-039-claude-skills-untracked.md +139 -0
  155. package/docs/decisions/ADR-rule-kernel-and-router.md +1 -1
  156. package/docs/decisions/INDEX.md +4 -0
  157. package/docs/development.md +12 -0
  158. package/docs/getting-started.md +2 -2
  159. package/docs/guidelines/agent-infra/layered-settings.md +10 -4
  160. package/docs/installation.md +3 -3
  161. package/docs/setup/mcp-client-config.md +1 -1
  162. package/docs/skills-catalog.md +5 -1
  163. package/docs/value.md +9 -7
  164. package/docs/wizard.md +1 -1
  165. package/llms.txt +4 -0
  166. package/package.json +1 -1
  167. package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
  168. package/scripts/_cli/cmd_doctor.py +3 -2
  169. package/scripts/_cli/cmd_explain.py +1 -1
  170. package/scripts/_cli/cmd_versions.py +2 -2
  171. package/scripts/_cli/explain_last/inputs.py +11 -8
  172. package/scripts/_cli/explain_last/sections/inputs.py +1 -1
  173. package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
  174. package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
  175. package/scripts/_lib/agent_settings.py +54 -6
  176. package/scripts/_lib/agent_src.py +30 -0
  177. package/scripts/_lib/value_ladder.py +99 -2
  178. package/scripts/_lib/value_report.py +30 -16
  179. package/scripts/ai_council/modes.py +1 -1
  180. package/scripts/ai_council/session.py +5 -1
  181. package/scripts/audit_command_surface.py +7 -1
  182. package/scripts/audit_initial_context.py +26 -2
  183. package/scripts/check_gate_paths.py +117 -0
  184. package/scripts/check_references.py +51 -2
  185. package/scripts/check_skill_requires.py +143 -0
  186. package/scripts/check_test_coverage_diff.py +180 -0
  187. package/scripts/compile_router.py +5 -1
  188. package/scripts/condense.py +92 -4
  189. package/scripts/config/session_profiles.py +492 -0
  190. package/scripts/council_cli.py +5 -1
  191. package/scripts/first-run.sh +11 -11
  192. package/scripts/hook_manifest.yaml +15 -7
  193. package/scripts/hooks/dispatch_hook.py +8 -0
  194. package/scripts/install +14 -1
  195. package/scripts/install-hooks.sh +2 -1
  196. package/scripts/install.py +203 -433
  197. package/scripts/install_anthropic_key.sh +1 -1
  198. package/scripts/install_openai_key.sh +1 -1
  199. package/scripts/inventory_abstraction_budget.py +6 -1
  200. package/scripts/lint_agents_md.py +11 -4
  201. package/scripts/lint_discovery_vocabulary.py +5 -5
  202. package/scripts/lint_hook_concern_budget.py +5 -1
  203. package/scripts/lint_marketplace.py +18 -7
  204. package/scripts/lint_roadmap_ci_steps.py +5 -1
  205. package/scripts/lint_roadmap_complexity.py +5 -1
  206. package/scripts/lint_value_dashboard.py +1 -1
  207. package/scripts/mcp_server/prompts.py +5 -1
  208. package/scripts/prediction-pool/adapters/_schema.md +42 -0
  209. package/scripts/prediction-pool/adapters/kicktipp.yml +23 -0
  210. package/scripts/prediction-pool/poisson_sim.py +167 -0
  211. package/scripts/prediction-pool/pool_winsim.py +236 -0
  212. package/scripts/prediction-pool/score_ev.py +188 -0
  213. package/scripts/profile_staleness_hook.py +69 -0
  214. package/scripts/render_value_md.py +1 -0
  215. package/scripts/roadmap_progress_hook.py +56 -6
  216. package/scripts/schemas/agent-settings.schema.json +77 -0
  217. package/scripts/schemas/skill.schema.json +7 -0
  218. package/scripts/smoke_quickstart.py +7 -6
  219. package/scripts/sync_agent_settings.py +12 -5
  220. package/scripts/validate_agent_settings.py +124 -0
  221. package/scripts/validate_decision_engine.py +5 -1
  222. package/templates/minimal/.agent-settings.yml +1 -1
  223. package/dist/ui/assets/index-DVsyUMZe.js.map +0 -1
  224. package/scripts/measure_roadmap_trajectory.py +0 -112
  225. package/scripts/verify_roadmap_closure.py +0 -327
@@ -34,7 +34,7 @@ Step-15 introduces three new configuration concepts:
34
34
 
35
35
  A pre-existing fourth concept is in play:
36
36
 
37
- - **`cost_profile`** — current setting in `.agent-settings.yml`, values
37
+ - **`rule_loading_tier`** — current setting in `.agent-settings.yml`, values
38
38
  `minimal` / `balanced` / `full` / `custom`. Owns **rule-tier loading**
39
39
  (kernel · kernel + tier-1 · kernel + tier-1 + tier-2). Contract:
40
40
  [`docs/contracts/cost-profile-defaults.md`](../contracts/cost-profile-defaults.md).
@@ -42,7 +42,7 @@ A pre-existing fourth concept is in play:
42
42
  Without a written boundary, three failure modes are predictable:
43
43
 
44
44
  1. The preset loader re-implements rule-tier gating (overlap with
45
- `cost_profile`).
45
+ `rule_loading_tier`).
46
46
  2. Packs ship duplicate `profile` + `preset` defaults that drift from
47
47
  the canonical source.
48
48
  3. Three teams add knobs to three places, and a user picking
@@ -58,22 +58,22 @@ Four orthogonal axes, four owners, one resolution chain.
58
58
  | **Profile** | *Who is the user?* (audience taxonomy) | Default skill/command surface; README entry-paragraph; persona pre-selection | `profile.id` |
59
59
  | **Preset** | *How cautious is this run?* (risk + cost + autonomy budget) | The 12+ governance knobs (per-call $ ceiling, confidence band, block-on-risk, autonomy default, council escalation, …) | `preset.id` |
60
60
  | **Pack** | *What bundle of skills + commands?* (workflow recipe) | A frozen `(profile, preset, allow_skills, allow_commands)` 4-tuple; nothing more | `pack.id` |
61
- | **Cost Profile** | *How many rules load?* (token budget) | Rule-tier loading at session start (kernel · +tier-1 · +tier-2) | `cost_profile` |
61
+ | **Cost Profile** | *How many rules load?* (token budget) | Rule-tier loading at session start (kernel · +tier-1 · +tier-2) | `rule_loading_tier` |
62
62
 
63
63
  ### Resolution chain (read order, last writer wins)
64
64
 
65
65
  ```
66
- pack → profile → preset → cost_profile → user/env/runtime overrides
66
+ pack → profile → preset → rule_loading_tier → user/env/runtime overrides
67
67
  ```
68
68
 
69
69
  - A **pack** declares defaults for `profile`, `preset`, and the
70
- skill / command allowlists. It cannot set `cost_profile` (that
70
+ skill / command allowlists. It cannot set `rule_loading_tier` (that
71
71
  axis belongs to the rule-tier loader and is governed separately).
72
72
  - A **profile** declares defaults for `preset`, audience-specific
73
73
  README pointer, persona pre-selection. It cannot set any preset
74
74
  knob directly — only `preset.id`.
75
75
  - A **preset** owns the 12+ knobs. No other axis writes them.
76
- - A **cost_profile** owns rule-tier loading. No other axis writes it.
76
+ - A **rule_loading_tier** owns rule-tier loading. No other axis writes it.
77
77
  - The user's `.agent-settings.yml`, environment variables, and
78
78
  runtime CLI flags override every axis above them.
79
79
 
@@ -86,7 +86,7 @@ DUPLICATION ACROSS AXES IS A CONTRACT VIOLATION.
86
86
 
87
87
  - A pack **may not** override a preset knob; it overrides `preset.id`.
88
88
  - A profile **may not** override a preset knob; it overrides `preset.id`.
89
- - A preset **may not** override `cost_profile`; the user does that.
89
+ - A preset **may not** override `rule_loading_tier`; the user does that.
90
90
  - The CI `task lint-config-schema` (added in Phase 1) hard-fails on a
91
91
  pack/profile YAML that names any preset-owned knob.
92
92
 
@@ -101,15 +101,15 @@ DUPLICATION ACROSS AXES IS A CONTRACT VIOLATION.
101
101
  has a single home.
102
102
  - Phase 2 item 7 (Workflow Packs) is a 4-tuple, not a re-implementation
103
103
  of profile + preset. Pack YAML stays under 30 lines.
104
- - `cost_profile` keeps its single-axis charter; this ADR explicitly
104
+ - `rule_loading_tier` keeps its single-axis charter; this ADR explicitly
105
105
  refuses to fold it into the preset layer.
106
106
 
107
107
  ### Negative
108
108
 
109
109
  - One more concept on the install screen (`profile` + `preset` + `pack`
110
- + `cost_profile` = four axes). Mitigated by: the wizard (Phase 1 item
110
+ + `rule_loading_tier` = four axes). Mitigated by: the wizard (Phase 1 item
111
111
  2) only asks for **profile** + **stack** + **risk appetite** and
112
- derives the rest. Packs are opt-in; `cost_profile` keeps its
112
+ derives the rest. Packs are opt-in; `rule_loading_tier` keeps its
113
113
  `balanced` default.
114
114
  - A skill-allowlist conflict between a pack and a runtime CLI flag is
115
115
  resolved by "runtime wins". Users on a pack who shadow-disable a
@@ -125,8 +125,44 @@ DUPLICATION ACROSS AXES IS A CONTRACT VIOLATION.
125
125
  (Phase 1 item 4). Pack shape lives in `docs/contracts/workflow-packs.md`
126
126
  (Phase 2 item 7).
127
127
 
128
+ ## Addendum — runtime `active_packs` overlay is not a fifth axis (2026-06-02)
129
+
130
+ The session-profile-activation work introduces an **ephemeral
131
+ `runtime.active_packs` overlay**: a developer activates a profile for the
132
+ current session and only the matching packs' commands/skills are the
133
+ surfaced set. This addendum records that the overlay does **not** add a
134
+ fifth axis and does **not** violate the no-duplication rule above.
135
+
136
+ The resolution chain is
137
+ `pack → profile → preset → rule_loading_tier → user/env/runtime overrides`.
138
+ The `active_packs` overlay is an instance of the chain's **existing final
139
+ link** (`… → user/env/runtime overrides`): a runtime override that
140
+ **modulates the `pack` axis** for the duration of a session. It selects
141
+ which already-installed packs are *surfaced*; it does not create a new
142
+ knob, a new vocabulary, or a new ownership boundary.
143
+
144
+ - **Axis ownership unchanged.** The `pack` axis still owns "which bundle".
145
+ The overlay narrows the *active subset* of installed packs at runtime —
146
+ the same way the documented "runtime wins" rule lets a CLI flag
147
+ shadow-disable a pack-supplied skill (see Consequences § Negative). It
148
+ is the read-time companion of that write-time precedent.
149
+ - **No knob duplication.** The overlay stores only a list of pack ids
150
+ (`runtime.active_packs: [...]`), the closure of the activated
151
+ profile/pack. It never restates a `preset` knob or a `profile` default.
152
+ - **Governance stays on its own axis.** Profile activation **does not**
153
+ touch `rule_loading_tier`. Rules load by tier + trigger, never by pack
154
+ (session-profile work Phase 0.4). Letting a profile move the tier would
155
+ be the very axis-collision this ADR forbids.
156
+ - **Ephemeral + uncommitted.** The overlay lives in
157
+ `.agent-settings.local.yml` (gitignored, deepest-winning layer), never
158
+ the committed settings file — so it cannot drift into a persisted axis.
159
+
160
+ Net: the overlay is a session-scoped *view* over the `pack` axis, not a
161
+ new axis. ADR-010's orthogonality holds.
162
+
128
163
  ## See also
129
164
 
130
- - [`docs/contracts/cost-profile-defaults.md`](../contracts/cost-profile-defaults.md) — the existing `cost_profile` contract this ADR explicitly does **not** touch.
165
+ - [`agents/settings/contexts/session-host-capability-audit.md`](../../agents/settings/contexts/session-host-capability-audit.md) — host-capability facts that bound the overlay's lifecycle (addendum input).
166
+ - [`docs/contracts/cost-profile-defaults.md`](../contracts/cost-profile-defaults.md) — the existing `rule_loading_tier` contract this ADR explicitly does **not** touch.
131
167
  - [`agents/roadmaps/step-15-product-refinement.md`](../../agents/roadmaps/step-15-product-refinement.md) — Phase 1 items 1, 4 and Phase 2 item 7.
132
168
  - [`agents/runtime/council/responses/2026-05-16-step-15-product-refinement-v3.json`](../../agents/runtime/council/responses/2026-05-16-step-15-product-refinement-v3.json) — Council v3 action #2 (origin). <!-- council-ref-allowed: ADR decision-trace to originating council response -->
@@ -34,7 +34,7 @@ truth. The scan emits a single `dist/discovery/discovery-manifest.json`
34
34
  shipped inside the npm tarball; every downstream surface reads from that
35
35
  file and from nothing else. This ADR locks the **frontmatter shape**, the
36
36
  **closed vocabularies**, and the **non-overlap rule** that keeps the new
37
- keys from colliding with the existing `cost_profile` / `profile.id` axes
37
+ keys from colliding with the existing `rule_loading_tier` / `profile.id` axes
38
38
  (ADR-010).
39
39
 
40
40
  ### Why a closed vocabulary
@@ -121,6 +121,7 @@ Amendments to the workspace list require an ADR-013 amendment.
121
121
  | `small-business` | SMB-shaped owner workflows. |
122
122
  | `construction` | Trade-business workflows. |
123
123
  | `ai-video` | AI video pipeline (per ADR-011, the only heavyweight domain). |
124
+ | `fun` | Non-essential social/fun workflows (prediction-pool tips, etc.). Optional under the `small-business` workspace; `experimental` trust. |
124
125
  | `meta` | Artefacts that maintain *this* package (`agent-config` itself). |
125
126
 
126
127
  Amendments to the pack list require an ADR-013 amendment and the
@@ -128,7 +129,7 @@ matching `config/discovery/packs.yml` row in the same PR.
128
129
 
129
130
  ### Non-overlap rule (ADR-010 alignment)
130
131
 
131
- - `cost_profile` values (`minimal`, `balanced`, `full`, `custom`) are
132
+ - `rule_loading_tier` values (`minimal`, `balanced`, `full`, `custom`) are
132
133
  **not** pack ids. The scanner hard-fails on overlap.
133
134
  - `profile.id` values (`founder`, `developer`, `content_creator`,
134
135
  `agency`, `finance`, `ops`) are **not** pack ids. The scanner
@@ -246,6 +247,19 @@ allowed by [`discovery-manifest.schema.json`](../contracts/discovery-manifest.sc
246
247
  Additive, no vocabulary rename. (Same change cleaned the `finance` label from
247
248
  "Finance / CFO" to "Finance".)
248
249
 
250
+ ### 2026-06-01 — New `fun` pack
251
+
252
+ Added pack id `fun` to the closed vocabulary (Non-essential social/fun
253
+ workflows — prediction-pool tip optimization, etc.). Mirrored in
254
+ [`config/discovery/packs.yml`](../../config/discovery/packs.yml) and the
255
+ `ADR_PACKS` frozenset in
256
+ [`scripts/lint_discovery_vocabulary.py`](../../scripts/lint_discovery_vocabulary.py).
257
+ Optional under the `small-business` workspace (alongside `ai-video`);
258
+ `trust_level_default: experimental`, `install.default: false`. First
259
+ artefacts: the `/prediction-pool` command + `prediction-pool-optimizer` skill in
260
+ `packages/pack-fun/`. Additive, no rename; non-overlap with cost-profile
261
+ and `profile.id` reservations holds.
262
+
249
263
  ## Cross-references
250
264
 
251
265
  - [ADR-007 — Agent Discovery Scopes](ADR-007-agent-discovery-scopes.md):
@@ -23,7 +23,7 @@ review_date: 2026-08-30
23
23
 
24
24
  ## Context
25
25
 
26
- `model-recommendation` (tier-2a, `core`) is a dead shell — it routes to `command:set-cost-profile`, which flips `cost_profile` but never selects a model. The task→model intelligence already exists in `contexts/model-recommendations.md` but has no mechanism to act. Claude Code now honours a native skill `model:` frontmatter key — verified against the official skills docs (`code.claude.com/docs/en/skills.md`): the override applies for the rest of the current turn, reverts to the session model on the next prompt, and accepts the `/model` values plus `inherit`. That makes per-skill model selection structural on Claude; Augment has no per-turn override, so a rule surfaces a one-question suggestion there.
26
+ `model-recommendation` (tier-2a, `core`) is a dead shell — it routes to `command:set-cost-profile`, which flips `rule_loading_tier` but never selects a model. The task→model intelligence already exists in `contexts/model-recommendations.md` but has no mechanism to act. Claude Code now honours a native skill `model:` frontmatter key — verified against the official skills docs (`code.claude.com/docs/en/skills.md`): the override applies for the rest of the current turn, reverts to the session model on the next prompt, and accepts the `/model` values plus `inherit`. That makes per-skill model selection structural on Claude; Augment has no per-turn override, so a rule surfaces a one-question suggestion there.
27
27
 
28
28
  The projection constraint: source `SKILL.md` is shared across tools via `.agent-src/`. `.claude/skills/<name>` is a whole-**directory symlink** to `.agent-src/skills/<name>`; `.claude/skills/<slug>/SKILL.md` for commands is a **symlink** inside a real dir. Augment skills symlink the same target. A Claude-only native `model:` therefore cannot live in the shared symlink target without also appearing in Augment.
29
29
 
@@ -0,0 +1,106 @@
1
+ ---
2
+ adr: 036
3
+ status: accepted
4
+ date: 2026-06-01
5
+ decision: global-install-browser-wizard-handoff
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: v5.x · install-UX consistency
9
+ type: forward-looking
10
+ ---
11
+
12
+ # ADR-036 — Global install hands off to the browser wizard (zero terminal prompts)
13
+
14
+ ## Status
15
+
16
+ **Accepted** · 2026-06-01. Implements the install-UX half of
17
+ [`road-to-self-update-and-global-hook-resolution`](../../agents/roadmaps/road-to-self-update-and-global-hook-resolution.md)
18
+ (Phase 6). Builds on [`ADR-020`](ADR-020-global-only-consumer-scope.md)
19
+ (global-only consumer scope) and reuses the wizard contract from
20
+ [`gui-wizard`](../contracts/gui-wizard.md).
21
+
22
+ ## Context
23
+
24
+ `npx @event4u/agent-config init` is the canonical first-time install
25
+ (README Quickstart) and `agent-config upgrade` is the self-update path
26
+ (ADR-020 update-lag fix). Both reach the global install through
27
+ `scripts/install --global` → `install.py` `install_global()`. Field use
28
+ surfaced four defects that made the global path drop into terminal
29
+ interaction instead of the browser wizard the project path already used:
30
+
31
+ 1. **Terminal tool-picker.** `scripts/install`'s `prompt_tools()` fired
32
+ on every interactive run, pre-empting the wizard and — via
33
+ `TOOLS_EXPLICIT` — suppressing it (`_wizard_should_launch` treats an
34
+ explicit `--tools=` as "headless").
35
+ 2. **No wizard on `--global`.** `install_global()` returned before the
36
+ `_wizard_should_launch` / `_wizard_spawn` block; only the project
37
+ path launched the GUI.
38
+ 3. **Browser never opened.** `_wizard_await_ready` **printed** the
39
+ `WIZARD_READY` URL but never opened it (the child is spawned with
40
+ `--no-open` so the Python parent owns the open — it only printed).
41
+ 4. **Wrong identity + ADR-020 leak.** Spawning the wizard with
42
+ `--project-root <detect_root>` forced project write-root, so the
43
+ wizard read neither nor wrote the **global**
44
+ `~/.event4u/agent-config/settings/.agent-user.yml` (the saved
45
+ identity → name/language pre-fill defaulted to the OS account, e.g.
46
+ `mathiasberg`, instead of the saved `Matze`/`de`), and global content
47
+ would land in the project tree — an ADR-020 violation.
48
+
49
+ ## Decision
50
+
51
+ On the interactive global-install path (`agent-config init` / `global` /
52
+ `upgrade` / `refresh --global`), the install is **zero-terminal-interaction
53
+ and hands off to the browser wizard**:
54
+
55
+ - `scripts/install` skips `prompt_tools()` when the wizard will launch
56
+ (TTY · not `CI` · not `AGENT_CONFIG_NO_UI`) — the wizard is the single
57
+ tool-selection surface.
58
+ - `install.py` launches the wizard after `install_global()` (parity with
59
+ the project path), gated by the single source of truth
60
+ `_wizard_should_launch`.
61
+ - The wizard is spawned **without** `--project-root` so `resolveWriteRoot`
62
+ picks the **global** write root — the saved `.agent-user.yml` drives the
63
+ identity pre-fill, and no global content is written into the project
64
+ tree (reinforces ADR-020).
65
+ - `_wizard_await_ready` opens the browser (`webbrowser.open`) after
66
+ printing the URL; the printed URL remains the headless fallback.
67
+ - On the wizard-handoff path the run is non-interactive: foreign-file
68
+ conflicts auto-resolve to overwrite and the legacy migration runs
69
+ without the `[Y/n]` gate — no `--force`, no prompts. The wizard is the
70
+ settings + package surface that recreates fresh config.
71
+
72
+ The terminal picker, conflict prompt, and migrate prompt remain the
73
+ behaviour on **headless** paths (no TTY · `CI` · `--no-ui` ·
74
+ explicit `--tools=`), where no wizard launches.
75
+
76
+ ## Consequences
77
+
78
+ **Positive.**
79
+ - "Run the command, it installs, then the wizard opens for packages +
80
+ settings" — the contract holds for `init` and `upgrade` alike.
81
+ - A returning user's name/language pre-fill from the saved identity, not
82
+ the OS account.
83
+ - Global content never leaks into the project tree on the wizard path.
84
+
85
+ **Negative / trade-offs.**
86
+ - Auto-overwrite + auto-migrate on the wizard path remove the per-file
87
+ confirmation. Scoped to the wizard-handoff path on paths agent-config
88
+ owns (ADR-020 global root); headless paths keep the prompts.
89
+ - The browser-open + zero-prompt flow cannot be asserted in headless CI;
90
+ the welcome-step identity pre-fill (`Matze`/`de` from the global
91
+ write root) is covered by a Playwright drive.
92
+
93
+ ## Alternatives considered
94
+
95
+ - **`npx` fallback inside the PostToolUse hook.** Rejected by the
96
+ 2026-05-30 council (per-tool-call network + version drift) and again
97
+ 2026-06-01; orthogonal to install UX. Hooks resolve the global binary.
98
+ - **Keep the terminal prompts, document `--force`.** Rejected — the
99
+ maintainer's explicit contract is zero terminal interaction with a
100
+ browser handoff.
101
+
102
+ ## References
103
+
104
+ - [`ADR-020`](ADR-020-global-only-consumer-scope.md) — global-only consumer scope.
105
+ - [`gui-wizard`](../contracts/gui-wizard.md) — wizard apply contract.
106
+ - [`road-to-self-update-and-global-hook-resolution`](../../agents/roadmaps/road-to-self-update-and-global-hook-resolution.md) — companion roadmap.
@@ -0,0 +1,117 @@
1
+ ---
2
+ adr: 037
3
+ status: accepted
4
+ date: 2026-06-01
5
+ decision: cost-profile-untangle
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: cost-profile-untangle
9
+ type: structural
10
+ review_date: 2026-09-01
11
+ ---
12
+
13
+ # ADR-037 — Untangle `cost_profile` into single-purpose settings
14
+
15
+ ## Status
16
+
17
+ **Accepted** · 2026-06-01. AI Council (anthropic/claude-sonnet-4-5 +
18
+ openai/gpt-4o, analysis lens, 3 rounds, 2026-06-01) converged on the
19
+ rename + keep-decoupled design below; findings were critically evaluated
20
+ against the codebase before adoption.
21
+
22
+ ## Context
23
+
24
+ The `cost_profile` setting had accreted multiple responsibilities plus a
25
+ hard naming collision:
26
+
27
+ 1. **Canonical meaning** — rule-tier loading (`minimal | balanced | full |
28
+ custom`), a token-footprint lever resolved from `dist/router.json`.
29
+ 2. **Colliding second meaning** — a separate contract
30
+ (`memory-visibility-v1`) and the work-engine hook read the *same key*
31
+ `cost_profile` with an incompatible value set (`lean | standard |
32
+ verbose`) to gate the `🧠 Memory` visibility-line cadence. Because no
33
+ real install ever wrote `cost_profile: lean`, the suppress branch was
34
+ **unreachable dead code**.
35
+ 3. **Default drift** — the default was declared in four places with three
36
+ different answers (`balanced`, `minimal`, `standard`).
37
+ 4. **Migrated intent** — `cost_profile` was originally meant to gate
38
+ self-optimization; that capability had already moved to the independent
39
+ `pipelines.skill_improvement` setting + tier-2a rule loading.
40
+ 5. **Naming confusion** — four "cost"-sounding concepts (`cost_profile`,
41
+ the memory cadence, `/cost:report` + `cost.budgets`, and
42
+ `model_tier`/`model.auto_switch`) competed for one mental slot; only the
43
+ first two were literally named `cost_profile`, and the second was the
44
+ broken one.
45
+
46
+ The root cause was the absence of a settings schema: nothing prevented one
47
+ key from carrying two value vocabularies.
48
+
49
+ ## Decision
50
+
51
+ 1. **One key, one job.** Rename the canonical setting `cost_profile` →
52
+ `rule_loading_tier` (values unchanged: `minimal | balanced | full |
53
+ custom`). The name now describes the mechanism, not a side effect, which
54
+ makes the `/cost:report` mismatch obvious ("you can't lower your rule
55
+ loading tier to save money without losing guardrails").
56
+ 2. **Memory cadence owns its own key.** The visibility-line cadence moves
57
+ to `memory.cadence` (`auto | always | never`, default `always` —
58
+ behaviour-neutral; the previously-dead suppress path is now reachable as
59
+ `auto`). Named `memory.cadence`, not `memory_status`, to avoid a clash
60
+ with the existing `scripts/memory_status.py`.
61
+ 3. **Self-optimization stays decoupled.** `pipelines.skill_improvement`
62
+ remains the independent lever; `rule_loading_tier` is *not* re-coupled to
63
+ learning behaviour. The council was unanimous that coupling token
64
+ footprint to learning behaviour is the wrong axis.
65
+ 4. **Schema prevents recurrence.** A new
66
+ `scripts/schemas/agent-settings.schema.json` (+ CI validator) enum-
67
+ constrains the value-bearing keys so a value-vocabulary collision is a
68
+ hard CI failure, not silent dead code.
69
+ 5. **Migration, not break.** `install.py`'s `LEGACY_RENAME_MAP` rewrites
70
+ `cost_profile` → `rule_loading_tier`; loaders read the legacy key as a
71
+ fallback during a grace period. The default is consolidated to one
72
+ source of truth (`balanced`).
73
+
74
+ ### Deliberately *not* done (scope discipline)
75
+
76
+ - **Command + file names kept** (`/set-cost-profile`,
77
+ `cost-profile-defaults.md`) — renaming them cascades through the
78
+ ownership-matrix, command-surface, discovery manifest, and marketplace
79
+ (all CI-enforced/generated); the cost/benefit did not clear the bar.
80
+ Their *content* now uses `rule_loading_tier`.
81
+ - **`custom` left unchanged** — it is absent from `dist/router.json`
82
+ profiles (documented but not router-dispatched). Its implementation is a
83
+ pre-existing question, tracked as a follow-up, not part of this rename.
84
+ - **`dist/router.json` `profiles` key kept** — it is the tier-list
85
+ structure, not the setting name; consumers may parse it.
86
+
87
+ ## Consequences
88
+
89
+ - The silent dead-code bug is gone; the memory cadence is reachable and
90
+ tested.
91
+ - A future settings-key collision fails CI immediately.
92
+ - Existing installs migrate automatically; no manual action.
93
+ - Internal naming is slightly inconsistent (command/file still say
94
+ "cost-profile" while the setting is `rule_loading_tier`) — an accepted
95
+ trade-off against a high-churn, low-value rename of generated surfaces.
96
+ - Breaking change to a public settings key → next major (see
97
+ `BREAKING_CHANGES.md`).
98
+
99
+ ## Alternatives considered
100
+
101
+ - **Re-couple `cost_profile` to self-optimization** (the original intent) —
102
+ rejected: couples two orthogonal axes (token footprint + learning
103
+ behaviour); the council and the existing decoupled architecture both
104
+ argue against it.
105
+ - **Minimal fix — resolve only the collision, keep the `cost_profile`
106
+ name** — rejected: leaves the misleading "cost" name and so leaves part
107
+ of the four-concept confusion intact.
108
+ - **Rename the command + doc files too** — deferred: disproportionate
109
+ cascade through CI-enforced manifests for marginal benefit.
110
+
111
+ ## References
112
+
113
+ - `BREAKING_CHANGES.md` (next-major entry).
114
+ - `docs/contracts/memory-visibility-v1.md` § Cadence interaction.
115
+ - `docs/contracts/cost-profile-defaults.md` (rule-loading defaults).
116
+ - `scripts/schemas/agent-settings.schema.json` + `scripts/validate_agent_settings.py`.
117
+ - ADR-010 (profile / pack / preset boundary) — `cost_profile` axis renamed.
@@ -0,0 +1,66 @@
1
+ # ADR-038: Canonical settings path is `agents/settings/.agent-settings.yml`
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-06-01
5
+
6
+ ## Context
7
+
8
+ The project's settings *layer* lives under `agents/settings/` — it already
9
+ holds `contexts/`, `policies/`, and the per-machine override
10
+ `.agent-settings.local.yml` (relocated there by `4f887ae8`). The main
11
+ developer settings file, however, stayed at the repo root as
12
+ `./.agent-settings.yml`: `agent_settings.py` (`DEFAULT_PROJECT_FILE`),
13
+ `install.py` (`SETTINGS_FILE`), `sync_agent_settings.py` (`DEFAULT_SETTINGS`),
14
+ and ~30 reader scripts all hardcode the root path. The split is inconsistent —
15
+ the override sits in the settings layer while the file it overrides sits at the
16
+ root — and surfaced as a real defect: roadmaps and contributors referenced
17
+ `agents/settings/.agent-settings.yml` (the location they expected), which then
18
+ failed `check-references` because no such canonical file existed.
19
+
20
+ Both files are gitignored (`.gitignore` matches the `.agent-settings.yml`
21
+ basename anywhere) and per-machine; neither is ever committed.
22
+
23
+ ## Decision
24
+
25
+ The canonical project settings file is **`agents/settings/.agent-settings.yml`**,
26
+ co-located with the rest of the settings layer. The repo-root
27
+ `./.agent-settings.yml` becomes a **back-compat read-fallback only**.
28
+
29
+ - **Read precedence (deepest wins):** legacy root `.agent-settings.yml`
30
+ < canonical `agents/settings/.agent-settings.yml` < per-machine
31
+ `agents/settings/.agent-settings.local.yml`.
32
+ - **Write target:** always `agents/settings/.agent-settings.yml`
33
+ (`canonical_settings_write_path`). The legacy root file is migrated into
34
+ the canonical location, never written afresh.
35
+ - **Resolution helper:** `project_settings_path()` returns the canonical file
36
+ when present, else the legacy root file when present (back-compat), else the
37
+ canonical path (fresh repo). All direct readers route through it.
38
+ - **Migration:** `install` and the `migrate` command relocate an existing root
39
+ `./.agent-settings.yml` to `agents/settings/.agent-settings.yml` once; no
40
+ consumer install breaks because the fallback keeps the old location readable
41
+ until it is moved.
42
+
43
+ ## Consequences
44
+
45
+ - Settings layout is internally consistent: the main file and its override live
46
+ together under `agents/settings/`.
47
+ - Existing installs keep working unchanged until migrated (read-fallback).
48
+ - One-time cost: ~36 Python reader sites + the TS settings server/CLI route
49
+ through the helper; install/sync/migrate gain the relocation step; docs and
50
+ the gitignore-managed block name the canonical path.
51
+ - The `.gitignore` basename match already covers the canonical path — no new
52
+ ignore entry required.
53
+
54
+ ## Alternatives considered
55
+
56
+ - **Keep root canonical (status quo).** Rejected: leaves the override/main-file
57
+ split inconsistent and keeps surfacing as wrong-path references.
58
+ - **Hard cut, no fallback.** Rejected: breaks every existing install (and this
59
+ repo) until each re-runs setup; the fallback is cheap insurance.
60
+
61
+ ## References
62
+
63
+ - `scripts/_lib/agent_settings.py` — resolver cascade + `project_settings_path` / `canonical_settings_write_path`.
64
+ - `4f887ae8` — prior relocation of `.agent-settings.local.yml` into `agents/settings/`.
65
+ - `docs/guidelines/agent-infra/layered-settings.md` — precedence model.
66
+ - `docs/contracts/migrate-command.md` — migration surface.
@@ -0,0 +1,139 @@
1
+ ---
2
+ adr: 039
3
+ status: accepted
4
+ date: 2026-06-01
5
+ decision: claude-skills-untracked
6
+ supersedes: —
7
+ superseded_by: —
8
+ phase: road-to-claude-skills-untrack
9
+ type: structural
10
+ review_date: 2026-06-15
11
+ ---
12
+
13
+ # ADR-039 — `.claude/skills/` is untracked; skills resolve from committed canonical sources
14
+
15
+ ## Status
16
+
17
+ **Accepted** · 2026-06-01. Decision lands **without** soak — all binding
18
+ conditions were verified empirically against a real Claude Code instance
19
+ (v2.1.159) in the same session. Review date 2026-06-15 keeps the revert path
20
+ open; reverting is one `git rm`-reversing commit plus a generator repoint.
21
+
22
+ ## Context
23
+
24
+ `event4u/agent-config` distributes ~365 skills to Claude Code. Until
25
+ commit `c0e2d897` the package committed `.claude/skills/<name>/SKILL.md`
26
+ (symlinks) and the plugin marketplace (`.claude-plugin/marketplace.json`)
27
+ referenced those committed paths. ADR-030 had established `.claude/skills/`
28
+ as Claude Code's filesystem-channel convention, and the cleanup that
29
+ untracked `.claude/{rules,personas,user-types}/` deliberately **kept**
30
+ `.claude/skills/` tracked, flagging the question for a dedicated
31
+ investigation (`road-to-claude-skills-untrack`).
32
+
33
+ The question this ADR closes: can the package stop committing
34
+ `.claude/skills/` — so `.claude/` in git reduces to `settings.json` only —
35
+ without breaking skill resolution on any channel?
36
+
37
+ Three resolution channels exist:
38
+
39
+ 1. **Marketplace plugin** — Claude Code reads `.claude-plugin/marketplace.json`
40
+ `skills[]` and loads skills from the referenced source paths.
41
+ 2. **Consumer filesystem** — `scripts/install.sh` builds `~/.claude/skills/`
42
+ symlinks at install time.
43
+ 3. **Local dev** — `task generate-tools` rebuilds a gitignored local
44
+ `.claude/skills/` for in-repo auto-discovery.
45
+
46
+ Commit `c0e2d897` already repointed the marketplace generator (real skills →
47
+ `./.agent-src/skills/<name>` (223), command-as-skill entries →
48
+ `./.claude-plugin/skills/<slug>` (142), both committed), updated
49
+ `lint_marketplace.py` and the pre-commit hook, and gitignored
50
+ `/.claude/skills/`. This ADR is the decision-gate record that the
51
+ investigation reached, backed by a real-instance registration test rather
52
+ than reasoning alone.
53
+
54
+ ## Decision
55
+
56
+ **`.claude/skills/` stays untracked.** Skills resolve from the committed
57
+ canonical sources (`.agent-src/skills/` + `.claude-plugin/skills/`) for the
58
+ marketplace channel, and from locally-built trees for the consumer and dev
59
+ channels. `.claude/` in git is `settings.json` only.
60
+
61
+ ## Evidence (real Claude Code v2.1.159, this machine)
62
+
63
+ - **Marketplace manifest validates.** `claude plugin validate
64
+ .claude-plugin/marketplace.json` → "Validation passed" (sole warning:
65
+ `metadata.keywords` is ignored at load — cosmetic, see Consequences).
66
+ - **Marketplace registers + installs at runtime.** `claude plugin
67
+ marketplace add <repo>` → `claude plugin install
68
+ agent-config@event4u-agent-config` → **enabled**; `claude plugin details`
69
+ reports **Skills (365)** resolved from `./.agent-src/skills/` (223) +
70
+ `./.claude-plugin/skills/` (142), with **no committed `.claude/skills/`**.
71
+ - **Runtime execution without a committed tree.** This very session is a live
72
+ Claude Code runtime in which `git ls-files .claude/skills/` returns `0`
73
+ yet skills load **and execute** (the `roadmap:process-full` skill was
74
+ loaded and run from its SKILL.md). Registration → runtime is therefore
75
+ demonstrated, not inferred, for the filesystem channel.
76
+ - **Consumer filesystem channel.** `scripts/probe_skill_registration.py`
77
+ shows 365 skills register from user-scope `~/.claude/skills/`, built by
78
+ `install.sh`, independent of any committed project tree.
79
+ - **Lint green.** `python3 scripts/lint_marketplace.py` → 365 skills, no
80
+ issues (reverse-completeness scans the two committed sources).
81
+ - **Idempotent regen.** `task generate-tools` produces no tracked diff;
82
+ `.claude/skills/` stays gitignored (0 tracked files).
83
+
84
+ ## Council convergence
85
+
86
+ Cross-checked with the AI council (analysis mode, members
87
+ anthropic/claude-sonnet-4-5 + openai/gpt-4o, 2026-06-01). Both members
88
+ converged on a single strongest blind spot: `claude plugin details` proves
89
+ *registration metadata*, not *live runtime execution*, and asked for a live
90
+ session test before closing. That test was then run and is recorded above
91
+ (this session executes skills with zero committed `.claude/skills/`; the
92
+ marketplace plugin was installed + enabled and resolved all 365 skills).
93
+ The council's residual follow-ups are carried into Consequences.
94
+
95
+ ## Consequences
96
+
97
+ **Positive**
98
+
99
+ - `.claude/` in git is `settings.json` only — no per-skill-set PR churn from
100
+ the previously-committed 365 symlinks.
101
+ - Marketplace source paths (`.agent-src/skills/`, `.claude-plugin/skills/`)
102
+ are **committed**, so marketplace consumers cloning at a tag or with
103
+ `--depth=1` still resolve every referenced skill — a strict improvement
104
+ over the old gitignore-adjacent layout.
105
+
106
+ **Costs / residual risks (from council follow-ups)**
107
+
108
+ - **Consumer channel depends on `install.sh`.** A consumer who clones the
109
+ repo but never runs `install.sh` (and never installs the marketplace
110
+ plugin) gets no `~/.claude/skills/`. This is unchanged from before the
111
+ untracking and is the documented consumer contract; a CI smoke test
112
+ (`npm install` → `probe_skill_registration.py` → assert 365) is a sensible
113
+ follow-up but is out of this ADR's scope.
114
+ - **Channel precedence is undocumented.** When a dev has the repo open
115
+ (local `.claude/skills/`) *and* the marketplace plugin installed, the
116
+ precedence of local vs marketplace skills is not formally specified.
117
+ Day-to-day dev uses the local generate-tools tree; no conflict observed.
118
+ Follow-up only.
119
+ - **`metadata.keywords` validator warning.** The field holds generic terms
120
+ (tool names, `php`, `laravel`), not skill names, so it is safe to drop;
121
+ left in place here to keep this diff minimal (out of scope per
122
+ `minimal-safe-diff`).
123
+
124
+ ## Alternatives
125
+
126
+ - **Keep `.claude/skills/` tracked (ADR-030 convention).** Rejected: the
127
+ registration test shows the convention is satisfied by locally-built and
128
+ marketplace-resolved trees; committing 365 symlinks adds PR churn with no
129
+ resolution benefit.
130
+
131
+ ## References
132
+
133
+ - ADR-030 — Claude Code command-projection strategy (established the
134
+ `.claude/skills/` filesystem-channel convention this ADR revisits).
135
+ - `scripts/condense.py` — `generate_plugin_command_skills()` emits the
136
+ `.claude-plugin/skills/<slug>` projection.
137
+ - `scripts/lint_marketplace.py` — reverse-completeness over the two
138
+ committed sources.
139
+ - `scripts/probe_skill_registration.py` — live install-state probe.
@@ -74,7 +74,7 @@ size budgets.
74
74
  | `balanced` *(default)* | kernel + tier-1 | Day-to-day engineering work; matches pre-roadmap behaviour superset |
75
75
  | `full` | kernel + tier-1 + tier-2 | Architectural / cross-wing / governance sessions |
76
76
 
77
- Consumer projects opt in via `personal.cost_profile` in
77
+ Consumer projects opt in via `personal.rule_loading_tier` in
78
78
  `.agent-settings.yml`. The install script keeps user-set values; only
79
79
  the template default is `balanced`.
80
80
 
@@ -39,6 +39,10 @@ _Auto-generated by `scripts/adr/regenerate_index.py`. Do not edit._
39
39
  | [ADR-033](ADR-033-distribution-identity-npm-primary.md) | Distribution Identity Npm Primary | accepted | 2026-05-29 | — |
40
40
  | [ADR-034](ADR-034-per-skill-model-recommendation-transport.md) | Per Skill Model Recommendation Transport | superseded | 2026-05-30 | — |
41
41
  | [ADR-035](ADR-035-model-capability-tiers.md) | Model Capability Tiers | accepted | 2026-05-30 | 034 |
42
+ | [ADR-036](ADR-036-global-install-browser-wizard-handoff.md) | Global Install Browser Wizard Handoff | accepted | 2026-06-01 | — |
43
+ | [ADR-037](ADR-037-cost-profile-untangle.md) | Cost Profile Untangle | accepted | 2026-06-01 | — |
44
+ | [ADR-038](ADR-038-canonical-settings-path.md) | Canonical Settings Path | — | — | — |
45
+ | [ADR-039](ADR-039-claude-skills-untracked.md) | Claude Skills Untracked | accepted | 2026-06-01 | — |
42
46
 
43
47
  ## Unnumbered (legacy)
44
48
 
@@ -127,6 +127,18 @@ task dev:link # Symlink this repo as the global @event4u/agent-
127
127
  task dev:unlink # Remove the global symlink
128
128
  ```
129
129
 
130
+ **Switch the global install between dev and release** — one-shot toggles
131
+ that flip BOTH the `agent-config` bin on PATH and the user-scope content:
132
+
133
+ ```bash
134
+ task install:use-dev # global = THIS working tree (npm link + dev-build content)
135
+ task install:use-release # global = latest npm release (npm i -g @latest + release content)
136
+ ```
137
+
138
+ Run `install:use-dev` to test the working tree as the live global install,
139
+ then `install:use-release` to switch back to the published version. They are
140
+ symmetric — whichever you run last is the active global `agent-config`.
141
+
130
142
  **Typical flow:**
131
143
 
132
144
  1. In this repo: `task dev:link` — once. The `agent-config` bin on PATH