@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.
- package/.agent-src/commands/agent-handoff.md +1 -1
- package/.agent-src/commands/agent-status.md +1 -1
- package/.agent-src/commands/agents/audit.md +1 -1
- package/.agent-src/commands/agents/init.md +1 -1
- package/.agent-src/commands/agents/user/accept.md +3 -3
- package/.agent-src/commands/agents/user/init.md +4 -4
- package/.agent-src/commands/agents/user/show.md +3 -3
- package/.agent-src/commands/agents/user/update.md +3 -3
- package/.agent-src/commands/agents/user.md +1 -1
- package/.agent-src/commands/agents.md +1 -1
- package/.agent-src/commands/analytics/prune.md +1 -1
- package/.agent-src/commands/analytics/show.md +1 -1
- package/.agent-src/commands/analytics.md +1 -1
- package/.agent-src/commands/bug-fix.md +1 -1
- package/.agent-src/commands/challenge-me.md +1 -1
- package/.agent-src/commands/chat-history/import.md +1 -1
- package/.agent-src/commands/chat-history/learn.md +1 -1
- package/.agent-src/commands/chat-history/show.md +1 -1
- package/.agent-src/commands/chat-history.md +1 -1
- package/.agent-src/commands/check-current-md.md +1 -1
- package/.agent-src/commands/condense.md +1 -1
- package/.agent-src/commands/context.md +1 -1
- package/.agent-src/commands/cost-report.md +13 -8
- package/.agent-src/commands/council.md +3 -3
- package/.agent-src/commands/create-pr/description-only.md +1 -1
- package/.agent-src/commands/create-pr.md +1 -1
- package/.agent-src/commands/e2e-heal.md +1 -1
- package/.agent-src/commands/e2e-plan.md +1 -1
- package/.agent-src/commands/feature.md +1 -1
- package/.agent-src/commands/fix/ci.md +1 -1
- package/.agent-src/commands/fix/portability.md +1 -1
- package/.agent-src/commands/fix/pr-bot-comments.md +1 -1
- package/.agent-src/commands/fix/pr-comments.md +1 -1
- package/.agent-src/commands/fix/pr-developer-comments.md +1 -1
- package/.agent-src/commands/fix/refs.md +1 -1
- package/.agent-src/commands/fix/seeder.md +1 -1
- package/.agent-src/commands/fix.md +1 -1
- package/.agent-src/commands/judge.md +1 -1
- package/.agent-src/commands/knowledge/cross-repo.md +1 -1
- package/.agent-src/commands/knowledge/forget.md +1 -1
- package/.agent-src/commands/knowledge/ingest.md +1 -1
- package/.agent-src/commands/knowledge/list.md +1 -1
- package/.agent-src/commands/knowledge.md +1 -1
- package/.agent-src/commands/memory/add.md +1 -1
- package/.agent-src/commands/memory/learn-low-impact.md +1 -1
- package/.agent-src/commands/memory/load.md +1 -1
- package/.agent-src/commands/memory/mine-session.md +1 -1
- package/.agent-src/commands/memory/promote.md +1 -1
- package/.agent-src/commands/memory/propose.md +1 -1
- package/.agent-src/commands/memory.md +1 -1
- package/.agent-src/commands/mode.md +1 -1
- package/.agent-src/commands/optimize/agents-dir.md +1 -1
- package/.agent-src/commands/optimize/augmentignore.md +1 -1
- package/.agent-src/commands/optimize/rtk.md +1 -1
- package/.agent-src/commands/optimize/skills.md +1 -1
- package/.agent-src/commands/optimize.md +1 -1
- package/.agent-src/commands/orchestrate.md +1 -1
- package/.agent-src/commands/override/create.md +1 -1
- package/.agent-src/commands/override/manage.md +1 -1
- package/.agent-src/commands/override.md +1 -1
- package/.agent-src/commands/package-reset.md +1 -1
- package/.agent-src/commands/prediction-pool.md +234 -0
- package/.agent-src/commands/profile/activate.md +81 -0
- package/.agent-src/commands/profile/deactivate.md +68 -0
- package/.agent-src/commands/profile/show.md +70 -0
- package/.agent-src/commands/profile.md +68 -0
- package/.agent-src/commands/project-health.md +1 -1
- package/.agent-src/commands/quality-fix.md +1 -1
- package/.agent-src/commands/roadmap/process-full.md +1 -1
- package/.agent-src/commands/roadmap/process-phase.md +1 -1
- package/.agent-src/commands/roadmap/process-step.md +1 -1
- package/.agent-src/commands/roadmap.md +1 -1
- package/.agent-src/commands/set-cost-profile.md +9 -9
- package/.agent-src/commands/skill/preview.md +3 -3
- package/.agent-src/commands/skill.md +1 -1
- package/.agent-src/commands/skills/discover.md +1 -1
- package/.agent-src/commands/skills.md +1 -1
- package/.agent-src/commands/sync-agent-settings.md +3 -3
- package/.agent-src/commands/sync-gitignore/fix.md +1 -1
- package/.agent-src/commands/sync-gitignore.md +1 -1
- package/.agent-src/commands/update-form-request-messages.md +1 -1
- package/.agent-src/presets/README.md +1 -1
- package/.agent-src/profiles/README.md +1 -1
- package/.agent-src/rules/non-destructive-by-default.md +2 -1
- package/.agent-src/skills/check-refs/SKILL.md +1 -1
- package/.agent-src/skills/finishing-a-development-branch/SKILL.md +1 -1
- package/.agent-src/skills/git-workflow/SKILL.md +1 -1
- package/.agent-src/skills/jira-integration/SKILL.md +1 -1
- package/.agent-src/skills/markitdown/SKILL.md +1 -1
- package/.agent-src/skills/prediction-pool-optimizer/SKILL.md +314 -0
- package/.agent-src/skills/prediction-pool-optimizer/evals/triggers.json +20 -0
- package/.agent-src/skills/prediction-pool-optimizer/reference/ev-fixtures.md +175 -0
- package/.agent-src/skills/prediction-pool-optimizer/reference/odds-and-bonus.md +109 -0
- package/.agent-src/skills/rtk-output-filtering/SKILL.md +1 -1
- package/.agent-src/skills/script-writing/SKILL.md +1 -1
- package/.agent-src/skills/token-optimizer/SKILL.md +1 -1
- package/.agent-src/skills/using-git-worktrees/SKILL.md +1 -1
- package/.agent-src/templates/agent-settings.md +7 -7
- package/.agent-src/templates/agents/agent-project-settings.example.yml +2 -2
- package/.agent-src/templates/scripts/work_engine/_lib/agent_settings.py +54 -6
- package/.agent-src/templates/scripts/work_engine/hook_bootstrap.py +1 -1
- package/.agent-src/templates/scripts/work_engine/hooks/builtin/memory_visibility.py +9 -7
- package/.agent-src/templates/scripts/work_engine/hooks/settings.py +9 -10
- package/.agent-src/templates/scripts/work_engine/scoring/memory_visibility.py +17 -4
- package/.claude-plugin/marketplace.json +370 -364
- package/CHANGELOG.md +108 -0
- package/README.md +2 -2
- package/config/agent-settings.template.yml +11 -2
- package/config/discovery/packs.yml +11 -0
- package/config/discovery/session-profiles.yml +37 -0
- package/config/discovery/workspaces.yml +1 -1
- package/config/profiles/balanced.ini +1 -1
- package/config/profiles/full.ini +1 -1
- package/config/profiles/minimal.ini +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +254 -100
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +4 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +41 -6
- package/dist/discovery/trust-report.md +3 -3
- package/dist/discovery/workspaces.json +19 -6
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/server/io/substituteTemplate.js +3 -3
- package/dist/server/io/substituteTemplate.js.map +1 -1
- package/dist/server/routes/settings.js +2 -2
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/schemas/settings.js +4 -2
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/ui/assets/{index-DVsyUMZe.js → index-5lFqAKL0.js} +2 -2
- package/dist/ui/assets/index-5lFqAKL0.js.map +1 -0
- package/dist/ui/index.html +1 -1
- package/docs/architecture/current-onboard-baseline.md +3 -3
- package/docs/architecture.md +2 -2
- package/docs/catalog.md +11 -5
- package/docs/contracts/adr-level-6-productization.md +1 -1
- package/docs/contracts/command-clusters.md +2 -0
- package/docs/contracts/config-presets.md +2 -2
- package/docs/contracts/cost-profile-defaults.md +5 -5
- package/docs/contracts/discovery-manifest.schema.json +1 -1
- package/docs/contracts/explain-trace.schema.json +3 -3
- package/docs/contracts/memory-visibility-v1.md +15 -7
- package/docs/contracts/profile-system.md +2 -2
- package/docs/contracts/session-profile-overlay.md +120 -0
- package/docs/contracts/settings-api.md +3 -3
- package/docs/contracts/value-report-schema.md +14 -1
- package/docs/customization.md +47 -5
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +47 -11
- package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +16 -2
- package/docs/decisions/ADR-034-per-skill-model-recommendation-transport.md +1 -1
- package/docs/decisions/ADR-036-global-install-browser-wizard-handoff.md +106 -0
- package/docs/decisions/ADR-037-cost-profile-untangle.md +117 -0
- package/docs/decisions/ADR-038-canonical-settings-path.md +66 -0
- package/docs/decisions/ADR-039-claude-skills-untracked.md +139 -0
- package/docs/decisions/ADR-rule-kernel-and-router.md +1 -1
- package/docs/decisions/INDEX.md +4 -0
- package/docs/development.md +12 -0
- package/docs/getting-started.md +2 -2
- package/docs/guidelines/agent-infra/layered-settings.md +10 -4
- package/docs/installation.md +3 -3
- package/docs/setup/mcp-client-config.md +1 -1
- package/docs/skills-catalog.md +5 -1
- package/docs/value.md +9 -7
- package/docs/wizard.md +1 -1
- package/llms.txt +4 -0
- package/package.json +1 -1
- package/scripts/__pycache__/validate_frontmatter.cpython-312.pyc +0 -0
- package/scripts/_cli/cmd_doctor.py +3 -2
- package/scripts/_cli/cmd_explain.py +1 -1
- package/scripts/_cli/cmd_versions.py +2 -2
- package/scripts/_cli/explain_last/inputs.py +11 -8
- package/scripts/_cli/explain_last/sections/inputs.py +1 -1
- package/scripts/_lib/__pycache__/__init__.cpython-312.pyc +0 -0
- package/scripts/_lib/__pycache__/agent_src.cpython-312.pyc +0 -0
- package/scripts/_lib/agent_settings.py +54 -6
- package/scripts/_lib/agent_src.py +30 -0
- package/scripts/_lib/value_ladder.py +99 -2
- package/scripts/_lib/value_report.py +30 -16
- package/scripts/ai_council/modes.py +1 -1
- package/scripts/ai_council/session.py +5 -1
- package/scripts/audit_command_surface.py +7 -1
- package/scripts/audit_initial_context.py +26 -2
- package/scripts/check_gate_paths.py +117 -0
- package/scripts/check_references.py +51 -2
- package/scripts/check_skill_requires.py +143 -0
- package/scripts/check_test_coverage_diff.py +180 -0
- package/scripts/compile_router.py +5 -1
- package/scripts/condense.py +92 -4
- package/scripts/config/session_profiles.py +492 -0
- package/scripts/council_cli.py +5 -1
- package/scripts/first-run.sh +11 -11
- package/scripts/hook_manifest.yaml +15 -7
- package/scripts/hooks/dispatch_hook.py +8 -0
- package/scripts/install +14 -1
- package/scripts/install-hooks.sh +2 -1
- package/scripts/install.py +203 -433
- package/scripts/install_anthropic_key.sh +1 -1
- package/scripts/install_openai_key.sh +1 -1
- package/scripts/inventory_abstraction_budget.py +6 -1
- package/scripts/lint_agents_md.py +11 -4
- package/scripts/lint_discovery_vocabulary.py +5 -5
- package/scripts/lint_hook_concern_budget.py +5 -1
- package/scripts/lint_marketplace.py +18 -7
- package/scripts/lint_roadmap_ci_steps.py +5 -1
- package/scripts/lint_roadmap_complexity.py +5 -1
- package/scripts/lint_value_dashboard.py +1 -1
- package/scripts/mcp_server/prompts.py +5 -1
- package/scripts/prediction-pool/adapters/_schema.md +42 -0
- package/scripts/prediction-pool/adapters/kicktipp.yml +23 -0
- package/scripts/prediction-pool/poisson_sim.py +167 -0
- package/scripts/prediction-pool/pool_winsim.py +236 -0
- package/scripts/prediction-pool/score_ev.py +188 -0
- package/scripts/profile_staleness_hook.py +69 -0
- package/scripts/render_value_md.py +1 -0
- package/scripts/roadmap_progress_hook.py +56 -6
- package/scripts/schemas/agent-settings.schema.json +77 -0
- package/scripts/schemas/skill.schema.json +7 -0
- package/scripts/smoke_quickstart.py +7 -6
- package/scripts/sync_agent_settings.py +12 -5
- package/scripts/validate_agent_settings.py +124 -0
- package/scripts/validate_decision_engine.py +5 -1
- package/templates/minimal/.agent-settings.yml +1 -1
- package/dist/ui/assets/index-DVsyUMZe.js.map +0 -1
- package/scripts/measure_roadmap_trajectory.py +0 -112
- 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
|
-
- **`
|
|
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
|
-
`
|
|
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) | `
|
|
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 →
|
|
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 `
|
|
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 **
|
|
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 `
|
|
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
|
-
- `
|
|
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
|
-
+ `
|
|
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; `
|
|
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
|
-
- [`
|
|
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 `
|
|
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
|
-
- `
|
|
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 `
|
|
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.
|
|
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
|
|
package/docs/decisions/INDEX.md
CHANGED
|
@@ -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
|
|
package/docs/development.md
CHANGED
|
@@ -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
|