@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.
Files changed (94) hide show
  1. package/.agent-src/commands/agent-status.md +29 -0
  2. package/.agent-src/commands/onboard.md +221 -81
  3. package/.agent-src/packs/README.md +49 -0
  4. package/.agent-src/packs/agency-delivery.yml +63 -0
  5. package/.agent-src/packs/content-engine.yml +53 -0
  6. package/.agent-src/packs/founder-mvp.yml +51 -0
  7. package/.agent-src/presets/README.md +26 -0
  8. package/.agent-src/presets/balanced.yml +34 -0
  9. package/.agent-src/presets/fast.yml +31 -0
  10. package/.agent-src/presets/strict.yml +38 -0
  11. package/.agent-src/profiles/README.md +29 -0
  12. package/.agent-src/profiles/agency.yml +27 -0
  13. package/.agent-src/profiles/content_creator.yml +25 -0
  14. package/.agent-src/profiles/developer.yml +26 -0
  15. package/.agent-src/profiles/finance.yml +24 -0
  16. package/.agent-src/profiles/founder.yml +25 -0
  17. package/.agent-src/profiles/ops.yml +25 -0
  18. package/.agent-src/rules/no-cheap-questions.md +25 -17
  19. package/.agent-src/skills/adr-create/SKILL.md +78 -68
  20. package/.agent-src/skills/subagent-orchestration/SKILL.md +33 -0
  21. package/.agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  22. package/.agent-src/templates/skill-archive-note.md +101 -0
  23. package/.claude-plugin/marketplace.json +1 -1
  24. package/CHANGELOG.md +73 -70
  25. package/README.md +68 -72
  26. package/config/agent-settings.template.yml +22 -0
  27. package/docs/adrs/caveman/0001-default-off-until-bench.md +93 -0
  28. package/docs/adrs/caveman/README.md +9 -0
  29. package/docs/adrs/cost/0001-hard-stop-hook.md +114 -0
  30. package/docs/adrs/cost/README.md +9 -0
  31. package/docs/adrs/memory/0001-consumer-side-snapshot.md +111 -0
  32. package/docs/adrs/memory/README.md +9 -0
  33. package/docs/adrs/router/0001-three-tier-routing.md +119 -0
  34. package/docs/adrs/router/README.md +9 -0
  35. package/docs/adrs/schema/0001-json-schema-frontmatter.md +102 -0
  36. package/docs/adrs/schema/README.md +9 -0
  37. package/docs/adrs/smoke/0001-per-tier-smoke-scripts.md +99 -0
  38. package/docs/adrs/smoke/README.md +9 -0
  39. package/docs/architecture/current-onboard-baseline.md +126 -0
  40. package/docs/architecture/current-safety-behavior.md +137 -0
  41. package/docs/archive/CHANGELOG-pre-2.16.0.md +48 -0
  42. package/docs/archive/CHANGELOG-pre-2.17.0.md +63 -0
  43. package/docs/contracts/adr-layout.md +108 -0
  44. package/docs/contracts/benchmark-corpus-spec.md +97 -0
  45. package/docs/contracts/benchmark-report-schema.md +111 -0
  46. package/docs/contracts/command-clusters.md +1 -0
  47. package/docs/contracts/command-taxonomy.md +137 -0
  48. package/docs/contracts/compression-default-kill-criterion.md +69 -0
  49. package/docs/contracts/config-presets.md +144 -0
  50. package/docs/contracts/cost-dashboard.md +143 -0
  51. package/docs/contracts/cost-enforcement.md +134 -0
  52. package/docs/contracts/file-ownership-matrix.json +0 -7
  53. package/docs/contracts/mcp-tool-inventory.md +53 -0
  54. package/docs/contracts/measurement-baseline.md +102 -0
  55. package/docs/contracts/namespace.md +125 -0
  56. package/docs/contracts/profile-system.md +142 -0
  57. package/docs/contracts/safety-model.md +129 -0
  58. package/docs/contracts/smoke-contracts.md +144 -0
  59. package/docs/contracts/workflow-packs.md +121 -0
  60. package/docs/decisions/ADR-010-profile-pack-preset-boundary.md +132 -0
  61. package/docs/decisions/INDEX.md +1 -0
  62. package/docs/featured-commands.md +27 -0
  63. package/docs/parity/bench-ruflo.json +58 -0
  64. package/docs/parity/bench.json +41 -0
  65. package/docs/parity/ruflo.md +46 -0
  66. package/docs/profiles.md +91 -0
  67. package/package.json +1 -1
  68. package/scripts/_cli/cmd_explain.py +250 -0
  69. package/scripts/_lib/bench_cost.py +138 -0
  70. package/scripts/_lib/bench_quality.py +118 -0
  71. package/scripts/_lib/bench_report.py +150 -0
  72. package/scripts/agent-config +13 -0
  73. package/scripts/audit_adr_coverage.py +175 -0
  74. package/scripts/audit_mcp_tools.py +146 -0
  75. package/scripts/bench_baseline_ready.py +108 -0
  76. package/scripts/bench_drift_check.py +151 -0
  77. package/scripts/bench_per_tool.py +216 -0
  78. package/scripts/bench_run.py +155 -0
  79. package/scripts/config/__init__.py +9 -0
  80. package/scripts/config/presets.py +206 -0
  81. package/scripts/config/profiles.py +173 -0
  82. package/scripts/cost/budget.mjs +73 -12
  83. package/scripts/cost/preflight.mjs +89 -0
  84. package/scripts/lint_archived_skills.py +143 -0
  85. package/scripts/lint_bench_corpus.py +161 -0
  86. package/scripts/lint_namespace.py +135 -0
  87. package/scripts/lint_roadmap_complexity.py +3 -2
  88. package/scripts/skill_overlap.py +204 -0
  89. package/scripts/skill_usage_collect.py +191 -0
  90. package/scripts/skill_usage_report.py +162 -0
  91. package/scripts/smoke/kernel.sh +101 -0
  92. package/scripts/smoke/router.sh +129 -0
  93. package/scripts/smoke/schema.sh +71 -0
  94. package/scripts/smoke/skills.sh +101 -0
@@ -0,0 +1,51 @@
1
+ # Seed pack — founder-mvp
2
+ # Schema: docs/contracts/workflow-packs.md
3
+ pack:
4
+ id: founder-mvp
5
+ audience:
6
+ label: "Solo / early-stage founder shipping the MVP and the pitch deck"
7
+ one_liner: "Ship the MVP and the pitch deck in the same week."
8
+ composition:
9
+ profile_id: founder
10
+ preset_id: fast
11
+ surface:
12
+ commands_allowed:
13
+ - work
14
+ - feature
15
+ - challenge-me
16
+ - council
17
+ - refine-prompt
18
+ - commit
19
+ - create-pr
20
+ skills_allowed:
21
+ - refine-prompt
22
+ - rice-prioritization
23
+ - vision-articulation
24
+ - fundraising-narrative
25
+ - runway-cognition
26
+ - customer-research
27
+ - po-discovery
28
+ - decision-record
29
+ - minimal-safe-diff
30
+ - verify-completion-evidence
31
+ personas:
32
+ - product-strategist
33
+ - reviewer
34
+ - founder-finance
35
+ rationale:
36
+ why_this_profile: |
37
+ Founder profile centres the work loop on framing, prioritization,
38
+ and narrative — the three artefacts a solo founder produces every
39
+ week. Engineering skills are not dropped; they are surfaced one
40
+ level below, accessible via /work but not on the first screen.
41
+ why_this_preset: |
42
+ Fast preset trades evidence-floor strictness for momentum. Confidence
43
+ band lowered to "low"; trivial-question suppression on. Block-on
44
+ list keeps security and prod-data hard floors intact — the speed
45
+ gain is in clarifying questions, not in safety.
46
+ why_these_commands: |
47
+ /work and /feature drive the build loop; /challenge-me grills the
48
+ idea before a week is sunk into it; /council polls external models
49
+ when the founder is the smartest person in their own head. /commit
50
+ and /create-pr close the loop without ceremony — most founders
51
+ ship solo and the PR-as-checkpoint is the only review they get.
@@ -0,0 +1,26 @@
1
+ # Presets
2
+
3
+ Seed presets for the [preset system](../../docs/contracts/config-presets.md).
4
+ Each preset bundles governance knobs (autonomy / confidence / risk /
5
+ council / mcp / cost / notifications) so the user picks a stance, not
6
+ a dozen individual values. Boundary against `profile.id`, `pack.id`,
7
+ and `cost_profile` lives in
8
+ [ADR-010](../../docs/decisions/ADR-010-profile-pack-preset-boundary.md).
9
+
10
+ ## Seed set (v2.x — fixed)
11
+
12
+ | `preset.id` | Stance | Typical user |
13
+ |---|---|---|
14
+ | `fast` | Lowest friction, widest autonomy | Solo founder, prototype, exploration |
15
+ | `balanced` *(default)* | Moderate friction, per-task autonomy | Day-to-day work |
16
+ | `strict` | Highest friction, ask-by-default | Production paths, regulated work, shared trunks |
17
+
18
+ Adding a fourth seed preset requires an ADR. User-defined project-local
19
+ presets (any `<id>.yml` not in the seed list above) are allowed without
20
+ an ADR but MUST match the schema enforced by `task lint-config-schema`.
21
+
22
+ ## See also
23
+
24
+ - [`docs/contracts/config-presets.md`](../../docs/contracts/config-presets.md) — schema, cost enforcement, resolution chain.
25
+ - [`docs/contracts/profile-system.md`](../../docs/contracts/profile-system.md) — profile axis.
26
+ - [`scripts/config/presets.py`](../../scripts/config/presets.py) — loader.
@@ -0,0 +1,34 @@
1
+ # Seed preset — balanced (default)
2
+ # Schema: docs/contracts/config-presets.md
3
+ preset:
4
+ id: balanced
5
+ autonomy:
6
+ default: auto
7
+ trivial_suppress: true
8
+ confidence:
9
+ min_band: medium
10
+ require_evidence: false
11
+ risk:
12
+ block_on:
13
+ - security
14
+ - prod_data
15
+ ask_on:
16
+ - bulk_delete
17
+ - schema_change
18
+ council:
19
+ auto_consult: false
20
+ cap_per_consult_usd: 0.50
21
+ mcp:
22
+ per_call_max_usd: 0.10
23
+ per_session_max_usd: 2.00
24
+ cost:
25
+ daily_max_usd: 10.00
26
+ weekly_max_usd: 50.00
27
+ monthly_max_usd: 150.00
28
+ enforce: hybrid
29
+ notifications:
30
+ threshold_pct:
31
+ - 50
32
+ - 75
33
+ - 90
34
+ - 100
@@ -0,0 +1,31 @@
1
+ # Seed preset — fast
2
+ # Schema: docs/contracts/config-presets.md
3
+ preset:
4
+ id: fast
5
+ autonomy:
6
+ default: on
7
+ trivial_suppress: true
8
+ confidence:
9
+ min_band: low
10
+ require_evidence: false
11
+ risk:
12
+ block_on:
13
+ - security
14
+ - prod_data
15
+ ask_on:
16
+ - bulk_delete
17
+ council:
18
+ auto_consult: false
19
+ cap_per_consult_usd: 0.25
20
+ mcp:
21
+ per_call_max_usd: 0.25
22
+ per_session_max_usd: 5.00
23
+ cost:
24
+ daily_max_usd: 25.00
25
+ weekly_max_usd: 100.00
26
+ monthly_max_usd: 300.00
27
+ enforce: hybrid
28
+ notifications:
29
+ threshold_pct:
30
+ - 75
31
+ - 100
@@ -0,0 +1,38 @@
1
+ # Seed preset — strict
2
+ # Schema: docs/contracts/config-presets.md
3
+ preset:
4
+ id: strict
5
+ autonomy:
6
+ default: off
7
+ trivial_suppress: false
8
+ confidence:
9
+ min_band: high
10
+ require_evidence: true
11
+ risk:
12
+ block_on:
13
+ - security
14
+ - prod_data
15
+ - bulk_delete
16
+ - schema_change
17
+ - financial_paths
18
+ ask_on:
19
+ - code_paths
20
+ - infra_change
21
+ council:
22
+ auto_consult: true
23
+ cap_per_consult_usd: 1.00
24
+ mcp:
25
+ per_call_max_usd: 0.05
26
+ per_session_max_usd: 1.00
27
+ cost:
28
+ daily_max_usd: 5.00
29
+ weekly_max_usd: 20.00
30
+ monthly_max_usd: 60.00
31
+ enforce: hybrid
32
+ notifications:
33
+ threshold_pct:
34
+ - 25
35
+ - 50
36
+ - 75
37
+ - 90
38
+ - 100
@@ -0,0 +1,29 @@
1
+ # Profiles
2
+
3
+ Seed profiles for the [profile system](../../docs/contracts/profile-system.md).
4
+ Each profile answers *who is the user?* — audience identity that
5
+ selects the default skill/command surface, README entry-paragraph,
6
+ and persona pre-selection. Boundary against `preset.id`, `pack.id`,
7
+ and `cost_profile` lives in
8
+ [ADR-010](../../docs/decisions/ADR-010-profile-pack-preset-boundary.md).
9
+
10
+ ## Seed set (v2.x — fixed)
11
+
12
+ | `profile.id` | Audience | Default preset |
13
+ |---|---|---|
14
+ | `founder` | Solo / early-stage founder | `fast` |
15
+ | `developer` | IC engineer | `balanced` |
16
+ | `content_creator` | Writers, ghostwriters, marketers | `balanced` |
17
+ | `agency` | Multi-client delivery shop | `strict` |
18
+ | `finance` | CFO / fractional finance / FP&A | `strict` |
19
+ | `ops` | RevOps, support, SRE-adjacent | `strict` |
20
+
21
+ Adding a seventh seed profile requires an ADR. User-defined project-local
22
+ profiles (any `<id>.yml` not in the seed list above) are allowed without
23
+ an ADR but MUST match the schema enforced by `task lint-config-schema`.
24
+
25
+ ## See also
26
+
27
+ - [`docs/contracts/profile-system.md`](../../docs/contracts/profile-system.md) — schema and loader contract.
28
+ - [`docs/contracts/config-presets.md`](../../docs/contracts/config-presets.md) — preset axis.
29
+ - [`scripts/config/profiles.py`](../../scripts/config/profiles.py) — loader.
@@ -0,0 +1,27 @@
1
+ # Seed profile — agency
2
+ # Schema: docs/contracts/profile-system.md
3
+ profile:
4
+ id: agency
5
+ audience:
6
+ label: "Multi-client delivery shop"
7
+ readme_anchor: "agency"
8
+ defaults:
9
+ preset_id: strict
10
+ personas:
11
+ - reviewer
12
+ - product-strategist
13
+ - editor
14
+ skills_hint:
15
+ - doc-coauthoring
16
+ - decision-record
17
+ - refine-ticket
18
+ - estimate-ticket
19
+ - perf-feedback-craft
20
+ surface:
21
+ commands_hint:
22
+ - work
23
+ - implement-ticket
24
+ - refine-ticket
25
+ - feature
26
+ - roadmap
27
+ docs_first_pointer: "docs/getting-started-by-role.md#agency"
@@ -0,0 +1,25 @@
1
+ # Seed profile — content_creator
2
+ # Schema: docs/contracts/profile-system.md
3
+ profile:
4
+ id: content_creator
5
+ audience:
6
+ label: "Writers, ghostwriters, marketers"
7
+ readme_anchor: "content_creator"
8
+ defaults:
9
+ preset_id: balanced
10
+ personas:
11
+ - editor
12
+ - brand-voice
13
+ skills_hint:
14
+ - voice-and-tone-design
15
+ - messaging-architecture
16
+ - editorial-calendar
17
+ - release-comms
18
+ - prompt-engineering-patterns
19
+ surface:
20
+ commands_hint:
21
+ - work
22
+ - post-as
23
+ - ghostwriter
24
+ - optimize-prompt
25
+ docs_first_pointer: "docs/getting-started-by-role.md#content_creator"
@@ -0,0 +1,26 @@
1
+ # Seed profile — developer
2
+ # Schema: docs/contracts/profile-system.md
3
+ profile:
4
+ id: developer
5
+ audience:
6
+ label: "IC engineer"
7
+ readme_anchor: "developer"
8
+ defaults:
9
+ preset_id: balanced
10
+ personas:
11
+ - reviewer
12
+ - security
13
+ skills_hint:
14
+ - developer-like-execution
15
+ - verify-completion-evidence
16
+ - minimal-safe-diff
17
+ - systematic-debugging
18
+ - test-driven-development
19
+ surface:
20
+ commands_hint:
21
+ - work
22
+ - implement-ticket
23
+ - review-changes
24
+ - fix
25
+ - commit
26
+ docs_first_pointer: "docs/getting-started-by-role.md#developer"
@@ -0,0 +1,24 @@
1
+ # Seed profile — finance
2
+ # Schema: docs/contracts/profile-system.md
3
+ profile:
4
+ id: finance
5
+ audience:
6
+ label: "CFO / fractional finance / FP&A"
7
+ readme_anchor: "finance"
8
+ defaults:
9
+ preset_id: strict
10
+ personas:
11
+ - finance-partner
12
+ - reviewer
13
+ skills_hint:
14
+ - dcf-modeling
15
+ - forecasting
16
+ - scenario-modeling
17
+ - unit-economics-modeling
18
+ - runway-cognition
19
+ surface:
20
+ commands_hint:
21
+ - work
22
+ - council
23
+ - challenge-me
24
+ docs_first_pointer: "docs/getting-started-by-role.md#finance"
@@ -0,0 +1,25 @@
1
+ # Seed profile — founder
2
+ # Schema: docs/contracts/profile-system.md
3
+ profile:
4
+ id: founder
5
+ audience:
6
+ label: "Solo / early-stage founder"
7
+ readme_anchor: "founder"
8
+ defaults:
9
+ preset_id: fast
10
+ personas:
11
+ - product-strategist
12
+ - reviewer
13
+ skills_hint:
14
+ - refine-prompt
15
+ - rice-prioritization
16
+ - vision-articulation
17
+ - fundraising-narrative
18
+ - runway-cognition
19
+ surface:
20
+ commands_hint:
21
+ - work
22
+ - feature
23
+ - challenge-me
24
+ - council
25
+ docs_first_pointer: "docs/getting-started-by-role.md#founder"
@@ -0,0 +1,25 @@
1
+ # Seed profile — ops
2
+ # Schema: docs/contracts/profile-system.md
3
+ profile:
4
+ id: ops
5
+ audience:
6
+ label: "RevOps, support, SRE-adjacent"
7
+ readme_anchor: "ops"
8
+ defaults:
9
+ preset_id: strict
10
+ personas:
11
+ - reviewer
12
+ - security
13
+ skills_hint:
14
+ - incident-commander
15
+ - dashboard-design
16
+ - logging-monitoring
17
+ - threat-modeling
18
+ - launch-readiness
19
+ surface:
20
+ commands_hint:
21
+ - work
22
+ - threat-model
23
+ - review-changes
24
+ - fix
25
+ docs_first_pointer: "docs/getting-started-by-role.md#ops"
@@ -8,7 +8,7 @@ source: package
8
8
 
9
9
  # No Cheap Questions
10
10
 
11
- A question is **cheap** when context already answers, an option breaches an Iron Law, choices differ only in sequencing / format, or one option is dominant. Mode-independent — `off`, `auto`, `on`. Autonomy never lifts the floor.
11
+ A question is **cheap** when context already answers it, an option breaches an Iron Law, choices differ only in sequencing / format, or one option is dominant. Mode-independent. Autonomy never lifts the floor.
12
12
 
13
13
  ## The Iron Laws
14
14
 
@@ -18,9 +18,20 @@ NEVER PRESENT AN OPTION THAT VIOLATES AN IRON LAW.
18
18
  NEVER OFFER NUMBERED CHOICES WITHOUT A REAL TRADE-OFF.
19
19
  ```
20
20
 
21
- ## What counts as cheap
21
+ ## Cheap classes
22
22
 
23
- Ten classes — sequencing · format-only · commit asks · CI / test asks · fenced-step re-asks · Iron-Law option · context-derived · dominant option · re-ask after decline · **paternalistic state-assuming option** (Iron Law 3 below). Per-class detail + governing rule: [`asking-and-brevity-examples § cheap-question-catalog`](../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).
23
+ Sequencing · format-only · commit asks · CI / test asks · fenced re-ask · Iron-Law option · context-derived · dominant option · re-ask after decline · paternalistic (Iron Law 3) · continuation under mandate (Iron Law 4). Catalog: [`asking-and-brevity-examples`](../docs/guidelines/agent-infra/asking-and-brevity-examples.md#cheap-question-class-catalog--extended-examples).
24
+
25
+ ## Iron Law 4 — No Continuation Prompts Under Autonomous Mandate
26
+
27
+ ```
28
+ WHEN A STANDING AUTONOMOUS MANDATE IS ACTIVE — /roadmap:process-full,
29
+ /roadmap:process-phase, EXPLICIT "ENTSCHEIDE SELBST / DECIDE AND DON'T
30
+ ASK" — NEVER ASK "WEITER? / NEXT STEP? / SHALL I CONTINUE?".
31
+ A CLEAN EDIT-BATCH IS NOT A HALT CONDITION. THE ONLY HALTS ARE THE
32
+ FIVE NAMED IN THE INVOKING COMMAND (HARD-FLOOR, COUNCIL-OFF +
33
+ AMBIGUITY, SECURITY-SENSITIVE, SCOPE-OUT-OF-ROADMAP, TEST/QUALITY RED).
34
+ ```
24
35
 
25
36
  ## Iron Law 3 — No Paternalistic State-Assuming Options
26
37
 
@@ -30,30 +41,27 @@ NEVER FABRICATE USER STATE TO JUSTIFY AN OPTION.
30
41
  THE USER DECIDES WHEN TO STOP. THE AGENT DECIDES WHAT TO BUILD NEXT.
31
42
  ```
32
43
 
33
- Every numbered option = technical / scope / sequencing choice with real trade-off, not mood-management nudge. Forbidden patterns + carve-outs: [`asking-and-brevity-examples § iron-law-3`](../docs/guidelines/agent-infra/asking-and-brevity-examples.md#no-cheap-questions--iron-law-3-detail-paternalistic-state-options).
34
-
35
44
  ## Pre-Send Self-Check — MANDATORY before every question
36
45
 
37
- Run silently before any numbered-options block:
46
+ Silent, before any numbered-options block:
38
47
 
39
48
  1. Answer already in stated context?
40
- 2. Any option violates `commit-policy`, `scope-control § git-ops`, or `non-destructive-by-default`?
41
- 3. Options pure sequencing / format, no trade-off?
49
+ 2. Option violates `commit-policy`, `scope-control § git-ops`, or `non-destructive-by-default`?
50
+ 3. Pure sequencing / format, no trade-off?
42
51
  4. One option obviously dominant?
43
- 5. User fenced next step (*"plan only"*, *"review first"*) → deliver + handback per `scope-control § fenced step`.
44
- 6. User already declined? Re-ask forbidden per `scope-control § decline = silence`.
45
- 7. Any option assumes user fatigue / frustration / "had enough" without in-message citation? Iron Law 3 — drop it.
52
+ 5. User fenced step (*"plan only"*, *"review first"*) → deliver + handback.
53
+ 6. User already declined? Re-ask forbidden.
54
+ 7. Option assumes user fatigue / frustration without in-message citation? Iron Law 3 — drop.
55
+ 8. Standing autonomous mandate + "weiter? / continue?" — Iron Law 4, drop; pick next item.
46
56
 
47
- Any "yes" → **do not ask**. Pick the dominant path, state assumption inline (*"assuming X — adjust if wrong"*), hand back. One-question-per-turn from [`ask-when-uncertain`](ask-when-uncertain.md) still applies when the question is genuine.
57
+ Any "yes" → don't ask. Pick dominant path, state inline assumption, hand back. Genuine ambiguity [`ask-when-uncertain`](ask-when-uncertain.md).
48
58
 
49
59
  ## When asking IS allowed
50
60
 
51
61
  - Real architectural / scope decision with non-obvious trade-offs.
52
- - Vague-request trigger per [`ask-when-uncertain § vague-triggers`](ask-when-uncertain.md#vague-request-triggers--must-ask).
53
- - Security-sensitive path per [`security-sensitive-stop`](security-sensitive-stop.md).
54
- - Hard Floor per [`non-destructive-by-default`](non-destructive-by-default.md) — confirmation mandatory.
62
+ - Vague-request trigger ([`ask-when-uncertain`](ask-when-uncertain.md)).
63
+ - Security-sensitive ([`security-sensitive-stop`](security-sensitive-stop.md)).
64
+ - Hard Floor ([`non-destructive-by-default`](non-destructive-by-default.md)).
55
65
  - Two genuinely-equivalent paths; user preference is the tiebreaker.
56
66
 
57
67
  In doubt → ask. This rule narrows asking, never widens silence.
58
-
59
- Cross-rule index: [`frugality-charter § cross-references`](../contexts/contracts/frugality-charter.md#cross-references--frugality-canon-rules).
@@ -44,42 +44,63 @@ Do NOT use when:
44
44
 
45
45
  ## Preconditions
46
46
 
47
- - An ADR directory exists (default `docs/adr/`; `docs/decisions/` is
48
- the recognised alias used in this package and many older projects).
49
- - The decision is **already made** — ADRs record outcomes, they do
50
- not run the decision process. For unresolved trade-offs, run the
51
- council or consult `adversarial-review` first.
47
+ - ADR directory exists. Two layouts coexist (see
48
+ [`docs/contracts/adr-layout.md`](../../../docs/contracts/adr-layout.md)):
49
+ - **Flat** — `docs/decisions/` (or `docs/adr/` alias): cross-cutting
50
+ governance ADRs, 3-digit numbering (`ADR-NNN-<slug>.md`).
51
+ - **Per-area** `docs/adrs/<area>/`: sub-area ADRs, 4-digit
52
+ numbering (`NNNN-<slug>.md`); `<area>` must match canonical
53
+ inventory in [`scripts/audit_adr_coverage.py`](../../../scripts/audit_adr_coverage.py).
54
+ - Decision **already made** — ADRs record outcomes, not run the
55
+ decision process. For unresolved trade-offs, run council or
56
+ consult `adversarial-review` first.
52
57
 
53
58
  ## Procedure
54
59
 
55
- ### 1. Inspect and resolve the ADR directory
60
+ ### 1. Inspect and pick the surface
56
61
 
57
- Identify the canonical directory in this order:
62
+ Ask one question only if both are plausible:
58
63
 
59
- 1. `docs/adr/`default per spec.
60
- 2. `docs/decisions/` accepted alias if `docs/adr/` is missing.
61
- 3. Anything else — fail, ask the user to pick one of the two
62
- canonical paths. Do not invent a third location.
64
+ 1. **Flat surface** decision constrains package's contract with
65
+ consumers (kernel composition, rule taxonomy, package-wide
66
+ architecture). Directory: `docs/decisions/` (fallback
67
+ `docs/adr/`). Filename: `ADR-NNN-<slug>.md`.
68
+ 2. **Per-area surface** — decision constrains code inside one area
69
+ folder (one runtime module, one contract group, one CLI surface).
70
+ Directory: `docs/adrs/<area>/`. Filename: `NNNN-<slug>.md`
71
+ (4-digit, no `ADR-` prefix).
72
+ 3. **Unknown area** — `<area>` not in inventory: refuse with hint
73
+ to add area to `AREAS` in `scripts/audit_adr_coverage.py` in
74
+ same PR. Do not invent.
75
+ 4. **In doubt** → per-area (cheaper to surface, easier to relocate).
63
76
 
64
77
  ### 2. Pick the next ADR number
65
78
 
66
- Scan the directory for `ADR-*.md`, parse the leading 3-digit number,
67
- take `max + 1` (zero-padded). For an empty directory, start at `001`.
68
- Reject re-use of an existing number the index regenerator treats
69
- duplicates as a hard failure.
79
+ - **Flat surface** scan `docs/decisions/` (or `docs/adr/`) for
80
+ `ADR-*.md`, parse leading 3-digit number, take `max + 1`
81
+ (zero-padded to 3). Empty directory start at `001`.
82
+ - **Per-area surface** scan `docs/adrs/<area>/` for
83
+ `[0-9][0-9][0-9][0-9]-*.md`, parse leading 4-digit number, take
84
+ `max + 1` (zero-padded to 4). Empty area → start at `0001`.
85
+ `README.md` is **not** an ADR — skip it.
86
+
87
+ Reject re-use of existing number — index regeneration treats
88
+ duplicates as hard failure on both surfaces.
70
89
 
71
90
  ### 3. Pick a slug
72
91
 
73
92
  Short, hyphen-lowercase, scope-revealing. Match peer ADRs in the
74
93
  directory. Examples: `kernel-swap-deferred`, `flat-cluster-subs`,
75
- `http-bridge-deferred-with-trigger`. Reject slugs longer than 60 chars.
94
+ `http-bridge-deferred-with-trigger`,
95
+ `per-tier-smoke-scripts`. Reject slugs longer than 60 chars.
76
96
 
77
97
  ### 4. Author the ADR
78
98
 
79
- Use the standard template (frontmatter + body). All sections are
80
- required; "n/a" is acceptable for genuinely empty Alternatives or
81
- References blocks but never for Status, Context, Decision, or
82
- Consequences.
99
+ Use surface-specific template. All sections required; "—" acceptable
100
+ for genuinely empty Alternatives or References blocks but never for
101
+ Status, Context, Decision, or Consequences.
102
+
103
+ **Flat-surface template** (`docs/decisions/ADR-NNN-<slug>.md`):
83
104
 
84
105
  ```markdown
85
106
  ---
@@ -98,73 +119,62 @@ phase: <roadmap> · <phase-id>
98
119
 
99
120
  **<Proposed | Accepted | …>** · YYYY-MM-DD.
100
121
 
101
- ## Context
102
-
103
- What problem forced this decision? What constraints applied? What
104
- alternatives were on the table at decision time?
105
-
106
- ## Decision
107
-
108
- The chosen variant, in one paragraph. Concrete enough that a reader
109
- six months later knows what was actually picked.
110
-
111
- ## Consequences
112
-
113
- ### Accepted
114
-
115
- - Hard guarantees we now make.
116
-
117
- ### Trade-offs
118
-
119
- - What we gave up. Mitigations, if any.
122
+ ## Context / Decision / Consequences / Alternatives / References
123
+ ```
120
124
 
121
- ## Alternatives considered
125
+ **Per-area template** (`docs/adrs/<area>/NNNN-<slug>.md`):
122
126
 
123
- - **Variant X — <name>.** Rejected because <reason>.
124
- - **Variant Y — <name>.** Rejected because <reason>.
127
+ ```markdown
128
+ # ADR NNNN — <Decision Title>
125
129
 
126
- ## References
130
+ > Area: `<area>` · Status: accepted · Date: YYYY-MM-DD · Type: retrospective | new
131
+ > Roadmap: `agents/roadmaps/<file>.md` <phase-id>
132
+ > Supersedes: —
127
133
 
128
- - Linked roadmap, contract, prior ADR, council session id.
134
+ ## Context / Decision / Considered alternatives / Consequences / References
129
135
  ```
130
136
 
131
- ### 5. Regenerate the index
132
-
133
- Run the dispatcher:
137
+ Per-area ADRs use quote-style header (no YAML frontmatter) so
138
+ `audit_adr_coverage.py`'s permissive parser can index them. Cite
139
+ the area's contract from the README in
140
+ [`docs/adrs/<area>/README.md`](../../../docs/adrs/).
134
141
 
135
- ```bash
136
- python3 scripts/runtime_dispatcher.py run --skill adr-create
137
- # or directly:
138
- python3 scripts/adr/regenerate_index.py --dir docs/adr/
139
- ```
142
+ ### 5. Regenerate the index
140
143
 
141
- The script scans `ADR-*.md`, reads frontmatter (`adr`, `status`,
142
- `date`, `decision`, `supersedes`), and writes `INDEX.md` with one
143
- table row per ADR plus broken-supersede warnings on stderr.
144
+ - **Flat surface** `python3 scripts/adr/regenerate_index.py
145
+ --dir docs/decisions/` writes `INDEX.md` from `ADR-*.md`.
146
+ - **Per-area surface** `python3 scripts/audit_adr_coverage.py
147
+ --regen-area-readme <area>` rewrites `docs/adrs/<area>/README.md`.
148
+ Coverage gate: run `python3 scripts/audit_adr_coverage.py` (no
149
+ args) — exit 0 only when every canonical area has ≥ 1 ADR.
144
150
 
145
151
  ### 6. Validate
146
152
 
147
- - `python3 scripts/adr/regenerate_index.py --check` exits 0
148
- (index is up to date, no number gaps, no broken supersedes).
149
- - The project's CI / quality pipeline passes locally.
153
+ - Flat: `python3 scripts/adr/regenerate_index.py --check` exits 0.
154
+ - Per-area: `python3 scripts/audit_adr_coverage.py --check` exits 0.
155
+ - Project's CI / quality pipeline passes locally.
150
156
 
151
157
  ## Output format
152
158
 
153
- 1. Path of the new `ADR-NNN-<slug>.md` file.
154
- 2. Path of the regenerated `INDEX.md`.
159
+ 1. Path of the new ADR file.
160
+ 2. Path of the regenerated index / README.
155
161
  3. One-line summary of the decision.
156
162
  4. Linked roadmap or phase, if any.
157
163
 
158
164
  ## Gotchas
159
165
 
160
- - `docs/adr/` is the default path; some projects use
161
- `docs/decisions/` (this package included). Pass `--dir` to the
162
- index regenerator when running outside the default.
163
- - Frontmatter `adr:` is the canonical number; the filename prefix
164
- must match. The index regenerator fails on mismatch.
165
- - ADRs are append-only history. To revise a decision, write a new
166
- ADR with `supersedes: ADR-MMM` and flip the old one's status to
167
- `superseded`.
166
+ - **Flat default path** is `docs/decisions/` in this package; some
167
+ projects use `docs/adr/`. Pass `--dir` when running outside default.
168
+ - **Per-area numbering is 4-digit** (`NNNN-<slug>.md`); flat surface
169
+ stays 3-digit (`ADR-NNN-<slug>.md`). Do not mix.
170
+ - **Area inventory closed** `<area>` must already exist in `AREAS`
171
+ in `scripts/audit_adr_coverage.py`. Adding new area is separate
172
+ PR with explicit reviewer sign-off.
173
+ - Frontmatter `adr:` (flat) is canonical number; filename prefix
174
+ must match. Flat regenerator fails on mismatch.
175
+ - ADRs are append-only history. To revise, write new ADR with
176
+ `supersedes: ADR-MMM` (flat) or `Supersedes:` line in header
177
+ quote-block (per-area) and flip old one's status to `superseded`.
168
178
  - Never delete an ADR file — supersede it. Deletion breaks
169
179
  historical links and round-trips through git history checks.
170
180