@event4u/agent-config 2.19.0 → 2.20.1
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-status.md +29 -0
- package/.agent-src/commands/onboard.md +221 -81
- package/.agent-src/packs/README.md +49 -0
- package/.agent-src/packs/agency-delivery.yml +63 -0
- package/.agent-src/packs/content-engine.yml +53 -0
- package/.agent-src/packs/founder-mvp.yml +51 -0
- package/.agent-src/presets/README.md +26 -0
- package/.agent-src/presets/balanced.yml +34 -0
- package/.agent-src/presets/fast.yml +31 -0
- package/.agent-src/presets/strict.yml +38 -0
- package/.agent-src/profiles/README.md +29 -0
- package/.agent-src/profiles/agency.yml +27 -0
- package/.agent-src/profiles/content_creator.yml +25 -0
- package/.agent-src/profiles/developer.yml +26 -0
- package/.agent-src/profiles/finance.yml +24 -0
- package/.agent-src/profiles/founder.yml +25 -0
- package/.agent-src/profiles/ops.yml +25 -0
- package/.agent-src/rules/no-cheap-questions.md +25 -17
- package/.agent-src/skills/adr-create/SKILL.md +78 -68
- package/.agent-src/skills/subagent-orchestration/SKILL.md +33 -0
- package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/.agent-src/templates/skill-archive-note.md +101 -0
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +73 -70
- package/README.md +68 -72
- package/config/agent-settings.template.yml +22 -0
- package/docs/adrs/caveman/0001-default-off-until-bench.md +93 -0
- package/docs/adrs/caveman/README.md +9 -0
- package/docs/adrs/cost/0001-hard-stop-hook.md +114 -0
- package/docs/adrs/cost/README.md +9 -0
- package/docs/adrs/memory/0001-consumer-side-snapshot.md +111 -0
- package/docs/adrs/memory/README.md +9 -0
- package/docs/adrs/router/0001-three-tier-routing.md +119 -0
- package/docs/adrs/router/README.md +9 -0
- package/docs/adrs/schema/0001-json-schema-frontmatter.md +102 -0
- package/docs/adrs/schema/README.md +9 -0
- package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +99 -0
- package/docs/adrs/smoke/README.md +9 -0
- package/docs/architecture/current-onboard-baseline.md +126 -0
- package/docs/architecture/current-safety-behavior.md +137 -0
- package/docs/archive/CHANGELOG-pre-2.16.0.md +48 -0
- package/docs/archive/CHANGELOG-pre-2.17.0.md +63 -0
- package/docs/contracts/adr-layout.md +108 -0
- package/docs/contracts/benchmark-corpus-spec.md +97 -0
- package/docs/contracts/benchmark-report-schema.md +111 -0
- package/docs/contracts/command-clusters.md +1 -0
- package/docs/contracts/command-taxonomy.md +137 -0
- package/docs/contracts/compression-default-kill-criterion.md +69 -0
- package/docs/contracts/config-presets.md +144 -0
- package/docs/contracts/cost-dashboard.md +143 -0
- package/docs/contracts/cost-enforcement.md +134 -0
- package/docs/contracts/file-ownership-matrix.json +0 -7
- package/docs/contracts/mcp-tool-inventory.md +53 -0
- package/docs/contracts/measurement-baseline.md +102 -0
- package/docs/contracts/namespace.md +125 -0
- package/docs/contracts/profile-system.md +142 -0
- package/docs/contracts/safety-model.md +129 -0
- package/docs/contracts/smoke-contracts.md +144 -0
- package/docs/contracts/workflow-packs.md +121 -0
- package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +132 -0
- package/docs/decisions/INDEX.md +1 -0
- package/docs/featured-commands.md +27 -0
- package/docs/parity/bench-ruflo.json +58 -0
- package/docs/parity/bench.json +41 -0
- package/docs/parity/ruflo.md +46 -0
- package/docs/profiles.md +91 -0
- package/package.json +1 -1
- package/scripts/_cli/cmd_explain.py +250 -0
- package/scripts/_lib/bench_cost.py +138 -0
- package/scripts/_lib/bench_quality.py +118 -0
- package/scripts/_lib/bench_report.py +150 -0
- package/scripts/agent-config +13 -0
- package/scripts/audit_adr_coverage.py +175 -0
- package/scripts/audit_mcp_tools.py +146 -0
- package/scripts/bench_baseline_ready.py +108 -0
- package/scripts/bench_drift_check.py +151 -0
- package/scripts/bench_per_tool.py +216 -0
- package/scripts/bench_run.py +155 -0
- package/scripts/config/__init__.py +9 -0
- package/scripts/config/presets.py +206 -0
- package/scripts/config/profiles.py +173 -0
- package/scripts/cost/budget.mjs +73 -12
- package/scripts/cost/preflight.mjs +89 -0
- package/scripts/lint_archived_skills.py +143 -0
- package/scripts/lint_bench_corpus.py +161 -0
- package/scripts/lint_namespace.py +135 -0
- package/scripts/lint_roadmap_complexity.py +3 -2
- package/scripts/skill_overlap.py +204 -0
- package/scripts/skill_usage_collect.py +191 -0
- package/scripts/skill_usage_report.py +162 -0
- package/scripts/smoke/kernel.sh +101 -0
- package/scripts/smoke/router.sh +129 -0
- package/scripts/smoke/schema.sh +71 -0
- package/scripts/smoke/skills.sh +101 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# ADR 0001 — Per-tier smoke scripts (kernel · router · schema · skills)
|
|
2
|
+
|
|
3
|
+
> Area: `smoke` · Status: accepted · Date: 2026-05-16 · Type: retrospective
|
|
4
|
+
> Roadmap: `agents/roadmaps/step-11-ruflo-parity.md` Phase 4 Step 3
|
|
5
|
+
> Supersedes: —
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
The North-Star audit
|
|
10
|
+
([`external-findings.md § 5`](../../../agents/audit-2026-05-14-north-star/external-findings.md))
|
|
11
|
+
flagged "smoke contracts" as an absorbed Ruflo pattern: every
|
|
12
|
+
high-traffic tier needs a fast, deterministic, measurable check that
|
|
13
|
+
runs in CI and surfaces regressions before they reach the rules /
|
|
14
|
+
router / schema / skill linter pipelines.
|
|
15
|
+
|
|
16
|
+
The full `task ci` run is ≥ 90 s and exercises every linter. That's
|
|
17
|
+
fine for merge gates; it's too slow for path-change feedback on PRs
|
|
18
|
+
that touch one tier in isolation.
|
|
19
|
+
|
|
20
|
+
## Decision
|
|
21
|
+
|
|
22
|
+
**One smoke script per tier, each ≤ 30 s, each emitting a baseline
|
|
23
|
+
declaration as its last stdout line.** Scripts live under
|
|
24
|
+
[`scripts/smoke/`](../../../scripts/smoke/):
|
|
25
|
+
|
|
26
|
+
| Tier | Script | Validates | Path-trigger globs |
|
|
27
|
+
|---|---|---|---|
|
|
28
|
+
| Kernel | [`kernel.sh`](../../../scripts/smoke/kernel.sh) | 9 kernel rules present, char-budget respected | `.agent-src.uncompressed/rules/**`, `docs/contracts/kernel-membership.md` |
|
|
29
|
+
| Router | [`router.sh`](../../../scripts/smoke/router.sh) | `router.json` compiles, all `routes_to:` resolve | `router.json`, `.agent-src.uncompressed/rules/**` |
|
|
30
|
+
| Schema | [`schema.sh`](../../../scripts/smoke/schema.sh) | Random skill / rule sample validates against JSON Schema | `scripts/schemas/**`, `.agent-src.uncompressed/{rules,skills}/**` |
|
|
31
|
+
| Skills | [`skills.sh`](../../../scripts/smoke/skills.sh) | 5 random skills pass frontmatter + `name == dir` | `.agent-src.uncompressed/skills/**` |
|
|
32
|
+
|
|
33
|
+
### Runtime contract
|
|
34
|
+
|
|
35
|
+
Per [`smoke-contracts.md`](../../contracts/smoke-contracts.md) § 1:
|
|
36
|
+
|
|
37
|
+
| Limit | Value |
|
|
38
|
+
|---|---:|
|
|
39
|
+
| Wall time | ≤ 30 s |
|
|
40
|
+
| External I/O | filesystem only — no network, no MCP |
|
|
41
|
+
| Output | last stdout line = baseline declaration |
|
|
42
|
+
| Exit code | non-zero on baseline regression |
|
|
43
|
+
|
|
44
|
+
### CI wiring
|
|
45
|
+
|
|
46
|
+
[`.github/workflows/smoke.yml`](../../../.github/workflows/smoke.yml)
|
|
47
|
+
dispatches each smoke independently on path-trigger match. Local
|
|
48
|
+
aggregator: `task smoke` (sub-tasks `task smoke:{kernel,router,schema,skills}`)
|
|
49
|
+
wired in [`taskfiles/engine.yml`](../../../taskfiles/engine.yml).
|
|
50
|
+
|
|
51
|
+
### Baseline declarations (lock-in 2026-05-16)
|
|
52
|
+
|
|
53
|
+
- Kernel: `9 rules · 23 / 26 kB used (88 %) · 0 fence breaches`.
|
|
54
|
+
- Router: `tier_1: N · tier_2: M · 0 unresolved routes`.
|
|
55
|
+
- Schema: deterministic seed = epoch day · 10 random files validated.
|
|
56
|
+
- Skills: deterministic seed = epoch day · `210 skills · 5/5 pass`.
|
|
57
|
+
|
|
58
|
+
## Considered alternatives
|
|
59
|
+
|
|
60
|
+
### Alt 1 — One monolithic smoke (rejected)
|
|
61
|
+
|
|
62
|
+
Single `task smoke` running every check.
|
|
63
|
+
|
|
64
|
+
**Why rejected:** path-change PRs pay the full cost every time;
|
|
65
|
+
flaky tier-X regression masks tier-Y signal; output is harder to
|
|
66
|
+
diff. The per-tier split costs four files and saves CI minutes.
|
|
67
|
+
|
|
68
|
+
### Alt 2 — Inline-in-`task ci` only (rejected)
|
|
69
|
+
|
|
70
|
+
Skip the smoke layer; rely on `task ci` for everything.
|
|
71
|
+
|
|
72
|
+
**Why rejected:** `task ci` is the merge gate, not the feedback
|
|
73
|
+
loop. Smokes are the cheap-and-fast layer between push and review.
|
|
74
|
+
|
|
75
|
+
### Alt 3 — Per-tier, ≤ 30 s budget, baseline-declaring (accepted)
|
|
76
|
+
|
|
77
|
+
The chosen path. One script per tier, declared budget, declared
|
|
78
|
+
baseline, CI-dispatched on path-trigger.
|
|
79
|
+
|
|
80
|
+
## Consequences
|
|
81
|
+
|
|
82
|
+
- **Positive:** PRs touching one tier get tier-specific feedback in
|
|
83
|
+
≤ 30 s; baseline declarations are diff-readable so regressions
|
|
84
|
+
surface in PR descriptions; the `task ci` merge gate stays the
|
|
85
|
+
authoritative full-run.
|
|
86
|
+
- **Negative:** four scripts to maintain, one workflow file, one
|
|
87
|
+
taskfile entry. Mitigated by the runtime contract — a smoke that
|
|
88
|
+
approaches 30 s gets split, not optimised in place.
|
|
89
|
+
- **Reversal cost:** delete `smoke.yml`; the scripts stay as opt-in
|
|
90
|
+
local checks (`task smoke:*`). No contract churn.
|
|
91
|
+
|
|
92
|
+
## References
|
|
93
|
+
|
|
94
|
+
- [`docs/contracts/smoke-contracts.md`](../../contracts/smoke-contracts.md) — runtime + path-trigger contract.
|
|
95
|
+
- [`scripts/smoke/`](../../../scripts/smoke/) — four scripts.
|
|
96
|
+
- [`.github/workflows/smoke.yml`](../../../.github/workflows/smoke.yml) — CI dispatch.
|
|
97
|
+
- [`taskfiles/engine.yml`](../../../taskfiles/engine.yml) — local aggregator.
|
|
98
|
+
- [`agents/audit-2026-05-14-north-star/external-findings.md`](../../../agents/audit-2026-05-14-north-star/external-findings.md) § 5 — origin pattern.
|
|
99
|
+
- [`agents/roadmaps/step-11-ruflo-parity.md`](../../../agents/roadmaps/step-11-ruflo-parity.md) Phase 3 (delivery) + Phase 4 Step 3 (this ADR).
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# ADRs — `smoke`
|
|
2
|
+
|
|
3
|
+
> Per-tier smoke contracts, baseline locks, regression gates.
|
|
4
|
+
|
|
5
|
+
Contract: [`docs/contracts/smoke-contracts.md`](../../../docs/contracts/smoke-contracts.md).
|
|
6
|
+
|
|
7
|
+
| # | Title | Status | Date | Supersedes |
|
|
8
|
+
|---|---|---|---|---|
|
|
9
|
+
| [0001](0001-per-tier-smoke-scripts.md) | Per Tier Smoke Scripts | — | — | — |
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Current `/onboard` Baseline (pre-step-15)
|
|
2
|
+
|
|
3
|
+
> **Status:** descriptive baseline · **Owner:** package maintainer ·
|
|
4
|
+
> **Last reviewed:** 2026-05-16
|
|
5
|
+
>
|
|
6
|
+
> Documents the **current** `/onboard` flow so the Phase 1 Guided
|
|
7
|
+
> Setup Wizard (step-15 item 2) has a baseline to extend. Council v3
|
|
8
|
+
> unique finding (cannot "extend" an undocumented surface). This file
|
|
9
|
+
> describes what ships today; it is **not** a proposal.
|
|
10
|
+
|
|
11
|
+
## Surface
|
|
12
|
+
|
|
13
|
+
`/onboard` lives at [`.agent-src.uncompressed/commands/onboard.md`](../../.agent-src.uncompressed/commands/onboard.md)
|
|
14
|
+
(canonical source) and is triggered by the
|
|
15
|
+
[`onboarding-gate`](../../.agent-src/rules/onboarding-gate.md) rule on
|
|
16
|
+
the first turn when `onboarding.onboarded == false` in
|
|
17
|
+
`.agent-settings.yml`. Cloud surfaces (Claude.ai Web, Skills API): fully
|
|
18
|
+
inert — no settings file, no flow.
|
|
19
|
+
|
|
20
|
+
## The 12 steps today
|
|
21
|
+
|
|
22
|
+
| # | Step | Captures | Asked if |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| 1 | Greet + set expectations | — | always |
|
|
25
|
+
| 2 | Offer user-global cross-project defaults | intent flag for step 9 | first-time-setup heuristic only |
|
|
26
|
+
| 3 | `personal.user_name` | first name | unset |
|
|
27
|
+
| 4 | `personal.ide` (+ auto-detect via `ps aux`) and `personal.open_edited_files` | IDE id, auto-open flag | unset |
|
|
28
|
+
| 5 | `personal.pr_comment_bot_icon` | bool | always (no detection possible) |
|
|
29
|
+
| 6 | `personal.rtk_installed` (via `which rtk`) | bool + install action | rtk not found |
|
|
30
|
+
| 7 | `cost_profile` and `pipelines.skill_improvement` | profile id, learning bool | always (one summary screen) |
|
|
31
|
+
| 8 | Mark `onboarding.onboarded: true` | — | always |
|
|
32
|
+
| 9 | Write user-global `~/.event4u/agent-config/agent-settings.yml` | six whitelisted keys | step 2 captured "yes" |
|
|
33
|
+
| 10 | Summary block | — | always |
|
|
34
|
+
| 11 | Quickstart pointer (`/work` and `/implement-ticket`) | — | local only |
|
|
35
|
+
| 12 | Maintainer telemetry hint (opt-in) | — | local only |
|
|
36
|
+
|
|
37
|
+
## What `/onboard` does **not** capture today
|
|
38
|
+
|
|
39
|
+
Step-15 Phase 1 item 2 introduces a new role-selection step ("8 options
|
|
40
|
+
covering Software / Content / Founder / Consulting / Marketing / Finance
|
|
41
|
+
/ Handwerk / Self-configure") that produces a `user_type`. Today, no
|
|
42
|
+
`user_type` is captured. Specifically:
|
|
43
|
+
|
|
44
|
+
- **No audience/role question.** `/onboard` knows the developer's name,
|
|
45
|
+
IDE, and rtk install status — never the audience taxonomy.
|
|
46
|
+
- **No `profile.id`.** `profile.id` does not exist as a key in
|
|
47
|
+
`.agent-settings.yml`. Per
|
|
48
|
+
[ADR-010](../decisions/ADR-010-profile-pack-preset-boundary.md), it
|
|
49
|
+
is owned by the Phase 1 item 1 profile loader.
|
|
50
|
+
- **No `preset.id`.** Same status — `preset.id` arrives with Phase 1
|
|
51
|
+
item 4.
|
|
52
|
+
- **No `pack.id`.** Arrives with Phase 2 item 7.
|
|
53
|
+
- **No risk-appetite question.** The current flow defers risk posture
|
|
54
|
+
to `personal.autonomy`, which is itself not part of the onboard
|
|
55
|
+
questions (it inherits the template default).
|
|
56
|
+
- **No stack question.** Stack is inferred at runtime by detectors
|
|
57
|
+
(`scripts/detect/*`), not asked here.
|
|
58
|
+
|
|
59
|
+
## Settings keys written today
|
|
60
|
+
|
|
61
|
+
```yaml
|
|
62
|
+
personal:
|
|
63
|
+
user_name: "<first-name>" # step 3
|
|
64
|
+
ide: "code|phpstorm|cursor" # step 4
|
|
65
|
+
open_edited_files: true|false # step 4
|
|
66
|
+
pr_comment_bot_icon: true|false # step 5
|
|
67
|
+
rtk_installed: true|false # step 6
|
|
68
|
+
cost_profile: "balanced" # step 7 (default unchanged)
|
|
69
|
+
pipelines:
|
|
70
|
+
skill_improvement: true # step 7 (default unchanged)
|
|
71
|
+
onboarding:
|
|
72
|
+
onboarded: true # step 8
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
User-global file (step 9, opt-in): the six whitelisted keys in
|
|
76
|
+
[`scripts/_lib/agent_settings.py`](../../scripts/_lib/agent_settings.py)
|
|
77
|
+
— `name`, `ide`, `cost_profile`, `personal.bot_icon`,
|
|
78
|
+
`personal.autonomy`, `caveman.speak_scope`.
|
|
79
|
+
|
|
80
|
+
## Iron Laws today
|
|
81
|
+
|
|
82
|
+
- **One question per turn** ([`ask-when-uncertain`](../../.agent-src/rules/ask-when-uncertain.md)).
|
|
83
|
+
- **Re-runnable** — invoking `/onboard` when `onboarded: true` walks the
|
|
84
|
+
flow again, never silently rewrites a value (asks before overwriting
|
|
85
|
+
`user_name` / `ide`).
|
|
86
|
+
- **Never commits** — `.agent-settings.yml` is git-ignored.
|
|
87
|
+
- **User-global write is opt-in + one-shot + never silent** — step 2
|
|
88
|
+
captures intent, step 9 re-confirms.
|
|
89
|
+
|
|
90
|
+
## Gaps the wizard (Phase 1 item 2) must close
|
|
91
|
+
|
|
92
|
+
1. **Add role-selection step** producing a `user_type` (later mapped to
|
|
93
|
+
`profile.id`). Eight options covering Software / Content / Founder /
|
|
94
|
+
Consulting / Marketing / Finance / Handwerk / Self-configure.
|
|
95
|
+
Inserted **before** step 8 (mark onboarded) so the profile loader
|
|
96
|
+
has a value to read on the next session start.
|
|
97
|
+
2. **Add stack-detection confirmation step.** Run the existing
|
|
98
|
+
`scripts/detect/*` detectors, present the result, allow the user
|
|
99
|
+
to override. Without confirmation, profile-aware presets cannot
|
|
100
|
+
resolve.
|
|
101
|
+
3. **Add risk-appetite question.** Maps to `preset.id` from
|
|
102
|
+
[`config-presets.md`](../contracts/config-presets.md). Three
|
|
103
|
+
options: `fast` / `balanced` / `strict`.
|
|
104
|
+
4. **Write the new keys.** `profile.id`, `preset.id`, optionally
|
|
105
|
+
`pack.id`, plus the user-typed `user_type` as a stable audit field.
|
|
106
|
+
|
|
107
|
+
## Wizard contract (Phase 1 item 2 acceptance)
|
|
108
|
+
|
|
109
|
+
The wizard MUST:
|
|
110
|
+
|
|
111
|
+
- Preserve every existing step semantically (no silent removal).
|
|
112
|
+
- Insert role + stack + risk-appetite questions **before** step 8.
|
|
113
|
+
- Honor the one-question-per-turn Iron Law.
|
|
114
|
+
- Write `profile.id`, `preset.id`, and `user_type` to
|
|
115
|
+
`.agent-settings.yml` using the section-aware merge rules.
|
|
116
|
+
- Be re-runnable (idempotent for unchanged answers).
|
|
117
|
+
- Work offline (no network call required for any question).
|
|
118
|
+
- Skip itself on cloud surfaces (inherit current cloud-noop behavior).
|
|
119
|
+
|
|
120
|
+
## See also
|
|
121
|
+
|
|
122
|
+
- [`/onboard` command](../../.agent-src.uncompressed/commands/onboard.md) — canonical source.
|
|
123
|
+
- [`onboarding-gate`](../../.agent-src/rules/onboarding-gate.md) — trigger rule.
|
|
124
|
+
- [`ADR-010`](../decisions/ADR-010-profile-pack-preset-boundary.md) — boundary the wizard must respect.
|
|
125
|
+
- [`config-presets.md`](../contracts/config-presets.md) — preset axis the wizard writes.
|
|
126
|
+
- [`agents/roadmaps/step-15-product-refinement.md`](../../agents/roadmaps/step-15-product-refinement.md) — Phase 1 item 2.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Current Safety Behavior — Baseline (pre-step-15)
|
|
2
|
+
|
|
3
|
+
> **Status:** descriptive baseline · **Owner:** package maintainer ·
|
|
4
|
+
> **Last reviewed:** 2026-05-16
|
|
5
|
+
>
|
|
6
|
+
> Documents the **current** safety / autonomy surface so the Phase 2
|
|
7
|
+
> Universal Safety Model ADR (step-15 item 9) has a baseline to diff
|
|
8
|
+
> against. Council v3 action #4 prerequisite. This file describes what
|
|
9
|
+
> ships today; it is **not** a proposal for what should ship next.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
The current package has **one autonomy switch** plus **four
|
|
14
|
+
non-overridable floors**. The Phase 2 ADR will replace the single switch
|
|
15
|
+
with per-profile, per-domain `deny / ask / allow` declarations. Before
|
|
16
|
+
that ADR can specify "replace X", X has to be written down.
|
|
17
|
+
|
|
18
|
+
## The one switch — `personal.autonomy`
|
|
19
|
+
|
|
20
|
+
**Where defined:** `.agent-settings.yml` under `personal.autonomy`.
|
|
21
|
+
Template: `config/agent-settings.template.yml`.
|
|
22
|
+
|
|
23
|
+
**Values:** `on` · `off` · `auto`.
|
|
24
|
+
|
|
25
|
+
**Read site:** [`.agent-src/rules/autonomous-execution.md`](../../.agent-src/rules/autonomous-execution.md)
|
|
26
|
+
(Iron-Law rule, kernel-loaded in every profile). Cached on the first
|
|
27
|
+
turn; missing key treated as `on`.
|
|
28
|
+
|
|
29
|
+
**What it gates:** trivial workflow questions (suppression). Examples:
|
|
30
|
+
"Should I run the tests now?", "Should I create the branch?", "Continue
|
|
31
|
+
with the next phase?". These are suppressed when `autonomy` resolves to
|
|
32
|
+
`on`.
|
|
33
|
+
|
|
34
|
+
**What it does NOT gate:** any of the four floors below, any
|
|
35
|
+
[`scope-control`](../../.agent-src/rules/scope-control.md) git operation,
|
|
36
|
+
or any [`commit-policy`](../../.agent-src/rules/commit-policy.md) commit
|
|
37
|
+
default. The switch only narrows the **trivial-question** surface.
|
|
38
|
+
|
|
39
|
+
### State table
|
|
40
|
+
|
|
41
|
+
| State | Behavior on trivial workflow questions | Blocking / Hard-Floor / Commit gates |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `on` | **Suppress** — agent acts, surfaces what it did | Unchanged — still apply |
|
|
44
|
+
| `off` | **Ask** — numbered options, single question | Unchanged — still apply |
|
|
45
|
+
| `auto` | Same as `off` until the user opts in via a standing autonomy directive ("just work", "arbeite eigenständig"). Then sticky-flip to `on` for the rest of the conversation. Mirror opt-out flips back. | Unchanged — still apply |
|
|
46
|
+
|
|
47
|
+
### Opt-in detection
|
|
48
|
+
|
|
49
|
+
Intent-matched, not literal-string-matched. Speech-act-checked: the
|
|
50
|
+
phrase must be a meta-instruction, not content / quote / code. Detail:
|
|
51
|
+
[`autonomy-detection`](../../.agent-src/contexts/execution/autonomy-detection.md),
|
|
52
|
+
[`autonomy-mechanics`](../../.agent-src/contexts/execution/autonomy-mechanics.md).
|
|
53
|
+
|
|
54
|
+
### Task scope vs conversation scope
|
|
55
|
+
|
|
56
|
+
Two distinct autonomy shapes:
|
|
57
|
+
|
|
58
|
+
| Shape | Trigger | Scope |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| **Conversation-wide trivial-question suppression** | "stop asking on trivial steps" — no deliverable named | Sticky for the rest of the conversation. Suppresses trivial workflow questions only. |
|
|
61
|
+
| **Task-scoped autonomous execution** | "work autonomously on X", "arbeite die Roadmap Y komplett ab" — deliverable named | Bound to that task. Ends when the task ends. Does NOT authorize a different later deliverable. |
|
|
62
|
+
|
|
63
|
+
Per [`autonomous-execution § task-scope`](../../.agent-src/rules/autonomous-execution.md#task-scope--autonomy-is-bound-to-the-named-task).
|
|
64
|
+
|
|
65
|
+
## The four non-overridable floors
|
|
66
|
+
|
|
67
|
+
No value of `personal.autonomy` lifts any of these. Standing
|
|
68
|
+
autonomy directives, roadmap authorizations, or "just keep going"
|
|
69
|
+
phrases never reach them.
|
|
70
|
+
|
|
71
|
+
### 1. Hard Floor — `non-destructive-by-default`
|
|
72
|
+
|
|
73
|
+
[`.agent-src/rules/non-destructive-by-default.md`](../../.agent-src/rules/non-destructive-by-default.md).
|
|
74
|
+
Stops on: production-branch merges; deploy / release; push to remote;
|
|
75
|
+
production data / infra writes; whimsical bulk deletions; commits
|
|
76
|
+
containing bulk deletions or infra changes. **Always confirm this turn.**
|
|
77
|
+
|
|
78
|
+
### 2. Git-ops Permission Gate — `scope-control`
|
|
79
|
+
|
|
80
|
+
[`.agent-src/rules/scope-control.md § Git operations`](../../.agent-src/rules/scope-control.md#git-operations--permission-gated).
|
|
81
|
+
Stops on: commit · push · merge · rebase · force-push · branch create /
|
|
82
|
+
switch / delete · PR create / close / retarget · tag / release / pin.
|
|
83
|
+
Permission must be **this turn or a standing instruction not yet
|
|
84
|
+
revoked**.
|
|
85
|
+
|
|
86
|
+
### 3. Commit Default — `commit-policy`
|
|
87
|
+
|
|
88
|
+
[`.agent-src/rules/commit-policy.md`](../../.agent-src/rules/commit-policy.md).
|
|
89
|
+
**Never commit, never ask about committing.** Four exceptions: user
|
|
90
|
+
says so this turn · standing instruction · `/commit` invoked · roadmap
|
|
91
|
+
authorization. Anything else → no commit.
|
|
92
|
+
|
|
93
|
+
### 4. Security-sensitive STOP — `security-sensitive-stop`
|
|
94
|
+
|
|
95
|
+
[`.agent-src/rules/security-sensitive-stop.md`](../../.agent-src/rules/security-sensitive-stop.md).
|
|
96
|
+
Stops on: auth, billing, tenant boundaries, secrets, uploads,
|
|
97
|
+
integrations, webhooks, public endpoints. Threat-model **before**
|
|
98
|
+
editing.
|
|
99
|
+
|
|
100
|
+
## Coverage map
|
|
101
|
+
|
|
102
|
+
| Surface | What governs it |
|
|
103
|
+
|---|---|
|
|
104
|
+
| Trivial workflow question | `personal.autonomy` (the switch) |
|
|
105
|
+
| Blocking architectural / scope question | [`ask-when-uncertain`](../../.agent-src/rules/ask-when-uncertain.md) (always) |
|
|
106
|
+
| Tool / MCP call cost | None today — Phase 1 item 4 introduces preset-loader Hard Enforcement |
|
|
107
|
+
| Skill / command allowlist per audience | None today — Phase 2 item 7 introduces packs |
|
|
108
|
+
| Per-domain `deny / ask / allow` | None today — Phase 2 item 9 introduces this |
|
|
109
|
+
| Hard Floor (prod, deploy, push, bulk-destructive) | Universal — not switchable |
|
|
110
|
+
| Git ops | Universal permission gate — not switchable |
|
|
111
|
+
| Commit | Universal default-deny — not switchable |
|
|
112
|
+
|
|
113
|
+
## Gaps the Phase 2 ADR will address
|
|
114
|
+
|
|
115
|
+
1. **One switch, one granularity.** Today, `autonomy: on` suppresses
|
|
116
|
+
*every* trivial question identically. A founder running the
|
|
117
|
+
`content-engine` pack may want autonomy for content, ask-mode for
|
|
118
|
+
spend; the current model cannot express that.
|
|
119
|
+
2. **No per-domain policy.** Domain-safety rules
|
|
120
|
+
(`.agent-src/rules/domain-safety-*.md`) act as output floors but do
|
|
121
|
+
not declare `deny / ask / allow` per profile. The Phase 2 model
|
|
122
|
+
centralizes this.
|
|
123
|
+
3. **No machine-readable safety schema.** The current behavior is
|
|
124
|
+
distributed across four rules. A consuming tool (the wizard, the
|
|
125
|
+
explain command) cannot ask "what is this install's safety posture?"
|
|
126
|
+
without reading rule prose.
|
|
127
|
+
|
|
128
|
+
The Phase 2 ADR (`docs/contracts/safety-model.md`) inherits this
|
|
129
|
+
baseline and adds: per-profile policy table, machine-readable schema,
|
|
130
|
+
explain-trace integration. It MUST NOT silently relax any of the four
|
|
131
|
+
floors above.
|
|
132
|
+
|
|
133
|
+
## See also
|
|
134
|
+
|
|
135
|
+
- [`autonomous-execution`](../../.agent-src/rules/autonomous-execution.md) · [`non-destructive-by-default`](../../.agent-src/rules/non-destructive-by-default.md) · [`scope-control`](../../.agent-src/rules/scope-control.md) · [`commit-policy`](../../.agent-src/rules/commit-policy.md) · [`security-sensitive-stop`](../../.agent-src/rules/security-sensitive-stop.md).
|
|
136
|
+
- [`docs/safety.md`](../safety.md) — domain-safety output floors.
|
|
137
|
+
- [`agents/roadmaps/step-15-product-refinement.md`](../../agents/roadmaps/step-15-product-refinement.md) — Phase 1 item 2a (this doc) and Phase 2 item 9 (Universal Safety Model ADR).
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Changelog Archive — pre-2.16.0
|
|
2
|
+
|
|
3
|
+
> Frozen snapshot of `event4u/agent-config` changelog entries from
|
|
4
|
+
> `2.15.0`, split out of the main
|
|
5
|
+
> [`CHANGELOG.md`](../../CHANGELOG.md) on 2026-05-16 once the active
|
|
6
|
+
> era's body crossed the 200-line drift cap enforced by
|
|
7
|
+
> `tests/test_changelog_eras.py`.
|
|
8
|
+
>
|
|
9
|
+
> **Read-only.** New entries land in `CHANGELOG.md` § "Era: 2.16.x".
|
|
10
|
+
> Entries here are not amended — git tag `2.15.0` remains the
|
|
11
|
+
> canonical source for what shipped.
|
|
12
|
+
>
|
|
13
|
+
> Entry shape follows the conventions documented in
|
|
14
|
+
> [`docs/contracts/CHANGELOG-conventions.md`](../contracts/CHANGELOG-conventions.md).
|
|
15
|
+
> Earlier eras live in
|
|
16
|
+
> [`CHANGELOG-pre-2.15.0.md`](CHANGELOG-pre-2.15.0.md),
|
|
17
|
+
> [`CHANGELOG-pre-2.11.0.md`](CHANGELOG-pre-2.11.0.md),
|
|
18
|
+
> [`CHANGELOG-pre-2.7.0.md`](CHANGELOG-pre-2.7.0.md), and
|
|
19
|
+
> [`CHANGELOG-pre-2.2.0.md`](CHANGELOG-pre-2.2.0.md).
|
|
20
|
+
|
|
21
|
+
## [2.15.0](https://github.com/event4u-app/agent-config/compare/2.14.0...2.15.0) (2026-05-15)
|
|
22
|
+
|
|
23
|
+
### Features
|
|
24
|
+
|
|
25
|
+
* **agent-user:** add /agents user command cluster (init, show, review, accept, update) ([15d53d8](https://github.com/event4u-app/agent-config/commit/15d53d8d9a2365b044831cd42127e247a70d7e20))
|
|
26
|
+
* **agent-user:** add v1 schema contract for .agent-user.md persona file ([64f4eab](https://github.com/event4u-app/agent-config/commit/64f4eab62ccf6a2606fbca0c56d398372c05a7a0))
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* **agent-user:** inline council-reference summary per no-roadmap-references ([ee4d3ce](https://github.com/event4u-app/agent-config/commit/ee4d3cedf9f4429450d21ca5badc2ae5c2ecaaed))
|
|
31
|
+
* **agent-user:** drop roadmap references per no-roadmap-references rule ([c8ade8d](https://github.com/event4u-app/agent-config/commit/c8ade8d7c5b495e0e4295aa0cb801e59076ee0b0))
|
|
32
|
+
* **agent-user:** adjust keep-beta-until to fit 90-day window ([801b365](https://github.com/event4u-app/agent-config/commit/801b365117a2d1efb4505e504bdd730e4cbbc217))
|
|
33
|
+
|
|
34
|
+
### Documentation
|
|
35
|
+
|
|
36
|
+
* **persona:** README section + agent-settings legacy-fallback note ([4da7629](https://github.com/event4u-app/agent-config/commit/4da7629f1f0b5a35a64d0a861040ad8639a66ebe))
|
|
37
|
+
* **roadmap:** mark step-3-agent-user-persona phases as in-progress ([f29d3bc](https://github.com/event4u-app/agent-config/commit/f29d3bce2380c0ea9c67e6094540b88d920ed9ff))
|
|
38
|
+
|
|
39
|
+
### Chores
|
|
40
|
+
|
|
41
|
+
* **roadmap:** close out + archive step-3-agent-user-persona ([09c0229](https://github.com/event4u-app/agent-config/commit/09c0229efd67af9cad7b2ca8202f4caa351d028d))
|
|
42
|
+
* **ownership:** regenerate file-ownership-matrix for /agents user ([128890d](https://github.com/event4u-app/agent-config/commit/128890d880584704b4842a398555dd979ae54462))
|
|
43
|
+
* **docs:** bump command count from 109 to 115 ([f8c61b1](https://github.com/event4u-app/agent-config/commit/f8c61b1d0ec48034e0d66e8d32534056ca4aa1f0))
|
|
44
|
+
* **template:** bump agent_config_version pin to 2.14.0 ([fcb885f](https://github.com/event4u-app/agent-config/commit/fcb885fd19bdbca46ef91ec4d5e723cc6c186c6d))
|
|
45
|
+
* **index:** regenerate agents/index.md + docs/catalog.md for /agents user ([56b281d](https://github.com/event4u-app/agent-config/commit/56b281d69960d3e57adbd24b9ec6fd24fc1a5aff))
|
|
46
|
+
* **agent-user:** regenerate compressed sources + claude tool stubs ([f79b6d1](https://github.com/event4u-app/agent-config/commit/f79b6d1cfcf1caccde4a723ad779c65d9ed87198))
|
|
47
|
+
|
|
48
|
+
Tests: 4352 (+12 since 2.14.0)
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Changelog Archive — pre-2.17.0
|
|
2
|
+
|
|
3
|
+
> Frozen snapshot of `event4u/agent-config` changelog entries from
|
|
4
|
+
> `2.16.0`, split out of the main
|
|
5
|
+
> [`CHANGELOG.md`](../../CHANGELOG.md) on 2026-05-16 once the active
|
|
6
|
+
> era's body crossed the 200-line drift cap enforced by
|
|
7
|
+
> `tests/test_changelog_eras.py`.
|
|
8
|
+
>
|
|
9
|
+
> **Read-only.** New entries land in `CHANGELOG.md` § "Era: 2.17.x".
|
|
10
|
+
> Entries here are not amended — git tag `2.16.0` remains the
|
|
11
|
+
> canonical source for what shipped.
|
|
12
|
+
>
|
|
13
|
+
> Entry shape follows the conventions documented in
|
|
14
|
+
> [`docs/contracts/CHANGELOG-conventions.md`](../contracts/CHANGELOG-conventions.md).
|
|
15
|
+
> Earlier eras live in
|
|
16
|
+
> [`CHANGELOG-pre-2.16.0.md`](CHANGELOG-pre-2.16.0.md),
|
|
17
|
+
> [`CHANGELOG-pre-2.15.0.md`](CHANGELOG-pre-2.15.0.md),
|
|
18
|
+
> [`CHANGELOG-pre-2.11.0.md`](CHANGELOG-pre-2.11.0.md),
|
|
19
|
+
> [`CHANGELOG-pre-2.7.0.md`](CHANGELOG-pre-2.7.0.md), and
|
|
20
|
+
> [`CHANGELOG-pre-2.2.0.md`](CHANGELOG-pre-2.2.0.md).
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## [2.16.0](https://github.com/event4u-app/agent-config/compare/2.15.0...2.16.0) (2026-05-15)
|
|
24
|
+
|
|
25
|
+
### Features
|
|
26
|
+
|
|
27
|
+
* **install:** install-mode marker + minimal-init upgrade hint (Step 8 P3) ([e028468](https://github.com/event4u-app/agent-config/commit/e028468ed2b58428b99bea5a2e6c2a25e12fc113))
|
|
28
|
+
* **cli:** doctor --trace-root + --context diagnostic surface (Step 8 P2) ([387a626](https://github.com/event4u-app/agent-config/commit/387a626b7795fc40e6e2442c1dde272dfc98f9d7))
|
|
29
|
+
* **cli:** --root override flag + fail-loud root validation (Step 8 P1) ([0c8356e](https://github.com/event4u-app/agent-config/commit/0c8356e9034ca474827de89db5386a04c61f560c))
|
|
30
|
+
* **wrapper:** export AGENT_CONFIG_PROJECT_ROOT pin so subdir invocations skip the walk ([e866cef](https://github.com/event4u-app/agent-config/commit/e866cef14d40269786fb0a88b69d9aafcfab1c88))
|
|
31
|
+
* **agent-settings:** add resolve_project_root helper for Phase 3 subdir hardening ([95bac18](https://github.com/event4u-app/agent-config/commit/95bac187132d35d476716cd38d8c619bccaca6e5))
|
|
32
|
+
* **install:** add --minimal / --settings-only init mode ([4c02743](https://github.com/event4u-app/agent-config/commit/4c02743cd7df6d89f7b7fa6188d654ca1eec983c))
|
|
33
|
+
* **agent_settings:** extend find_project_root with agents/ + .agent-settings.yml anchors ([60dcd11](https://github.com/event4u-app/agent-config/commit/60dcd11c498f25f92bb01482943bfb95d4efef37))
|
|
34
|
+
|
|
35
|
+
### Documentation
|
|
36
|
+
|
|
37
|
+
* **changelog:** Step 8 discovery polish entry under Unreleased ([eecaf6a](https://github.com/event4u-app/agent-config/commit/eecaf6a9a2248a877d71dbd33e7db096f94dab3b))
|
|
38
|
+
* **installation:** root override + monorepo semantics + diagnostics (Step 8) ([de3081f](https://github.com/event4u-app/agent-config/commit/de3081fe828cb43c628d922c50d25177d43f267e))
|
|
39
|
+
* **roadmap:** archive step-7 (all phases complete) + sync dashboard ([8f2953e](https://github.com/event4u-app/agent-config/commit/8f2953ee5c867ada29c9f32cf45bd2380504bc12))
|
|
40
|
+
* **step-7:** add minimal-init flow, anchor migration guide, changelog entry ([9ace019](https://github.com/event4u-app/agent-config/commit/9ace01945967e67e98e8855a940801db09de8d17))
|
|
41
|
+
* **roadmap:** mark Step 7 Phase 3 complete (subdir invocation hardening) ([518f9dc](https://github.com/event4u-app/agent-config/commit/518f9dcaf6d71a34cf1700bceb1487f1e8e33175))
|
|
42
|
+
* **roadmap:** mark Step 7 Phase 2 + test items complete ([1bb9b71](https://github.com/event4u-app/agent-config/commit/1bb9b712d866dd509124f7d8502f52957e972b20))
|
|
43
|
+
* **roadmap:** mark Step 7 Phase 1 complete; refresh progress dashboard ([2ba8d5b](https://github.com/event4u-app/agent-config/commit/2ba8d5be1b94bbab87da4270d833697c895cc9c6))
|
|
44
|
+
|
|
45
|
+
### Refactoring
|
|
46
|
+
|
|
47
|
+
* **cli:** route all cmd_*.py entry points through resolve_project_root ([aa7a01a](https://github.com/event4u-app/agent-config/commit/aa7a01a7f27205919193d54339298c0dbd30c43e))
|
|
48
|
+
|
|
49
|
+
### Tests
|
|
50
|
+
|
|
51
|
+
* **cli:** coverage for --root override + doctor trace/context (Step 8) ([9b943aa](https://github.com/event4u-app/agent-config/commit/9b943aa9f002750499738fd36f8a203525fb84da))
|
|
52
|
+
* **subdir:** cover resolve_project_root precedence + wrapper-pinned root ([0693714](https://github.com/event4u-app/agent-config/commit/06937145ac8f4e1160ec9279d3832e4f5397bb1e))
|
|
53
|
+
* **install:** cover --minimal payload + nested-install guard ([5623521](https://github.com/event4u-app/agent-config/commit/56235218624792b487a92f444ff8ee114a5651a3))
|
|
54
|
+
* **agent_settings:** cover anchor extension, kill-switch, perf budget ([37a080c](https://github.com/event4u-app/agent-config/commit/37a080c07ee9238fda45bbda1829764a4232f062))
|
|
55
|
+
|
|
56
|
+
### Chores
|
|
57
|
+
|
|
58
|
+
* **template:** bump agent_config_version pin to 2.15.0 ([093367d](https://github.com/event4u-app/agent-config/commit/093367d3e417a11a28295f2efa574e8c3fef6524))
|
|
59
|
+
* **sync:** propagate Step 8 agent_settings.py to .agent-src/ projection ([7ce92e5](https://github.com/event4u-app/agent-config/commit/7ce92e514a8edbd970a4118b91d2f651bf730070))
|
|
60
|
+
* **roadmap:** archive Step 8 discovery polish ([1c21982](https://github.com/event4u-app/agent-config/commit/1c219825dc413cfe45aefc3b12c08d2720583880))
|
|
61
|
+
* **changelog:** split era 2.11.x → pre-2.15.0 ([c79363c](https://github.com/event4u-app/agent-config/commit/c79363c05d775ecfa95ab6fff5b3bbe706f797c9))
|
|
62
|
+
|
|
63
|
+
Tests: 4405 (+53 since 2.15.0)
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
stability: stable
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# ADR Layout — Per-area Directories
|
|
6
|
+
|
|
7
|
+
> Status: accepted · 2026-05-16 · Roadmap: `step-11-ruflo-parity` Phase 4
|
|
8
|
+
|
|
9
|
+
## Scope
|
|
10
|
+
|
|
11
|
+
Two ADR surfaces coexist in this repo. **Both are canonical** — neither supersedes the other.
|
|
12
|
+
|
|
13
|
+
| Surface | Path | Use for |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| **Flat (legacy)** | `docs/decisions/ADR-NNN-<slug>.md` | Cross-cutting governance decisions: kernel composition, rule taxonomy, package-wide architecture. Numbering is global, sequential, gap-free. |
|
|
16
|
+
| **Per-area** | `docs/adrs/<area>/NNNN-<slug>.md` | Sub-area decisions whose blast radius is one plugin / one subsystem. Numbering is per-area, starts at `0001`, padded to 4 digits. |
|
|
17
|
+
|
|
18
|
+
Choice rule — does the decision constrain code **inside one area folder** (one runtime module, one contract group, one CLI surface)? → per-area. Does it constrain **the package's contract with consumers**? → flat. In doubt → per-area (cheaper to surface, easier to relocate).
|
|
19
|
+
|
|
20
|
+
## Per-area layout
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
docs/adrs/
|
|
24
|
+
<area>/
|
|
25
|
+
README.md # one-paragraph area scope + table of all ADRs in this area
|
|
26
|
+
0001-<slug>.md # first ADR, retrospective or prospective
|
|
27
|
+
0002-<slug>.md
|
|
28
|
+
...
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
`<area>` is a kebab-case stem matching one of:
|
|
32
|
+
|
|
33
|
+
- An entry in the canonical area inventory (see [`scripts/audit_adr_coverage.py`](../../scripts/audit_adr_coverage.py) `AREAS`).
|
|
34
|
+
- A new area added to that inventory in the same PR.
|
|
35
|
+
|
|
36
|
+
Reserved areas (bootstrap pass — step-11 Phase 4 Step 3):
|
|
37
|
+
|
|
38
|
+
| Area | Scope | Owner contract |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| `cost` | Budget ladder, hard-stop hook, cost reporting | [`cost-enforcement.md`](cost-enforcement.md) |
|
|
41
|
+
| `caveman` | Caveman-speak compression, decompression, reversibility | [`compression-default-kill-criterion.md`](compression-default-kill-criterion.md) |
|
|
42
|
+
| `schema` | Frontmatter schemas, v2 rigor, lint behaviour | [`schema-versioning.md`](schema-versioning.md) (when published) |
|
|
43
|
+
| `router` | `router.json` shape, tier semantics, dispatch precedence | [`rule-router.md`](rule-router.md) |
|
|
44
|
+
| `smoke` | Per-tier smoke contracts, baseline locks | [`smoke-contracts.md`](smoke-contracts.md) |
|
|
45
|
+
| `memory` | Memory MCP, propose / promote / poison flow | [`agent-memory-contract.md`](agent-memory-contract.md) |
|
|
46
|
+
|
|
47
|
+
## Frontmatter
|
|
48
|
+
|
|
49
|
+
Identical across both surfaces:
|
|
50
|
+
|
|
51
|
+
```yaml
|
|
52
|
+
---
|
|
53
|
+
adr: NNN # zero-padded; per-area uses 4-digit (0001), flat uses 3-digit (010)
|
|
54
|
+
area: <area> | flat # 'flat' for docs/decisions/, otherwise the area slug
|
|
55
|
+
status: proposed | accepted | superseded | deprecated
|
|
56
|
+
date: YYYY-MM-DD
|
|
57
|
+
decision: <slug>
|
|
58
|
+
supersedes: — | ADR-<area>-NNNN | ADR-MMM
|
|
59
|
+
superseded_by: — | ADR-<area>-NNNN | ADR-MMM
|
|
60
|
+
phase: <roadmap-stem> · <phase-id> # optional but recommended
|
|
61
|
+
type: retrospective | prospective
|
|
62
|
+
---
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Supersession links cross surfaces: a per-area ADR may supersede a flat ADR and vice versa. The numeric prefix in `supersedes:` makes the target unambiguous (`ADR-007` = flat, `ADR-cost-0001` = per-area).
|
|
66
|
+
|
|
67
|
+
## Per-area README contract
|
|
68
|
+
|
|
69
|
+
Every `<area>/` directory carries a `README.md` with:
|
|
70
|
+
|
|
71
|
+
1. One-paragraph area scope (≤ 4 sentences).
|
|
72
|
+
2. Single contract pointer — the `docs/contracts/<X>.md` this area implements (or "no published contract" if pre-Phase 5).
|
|
73
|
+
3. Numbered table of ADRs in the area: `| # | Title | Status | Date | Supersedes |`. Generated by `scripts/audit_adr_coverage.py --regen-area-readme <area>`.
|
|
74
|
+
|
|
75
|
+
## Coverage gate
|
|
76
|
+
|
|
77
|
+
`scripts/audit_adr_coverage.py --check` (wired to `task lint-adr-coverage`):
|
|
78
|
+
|
|
79
|
+
- Warns when a `docs/contracts/<X>.md` exists without a matching `docs/adrs/<X>/0001-*.md`.
|
|
80
|
+
- Hard-fails on number gaps within an area (e.g. `0001`, `0003` without `0002`).
|
|
81
|
+
- Hard-fails on missing `README.md` in any non-empty area directory.
|
|
82
|
+
- Warns on dangling `supersedes:` or `superseded_by:` references.
|
|
83
|
+
|
|
84
|
+
Default mode is **warn** at the consumer surface; **fail** under `task ci`. Rationale: a new contract dropped without an ADR is a documentation gap, not a bug. CI enforces it for this package; consumer projects opt in by adding the task to their own pipeline.
|
|
85
|
+
|
|
86
|
+
## Numbering & gaps
|
|
87
|
+
|
|
88
|
+
- Per-area: 4-digit, gap-free, starts at `0001`. Re-use of numbers is a hard failure in the index regenerator.
|
|
89
|
+
- Flat: 3-digit, gap-free, starts at `001`. Existing ADRs in `docs/decisions/` set the precedent.
|
|
90
|
+
- A deleted ADR is **never** removed from history — supersede it. The lint surfaces broken supersession chains.
|
|
91
|
+
|
|
92
|
+
## Relationship to `adr-create` skill
|
|
93
|
+
|
|
94
|
+
[`adr-create`](../../.agent-src.uncompressed/skills/adr-create/SKILL.md) accepts an optional `<area>` argument (added in step-11 Phase 4 Step 4):
|
|
95
|
+
|
|
96
|
+
- No `<area>` → flat surface, `docs/decisions/`.
|
|
97
|
+
- `<area>` matches inventory → per-area surface, `docs/adrs/<area>/`.
|
|
98
|
+
- `<area>` does **not** match inventory → skill refuses with a hint to update the inventory first.
|
|
99
|
+
|
|
100
|
+
The skill's template, numbering logic, and validation hooks are identical for both surfaces; only the target directory and number padding differ.
|
|
101
|
+
|
|
102
|
+
## References
|
|
103
|
+
|
|
104
|
+
- [`docs/adrs/cost/0001-hard-stop-hook.md`](../adrs/cost/0001-hard-stop-hook.md) — first per-area ADR (bootstrap).
|
|
105
|
+
- [`docs/decisions/INDEX.md`](../decisions/INDEX.md) — flat surface index.
|
|
106
|
+
- [`scripts/audit_adr_coverage.py`](../../scripts/audit_adr_coverage.py) — coverage gate.
|
|
107
|
+
- [`scripts/adr/regenerate_index.py`](../../scripts/adr/regenerate_index.py) — index regenerator (works on both surfaces; pass `--dir`).
|
|
108
|
+
- `step-11-ruflo-parity` Phase 4 — origin.
|