@event4u/agent-config 2.16.0 → 2.18.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 (96) hide show
  1. package/.agent-src/commands/ghostwriter/delete.md +118 -0
  2. package/.agent-src/commands/ghostwriter/fetch.md +185 -0
  3. package/.agent-src/commands/ghostwriter/list.md +102 -0
  4. package/.agent-src/commands/ghostwriter/show.md +113 -0
  5. package/.agent-src/commands/ghostwriter/write.md +160 -0
  6. package/.agent-src/commands/ghostwriter.md +96 -0
  7. package/.agent-src/commands/post-as/ghostwriter.md +66 -0
  8. package/.agent-src/commands/post-as/me.md +124 -0
  9. package/.agent-src/commands/post-as.md +58 -0
  10. package/.agent-src/ghostwriter/README.md +61 -0
  11. package/.agent-src/ghostwriter/fictional-fixture-v1.md +94 -0
  12. package/.agent-src/personas/README.md +8 -0
  13. package/.agent-src/rules/domain-safety-disclaimer-consulting.md +52 -0
  14. package/.agent-src/rules/domain-safety-disclaimer-financial.md +54 -0
  15. package/.agent-src/rules/domain-safety-disclaimer-legal.md +49 -0
  16. package/.agent-src/rules/domain-safety-disclaimer-medical.md +56 -0
  17. package/.agent-src/rules/domain-safety-export-redact.md +65 -0
  18. package/.agent-src/rules/domain-safety-logging-pii-floor.md +55 -0
  19. package/.agent-src/rules/domain-safety-pii-finance.md +57 -0
  20. package/.agent-src/rules/domain-safety-pii-marketing.md +60 -0
  21. package/.agent-src/rules/domain-safety-pii-recruiting.md +56 -0
  22. package/.agent-src/rules/domain-safety-pii-support.md +57 -0
  23. package/.agent-src/rules/domain-safety-retention-finance.md +48 -0
  24. package/.agent-src/rules/domain-safety-retention-support.md +55 -0
  25. package/.agent-src/skills/api-design/SKILL.md +3 -0
  26. package/.agent-src/skills/authz-review/SKILL.md +3 -0
  27. package/.agent-src/skills/competitive-moat-analysis/SKILL.md +3 -0
  28. package/.agent-src/skills/competitive-positioning/SKILL.md +3 -0
  29. package/.agent-src/skills/content-funnel-design/SKILL.md +3 -0
  30. package/.agent-src/skills/contracts-cognition/SKILL.md +3 -0
  31. package/.agent-src/skills/dashboard-design/SKILL.md +3 -0
  32. package/.agent-src/skills/data-handling-judgment/SKILL.md +3 -0
  33. package/.agent-src/skills/dcf-modeling/SKILL.md +3 -0
  34. package/.agent-src/skills/deal-qualification-meddic/SKILL.md +3 -0
  35. package/.agent-src/skills/discovery-interview/SKILL.md +3 -0
  36. package/.agent-src/skills/editorial-calendar/SKILL.md +3 -0
  37. package/.agent-src/skills/forecast-accuracy/SKILL.md +3 -0
  38. package/.agent-src/skills/forecasting/SKILL.md +3 -0
  39. package/.agent-src/skills/fundraising-narrative/SKILL.md +3 -0
  40. package/.agent-src/skills/gtm-launch/SKILL.md +3 -0
  41. package/.agent-src/skills/incident-commander/SKILL.md +3 -0
  42. package/.agent-src/skills/launch-readiness/SKILL.md +3 -0
  43. package/.agent-src/skills/messaging-architecture/SKILL.md +3 -0
  44. package/.agent-src/skills/okr-tree-modeling/SKILL.md +3 -0
  45. package/.agent-src/skills/pipeline-strategy/SKILL.md +3 -0
  46. package/.agent-src/skills/playwright-architect/SKILL.md +3 -0
  47. package/.agent-src/skills/privacy-review/SKILL.md +4 -1
  48. package/.agent-src/skills/quality-tools/SKILL.md +3 -0
  49. package/.agent-src/skills/release-comms/SKILL.md +3 -0
  50. package/.agent-src/skills/runway-cognition/SKILL.md +3 -0
  51. package/.agent-src/skills/scenario-modeling/SKILL.md +3 -0
  52. package/.agent-src/skills/secrets-management/SKILL.md +3 -0
  53. package/.agent-src/skills/tech-debt-tracker/SKILL.md +3 -0
  54. package/.agent-src/skills/unit-economics-modeling/SKILL.md +3 -0
  55. package/.agent-src/skills/voc-extract/SKILL.md +3 -0
  56. package/.agent-src/skills/voice-and-tone-design/SKILL.md +3 -0
  57. package/.agent-src/templates/agents/agent-project-settings.example.yml +16 -1
  58. package/.claude-plugin/marketplace.json +10 -1
  59. package/CHANGELOG.md +98 -0
  60. package/README.md +44 -23
  61. package/config/agent-settings.template.yml +7 -0
  62. package/config/gitignore-block.txt +8 -0
  63. package/docs/announcements/2026-05-non-dev-launch.md +79 -0
  64. package/docs/architecture.md +2 -2
  65. package/docs/case-studies/_template.md +60 -0
  66. package/docs/catalog.md +25 -4
  67. package/docs/contracts/adr-install-user-type-axis.md +107 -0
  68. package/docs/contracts/agent-user-schema.md +1 -0
  69. package/docs/contracts/command-clusters.md +2 -0
  70. package/docs/contracts/file-ownership-matrix.json +490 -0
  71. package/docs/contracts/ghostwriter-schema.md +337 -0
  72. package/docs/contracts/init-telemetry.md +132 -0
  73. package/docs/contracts/router-blending.md +71 -0
  74. package/docs/contracts/universal-skills.md +92 -0
  75. package/docs/contracts/write-engine.md +142 -0
  76. package/docs/getting-started-by-role.md +89 -0
  77. package/docs/getting-started-laravel.md +72 -0
  78. package/docs/getting-started.md +2 -2
  79. package/docs/safety.md +30 -0
  80. package/package.json +1 -1
  81. package/scripts/audit_user_type_axis.py +140 -0
  82. package/scripts/bench_runner.py +158 -0
  83. package/scripts/check_role_doc_links.py +110 -0
  84. package/scripts/compress.py +11 -0
  85. package/scripts/ghostwriter_fixture_allowlist.txt +16 -0
  86. package/scripts/install +9 -1
  87. package/scripts/install.py +214 -8
  88. package/scripts/install.sh +7 -0
  89. package/scripts/lint_ghostwriter_source.py +240 -0
  90. package/scripts/mcp_server/prompts.py +134 -2
  91. package/scripts/measure_skill_reduction.py +102 -0
  92. package/scripts/schemas/rule.schema.json +5 -0
  93. package/scripts/schemas/skill.schema.json +6 -0
  94. package/scripts/schemas/user-type-axis.schema.json +56 -0
  95. package/scripts/sync_agent_settings.py +6 -0
  96. package/scripts/update-github-metadata.sh +84 -0
@@ -0,0 +1,60 @@
1
+ # Case study — `<short-title>`
2
+
3
+ > **Step-12 Phase 7 L128–131 template.** Drop a copy into `docs/case-studies/` with filename `<YYYY-MM-DD>-<user-type>-<slug>.md`. Anonymise as needed; metrics must be real.
4
+
5
+ ## Subject
6
+
7
+ - **User-type:** (consultant | creator | founder | finance | ops | gtm | developer)
8
+ - **Tool host:** (claude-code | cursor | windsurf | copilot | claude.ai web | other)
9
+ - **`agent-config` install:** `npx agent-config init --user-type=<type>`
10
+ - **Anonymised:** yes / no (if yes — describe what was abstracted)
11
+
12
+ ## Workflow before
13
+
14
+ One paragraph. What was the specific job-to-be-done? How was it solved before `agent-config` (which tool, how many steps, where did it stall)? Include **time-to-output** as a baseline metric.
15
+
16
+ ## Workflow after
17
+
18
+ One paragraph. Same job, after install. Which **3–5 skills** carried the load? Which **commands** did the user actually invoke? Where did the agent ask vs. act?
19
+
20
+ ## Top-10 skill invocations (proof of non-dev workflow)
21
+
22
+ Paste output of `task bench --history --top 10` (or the equivalent host log). The closure gate (L130) requires this list to contain **zero** of: `test`, `deploy`, `ci`. If it does, the case study counts as proof of non-dev workflow rather than disguised dev work.
23
+
24
+ ```
25
+ 1. <skill-name> (N invocations)
26
+ 2. ...
27
+ ...
28
+ 10. ...
29
+ ```
30
+
31
+ ## Quantified outcomes
32
+
33
+ | Metric | Before | After | Δ |
34
+ |---|---:|---:|---:|
35
+ | Time-to-output (minutes) | | | |
36
+ | Number of revision passes | | | |
37
+ | Self-reported confidence (1–5) | | | |
38
+ | <domain-specific KPI> | | | |
39
+
40
+ Example: *"Brief drafting: 90 min → 25 min, 73 % time reduction."*
41
+
42
+ ## What broke
43
+
44
+ Be specific. The case study is only useful if it lists at least **two real friction points** — skill misfires, rule false-positives, missing user-type tags, confusing description language. These feed back into the corpus + skill descriptions.
45
+
46
+ 1. ...
47
+ 2. ...
48
+
49
+ ## Verbatim quote (optional, with consent)
50
+
51
+ > "...short quote that captures the value the user got, in their voice..."
52
+
53
+ — `<role>, <anonymised company shape>`
54
+
55
+ ## Provenance & consent
56
+
57
+ - **Interview / live walkthrough date:** YYYY-MM-DD
58
+ - **Consent for publication:** signed / verbal-recorded / declined-attribution
59
+ - **Author:** maintainer initials
60
+ - **Reviewed by user before merge:** yes / no
package/docs/catalog.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # agent-config — Public Catalog
2
2
 
3
- Consumer-facing catalog of all **461 public artefacts** shipped by
3
+ Consumer-facing catalog of all **482 public artefacts** shipped by
4
4
  this package. Internal package-maintenance rules and deprecation shims
5
5
  are excluded.
6
6
 
@@ -148,7 +148,7 @@ are excluded.
148
148
  | skill | [`playwright-testing`](../.agent-src/skills/playwright-testing/SKILL.md) | | Use when writing Playwright E2E tests — browser automation, visual regression testing, Page Objects, fixtures, and reliable test patterns. |
149
149
  | skill | [`po-discovery`](../.agent-src/skills/po-discovery/SKILL.md) | | Use when shaping a fuzzy product ask into a refined backlog item — problem framing, user-story rewrite, AC tightening — even if the user just says 'help me write this ticket'. |
150
150
  | skill | [`positioning-strategy`](../.agent-src/skills/positioning-strategy/SKILL.md) | | Use when locking the market frame — category, segment, alternative, point-of-view — before messaging, launch, or pricing rides on it. Triggers on 'who are we for', 'opposable audit'. |
151
- | skill | [`privacy-review`](../.agent-src/skills/privacy-review/SKILL.md) | | Use when reviewing data flows for GDPR / CCPA / HIPAA fit — regulatory-regime delta, consent shape, breach-impact triage. Triggers on 'is this GDPR-safe', 'do we need a DPA'. |
151
+ | skill | [`privacy-review`](../.agent-src/skills/privacy-review/SKILL.md) | | Use when reviewing data flows, support macros, refund templates for GDPR/CCPA/HIPAA fit — regime, consent, PII redaction (email, order-id), breach triage. Triggers 'is this GDPR-safe', 'PII redact'. |
152
152
  | skill | [`project-analysis-core`](../.agent-src/skills/project-analysis-core/SKILL.md) | | Raw discovery primitives — project discovery, version resolution, docs loading, architecture mapping, execution flow. Called by `universal-project-analysis`. Single-pass scan → `project-analyzer`. |
153
153
  | skill | [`project-analysis-hypothesis-driven`](../.agent-src/skills/project-analysis-hypothesis-driven/SKILL.md) | | Use when a bug has multiple plausible causes across layers — competing hypotheses, validation loops, evidence-based conclusions — even when the user just says 'why is this happening?'. |
154
154
  | skill | [`project-analysis-laravel`](../.agent-src/skills/project-analysis-laravel/SKILL.md) | | Use for deep Laravel project analysis: boot flow, request lifecycle, container usage, Eloquent/data flow, async systems, and Laravel-specific failure patterns. |
@@ -222,7 +222,7 @@ are excluded.
222
222
  | skill | [`voice-and-tone-design`](../.agent-src/skills/voice-and-tone-design/SKILL.md) | | Use when shaping brand voice — voice attributes, tone-by-context matrix, consistency review. Triggers on 'define our voice', 'why does our copy sound different on every surface'. |
223
223
  | skill | [`websocket`](../.agent-src/skills/websocket/SKILL.md) | | Use when building real-time features — WebSocket broadcasting, live updates, presence channels, connection state — even when the user just says 'push this to the client live'. |
224
224
 
225
- ## Rules (64)
225
+ ## Rules (76)
226
226
 
227
227
  | kind | name | type | description |
228
228
  |---|---|---|---|
@@ -246,6 +246,18 @@ are excluded.
246
246
  | rule | [`direct-answers`](../.agent-src/rules/direct-answers.md) | always | Always — direct, unembellished answers. No flattery, no invented facts (verify load-bearing claims, otherwise ask). Emojis only as functional markers. Brevity is the default. |
247
247
  | rule | [`docker-commands`](../.agent-src/rules/docker-commands.md) | auto | Running PHP commands inside Docker containers — artisan, composer, phpstan, rector, ecs, phpunit, tests, migrations, and any CLI tool execution |
248
248
  | rule | [`domain-adoption-policy`](../.agent-src/rules/domain-adoption-policy.md) | auto | Adopting a new domain track (mobile, ML, blockchain, IoT, gaming) — gates import on demand, ownership, CI fit, Sunset compatibility BEFORE harvest |
249
+ | rule | [`domain-safety-disclaimer-consulting`](../.agent-src/rules/domain-safety-disclaimer-consulting.md) | auto | Drafting strategic recommendations, executive memos, board decks, or consulting deliverables — cite assumptions; flag low-confidence claims |
250
+ | rule | [`domain-safety-disclaimer-financial`](../.agent-src/rules/domain-safety-disclaimer-financial.md) | auto | Drafting investment memos, valuation models, tax positions, or financial-advice-shaped content — require 'not financial advice' disclaimer |
251
+ | rule | [`domain-safety-disclaimer-legal`](../.agent-src/rules/domain-safety-disclaimer-legal.md) | auto | Drafting legal briefs, contract redlines, ToS, privacy policies, or any legal-shaped content — require 'not legal advice' disclaimer in output |
252
+ | rule | [`domain-safety-disclaimer-medical`](../.agent-src/rules/domain-safety-disclaimer-medical.md) | auto | Drafting health, wellness, medical, or therapeutic content — require 'not medical advice' disclaimer; refuse diagnostic or dosage outputs |
253
+ | rule | [`domain-safety-export-redact`](../.agent-src/rules/domain-safety-export-redact.md) | auto | Generating CSV / Excel / API exports, partner data-shares, or analyst handoffs — redact direct identifiers; flag re-identification on quasi-IDs |
254
+ | rule | [`domain-safety-logging-pii-floor`](../.agent-src/rules/domain-safety-logging-pii-floor.md) | auto | Writing logging code, structured logger config, or log lines — refuse to log raw PII; require redaction or a structured-field allowlist |
255
+ | rule | [`domain-safety-pii-finance`](../.agent-src/rules/domain-safety-pii-finance.md) | auto | Drafting invoices, financial reports, AR/AP statements, or finance memos — redact counterparty PII and account/bank identifiers before output |
256
+ | rule | [`domain-safety-pii-marketing`](../.agent-src/rules/domain-safety-pii-marketing.md) | auto | Drafting testimonials, case studies, social proof, or marketing emails referencing real customers — require consent; redact identifiers if absent |
257
+ | rule | [`domain-safety-pii-recruiting`](../.agent-src/rules/domain-safety-pii-recruiting.md) | auto | Drafting candidate notes, interview scorecards, rejection emails, or hiring memos — redact candidate PII before output |
258
+ | rule | [`domain-safety-pii-support`](../.agent-src/rules/domain-safety-pii-support.md) | auto | Generating support macros, ticket responses, or help-desk drafts — redact customer PII before output (names, emails, phones, account IDs, addresses) |
259
+ | rule | [`domain-safety-retention-finance`](../.agent-src/rules/domain-safety-retention-finance.md) | auto | Finance data retention guidance — flag jurisdiction dependence, default to longest applicable retention, never delete records under audit hold |
260
+ | rule | [`domain-safety-retention-support`](../.agent-src/rules/domain-safety-retention-support.md) | auto | Support / CRM data retention guidance — surface DSR-readiness, consent-window expiry, ticket-body retention vs. analytics aggregate retention |
249
261
  | rule | [`downstream-changes`](../.agent-src/rules/downstream-changes.md) | auto | After EVERY code edit, find ALL downstream changes needed to existing files, including callers, tests, imports, types, and documentation |
250
262
  | rule | [`e2e-testing`](../.agent-src/rules/e2e-testing.md) | auto | Playwright E2E tests — locators, assertions, Page Objects, fixtures, CI, and flaky test prevention |
251
263
  | rule | [`external-reference-deep-dive`](../.agent-src/rules/external-reference-deep-dive.md) | auto | User names an external repo, file, URL, or artifact as reference — fetch the actual tree and inspect, never summarize from README or metadata |
@@ -291,7 +303,7 @@ are excluded.
291
303
  | rule | [`user-interaction`](../.agent-src/rules/user-interaction.md) | auto | Asking the user a question, presenting options, or summarizing progress — numbered-options Iron Law, single-recommendation rule, progress indicators |
292
304
  | rule | [`verify-before-complete`](../.agent-src/rules/verify-before-complete.md) | always | Verify before completion — run tests and quality tools before claiming done |
293
305
 
294
- ## Commands (115)
306
+ ## Commands (124)
295
307
 
296
308
  | kind | name | cluster | description |
297
309
  |---|---|---|---|
@@ -351,6 +363,12 @@ are excluded.
351
363
  | command | [`fix:refs`](../.agent-src/commands/fix/refs.md) | cluster: fix | Find and fix broken cross-references in .augment/ and agents/ files |
352
364
  | command | [`fix:seeder`](../.agent-src/commands/fix/seeder.md) | cluster: fix | Scan seeder data files for broken foreign key references — find constants used without getReference() and fix them |
353
365
  | command | [`fix`](../.agent-src/commands/fix.md) | cluster: fix | Fix orchestrator — routes to ci, references, portability, seeder, pr-comments, pr-bot-comments, pr-developer-comments |
366
+ | command | [`ghostwriter:delete`](../.agent-src/commands/ghostwriter/delete.md) | cluster: ghostwriter | Hard-delete a ghostwriter profile at agents/ghostwriter/<slug>.md after a two-step confirmation. No backup, no soft delete — the file is gone after acceptance. |
367
+ | command | [`ghostwriter:fetch`](../.agent-src/commands/ghostwriter/fetch.md) | cluster: ghostwriter | Build or refresh a public-figure voice profile at agents/ghostwriter/<slug>.md from a URL or bare name; runs the public-figure attestation gate; delegates web-fetch / web-search to the host agent. |
368
+ | command | [`ghostwriter:list`](../.agent-src/commands/ghostwriter/list.md) | cluster: ghostwriter | List captured ghostwriter profiles under agents/ghostwriter/ as a numbered table with confidence, last-fetched, and stale-warning flags. Read-only. |
369
+ | command | [`ghostwriter:show`](../.agent-src/commands/ghostwriter/show.md) | cluster: ghostwriter | Render a single ghostwriter profile in full — identity, style fingerprint, voice samples, taboos, source URLs. Read-only. |
370
+ | command | [`ghostwriter:write`](../.agent-src/commands/ghostwriter/write.md) | cluster: ghostwriter | Draft a markdown post in the voice of a captured public-figure ghostwriter profile; appends the mandatory non-removable disclosure footer. |
371
+ | command | [`ghostwriter`](../.agent-src/commands/ghostwriter.md) | cluster: ghostwriter | Ghostwriter cluster — fetch, write, list, show, and delete public-figure voice profiles (the third voice primitive alongside personas/ and .agent-user.md). |
354
372
  | command | [`grill-me`](../.agent-src/commands/grill-me.md) | cluster: challenge-me | Alias for /challenge-me — interactive grill-style interview that sharpens a fuzzy plan/idea into a copyable Markdown pitch |
355
373
  | command | [`implement-ticket`](../.agent-src/commands/implement-ticket.md) | | Drive a ticket end-to-end through refine → memory → analyze → plan → implement → test → verify → report — Option-A loop over the `work_engine` Python engine, block-on-ambiguity, no auto-git. |
356
374
  | command | [`jira-ticket`](../.agent-src/commands/jira-ticket.md) | | Read Jira ticket from branch name, analyze linked Sentry issues, implement feature or fix bug |
@@ -382,6 +400,9 @@ are excluded.
382
400
  | command | [`override`](../.agent-src/commands/override.md) | cluster: override | Override orchestrator — routes to create, manage |
383
401
  | command | [`package-reset`](../.agent-src/commands/package-reset.md) | | /package-reset |
384
402
  | command | [`package-test`](../.agent-src/commands/package-test.md) | | /package-test |
403
+ | command | [`post-as:ghostwriter`](../.agent-src/commands/post-as/ghostwriter.md) | cluster: post-as | Thin alias for /ghostwriter:write — drafts a copyable markdown post in a captured public-figure voice with the mandatory non-removable disclosure footer. |
404
+ | command | [`post-as:me`](../.agent-src/commands/post-as/me.md) | cluster: post-as | Draft a copyable markdown post in the maintainer's own voice (style source = .agent-user.md.voice_sample). No disclosure footer — the user is the author. |
405
+ | command | [`post-as`](../.agent-src/commands/post-as.md) | cluster: post-as | Consumer-facing write entry points — :me drafts in the maintainer's own voice from .agent-user.md (no disclosure); :ghostwriter is a thin alias for /ghostwriter:write (mandatory disclosure footer). |
385
406
  | command | [`prepare-for-review`](../.agent-src/commands/prepare-for-review.md) | | Prepare a PR branch for local review — updates main and merges the full branch chain so the branch is up to date |
386
407
  | command | [`project-analyze`](../.agent-src/commands/project-analyze.md) | | Full project analysis — detect stack, inventory modules, audit docs, create missing contexts |
387
408
  | command | [`project-health`](../.agent-src/commands/project-health.md) | | Quick project health check — show status of docs, modules, contexts, and roadmaps without creating anything |
@@ -0,0 +1,107 @@
1
+ ---
2
+ stability: beta
3
+ keep-beta-until: 2026-08-13
4
+ ---
5
+
6
+ # ADR — Install-time user-type axis
7
+
8
+ > **Status:** Decided · 2026-05-15
9
+ > **Source:** AI Council session 2026-05-15-step12-closure-run2 (Reviewer-A, Reviewer-B, Reviewer-C) D1 verdict — ACCEPT with amendments: seed all 7 user-types, cap roadmap at ≤5 phases, cap deliverables per phase.
10
+ > **Sibling axis (distinct layer):** the runtime `personas/` ladder. The
11
+ > install-time `user_type` axis filters *which skills load*; personas filter
12
+ > *which voice reviews*. The two compose orthogonally.
13
+
14
+ ## Decision
15
+
16
+ Install-time skill filtering uses a dedicated axis seeded under
17
+ `user-types/` (package root, not `.agent-src.uncompressed/`). The
18
+ selection lands in the consumer's `.agent-settings.yml` under
19
+ `personal.user_type: <id>` via `agent-config install --user-type=<id>`.
20
+ Runtime skill discovery intersects each skill's
21
+ `recommended_for_user_types` frontmatter against
22
+ `personal.user_type`; unset → "show all skills" (legacy behavior).
23
+
24
+ The `user-types/` directory holds **seven** YAML configs — `consultant`,
25
+ `creator`, `developer`, `finance`, `founder`, `gtm`, `ops` — matching
26
+ every value already in active use across 32 skills' frontmatter. Adding
27
+ an eighth value requires a new YAML plus a frontmatter audit (Phase 4).
28
+ Schema: [`scripts/schemas/user-type-axis.schema.json`](../../scripts/schemas/user-type-axis.schema.json).
29
+
30
+ ## Why this is distinct from the review-lens axis
31
+
32
+ Same vocabulary, different layer:
33
+
34
+ | Axis | Layer | Owner roadmap | Where it bites |
35
+ |---|---|---|---|
36
+ | **Install filter** (this ADR) | onboarding / `.agent-settings.yml` | `step-9-user-types-axis.md` | Which skills surface first at discovery |
37
+ | **Review lens** | runtime / `refine-ticket` | `step-6-user-types-axis.md` | Whose viewpoint a review adopts |
38
+
39
+ The two never collide because they live in different files and
40
+ different config keys. Install filter narrows *which skills load by
41
+ default*; review lens narrows *whose voice a refine-ticket review
42
+ adopts*. Authors can use both, neither, or one — independently.
43
+
44
+ The naming overlap is preserved deliberately. Consumers think in terms
45
+ of "I am a consultant" once; both axes consume that fact in their own
46
+ layer. Renaming one would force consumers to learn a second vocabulary
47
+ for the same self-identification.
48
+
49
+ ## Why install-time and not runtime-only
50
+
51
+ Three options were considered:
52
+
53
+ 1. **Runtime-only filter** — read `personal.user_type` on every
54
+ session start, no install-time wiring. Rejected: needs the value
55
+ to exist before any skill loads; bootstrapping into an empty
56
+ `.agent-settings.yml` is fragile and undocumented.
57
+ 2. **Install-time flag, no runtime filter** — `--user-type` writes the
58
+ key, but skill discovery ignores it. Rejected: the value is dead
59
+ metadata without the discovery hook (Phase 3). Already the state of
60
+ the codebase before this roadmap; the whole point of step-9 is to
61
+ wire it.
62
+ 3. **Install-time flag + runtime filter** *(chosen)* — `--user-type`
63
+ writes the key; the discovery hook intersects frontmatter against
64
+ it. Legacy "no flag" path is preserved by treating an unset value
65
+ as "match all". Additive, opt-in, no breaking change.
66
+
67
+ ## Consequences
68
+
69
+ - `scripts/install.sh`, `scripts/install.py`, `scripts/install` each
70
+ accept `--user-type=<id>`. Validation against `user-types/*.yml`
71
+ stems happens in one place (`install.py`) and the bash entry-point
72
+ delegates. Invalid values fail fast with a non-zero exit.
73
+ - `config/agent-settings.template.yml` keeps a commented
74
+ `personal.user_type:` stub documenting the seven valid values.
75
+ - The existing `--interactive` flag (legacy `.agent-config.local.json`
76
+ stub) is preserved for backward compat; the new flag is the
77
+ first-class path going forward. A future ADR can deprecate the JSON
78
+ stub once consumers migrate.
79
+ - Frontmatter audit (Phase 4) catches drift: every value used in
80
+ `recommended_for_user_types` MUST have a corresponding YAML, and
81
+ every YAML SHOULD be consumed by at least one skill. The audit ships
82
+ as a CI gate (`task lint-user-type-axis` →
83
+ [`scripts/audit_user_type_axis.py`](../../scripts/audit_user_type_axis.py)).
84
+ Initial sweep at Phase 4 close: 7 declared / 7 used / 0 orphans / 0
85
+ unused — coverage is clean, no rename or backfill needed. Report:
86
+ [`agents/reports/user-type-axis-audit.md`](../../agents/reports/user-type-axis-audit.md).
87
+ - Adding an 8th value is non-trivial by design — it requires a YAML, a
88
+ schema-compatible frontmatter rollout, and a roadmap entry. The
89
+ friction is the feature: a sprawling axis defeats the purpose of
90
+ filtering.
91
+
92
+ ## Open questions deferred
93
+
94
+ - Skill-loader hook location is left to Phase 3 — likely
95
+ `scripts/skill_linter.py`'s discovery pass plus a runtime helper for
96
+ agent hosts that read the axis directly.
97
+ - Whether to surface a "show outside `<id>` filter" affordance in
98
+ agent hosts is left to host-side UX, not enforced by this ADR.
99
+ - The `default_skill_priority` field is informational in v1 (no
100
+ loader consumes it yet). Phase 3 may promote it to a sort key.
101
+
102
+ ## See also
103
+
104
+ - [`user-types/README.md`](../../user-types/README.md) — schema + seed table
105
+ - [`docs/contracts/universal-skills.md`](universal-skills.md) — always-loaded floor
106
+ - [`docs/contracts/rule-router.md`](rule-router.md) — kernel + router
107
+ architecture (sibling but orthogonal axis)
@@ -163,3 +163,4 @@ Copy it to the project root as `.agent-user.md` and edit, or run
163
163
 
164
164
  - [`language-and-tone`](../../.agent-src/rules/language-and-tone.md) — language-mirroring rule the loader feeds.
165
165
  - [`agents-md-thin-root`](../../.agent-src/skills/agents-md-thin-root/SKILL.md) — Thin-Root contract that this file complements (user-state vs project-state).
166
+ - [`ghostwriter-schema`](ghostwriter-schema.md) — sibling voice primitive for **external public-figure** voices (`/ghostwriter:write`, mandatory disclosure footer). `.agent-user.md` covers the maintainer's **own** voice (`/post-as:me`, no footer); the three-primitive model is summarised in [`personas/README.md § See also — sibling voice primitives`](../../.agent-src/personas/README.md).
@@ -47,6 +47,8 @@ column 1 of this table.
47
47
  | `research` | 2 | `deep` · `report` | preliminary-research scaffolder ported from `Weizhena/Deep-Research-skills` (cluster head emits `outline.yaml` + `fields.yaml` against the `research-schema` contract). `:deep` populates per-item JSON in batches with native web-search + JSON-Schema self-validation (no Python runtime); `:report` renders `report.md` directly + optionally emits a `jq` template for deterministic regeneration. `add-items` / `add-fields` intentionally **not** ported — re-run `/research <topic>` to extend the field framework. |
48
48
  | `orchestrate` | — | _(none yet — cluster head only)_ | new — runtime executor for YAML pipelines under `.agent-config/orchestrations/` per the [`orchestration-dsl-v1`](orchestration-dsl-v1.md) contract; chains personas / skills / commands / sub-agents deterministically. Single cluster head; sub-commands deferred until a second verb is needed. |
49
49
  | `sync-gitignore` | — | `fix` | new sub-command 2026-05-11 — cluster head retains the existing append-only sync as its default flow; `:fix` adds `--cleanup-legacy` semantics, scrubbing pre-`/agents/` runtime patterns wherever they appear in the consumer's `.gitignore` (inside or outside the managed block) and re-syncing the canonical entries. |
50
+ | `ghostwriter` | — | `fetch` · `write` · `list` · `show` · `delete` | new cluster 2026-05-15 — third voice primitive for AI-assisted writing in the public voice of a public figure. Hybrid storage: real-person profiles live consumer-side under `agents/ghostwriter/<slug>.md` (gitignored by default); package source ships only `fictional: true` fixtures. Zero network code in the package — `:fetch` delegates web-fetch / web-search to the host agent. Mandatory disclosure footer on every `:write` output (no opt-out). Schema: [`ghostwriter-schema`](ghostwriter-schema.md). |
51
+ | `post-as` | — | `me` · `ghostwriter` | new cluster 2026-05-15 — consumer-facing write entry points. `:me` reads `.agent-user.md.voice_sample` and drafts in the maintainer's own voice (no disclosure footer — the user is the author); `:ghostwriter` is a thin alias for `/ghostwriter:write` with the mandatory disclosure footer. Both share the procedural [`write-engine`](write-engine.md) contract — style source and footer are the only axes of variation. |
50
52
 
51
53
  **Net change:** Phase 1 collapsed 15 atomics → 3 clusters; Phase 2
52
54
  collapses 26 atomics → 11 sub-command clusters. Sub-commands use