@event4u/agent-config 7.1.0 → 7.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.claude-plugin/marketplace.json +2 -1
  2. package/CHANGELOG.md +39 -0
  3. package/README.md +1 -1
  4. package/dist/agent-src/rules/brand-source-of-truth.md +10 -0
  5. package/dist/agent-src/rules/delegation-policy.md +1 -0
  6. package/dist/agent-src/rules/legal-safety-floor.md +42 -4
  7. package/dist/agent-src/rules/output-discipline.md +85 -0
  8. package/dist/agent-src/rules/telegraph-speak.md +4 -1
  9. package/dist/agent-src/rules/token-budget-discipline.md +94 -0
  10. package/dist/agent-src/skills/accessibility-auditor/SKILL.md +20 -5
  11. package/dist/agent-src/skills/blade-ui/SKILL.md +9 -0
  12. package/dist/agent-src/skills/contract-review/SKILL.md +3 -2
  13. package/dist/agent-src/skills/dashboard-design/SKILL.md +21 -5
  14. package/dist/agent-src/skills/design-intelligence/SKILL.md +96 -0
  15. package/dist/agent-src/skills/design-review/SKILL.md +83 -0
  16. package/dist/agent-src/skills/design-system-capture/SKILL.md +234 -0
  17. package/dist/agent-src/skills/design-tokens/SKILL.md +1 -0
  18. package/dist/agent-src/skills/dpa-review/SKILL.md +3 -2
  19. package/dist/agent-src/skills/existing-ui-audit/SKILL.md +15 -4
  20. package/dist/agent-src/skills/fe-design/SKILL.md +98 -16
  21. package/dist/agent-src/skills/flux/SKILL.md +8 -0
  22. package/dist/agent-src/skills/iconography/SKILL.md +1 -0
  23. package/dist/agent-src/skills/legal-intake-triage/SKILL.md +3 -2
  24. package/dist/agent-src/skills/legal-practice-profile/SKILL.md +3 -2
  25. package/dist/agent-src/skills/livewire/SKILL.md +8 -0
  26. package/dist/agent-src/skills/nda-triage/SKILL.md +3 -2
  27. package/dist/agent-src/skills/react-shadcn-ui/SKILL.md +21 -9
  28. package/dist/agent-src/skills/skill-writing/SKILL.md +18 -0
  29. package/dist/agent-src/skills/subagent-orchestration/SKILL.md +7 -10
  30. package/dist/agent-src/skills/tailwind-engineer/SKILL.md +17 -7
  31. package/dist/agent-src/skills/typography-system/SKILL.md +14 -0
  32. package/dist/agent-src/skills/ui-component-architect/SKILL.md +9 -0
  33. package/dist/discovery/deprecation-report.md +1 -1
  34. package/dist/discovery/discovery-manifest.json +123 -59
  35. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  36. package/dist/discovery/discovery-manifest.summary.md +8 -8
  37. package/dist/discovery/orphan-report.md +1 -1
  38. package/dist/discovery/packs.json +18 -15
  39. package/dist/discovery/trust-report.md +5 -5
  40. package/dist/discovery/workspaces.json +15 -12
  41. package/dist/mcp/registry-manifest.json +2 -2
  42. package/dist/router.json +1 -1
  43. package/dist/server/routes/wizard.js +4 -3
  44. package/dist/server/routes/wizard.js.map +1 -1
  45. package/dist/server/schemas/settings.js +9 -0
  46. package/dist/server/schemas/settings.js.map +1 -1
  47. package/dist/ui/assets/{index-CoQo90sz.js → index-UjcTG_9O.js} +2 -2
  48. package/dist/ui/assets/index-UjcTG_9O.js.map +1 -0
  49. package/dist/ui/index.html +1 -1
  50. package/docs/RELEASE_STORY_TEMPLATE.md +37 -0
  51. package/docs/architecture.md +3 -3
  52. package/docs/contracts/capability-boundary.md +64 -0
  53. package/docs/contracts/discovery-manifest.schema.json +2 -2
  54. package/docs/contracts/package-self-orientation.md +3 -0
  55. package/docs/contracts/subagent-boundary.md +54 -0
  56. package/docs/decisions/ADR-013-discovery-frontmatter-contract.md +13 -0
  57. package/docs/decisions/ADR-107-legal-domain-pack-adoption.md +19 -0
  58. package/docs/getting-started.md +1 -1
  59. package/docs/guidelines/agent-infra/domain-pack-architecture.md +1 -0
  60. package/docs/guidelines/design-antipatterns-triggers.json +17 -0
  61. package/docs/guidelines/design-antipatterns.md +170 -0
  62. package/docs/guidelines/design-modes.md +97 -0
  63. package/package.json +1 -1
  64. package/src/config/agent-settings.template.yml +31 -0
  65. package/src/config/discovery/packs.yml +16 -5
  66. package/src/config/discovery/workspaces.yml +4 -4
  67. package/src/scripts/check_trunk_drift.ts +67 -0
  68. package/src/scripts/lint_design_quality.ts +321 -0
  69. package/src/scripts/lint_discovery_vocabulary.ts +4 -4
  70. package/src/scripts/lint_legal_pack.ts +62 -4
  71. package/src/scripts/lint_output_slop.ts +223 -0
  72. package/src/scripts/lint_pack_risk_class.ts +79 -0
  73. package/src/scripts/schemas/agent-settings.schema.json +12 -0
  74. package/src/scripts/schemas/skill.schema.json +5 -0
  75. package/dist/ui/assets/index-CoQo90sz.js.map +0 -1
@@ -5,7 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1" />
6
6
  <meta name="robots" content="noindex" />
7
7
  <title>agent-config</title>
8
- <script type="module" crossorigin src="/assets/index-CoQo90sz.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-UjcTG_9O.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-BbWWuFrF.css">
10
10
  </head>
11
11
  <body>
@@ -0,0 +1,37 @@
1
+ # Release Story — `<version>`
2
+
3
+ A curated, human-readable "what changed and **why it matters**" — distinct from
4
+ the raw `CHANGELOG`. The changelog lists commits; the release story tells a
5
+ maintainer or consumer, in plain language, what they get and what to watch.
6
+
7
+ Copy this template per release; keep it short (a screen or less).
8
+
9
+ ## Headline
10
+
11
+ One sentence: the single most important thing this release delivers.
12
+
13
+ ## What changed (and why it matters)
14
+
15
+ - **<change>** — what it is · why a consumer cares · what they should do (if anything).
16
+ - **<change>** — …
17
+
18
+ ## Safety / behaviour changes
19
+
20
+ Anything that changes agent behaviour, gates, or defaults — call it out explicitly
21
+ (new floors, new consent gates, renamed packs, changed risk postures). Consumers
22
+ read this section first.
23
+
24
+ ## Upgrade notes
25
+
26
+ - Breaking? Migration steps. Non-breaking? Say so.
27
+ - New opt-in surfaces (packs, settings) — how to enable.
28
+
29
+ ## Deferred / known limitations
30
+
31
+ What was intentionally left for a future release, and the pointer (roadmap /
32
+ ADR). Honesty here prevents "is this missing or coming?" questions.
33
+
34
+ ---
35
+
36
+ > Fill every section. An empty section is a signal the release is not understood
37
+ > well enough to ship its story. (road-to-product-clarity Phase 4a.)
@@ -146,10 +146,10 @@ note, package-internal path-swap, description budget, and the
146
146
 
147
147
  | Layer | Count | Purpose |
148
148
  |---|---|---|
149
- | **Skills** | 257 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
150
- | **Rules** | 91 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
149
+ | **Skills** | 258 | On-demand expertise — stack analysis (Laravel · Symfony · Zend / Laminas · Next.js · React · Node), testing, Docker, API design, security, observability, … |
150
+ | **Rules** | 93 | Always-active constraints — coding standards, scope control, verification, language-and-tone, agent-authority |
151
151
  | **Commands** | 162 | Slash-command workflows — `/commit`, `/create-pr`, `/fix ci`, `/optimize skills`, `/feature plan`, `/work`, `/implement-ticket`, `/condense`, … |
152
- | **Guidelines** | 84 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
152
+ | **Guidelines** | 86 | Reference material cited by skills — PHP patterns, Eloquent, Playwright, agent-infra, … |
153
153
  | **Templates** | 7 | Scaffolds for features, roadmaps, contexts, skills, overrides |
154
154
  | **Contexts** | 5 | Shared knowledge about the system itself |
155
155
 
@@ -0,0 +1,64 @@
1
+ # Capability Boundary Matrix
2
+
3
+ The per-pack safety posture at a glance: is a pack on by default, does it need
4
+ consent, a council pass, a disclaimer, an eval — and how risky is it. The matrix
5
+ makes the invisible visible; the **enforcement** lives in the per-pack safety
6
+ floors + gates (this doc is the map, not the engine).
7
+
8
+ > Source of truth: `src/config/discovery/packs.yml` (`surface_tier`,
9
+ > `trust_level_default`, `domain`, and the legal-review-prep gate fields) + the
10
+ > domain safety-floor rules. Built in `road-to-capability-governance` Phase 1;
11
+ > `risk_class` becomes a real pack field in Phase 2.
12
+
13
+ ## Policy by risk class
14
+
15
+ | `risk_class` | default install | consent | council / deep-research | disclaimer | eval expectation | surface_tier |
16
+ |---|---|---|---|---|---|---|
17
+ | **low** | per profile | no | no | no | optional | `core` |
18
+ | **medium** (advisory) | per profile | no | no | **yes** (domain safety floor) | recommended | `core` |
19
+ | **high** | **no** (opt-in) | **yes** | **yes** (fail-closed) | **yes** | **yes** | `lab` |
20
+
21
+ - **low** — engineering, product, meta, and tooling packs. Normal capability; no domain liability surface.
22
+ - **medium (advisory)** — packs that emit advisory-shaped output (finance, strategy). They carry a **domain safety floor** that mandates a not-X-advice disclaimer + structural elements (assumptions / counter-case / confidence). Not off-by-default, but never a final call.
23
+ - **high** — regulated-advice-adjacent. Off by default, consent-gated, council-gated (fail-closed), disclaimer-bound, eval-backed, lab-tier, and promotion-gated behind a professional review.
24
+
25
+ ## Per-pack assignment (non-low)
26
+
27
+ | Pack | `risk_class` | Floor | Gates |
28
+ |---|---|---|---|
29
+ | `legal-review-prep` | **high** | `legal-safety-floor` | consent (`legal_review_prep.acknowledged`) · council (`require_council`, fail-closed) · hard individual-case STOP · attorney-review line + `Jurisdiction:` tag · attorney-framing-review promotion tripwire · `default_install: false` · `surface_tier: lab` |
30
+ | `finance-basic` | medium | `finance-safety-floor` | not-financial-advice disclaimer · assumptions + sensitivity + confidence + counter-case · no final invest/raise call |
31
+ | `finance-advanced` | medium | `finance-safety-floor` | as finance-basic (DCF / scenario depth) |
32
+ | `founder-strategy` | medium | `strategy-safety-floor` | not-a-strategic-decision footer · bet + counter-case + residual risk + decision owner |
33
+
34
+ Every other pack in `packs.yml` is **low** by default. A pack moves to medium the
35
+ moment it ships advisory-shaped output behind a domain safety floor, and to high
36
+ only through the high-risk checklist (consent + council + disclaimer + eval +
37
+ lab + promotion gate) — see `road-to-legal-review-prep` for the worked example.
38
+
39
+ ## Capability lifecycle (a view, not a new axis)
40
+
41
+ Reviewers wanted one lifecycle vocabulary for promoting / retiring capabilities.
42
+ This is a **derived view** over the metadata that already exists
43
+ (`trust_level_default` + `surface_tier` + eval presence) — **not** a new field.
44
+ Nothing to set; it is read off what is already there.
45
+
46
+ | Lifecycle | Derived from | Promotion criterion (to reach it) |
47
+ |---|---|---|
48
+ | **experimental** | `surface_tier: lab` **or** `trust_level_default: experimental` | default for any new pack/skill |
49
+ | **validated** | `surface_tier: core` **and** has an `evals/` (or regression harness) | a real eval exists + the pack left lab |
50
+ | **recommended** | validated **and** in a default profile / ≥1 real consumer | adoption evidence, not just existence |
51
+ | **deprecated** | a `deprecated`/`superseded_by` marker in frontmatter | a successor named (per the persona/skill deprecation discipline) |
52
+
53
+ Read the lifecycle column off the matrix above: a `lab` + `experimental` pack
54
+ (e.g. `legal-review-prep`, `ai-video`) is **experimental**; a `core` pack with an
55
+ eval is **validated**; a `core` pack a profile ships is **recommended**.
56
+ Promotion stays a human/maintainer decision (criteria-documented, never
57
+ automated — see `road-to-capability-governance` Phase 6).
58
+
59
+ ## See also
60
+
61
+ - [`legal-safety-floor`](../../src/rules/legal-safety-floor.md) — the high-risk exemplar.
62
+ - `finance-safety-floor` · `strategy-safety-floor` — the medium-risk advisory floors.
63
+ - [`domain-pack-architecture`](../guidelines/agent-infra/domain-pack-architecture.md) — the pack build sequence.
64
+ - `road-to-capability-governance` Phase 2 — `risk_class` as a validated pack field.
@@ -74,7 +74,7 @@
74
74
  },
75
75
  "workspace_id": {
76
76
  "type": "string",
77
- "enum": ["engineering", "product", "finance", "founder", "gtm", "ops", "small-business", "construction", "legal", "agent-config-maintainer"]
77
+ "enum": ["engineering", "product", "finance", "founder", "gtm", "ops", "small-business", "construction", "legal-review-prep", "agent-config-maintainer"]
78
78
  },
79
79
  "pack_id": {
80
80
  "type": "string",
@@ -84,7 +84,7 @@
84
84
  "finance-basic", "finance-advanced",
85
85
  "gtm-sales", "gtm-marketing",
86
86
  "ops-people", "founder-strategy", "small-business", "construction", "ai-video", "ai-image", "fun", "meta", "git", "frontend-design", "brand",
87
- "memory", "analytics", "product-reasoning", "analysis-workbench", "legal"
87
+ "memory", "analytics", "product-reasoning", "analysis-workbench", "legal-review-prep"
88
88
  ]
89
89
  },
90
90
  "lifecycle": {
@@ -156,5 +156,8 @@ layout + cloud-bundle pipeline:
156
156
  3. Commit in logical chunks with Conventional Commits.
157
157
  4. Open a PR against `main`.
158
158
 
159
+ Per-pack safety posture (default-install / consent / council / disclaimer /
160
+ risk_class): [`capability-boundary.md`](capability-boundary.md).
161
+
159
162
  User-facing story: [`README.md`](../../README.md). Architecture
160
163
  deep-dive: [`docs/architecture.md`](../architecture.md).
@@ -0,0 +1,54 @@
1
+ # Subagent Boundary Contract
2
+
3
+ What a subagent **owns** and what it must **never** own. As delegation spreads
4
+ (the `subagent-orchestration` modes, the `delegation-policy` auto-trigger,
5
+ workflow fan-out), the failure mode is scope drift: a subagent quietly
6
+ redefining the task, expanding scope, or bypassing a floor. This contract draws
7
+ the line.
8
+
9
+ ## The ownership line
10
+
11
+ A subagent **executes one scoped, named task and returns a conclusion.** That is
12
+ the whole of its authority.
13
+
14
+ ### A subagent OWNS
15
+
16
+ - **Its scoped task** — the single, well-specified slice it was dispatched with.
17
+ - **Its method** — how it searches, reads, reasons, or drafts within that slice.
18
+ - **Its return** — a conclusion + evidence, sized to what the orchestrator asked for (structured output when a schema was given).
19
+
20
+ > **Explainability is durable, not host-ephemeral.** The return must carry a brief
21
+ > *why + evidence* (which sources/steps led to the conclusion) **in the artefact /
22
+ > output itself**, not only in the host's session reasoning. A user opening the
23
+ > result later — possibly across sessions — must be able to trace the *why* without
24
+ > reassembling provider chat logs. This is the reasoning-in-notes discipline applied
25
+ > to delegation: conclusions + evidence travel with the output, raw chain-of-thought
26
+ > does not.
27
+
28
+ ### A subagent must NEVER own
29
+
30
+ - **Task meaning** — it does not redefine, broaden, or reinterpret the parent task. An ambiguous slice returns "ambiguous + why", it does not guess a bigger task.
31
+ - **Cross-task memory / state** — it does not write durable memory, mutate shared roadmaps, or persist decisions for other tasks; its output is its only channel.
32
+ - **Pack / surface decisions** — it does not decide what ships, what installs, or what a pack contains; those are orchestrator + human calls.
33
+ - **Safety-floor bypass** — every floor applies *inside* the subagent. The Hard Floor ([`non-destructive-by-default`](../../src/rules/non-destructive-by-default.md)), the domain safety floors, [`scope-control`](../../src/rules/scope-control.md), and [`commit-policy`](../../src/rules/commit-policy.md) are not lifted by being one level down. A subagent cannot do what its parent may not.
34
+ - **Silent scope expansion** — touching files / systems beyond its slice is a contract violation, surfaced, not absorbed.
35
+
36
+ ## Orchestrator obligations (the other side)
37
+
38
+ - **Verify, never adopt blind** — a subagent return is evidence, not truth; the orchestrator verifies per [`delegation-policy`](../../src/rules/delegation-policy.md)'s Iron Law before adopting it.
39
+ - **Tier-size the slice, not the agent** — dispatch at the slice's complexity, not the session's.
40
+ - **Own the safety decision** — a Hard-Floor or egress action surfaced by a subagent is decided by the orchestrator + human, never executed by the subagent.
41
+
42
+ ## Failure modes
43
+
44
+ - A research subagent that, finding the task underspecified, invents a broader task and "helpfully" does it.
45
+ - A subagent that writes to shared memory / a roadmap dashboard as a side effect.
46
+ - A subagent that commits, pushes, or deletes because "the task implied it".
47
+ - An orchestrator that pastes a subagent's claim into the answer without verifying it.
48
+
49
+ ## See also
50
+
51
+ - [`subagent-orchestration`](../../src/skills/subagent-orchestration/SKILL.md) — the dispatch modes this contract bounds.
52
+ - [`delegation-policy`](../../src/rules/delegation-policy.md) — the delegate-by-default trigger + verify-every-return Iron Law.
53
+ - [`capability-boundary`](capability-boundary.md) — the pack-level companion (this is the agent-level one).
54
+ - [`non-destructive-by-default`](../../src/rules/non-destructive-by-default.md) — the Hard Floor that applies inside subagents too.
@@ -314,6 +314,19 @@ road-to-legal-pack Phase 0.2). Council-resolved across three rounds 2026-06-24
314
314
  (road-to-legal-pack). Additive, no rename; non-overlap with cost-profile and
315
315
  `profile.id` reservations holds.
316
316
 
317
+ ### 2026-06-24 — Rename `legal` → `legal-review-prep` (workspace + pack)
318
+
319
+ Renamed the workspace id and pack id `legal` → `legal-review-prep` in both
320
+ closed vocabularies, the schema enums, and all artefacts (`src/domains/legal/`
321
+ → `src/domains/legal-review-prep/`, the five skill frontmatters, the
322
+ `legal-safety-floor` rule). Driven by a deep AI-council (3 rounds,
323
+ anthropic/claude-sonnet-4-5 + openai/gpt-4o, 2026-06-24) + ~8 external
324
+ 7.1.0 reviewers: the name `legal` reads as "legal advice" and undermines the
325
+ not-legal-advice positioning; `legal-review-prep` names the actual capability
326
+ (prepare for attorney review). The `domain: legal` classifier and the `legal`
327
+ user-type are a different axis and are unchanged. Rename, not additive;
328
+ non-overlap reservations still hold. See `road-to-legal-review-prep` Phase 0.
329
+
317
330
  ## Cross-references
318
331
 
319
332
  - [ADR-007 — Agent Discovery Scopes](ADR-007-agent-discovery-scopes.md):
@@ -21,6 +21,11 @@ type: prospective
21
21
 
22
22
  ## Decision
23
23
 
24
+ > **Amendment (2026-06-24, deep-council).** The pack id was renamed `legal` →
25
+ > `legal-review-prep` after this ADR, to stop the name itself reading as "legal
26
+ > advice" (deep AI-council + 7.1.0 reviewers; see `road-to-legal-review-prep`).
27
+ > Read every `legal` pack-id reference below as `legal-review-prep`.
28
+
24
29
  Open a single, narrow `legal` pack — **not** a multi-plugin / multi-agent parity clone.
25
30
 
26
31
  1. **Scope: EU/DE-only, hard refusal.** Every selectable jurisdiction is an implicit currency promise; for a single maintainer the smallest correct cut is EU/DE with "consult local counsel" for everything else. Encoded in the `legal-safety-floor` rule + the pack description; surfaced via a machine-checkable `Jurisdiction:` tag.
@@ -31,6 +36,20 @@ Open a single, narrow `legal` pack — **not** a multi-plugin / multi-agent pari
31
36
  6. **No personas** — procedure-not-personality; role focus lives in skill tags + the practice profile.
32
37
  7. **Conditional product-liability gate** — commercial (Pro-tier) ship would require licensed-attorney review of the pack itself. **Resolved N/A 2026-06-24:** the suite is open-source forever, no commercial tier (ADR-108) — the gate never fires; the non-removable disclaimer + per-output attorney-review line cover end-user reliance.
33
38
 
39
+ ## Amendment (2026-06-24, deep-council) — attorney-framing-review promotion tripwire
40
+
41
+ Promotion of `legal-review-prep` out of `surface_tier: lab` / `trust_level_default:
42
+ experimental`, flipping `default_install` to anything but `false`, or any
43
+ commercial / hosted surface, is **blocked** until a licensed German attorney has
44
+ reviewed the *framing* (the `legal-safety-floor` rule, `LEGAL_NOTICE.md`, and the
45
+ RDG individual-case wording — **not** skill correctness) and the review is recorded
46
+ in `LEGAL_NOTICE.md` as `Framing reviewed by <name>, Rechtsanwalt/Rechtsanwältin,
47
+ <date>`. The deep AI-council (2026-06-24) scoped this as a bounded (~€300–800,
48
+ 1–2h) one-time gate, **not** a blocker for the current lab release (lab is
49
+ explicitly unvetted; users opt in knowingly via the consent gate). Enforced by
50
+ `lint_legal_pack` (`promotion-gate` rule): a promoted tier without the recorded
51
+ marker fails CI.
52
+
34
53
  ## Rejections (recorded)
35
54
 
36
55
  matter-workspace (too heavy), scheduled watchers, community-skill installer hub, US-state employment tests, full litigation depth, bar-prep, Swiss cantonal depth, non-EU/DE jurisdictions, the cross-model-parity dependency for the eval (a false blocker, corrected in the full critique round).
@@ -129,7 +129,7 @@ Your agent is now:
129
129
  - **Respecting your codebase** — no conflicting patterns
130
130
  - **Following standards** — consistent code quality
131
131
 
132
- This is enforced automatically by 91 rules. No configuration needed.
132
+ This is enforced automatically by 93 rules. No configuration needed.
133
133
 
134
134
  ---
135
135
 
@@ -50,6 +50,7 @@ itself a useful result.
50
50
 
51
51
  ## See also
52
52
 
53
+ - [Capability Boundary Matrix](../../contracts/capability-boundary.md) — per-pack safety posture (default-install / consent / council / disclaimer / eval / risk_class).
53
54
  - [ADR-107 — Legal domain-pack adoption](../../decisions/ADR-107-legal-domain-pack-adoption.md)
54
55
  - `domain-adoption-policy` (rule) — the three gates before opening any domain.
55
56
  - `domain-eval-anti-pattern.md` — why the legal eval is a regression harness, not an objective gate.
@@ -0,0 +1,17 @@
1
+ {
2
+ "description": "Routing eval for design-antipatterns guideline: should an agent pull this catalog for a given task?",
3
+ "should_pull": [
4
+ "Design a landing page for a new SaaS product",
5
+ "Review this UI mockup for AI-slop patterns",
6
+ "Create a feature card section with icons and descriptions",
7
+ "Generate a hero section with a big metric and supporting stats",
8
+ "The design looks generic — how do I make it more distinctive?"
9
+ ],
10
+ "should_not_pull": [
11
+ "Fix the authentication bug in the login controller",
12
+ "Write a migration to add the user_id column to the orders table",
13
+ "Set up the CI pipeline for the monorepo",
14
+ "Draft a customer email reply for a billing issue",
15
+ "Analyze the test coverage for the payment module"
16
+ ]
17
+ }
@@ -0,0 +1,170 @@
1
+ # Design Anti-Patterns — AI-Slop Catalog
2
+
3
+ > Lazy-loaded reference guideline. Pull this before proposing, generating, or
4
+ > reviewing any UI. Used by `design-intelligence`, `fe-design`, `design-review`,
5
+ > `existing-ui-audit`.
6
+
7
+ This catalog enumerates patterns that make AI-generated UI **recognizably
8
+ AI-generated**. Every entry carries a concrete override condition — the goal is
9
+ not prohibition but deliberateness. A pattern on this list used *knowingly* for
10
+ a specific brief is a design decision; used *reflexively* from a default, it is
11
+ slop.
12
+
13
+ **How to use:** Before generating UI, scan the applicable category. Flag any
14
+ pattern you were about to reach for. Either (a) choose a different approach, or
15
+ (b) invoke the override condition and state the reason explicitly in the brief.
16
+
17
+ **Agent self-check principle:** These are guidance rules, not linter rules. The
18
+ agent reads the brief, checks its first impulse against this catalog, and adjusts
19
+ or overrides. The enforceable subset (contrast ratio, font-size, heading
20
+ hierarchy, reduced-motion, focus indicator) is in `lint_design_quality`
21
+ (Phase 5).
22
+
23
+ **Who owns what (boundary — avoid drift):**
24
+
25
+ | Layer | Owns | Artifact |
26
+ |---|---|---|
27
+ | **Guidance** | Subjective taste — Visual / Typography / Color / Layout / Copy patterns, override judgment, the originality self-test | this catalog |
28
+ | **Enforcement** | Objective floors — Q1–Q6 (WCAG contrast, font-size, line-length, reduced-motion, heading hierarchy, focus indicator) as exit-code-2 CI | `lint_design_quality` |
29
+ | **Audit method** | HOW to test WCAG (keyboard nav, ARIA, screen-reader procedures) | `accessibility-auditor` |
30
+ | **Stack manifestation** | Concrete Tailwind class / hex bans, shadcn defaults | `tailwind-engineer`, `react-shadcn-ui` (per `framework-neutrality-in-generic-skills`) |
31
+ | **Register** | Brand mode vs product mode — which patterns apply | `docs/guidelines/design-modes.md` |
32
+
33
+ This catalog is the canonical *index*; it states the pattern stack-agnostically.
34
+ The stack-specific bans live in the apply skills and link back here by entry ID.
35
+ The objective floors are cited from the linter, never re-eyeballed by an agent.
36
+
37
+ ---
38
+
39
+ ## Visual
40
+
41
+ | # | Pattern | Why it reads as AI-generated | Override condition |
42
+ |---|---|---|---|
43
+ | V1 | Side-stripe `border-left` or `border-right` > 1px as a colored accent | The single most recognizable AI-UI signature; every scaffold-default card uses it | Brand token explicitly defines a stripe; document the decision in the design brief |
44
+ | V2 | Glassmorphism as decoration (`backdrop-blur` + `bg-white/10`) with no functional depth hierarchy | Model defaults to it for "premium feel"; result looks like 2021 Material You clip-art | Element genuinely sits above a complex, blurred background layer; use sparingly and only for top-level floating surfaces |
45
+ | V3 | Ghost card: `border: 1px solid` + box-shadow ≥ 16px spread together | The combination creates visual noise — the ghost card signals no confident decision about depth | Choose either border OR shadow to indicate depth; never both on the same surface |
46
+ | V4 | Over-rounded small cards or badges: `border-radius` > 16px on elements < 200px wide | Excessive rounding on small surfaces looks toy-ish; standard cap is 12–16px | Pill shape (`border-radius: 9999px`) is intentional on single-line tags/chips only |
47
+ | V5 | Hand-drawn or illustrated SVG icons mixed with crisp icon-system icons | Visual register collision; instantly reads as "generated asset" | Intentional illustrative section (hero illustration, empty-state art); isolate from the icon system |
48
+ | V6 | Repeating diagonal stripes as a background texture | A cliché background default; reads as generated CSS art | Brand explicitly uses pattern backgrounds (e.g., a textile brand); document the stripe definition |
49
+ | V7 | Nested cards: a card inside a card inside a card | Depth hierarchy collapses; user cannot parse elevation intent | A truly three-level hierarchy (e.g., project → board → card); ensure each level has distinct visual weight |
50
+
51
+ ---
52
+
53
+ ## Typography
54
+
55
+ | # | Pattern | Why it reads as AI-generated | Override condition |
56
+ |---|---|---|---|
57
+ | T1 | Flat type hierarchy: body and headings use the same optical weight and nearly the same size | Type hierarchy is invisible; user cannot scan the page | Deliberately minimal aesthetic where all text is body-weight; must be an explicit brand decision |
58
+ | T2 | Oversized italic serif as the primary hero headline | The "AI startup landing page" template; seen on ~60% of AI-generated marketing pages | Brand adopts editorial-magazine aesthetic with a documented italic serif rationale |
59
+ | T3 | Icon tile (small rounded-square container) above heading | The universal AI feature-card template; reads as scaffold | Listed features genuinely benefit from visual-icon-then-title affordance AND the icons are custom, not library defaults |
60
+ | T4 | Eyebrow / ALL-CAPS label above every section heading | Overuse collapses the emphasis; maximum is 1 eyebrow per 3 sections (countable: grep tracking classes) | Used for genuine section-type differentiation with meaningful vocabulary (not just "FEATURES", "PRICING") |
61
+ | T5 | Repeated section kickers ("Our mission", "What we offer", "Why choose us") | Filler vocabulary; every AI-generated page has the same three section titles | Every kicker is substantive and uses brand-specific vocabulary, not generic marketing speak |
62
+ | T6 | Crushed letter-spacing on display text (`letter-spacing` < −0.04em) | Below −0.04em glyphs collide optically; reads as "designer-ish effect" with no grounding | Intentional tight display treatment with a documented minimum floor; verify at the actual render size |
63
+ | T7 | Overused fonts without a brand reason: Inter, Roboto, DM Sans, Geist, Space Grotesk, Instrument Serif | These are the default AI-coding-tool font picks; every generated UI uses one of them | Brand has explicitly adopted one of these AND there is a documented reason (e.g., Inter for its variable metrics in a data-dense dashboard) |
64
+ | T8 | Single typeface for everything | Missed typographic contrast opportunity; all-Inter reads as "I did not think about fonts" | Intentional mono-typeface aesthetic (e.g., terminal-inspired); must be stated in the brief |
65
+ | T9 | All-caps body paragraphs or field labels | Reduces legibility below WCAG AA for sustained reading; reads as flair over function | Short UI labels (e.g., button text in a brutalist layout); never for body paragraphs |
66
+ | T10 | Wide letter-spacing on body text (`letter-spacing` > 0.05em) | Reduces readability for sustained reading; reserved for display use | Display text (headlines, pull quotes) where intentional tracking is a brand element |
67
+
68
+ ---
69
+
70
+ ## Color
71
+
72
+ | # | Pattern | Why it reads as AI-generated | Override condition |
73
+ |---|---|---|---|
74
+ | C1 | Purple/violet + cyan-on-dark palette as the primary scheme | The most recognizable AI-UI color combination in 2024–2026; instantly signals "generated" | Brand color system genuinely defines a violet primary; must come from `brand-to-tokens`, not from model defaults |
75
+ | C2 | Gradient text via `background-clip: text` as a primary accent | Overused to the point of invisibility; also has rendering edge cases on some platforms | Headline treatment in a brand that explicitly uses gradient identity (e.g., a product whose logo is a gradient) |
76
+ | C3 | Glowing colored accents on dark mode (bright neon `box-shadow` or `text-shadow`) | Looks like a 2020 gaming UI; reads as an AI attempt at "moody" | Brand explicitly defines neon accents with a documented usage rule (e.g., error or alert states in a security product) |
77
+ | C4 | Gray text on colored background without WCAG AA check | Muted gray chosen for "elegance" often fails 4.5:1 contrast; the failure is invisible until audited | Any use — always verify the contrast ratio; if it fails, either darken the text or lighten/darken the background |
78
+ | C5 | Cream/sand body background (OKLCH L 0.84–0.97, C < 0.06) with brass/clay/oxblood accents | The 2025 "premium-consumer" AI palette; every generated "sophisticated" product uses this exact combination | Brand has an explicit warm-neutral design language documented in `brand-to-tokens`; the palette is first-party, not a default reach |
79
+
80
+ ---
81
+
82
+ ## Layout
83
+
84
+ | # | Pattern | Why it reads as AI-generated | Override condition |
85
+ |---|---|---|---|
86
+ | L1 | Hero metric template: giant number, small label, 3–4 stats in a row, gradient | The default SaaS dashboard hero; appears on ~70% of AI-generated dashboard screens | Data storytelling genuinely requires a primary metric with supporting context; must vary the arrangement |
87
+ | L2 | Three identical feature cards in a grid with the same visual weight | The scaffold-default; no visual rhythm, no hierarchy among features | Product genuinely has three equally weighted features; must still vary padding, or use a different composition |
88
+ | L3 | Monotonous spacing: one spacing value (usually 24px) used for everything | Spacing is rhythm; uniform spacing collapses the hierarchy of proximity | Intentional grid where every element has equal weight; must document the grid definition |
89
+ | L4 | Numbered section markers (01 / 02 / 03) as a primary section-order device | Universal AI-generated marketing page tell; seen on virtually every generated landing page | A genuinely numbered process or sequenced guide where the step number carries meaning beyond decoration |
90
+ | L5 | Line length > 80ch in body copy without column constraint | Reduces readability; WCAG recommends 45–75 characters; beyond 80 the eye struggles to track | Data-dense dashboards where column width is driven by tabular data, not narrative text |
91
+ | L6 | `position: absolute` dropdown inside `overflow: hidden` container | Dropdown clips; a common AI-generated layout bug | Refactor: use `<dialog>`, the Popover API, or `position: fixed` / portal to escape the stacking context |
92
+ | L7 | Content that overflows its container | Text truncation or reflow failures at non-default viewport widths; reads as untested | Never acceptable in production output; test at 320px, 768px, 1280px minimally |
93
+ | L8 | Z-index values of 99, 999, 9999 without a semantic z-index scale | Magic numbers; the first time two elements compete, the scale breaks | Establish a named semantic z-index scale (`--z-modal: 400`, `--z-toast: 500`, etc.) and use it |
94
+
95
+ ---
96
+
97
+ ## Motion
98
+
99
+ | # | Pattern | Why it reads as AI-generated | Override condition |
100
+ |---|---|---|---|
101
+ | M1 | Bounce or elastic easing curves on UI elements | Bounce draws attention to the animation itself; UI motion should serve the action, not perform | Intentional playful affordance (game UI, onboarding celebration state); must be brief and non-repeating |
102
+ | M2 | Animating layout properties (width, height, top, left, padding) | Triggers browser layout recalculation; janky on mid-range devices; always solvable with `transform` | Never — use `transform: scaleX()` for width-like effects, `transform: translateY()` for position |
103
+ | M3 | Animating `<img>` element on hover (scale, filter, transform) | Triggers composite + image decode; often causes content shift | Animate the card's background, border, or shadow instead; leave the image static |
104
+ | M4 | `transition: all` shorthand | Animates every property including layout, color, opacity simultaneously; unpredictable and expensive | Enumerate only the properties that should animate: `transition: transform 200ms ease-out, opacity 200ms` |
105
+ | M5 | Missing `@media (prefers-reduced-motion: reduce)` alternative for any animation | Accessibility violation; vestibular disorders make animated UI unusable | Never acceptable; always add a `prefers-reduced-motion` variant — gentler animation (reduced distance/opacity) is preferred over `display: none` |
106
+
107
+ ---
108
+
109
+ ## Copy
110
+
111
+ | # | Pattern | Why it reads as AI-generated | Override condition |
112
+ |---|---|---|---|
113
+ | CP1 | Em-dash (`—`) overuse | The #1 syntactic LLM signature; appears in AI copy at 3–5× the frequency of human editorial copy; maximum 2 per 500 words | Specific editorial voice that uses em-dashes deliberately; count them before shipping |
114
+ | CP2 | Marketing buzzwords: streamline, empower, supercharge, world-class, enterprise-grade, seamlessly, robust, leverage | These words carry no information; an AI-slop test: replace each with nothing — the sentence still communicates the same thing | No override; if a word can be deleted without loss, delete it |
115
+ | CP3 | Aphoristic manufactured contrast ("We don't do X. We do Y." / "Not just A, but B.") | A generated sentence rhythm that sounds like brand writing but carries no specificity | Aphoristic copy is legitimate when the contrast reveals a genuine product distinction; test by asking whether the Y side says something concrete |
116
+ | CP4 | "Theater" framing — copy that announces what the product does without saying how or why | "The platform for modern teams." communicates nothing; it is content-shaped noise | Every tagline must pass the "so what" test: can a skeptic follow it with "but how?" and get a concrete answer? |
117
+
118
+ ---
119
+
120
+ ## Quality floors — measurable thresholds
121
+
122
+ These are not stylistic — they are objective quality failures detectable without
123
+ aesthetic judgment. The `lint_design_quality` CI linter enforces a subset of
124
+ these. The rest are agent self-checks.
125
+
126
+ | # | Threshold | Measurement | CI-enforced? |
127
+ |---|---|---|---|
128
+ | Q1 | Text contrast ≥ 4.5:1 normal / ≥ 3:1 large text (WCAG AA) | `contrastRatio(text, bg) < threshold` | Yes (`lint_design_quality`) |
129
+ | Q2 | Body `font-size` ≥ 14px (floor); ≥ 16px strongly preferred | Computed `font-size` on `p`, `li`, `td` | Yes |
130
+ | Q3 | Line length ≤ 75 characters (prose) | Character count before soft wrap | Yes |
131
+ | Q4 | All `@keyframes` / `animation` have a `prefers-reduced-motion` alternative | CSS `@media` check | Yes |
132
+ | Q5 | Heading levels not skipped (h1→h3 direct, not h1→h4) | DOM heading sequence | Yes |
133
+ | Q6 | All interactive elements have a `:focus-visible` indicator | CSS rule check | Yes |
134
+ | Q7 | Display `letter-spacing` floor: ≥ −0.04em (tighter reads cramped) | Computed tracking | Agent self-check |
135
+ | Q8 | `line-height` ≥ 1.3 on body text | Computed `line-height` | Agent self-check |
136
+ | Q9 | Small-card `border-radius` cap: 12–16px (not 24px+) | Computed `border-radius` on elements < 200px | Agent self-check |
137
+ | Q10 | Body background: avoid OKLCH L 0.84–0.97, C < 0.06 (cream/sand) unless brand-defined | Color space calculation | Agent self-check |
138
+ | Q11 | Padding floors: ≥ 8px (inline elements), ≥ 16px (card/panel bodies) | Computed padding | Agent self-check |
139
+ | Q12 | Justified text only with CSS hyphenation (`hyphens: auto`) | Presence of `text-align: justify` without `hyphens` | Agent self-check |
140
+
141
+ ---
142
+
143
+ ## The AI-slop originality self-test
144
+
145
+ Before finalizing any UI design, run this two-tier check:
146
+
147
+ 1. **Category test:** Could someone guess the aesthetic from the product
148
+ category alone? (e.g., "SaaS → dark mode + purple gradient" /
149
+ "fintech → navy + gold" / "health → teal + rounded sans"). If yes,
150
+ rework the concept.
151
+
152
+ 2. **Anti-reference test:** Could someone still guess it after knowing the
153
+ category AND having seen 3 references you explicitly avoided? If yes,
154
+ dig deeper. A direction that is merely "not the worst cliché" is still
155
+ a cliché.
156
+
157
+ The bar: a visitor should ask "how was this made?", not "which AI made this?"
158
+
159
+ ---
160
+
161
+ ## See also
162
+
163
+ - `design-intelligence` — corpus-grounded style/color/typography selection
164
+ - `fe-design` — stack-agnostic heuristics (form, table, responsive, a11y)
165
+ - `design-review` — structured UI/UX review methodology
166
+ - `existing-ui-audit` — mandatory pre-step: inventory before designing
167
+ - `motion-choreographer` — animation heuristics (should-it, which-easing, how-much)
168
+ - `typography-system` — modular-scale construction and pairing
169
+ - `accessibility-auditor` — WCAG audit method
170
+ - `brand-to-tokens` — first-party brand token extraction (the legitimate override source for most anti-patterns above)
@@ -0,0 +1,97 @@
1
+ # Design Modes — Brand vs Product
2
+
3
+ > Reference doc. Pull this when deciding which design skills to prioritize
4
+ > or when the brief is ambiguous about the design register.
5
+
6
+ ## The two registers
7
+
8
+ Every design task operates in one of two registers. Getting the register
9
+ wrong is the root cause of most AI-generated design failures:
10
+
11
+ | | Brand mode | Product mode |
12
+ |---|---|---|
13
+ | **Core thesis** | The impression IS the product | Design serves the task |
14
+ | **Primary failure** | Flatness / genericness — looks like every other AI startup | Strangeness without purpose — "clever" choices that obscure the tool |
15
+ | **The user's question** | "How was this made?" (genuine curiosity) | "Where do I click?" (the tool disappears into the task) |
16
+ | **Key skill cluster** | `brand-identity`, `iconography`, `fe-design § Aesthetic direction`, `design-intelligence` | `accessibility-auditor`, `ui-component-architect`, `fe-design § Table/Form Design` |
17
+ | **Typography strategy** | Distinctive pairing — two contrasting families, deliberate tracking | One reliable family — Inter or equivalent; predictable hierarchy |
18
+ | **Color strategy** | Brand identity — often unexpected; the palette IS the differentiator | Semantic function — primary/danger/success/neutral; predictable meaning |
19
+ | **Motion strategy** | Expressive — motion reinforces the brand's personality | Utilitarian — motion confirms state changes; nothing decorative |
20
+ | **Spacing strategy** | Breathing room; generous whitespace as a brand signal | Dense/efficient; optimize for information density |
21
+ | **Success criterion** | Originality test: a skeptic can't guess "which AI made this?" | Earned familiarity: the tool disappears; users focus on their task |
22
+
23
+ ## How to determine the register
24
+
25
+ Ask: **What is the output of this UI being used for?**
26
+
27
+ - A consumer-facing surface where the FIRST impression determines whether the
28
+ user trusts/buys → **Brand mode**. The product has 3 seconds; every pixel
29
+ contributes to the brand's identity.
30
+
31
+ - An internal tool, dashboard, admin panel, or workflow-critical surface where
32
+ users return dozens of times per day → **Product mode**. Strangeness wastes
33
+ their time; predictability builds trust.
34
+
35
+ - A marketing landing page → **Brand mode**. It has one job: create desire.
36
+
37
+ - A data entry form → **Product mode**. It has one job: accept correct data.
38
+
39
+ **Ambiguous cases:** many products have both (a brand-heavy landing page +
40
+ a product-mode dashboard). The register applies per-surface, not per-product.
41
+ When unclear: ask — *"Is the user here to be impressed, or to accomplish a
42
+ task?"*
43
+
44
+ ## Brand-mode failure modes
45
+
46
+ - **Genericness:** Choosing the safe AI-slop palette (cream + brass, purple/violet gradient, three equal cards). The product is invisible in its category. Cross-check with `docs/guidelines/design-antipatterns.md` § Color and Visual.
47
+ - **Inconsistency:** Brand direction picked for the hero, abandoned for the body. The page reads as two different products.
48
+ - **Aesthetics-without-function:** Beautiful but confusing navigation, stunning hero with no CTA clarity.
49
+
50
+ ## Product-mode failure modes
51
+
52
+ - **Strangeness-without-purpose:** A clever typographic choice that makes the CTA harder to scan. A gradient background on a data table. An animated page transition in an admin panel.
53
+ - **Premature originality:** Reinventing a standard UI pattern (data table, form validation, dropdown) when the standard is what users expect.
54
+ - **Over-engineering:** Five different card elevations in a dashboard that needs two.
55
+
56
+ ## The AI-slop originality self-test (applies to brand mode primarily)
57
+
58
+ Run BOTH tiers before approving a brand-mode design direction:
59
+
60
+ **Tier 1 — Category test:**
61
+ Would a designer seeing 20 AI-generated [product category] UIs recognize this
62
+ aesthetic as part of that category's default? (e.g., "SaaS → dark mode + purple
63
+ gradient"; "health app → teal + rounded sans serif + white space").
64
+ - If YES: rework the concept. The design is invisible in its category.
65
+ - If NO: proceed to Tier 2.
66
+
67
+ **Tier 2 — Anti-reference test:**
68
+ Given the category AND three explicit aesthetics you've avoided — could a
69
+ skeptic still guess the direction? (e.g., "fintech that's not navy-and-gold,
70
+ not minimal white, not brutalist → everyone picks terminal dark").
71
+ - If YES: dig deeper. "Avoiding the worst cliché" is not differentiation.
72
+ - If NO: the direction is genuinely distinctive.
73
+
74
+ **The bar:** a visitor should ask "how was this made?" not "which AI made this?"
75
+
76
+ ## Routing to skills by mode
77
+
78
+ **Brand mode brief:**
79
+ 1. `design-intelligence` (grounded style/palette/typography selection — run the corpus first)
80
+ 2. `brand-identity` (archetype → token system)
81
+ 3. `iconography` (icon system selection for brand expression)
82
+ 4. `fe-design § Aesthetic direction` (direction → composition → typography → color)
83
+
84
+ **Product mode brief:**
85
+ 1. `existing-ui-audit` (mandatory — inventory first)
86
+ 2. `accessibility-auditor` (WCAG compliance from the start)
87
+ 3. `ui-component-architect` (reuse existing primitives)
88
+ 4. `fe-design § Component Architecture, Form Design, Table Design` (standard patterns)
89
+
90
+ **Both modes:** `design-antipatterns` (always pull), `design-review` (with anti-slop check)
91
+
92
+ ## See also
93
+
94
+ - `docs/guidelines/design-antipatterns.md` — the slop-tell catalog; brand mode especially needs this
95
+ - `brand-source-of-truth` — when a registered brand profile is present, it governs
96
+ - `brand-consistency` — validates emitted artifacts against the brand profile
97
+ - `design-system-capture` — DESIGN.md/PRODUCT.md capture the mode's decisions for cross-task consistency
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
- "version": "7.1.0",
3
+ "version": "7.2.0",
4
4
  "description": "Universal AI Agent OS — audited skills, governance rules, commands, and templates for AI coding tools (Claude Code, Cursor, Windsurf, Copilot).",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -84,6 +84,24 @@ rule_loading_tier: __RULE_LOADING_TIER__
84
84
  lean_projection:
85
85
  mode: eager-all
86
86
 
87
+ # --- Token-rich skills governance ---
88
+ #
89
+ # Skills marked `token_budget_class: rich` in their frontmatter are exempt
90
+ # from telegraph-speak condensation and thin-projector trimming. They load
91
+ # their full content (examples, tables, code blocks) to maximize design-output
92
+ # quality. This setting controls whether that extra spend is allowed globally.
93
+ #
94
+ # Values:
95
+ # on — rich skills load in full (default; recommended for design-intensive workflows)
96
+ # off — rich skills fall back to standard condensed behavior
97
+ # ask — before loading a rich skill, the agent surfaces an estimated token
98
+ # delta (≈ file size in chars / 4, reported in tokens not dollars) and
99
+ # asks the user once; the answer is cached for the session
100
+ #
101
+ # Configurable in the browser setup wizard (Setup → Skills → Token budget).
102
+ tokens:
103
+ rich_skills: on
104
+
87
105
  # --- Cost tracking + budget enforcement ---
88
106
  #
89
107
  # USD budgets evaluated against `agents/cost-tracking/sessions.jsonl` by
@@ -785,6 +803,19 @@ update_check:
785
803
  explain:
786
804
  enable_last: true
787
805
 
806
+ # ─── legal-review-prep consent gate ──────────────────────────────────────────
807
+ # The legal-review-prep pack is high-risk (EU/DE legal review-prep, NOT legal
808
+ # advice). It stays inactive until you acknowledge it is not legal advice — set
809
+ # by the setup wizard's consent checkbox, or here by hand. The legal-safety-floor
810
+ # rule refuses every legal-review-prep skill until `acknowledged: true`.
811
+ legal_review_prep:
812
+ acknowledged: false
813
+ consented_at: ""
814
+ # Gate legal work-product behind a multi-model council / deep-research pass
815
+ # (defense-in-depth + audit trail; fail-closed). Off lets single-model legal
816
+ # output through — not recommended for this high-risk pack.
817
+ require_council: true
818
+
788
819
  # ─── secrets ────────────────────────────────────────────────────────────────
789
820
  # Local-only secret material. This whole file is gitignored, so the key never
790
821
  # enters the tracked tree.