@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,96 @@
1
+ ---
2
+ name: ghostwriter
3
+ tier: 2
4
+ description: Ghostwriter cluster — fetch, write, list, show, and delete public-figure voice profiles (the third voice primitive alongside personas/ and .agent-user.md).
5
+ cluster: ghostwriter
6
+ type: orchestrator
7
+ disable-model-invocation: true
8
+ suggestion:
9
+ eligible: true
10
+ trigger_description: "fetch a public figure's writing voice, write in someone's style, list ghostwriter profiles, refresh stale profile"
11
+ trigger_context: "user wants to capture or use the public-facing writing voice of a documented public figure for AI-assisted drafting"
12
+ ---
13
+
14
+ # /ghostwriter
15
+
16
+ Top-level orchestrator for the `/ghostwriter` family — the **public-figure
17
+ voice cluster**. Captures and consumes the writing voice of documented
18
+ public figures (authors, executives, academics, journalists, public
19
+ speakers, deceased historical figures).
20
+
21
+ The third voice primitive in the package:
22
+
23
+ - `personas/*.md` — review-lens voices (internal critique).
24
+ - `.agent-user.md` — the maintainer's own voice (self).
25
+ - `ghostwriter/*.md` — external public-figure voices (this cluster).
26
+
27
+ No folding, no shared schema, no cross-cluster commands. Schema contract:
28
+ [`ghostwriter-schema`](../docs/contracts/ghostwriter-schema.md).
29
+
30
+ > Looking to write in **your own** voice? Use
31
+ > [`/post-as:me`](post-as/me.md) (reads `.agent-user.md`, no disclosure
32
+ > footer — you are the author).
33
+
34
+ ## Sub-commands
35
+
36
+ | Sub-command | Routes to | Purpose |
37
+ |---|---|---|
38
+ | `/ghostwriter:fetch` | `commands/ghostwriter/fetch.md` | Build a profile from a URL or a bare name via host-agent web-fetch / web-search; runs the public-figure attestation gate before writing |
39
+ | `/ghostwriter:write` | `commands/ghostwriter/write.md` | Draft markdown in the selected ghostwriter's voice with the mandatory disclosure footer |
40
+ | `/ghostwriter:list` | `commands/ghostwriter/list.md` | Numbered listing of available profiles with confidence and stale-warning flags |
41
+ | `/ghostwriter:show` | `commands/ghostwriter/show.md` | Read-only render of a single profile (identity, fingerprint, samples, taboos, sources) |
42
+ | `/ghostwriter:delete` | `commands/ghostwriter/delete.md` | Two-step confirmation, hard-delete the profile file |
43
+
44
+ Cluster locked in
45
+ [`command-clusters`](../docs/contracts/command-clusters.md).
46
+
47
+ ## Dispatch
48
+
49
+ 1. Parse the user's argument: `/ghostwriter:<sub> [args]` or
50
+ `/ghostwriter <sub> [args]`.
51
+ 2. Look up the sub-command in the table above.
52
+ 3. Load the routed file and follow its `## Steps` section verbatim
53
+ with the remaining args.
54
+ 4. Unknown or missing sub-command → print the table and ask which one.
55
+ **One sub-command per turn**; do not chain.
56
+
57
+ ## Rules
58
+
59
+ - **Zero network code in this package.** `fetch` delegates web-fetch /
60
+ web-search to the host agent's built-in tools. If the host cannot
61
+ fetch / search, the command emits a paste-prompt and accepts the
62
+ user's manual paste.
63
+ - **Public figures only.** The public-figure-category enum in
64
+ [`ghostwriter-schema § identity`](../docs/contracts/ghostwriter-schema.md)
65
+ is the binding allowlist. Private individuals are rejected — no
66
+ fair-use defence.
67
+ - **Mandatory disclosure footer.** Every `:write` output ends with
68
+ `*Written in the style of <name>, not by them.*` (or the equivalent
69
+ in the user's language). No `--no-disclosure` flag exists.
70
+ - **Banned source content.** Private DMs, paywalled material,
71
+ login-walled content, leaked drafts, retracted content, anything
72
+ explicitly marked private. See
73
+ [`ghostwriter-schema § exclusions`](../docs/contracts/ghostwriter-schema.md).
74
+ - **No commit / push / PR** unless the sub-command explicitly authorises
75
+ it (none currently do).
76
+ - **Edit `.agent-src.uncompressed/` only.** `.agent-src/` and `.augment/`
77
+ regenerate from source.
78
+
79
+ ## Storage model (recap)
80
+
81
+ | Location | Holds | Tracked in git? |
82
+ |---|---|---|
83
+ | `agents/ghostwriter/<slug>.md` (consumer) | Real-person public-figure profiles | **No** — gitignored by default. `--shared` opt-in deferred to v2. |
84
+ | `agents/ghostwriter/README.md` (consumer) | Directory anchor + how-to | Yes |
85
+ | `.agent-src.uncompressed/ghostwriter/*.md` (package) | `fictional: true` fixtures only | Yes — CI-enforced by `scripts/lint_ghostwriter_source.py` |
86
+
87
+ Slug = full-name kebab-case with optional `-<discriminator>` suffix
88
+ (`alice-walker` vs `alice-walker-novelist`). The package never
89
+ deduplicates slugs across consumer projects — namespace collisions are
90
+ consumer-owned.
91
+
92
+ ## See also
93
+
94
+ - [`ghostwriter-schema`](../docs/contracts/ghostwriter-schema.md) — locked v1 frontmatter and verification levels.
95
+ - [`/post-as:me`](post-as/me.md) — write in the maintainer's own voice (separate primitive, no disclosure footer).
96
+ - [`/post-as:ghostwriter`](post-as/ghostwriter.md) — thin alias for `/ghostwriter:write`.
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: post-as:ghostwriter
3
+ tier: 2
4
+ cluster: post-as
5
+ sub: ghostwriter
6
+ description: Thin alias for /ghostwriter:write — drafts a copyable markdown post in a captured public-figure voice with the mandatory non-removable disclosure footer.
7
+ disable-model-invocation: true
8
+ suggestion:
9
+ eligible: true
10
+ trigger_description: "post as ghostwriter, draft as a public figure, write in style of X, post-as alias for ghostwriter:write"
11
+ trigger_context: "user invokes /post-as:ghostwriter as a discoverable alias for /ghostwriter:write — same flags, same output, same mandatory disclosure footer"
12
+ ---
13
+
14
+ # /post-as:ghostwriter
15
+
16
+ **Thin alias** for [`/ghostwriter:write`](../ghostwriter/write.md).
17
+ Same flags, same output, same procedural contract, same **mandatory
18
+ non-removable disclosure footer**.
19
+
20
+ This command exists so the `/post-as:*` cluster is discoverable as a
21
+ single consumer-facing surface (`/post-as:me` for self,
22
+ `/post-as:ghostwriter` for public figures). It does not introduce
23
+ new behaviour.
24
+
25
+ ## Steps
26
+
27
+ ### 1. Forward to `/ghostwriter:write`
28
+
29
+ Invoke [`/ghostwriter:write`](../ghostwriter/write.md) with **every
30
+ argument and flag passed through verbatim**:
31
+
32
+ - `/post-as:ghostwriter` → `/ghostwriter:write`
33
+ - `/post-as:ghostwriter --as=<slug>` → `/ghostwriter:write --as=<slug>`
34
+ - `/post-as:ghostwriter <slug> --tone=casual --length=180 --channel=linkedin-post --audience="early-stage founders"`
35
+ → `/ghostwriter:write <slug> --tone=casual --length=180 --channel=linkedin-post --audience="early-stage founders"`
36
+
37
+ Follow the routed file's `## Steps` section verbatim. Do not
38
+ re-implement, do not skip, do not add steps.
39
+
40
+ ### 2. Disclosure footer (mandatory — inherited from `/ghostwriter:write`)
41
+
42
+ The footer is appended by `/ghostwriter:write`'s output template (per
43
+ [`write-engine § 5`](../../../docs/contracts/write-engine.md)). This
44
+ alias inherits the footer unconditionally — no `--no-disclosure`
45
+ flag, no `--internal` flag, no opt-out. Any flag that would suppress
46
+ it is forbidden by design.
47
+
48
+ ## Rules
49
+
50
+ - **Do NOT diverge from `/ghostwriter:write`.** This file is a thin
51
+ alias; behavioural drift is forbidden. If a new flag lands on
52
+ `/ghostwriter:write`, it is automatically available here via the
53
+ pass-through.
54
+ - **Do NOT add new steps, prompts, or output sections.** They belong
55
+ on `/ghostwriter:write` (the canonical file).
56
+ - **Do NOT commit, push, or open a PR.** The user owns the git surface.
57
+ - **Do NOT consume `.agent-user.md`** — that is `/post-as:me`'s
58
+ source. This alias only fronts the ghostwriter primitive.
59
+
60
+ ## See also
61
+
62
+ - [`/ghostwriter:write`](../ghostwriter/write.md) — canonical implementation; this file is a thin alias.
63
+ - [`/post-as`](../post-as.md) — parent cluster.
64
+ - [`/post-as:me`](me.md) — sibling consumer, user-self voice, no footer.
65
+ - [`write-engine`](../../../docs/contracts/write-engine.md) — shared procedural contract.
66
+ - [`ghostwriter-schema`](../../../docs/contracts/ghostwriter-schema.md) — locked v1 frontmatter.
@@ -0,0 +1,124 @@
1
+ ---
2
+ name: post-as:me
3
+ tier: 2
4
+ cluster: post-as
5
+ sub: me
6
+ description: 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.
7
+ disable-model-invocation: true
8
+ suggestion:
9
+ eligible: true
10
+ trigger_description: "write as me, draft in my own voice, post as myself, draft from .agent-user.md"
11
+ trigger_context: "user wants a copyable draft in their own captured voice from .agent-user.md; no third-party voice, no disclosure footer"
12
+ ---
13
+
14
+ # /post-as:me
15
+
16
+ Generate a copyable markdown draft in the **maintainer's own voice**.
17
+ Style source is the project-root `.agent-user.md` file. Implements
18
+ the [`write-engine`](../../../docs/contracts/write-engine.md)
19
+ contract — **the disclosure footer is omitted** because the user is
20
+ the author.
21
+
22
+ > Writing in a **public figure's** voice? Use
23
+ > [`/post-as:ghostwriter`](ghostwriter.md) or
24
+ > [`/ghostwriter:write`](../ghostwriter/write.md) — both append the
25
+ > mandatory disclosure footer.
26
+
27
+ ## Steps
28
+
29
+ ### 1. Locate `.agent-user.md`
30
+
31
+ Look in the project root.
32
+
33
+ | State | Action |
34
+ |---|---|
35
+ | File missing | **Abort.** Print: *"`.agent-user.md` is missing. Run `/agents:user:init` to capture your voice."* |
36
+ | File exists but empty / no `voice_sample` | **Abort.** Print: *"`.agent-user.md.voice_sample` is empty. Run `/agents:user:update` to add a voice sample."* |
37
+ | File exists with `voice_sample` | Proceed |
38
+
39
+ Schema reference:
40
+ [`agent-user-schema`](../../../docs/contracts/agent-user-schema.md).
41
+
42
+ ### 2. Load the style source
43
+
44
+ Read the frontmatter:
45
+
46
+ - `identity.name` / `identity.nickname` — used only for address-form
47
+ decisions (default-to-nickname when set), **not** appended to the
48
+ output.
49
+ - `language` — language of the draft.
50
+ - `style.formality`, `style.pace` — mapped into the engine's
51
+ fingerprint slot:
52
+
53
+ | `.agent-user.md` field | Engine fingerprint slot |
54
+ |---|---|
55
+ | `style.formality: informal` | `vocab_register: casual` |
56
+ | `style.formality: formal` | `vocab_register: professional` |
57
+ | `style.pace: rapid` | `sentence_length_avg: 12` |
58
+ | `style.pace: pragmatic` | `sentence_length_avg: 18` |
59
+ | `style.pace: thorough` | `sentence_length_avg: 28` |
60
+
61
+ - `voice_sample` — the single paste used as the cadence / register
62
+ anchor. Engine matches its tone within ±25 % sentence length.
63
+
64
+ The body `# Notes` section is **ignored** for drafting — it is
65
+ operator notes, not voice signal.
66
+
67
+ ### 3. Collect topic + modifiers
68
+
69
+ Per [`write-engine § 2`](../../../docs/contracts/write-engine.md).
70
+ Flag form: `--tone=<formal|casual|neutral>`,
71
+ `--length=<words>`, `--channel=<linkedin-post|tweet|blog|freeform>`,
72
+ `--audience=<text>`. Missing flags → interactive prompt, **one
73
+ question per turn**, in the order Topic → Tone → Length → Channel →
74
+ Audience. Defaults inherit from the engine's per-channel table and
75
+ the formality / pace mapping above.
76
+
77
+ ### 4. Negative-constraint pass (skipped)
78
+
79
+ `.agent-user.md` v1 has no `taboos` field. Skip per
80
+ [`write-engine § 3`](../../../docs/contracts/write-engine.md).
81
+
82
+ ### 5. Draft
83
+
84
+ Generate the body as a single fenced markdown block per
85
+ [`write-engine § 4`](../../../docs/contracts/write-engine.md). Honour
86
+ the loaded fingerprint (sentence-length ±25 %, formality, pace),
87
+ ±15 % length tolerance, write in `language`.
88
+
89
+ ### 6. Disclosure footer (omitted — user is the author)
90
+
91
+ **Do not append a footer.** `/post-as:me` is the self-author path;
92
+ the disclosure footer is reserved for third-party voices
93
+ (`/ghostwriter:write`, `/post-as:ghostwriter`). The engine
94
+ contract's footer step (§ 5) is deliberately skipped here.
95
+
96
+ ### 7. Print
97
+
98
+ Print the body inside one fenced markdown block. No file writes, no
99
+ commit, no save. The user copies the output manually.
100
+
101
+ ## Rules
102
+
103
+ - **Do NOT commit, push, or open a PR.** The user owns the git surface.
104
+ - **Do NOT append a disclosure footer.** This command is the self-author
105
+ path; appending the ghostwriter footer here is wrong by design.
106
+ - **Do NOT consume `personas/*.md` or `agents/ghostwriter/*.md`** —
107
+ those are separate primitives.
108
+ - **Do NOT write the draft to disk.** This command prints only.
109
+ - **Do NOT proceed when `.agent-user.md` is missing or
110
+ `voice_sample` is empty.** Point the user at `/agents:user:init`
111
+ or `/agents:user:update` and abort.
112
+ - **Do NOT bypass the language field.** Draft in
113
+ `.agent-user.md.language` even when the topic prompt is in another
114
+ language (the user will re-prompt if they want a different
115
+ language).
116
+
117
+ ## See also
118
+
119
+ - [`write-engine`](../../../docs/contracts/write-engine.md) — shared procedural contract.
120
+ - [`agent-user-schema`](../../../docs/contracts/agent-user-schema.md) — `.agent-user.md` source schema.
121
+ - [`/post-as`](../post-as.md) — parent cluster.
122
+ - [`/post-as:ghostwriter`](ghostwriter.md) — sibling consumer, public-figure voice, mandatory footer.
123
+ - [`/agents:user:init`](../agents/user/init.md) — bootstrap `.agent-user.md`.
124
+ - [`/agents:user:update`](../agents/user/update.md) — refresh `voice_sample`.
@@ -0,0 +1,58 @@
1
+ ---
2
+ name: post-as
3
+ tier: 2
4
+ description: 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).
5
+ cluster: post-as
6
+ type: orchestrator
7
+ disable-model-invocation: true
8
+ suggestion:
9
+ eligible: true
10
+ trigger_description: "write as me, post as me, draft in my voice, draft as ghostwriter, post-as alias"
11
+ trigger_context: "user wants a copyable draft in their own voice (.agent-user.md) or in a captured public-figure voice (/ghostwriter:write alias)"
12
+ ---
13
+
14
+ # /post-as
15
+
16
+ Consumer-facing write cluster. Two thin entry points over the shared
17
+ [`write-engine`](../docs/contracts/write-engine.md):
18
+
19
+ - `/post-as:me` — read `.agent-user.md`, draft in the **maintainer's
20
+ own voice**, no disclosure footer (the user is the author).
21
+ - `/post-as:ghostwriter` — alias for `/ghostwriter:write`, mandatory
22
+ disclosure footer.
23
+
24
+ ## Sub-commands
25
+
26
+ | Sub-command | Routes to | Footer |
27
+ |---|---|---|
28
+ | `/post-as:me` | `commands/post-as/me.md` | **Omitted** |
29
+ | `/post-as:ghostwriter` | `commands/post-as/ghostwriter.md` (alias → `/ghostwriter:write`) | **Mandatory** |
30
+
31
+ Cluster locked in
32
+ [`command-clusters`](../docs/contracts/command-clusters.md).
33
+
34
+ ## Dispatch
35
+
36
+ 1. Parse the user's argument: `/post-as:<sub> [args]` or
37
+ `/post-as <sub> [args]`.
38
+ 2. Look up the sub-command in the table above.
39
+ 3. Load the routed file and follow its `## Steps` section verbatim.
40
+ 4. Unknown or missing sub-command → print the table and ask which
41
+ one. **One sub-command per turn**; do not chain.
42
+
43
+ ## Rules
44
+
45
+ - **Do NOT commit, push, or open a PR.** The user owns the git surface.
46
+ - **Do NOT consume `personas/*.md`** — those are review-lens voices,
47
+ not author voices.
48
+ - **Do NOT omit the disclosure footer from `:ghostwriter`** — it is
49
+ mandatory on every invocation. `:me` omits it because the user is
50
+ the author.
51
+ - **Edit `.agent-src.uncompressed/` only.** `.agent-src/` and
52
+ `.augment/` regenerate from source.
53
+
54
+ ## See also
55
+
56
+ - [`write-engine`](../docs/contracts/write-engine.md) — shared procedural contract.
57
+ - [`/ghostwriter`](ghostwriter.md) — producer side for public-figure profiles.
58
+ - [`agent-user-schema`](../docs/contracts/agent-user-schema.md) — `.agent-user.md` source for `:me`.
@@ -0,0 +1,61 @@
1
+ # Ghostwriter profiles (package source)
2
+
3
+ > Third voice primitive — public-figure writing-style profiles consumed
4
+ > by `/ghostwriter:write` and `/post-as:ghostwriter`. Peer to
5
+ > `personas/*.md` (review-lens) and `.agent-user.md` (maintainer-self).
6
+
7
+ ## What ships in this directory
8
+
9
+ - `README.md` — this file.
10
+ - `fictional-fixture-v1.md` — single allowlisted fictional fixture
11
+ demonstrating the schema. **No real-person profiles ever ship here.**
12
+
13
+ That's it. Real-person profiles live in **`agents/ghostwriter/`** in the
14
+ consumer project and are gitignored by default
15
+ (see [`config/gitignore-block.txt`](../../config/gitignore-block.txt)).
16
+
17
+ ## Why fictional-only
18
+
19
+ The package is OSS. Shipping a real public figure's writing voice
20
+ with the package would put a defamation / right-of-publicity surface
21
+ on every clone, every fork, every mirror — and the maintainer of this
22
+ package never attested anything about that figure. The user who runs
23
+ `/ghostwriter:fetch` for a real figure attests in their own project,
24
+ and the profile stays local.
25
+
26
+ The fictional fixture exists so:
27
+
28
+ - The schema lint has a positive example to validate against.
29
+ - New contributors can read a complete profile without us inventing
30
+ one in a doc.
31
+ - Tests for the `/ghostwriter:*` cluster have a stable fixture to load.
32
+
33
+ ## Adding a new fictional fixture
34
+
35
+ Two-step process — **both required**:
36
+
37
+ 1. Add the file stem (without `.md`) to
38
+ [`scripts/ghostwriter_fixture_allowlist.txt`](../../scripts/ghostwriter_fixture_allowlist.txt).
39
+ 2. Set `fictional: true` in the frontmatter.
40
+
41
+ `task lint-ghostwriter-source` (runs in `task ci`) fails on:
42
+
43
+ - Any file in this directory whose stem is not on the allowlist.
44
+ - Any allowlisted file missing `fictional: true`.
45
+ - Any consumer-side file under `agents/ghostwriter/` with `fictional: true`
46
+ (fictional profiles belong here, not in consumer trees).
47
+
48
+ New fixtures require reviewer sign-off on the allowlist change.
49
+
50
+ ## Schema
51
+
52
+ See [`docs/contracts/ghostwriter-schema.md`](../../docs/contracts/ghostwriter-schema.md)
53
+ for the locked v1 frontmatter, field reference, confidence derivation,
54
+ verification enum, ethics floor, lint rules, and command surface.
55
+
56
+ ## See also
57
+
58
+ - [`personas/README.md`](../personas/README.md) — sibling primitive,
59
+ distinct voice axis.
60
+ - [`docs/contracts/agent-user-schema.md`](../../docs/contracts/agent-user-schema.md)
61
+ — the maintainer-self primitive that `/post-as:me` consumes.
@@ -0,0 +1,94 @@
1
+ ---
2
+ version: 1
3
+ fictional: true
4
+ identity:
5
+ name: "Vera Holmwood"
6
+ role_or_title: "fictional novelist and essayist"
7
+ era: "1948–"
8
+ public_figure_category: "public_artist"
9
+ source_urls:
10
+ - "https://example.invalid/holmwood/fictional-interview-2019"
11
+ - "https://example.invalid/holmwood/fictional-essay-collection"
12
+ - "https://example.invalid/holmwood/fictional-lecture-2021"
13
+ fetched_at: "2026-05-15"
14
+ confidence: "med"
15
+ attestation_recorded_at: "2026-05-15T10:00:00Z"
16
+ style:
17
+ fingerprint:
18
+ sentence_length_avg: 19
19
+ vocab_register: "literary"
20
+ opener_patterns:
21
+ - "personal anecdote"
22
+ - "quiet observation of place"
23
+ closer_patterns:
24
+ - "open-ended invitation"
25
+ - "single short sentence pulling the threads together"
26
+ hashtag_rules: "never"
27
+ emoji_rules: "never"
28
+ paragraph_cadence: "long-form, 4–6 sentence paragraphs, occasional one-line break for emphasis"
29
+ free_form_notes: |
30
+ Holmwood (fictional) is the canonical fixture for the ghostwriter
31
+ schema. She tends to weave personal memory with a wider social
32
+ observation, rarely uses imperatives, and almost never names a
33
+ contemporary by name. Tone is reflective, never declarative.
34
+ voice_samples:
35
+ - source_url: "https://example.invalid/holmwood/fictional-interview-2019"
36
+ length_words: 88
37
+ text: |
38
+ The town I grew up in had three bookshops and one cinema. I used
39
+ to think that ratio explained something about us — that we
40
+ preferred the slow argument to the loud one, that we trusted the
41
+ written page over the moving picture. I am not sure I still
42
+ believe that. The bookshops are gone now, and the cinema is a
43
+ pharmacy. What stayed is the habit of reading slowly. Perhaps
44
+ that was the point all along.
45
+ - source_url: "https://example.invalid/holmwood/fictional-essay-collection"
46
+ length_words: 64
47
+ text: |
48
+ A useful sentence does two things at once. It carries a thought,
49
+ and it carries a hesitation about that thought. Sentences that
50
+ only carry the thought are speeches. Sentences that only carry
51
+ the hesitation are notes to oneself. The essay lives between
52
+ them, and the essayist's only real job is to keep the balance
53
+ from tipping either way for too long.
54
+ - source_url: "https://example.invalid/holmwood/fictional-lecture-2021"
55
+ length_words: 52
56
+ text: |
57
+ I was asked, on arriving, what I thought writing was for. I
58
+ answered, as I always answer, that I do not know. What I do know
59
+ is that writing changes the writer more than it changes any
60
+ reader, and that this is not a complaint.
61
+ taboos:
62
+ - "political endorsements"
63
+ - "profanity"
64
+ - "hashtag-driven posts"
65
+ - "second-person imperatives ('you should …')"
66
+ - "naming contemporary writers in a critical context"
67
+ source_provenance:
68
+ count: 3
69
+ last_fetched_at: "2026-05-15"
70
+ types:
71
+ - "interview"
72
+ - "essay"
73
+ - "lecture"
74
+ verification: "fetched"
75
+ last_updated: "2026-05-15"
76
+ ---
77
+
78
+ # Notes
79
+
80
+ Holmwood is **fictional**. Every URL in this file uses `example.invalid`,
81
+ the IANA-reserved TLD that never resolves. The fixture exists so the
82
+ ghostwriter schema lint, the write-engine tests, and any future
83
+ contract validators have a complete, stable, non-defamatory example
84
+ to load.
85
+
86
+ Do not use this fixture as a template for adding a real person to
87
+ `.agent-src.uncompressed/ghostwriter/`. Real-person profiles never
88
+ ship with the package — they belong in `agents/ghostwriter/` on the
89
+ consumer side, where they are gitignored by default.
90
+
91
+ If you need a second fictional fixture (for a different
92
+ `public_figure_category` or a different `style.fingerprint` shape),
93
+ add its stem to `scripts/ghostwriter_fixture_allowlist.txt` and submit
94
+ both changes in the same PR.
@@ -92,3 +92,11 @@ cast (usually Core-6 for review skills, empty for others).
92
92
  - [`../../docs/contracts/persona-schema.md`](../../docs/contracts/persona-schema.md) — locked schema (Core / Specialist)
93
93
  - [`../../docs/guidelines/agent-infra/role-contracts.md`](../../docs/guidelines/agent-infra/role-contracts.md) — workflow modes personas compose with
94
94
  - [`../rules/artifact-drafting-protocol.md`](../rules/artifact-drafting-protocol.md) — mandatory per new persona
95
+
96
+ ## See also — sibling voice primitives
97
+
98
+ Personas are one of three voice primitives. Same shape (Markdown +
99
+ frontmatter), distinct purpose — **no folding, no shared schema**:
100
+
101
+ - [`../../docs/contracts/agent-user-schema.md`](../../docs/contracts/agent-user-schema.md) — `.agent-user.md`, the maintainer's own voice (`/post-as:me`, no disclosure footer).
102
+ - [`../../docs/contracts/ghostwriter-schema.md`](../../docs/contracts/ghostwriter-schema.md) — `agents/ghostwriter/<slug>.md`, captured public-figure voice (`/ghostwriter:write` / `/post-as:ghostwriter`, mandatory disclosure footer).
@@ -0,0 +1,52 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Drafting strategic recommendations, executive memos, board decks, or consulting deliverables — cite assumptions; flag low-confidence claims"
5
+ source: package
6
+ triggers:
7
+ - keyword: "strategic recommendation"
8
+ - keyword: "board memo"
9
+ - keyword: "executive summary"
10
+ - keyword: "consulting deliverable"
11
+ - keyword: "go-to-market plan"
12
+ - phrase: "what should we do"
13
+ - phrase: "recommend a strategy"
14
+ routes_to:
15
+ - "skill:stakeholder-tradeoff"
16
+ - "skill:decision-record"
17
+ applies_to_user_types:
18
+ - "consultant"
19
+ ---
20
+
21
+ # Domain Safety — Consulting / Strategic Disclaimer
22
+
23
+ ## Iron Law
24
+
25
+ ```
26
+ EVERY STRATEGIC RECOMMENDATION CITES ITS LOAD-BEARING ASSUMPTIONS.
27
+ EVERY LOW-CONFIDENCE CLAIM IS LABELED. NO HIDDEN PRIORS.
28
+ ```
29
+
30
+ Strategic advice from an AI without surfaced assumptions is the worst kind of advice: it looks authoritative, but the reader can't see which inputs the recommendation rests on. The disclaimer here is structural, not a footer line — bake assumption-citation into the draft itself.
31
+
32
+ ## Required structure for any strategic deliverable
33
+
34
+ Every recommendation must include:
35
+
36
+ 1. **Assumptions section.** 3-5 bullets naming the load-bearing priors (market size, competitive response, internal capacity, regulatory stability, customer demand). If any one of these flips, the recommendation flips.
37
+ 2. **Confidence label per claim.** High / Medium / Low — verifiable from cited data → High; reasoned but unverified → Medium; speculative → Low.
38
+ 3. **Inversion check.** One paragraph: *"This recommendation fails if [X happens]. The early signal to watch is [Y]."*
39
+
40
+ ## Disclaimer footer (append in addition to structure)
41
+
42
+ > **AI-generated strategic analysis.** This recommendation was drafted by an AI assistant based on the assumptions stated above. It is one input among several and should not be acted on without human review, validation against current data, and stakeholder consultation. Confidence labels are the AI's self-assessment, not an external audit.
43
+
44
+ German equivalent:
45
+
46
+ > **KI-generierte Strategieanalyse.** Diese Empfehlung wurde von einem KI-Assistenten auf Basis der oben genannten Annahmen erstellt. Sie ist ein Input unter mehreren und sollte nicht ohne menschliche Prüfung, Abgleich mit aktuellen Daten und Stakeholder-Konsultation umgesetzt werden. Konfidenzangaben sind die Selbsteinschätzung der KI, kein externer Audit.
47
+
48
+ ## See also
49
+
50
+ - `skill:stakeholder-tradeoff` — competing-lens framing.
51
+ - `skill:decision-record` — ADR pattern for locking the choice.
52
+ - `skill:adversarial-review` — pre-commit stress test on the recommendation.
@@ -0,0 +1,54 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Drafting investment memos, valuation models, tax positions, or financial-advice-shaped content — require 'not financial advice' disclaimer"
5
+ source: package
6
+ triggers:
7
+ - keyword: "investment memo"
8
+ - keyword: "valuation"
9
+ - keyword: "DCF"
10
+ - keyword: "tax position"
11
+ - keyword: "portfolio allocation"
12
+ - keyword: "should I invest"
13
+ - phrase: "is this a good investment"
14
+ - phrase: "tax implications of"
15
+ routes_to:
16
+ - "skill:dcf-modeling"
17
+ - "skill:scenario-modeling"
18
+ applies_to_user_types:
19
+ - "finance"
20
+ - "founder"
21
+ ---
22
+
23
+ # Domain Safety — Financial Disclaimer
24
+
25
+ ## Iron Law
26
+
27
+ ```
28
+ EVERY INVESTMENT, VALUATION, OR TAX-SHAPED DRAFT SHIPS WITH A
29
+ "NOT FINANCIAL ADVICE" DISCLAIMER. NO EXCEPTIONS.
30
+ ```
31
+
32
+ The agent is not a registered investment advisor, broker, or tax professional. Outputs that look like advice on buying / selling securities, allocating capital, or claiming tax positions create both regulatory exposure and reader-reliance risk. Append the disclaimer to every financial-shaped artifact.
33
+
34
+ ## Disclaimer template (append verbatim or translated)
35
+
36
+ > **Not financial or tax advice.** This analysis was generated by an AI assistant and is provided for informational and educational purposes only. It does not constitute investment, financial, accounting, or tax advice. Past performance does not predict future results. Consult a licensed financial advisor and a qualified tax professional in your jurisdiction before making any investment or tax decision.
37
+
38
+ German equivalent:
39
+
40
+ > **Keine Anlage- oder Steuerberatung.** Diese Analyse wurde von einem KI-Assistenten erstellt und dient ausschließlich zu Informations- und Bildungszwecken. Sie stellt keine Anlage-, Finanz-, Buchhaltungs- oder Steuerberatung dar. Vergangene Wertentwicklung ist keine Garantie für zukünftige Ergebnisse. Konsultieren Sie vor jeder Anlage- oder Steuerentscheidung eine zugelassene Anlageberaterin und eine qualifizierte Steuerexpertin in Ihrer Rechtsordnung.
41
+
42
+ ## What "financial-shaped" means
43
+
44
+ - Buy / sell / hold recommendations on any security, crypto, or asset.
45
+ - Valuation outputs (DCF, comps, precedent transactions).
46
+ - Tax position recommendations (election timing, deduction strategy, entity choice).
47
+ - Portfolio allocation suggestions.
48
+
49
+ Not in scope: bookkeeping, expense categorization, runway-cash math — those are operational, not advisory.
50
+
51
+ ## See also
52
+
53
+ - `skill:dcf-modeling` — valuation cognition.
54
+ - `skill:runway-cognition` — operational, no disclaimer needed.
@@ -0,0 +1,49 @@
1
+ ---
2
+ type: "auto"
3
+ tier: "2a"
4
+ description: "Drafting legal briefs, contract redlines, ToS, privacy policies, or any legal-shaped content — require 'not legal advice' disclaimer in output"
5
+ source: package
6
+ triggers:
7
+ - keyword: "legal brief"
8
+ - keyword: "contract redline"
9
+ - keyword: "terms of service"
10
+ - keyword: "privacy policy"
11
+ - keyword: "MSA"
12
+ - keyword: "DPA"
13
+ - phrase: "draft a clause"
14
+ - phrase: "review this contract"
15
+ routes_to:
16
+ - "skill:contracts-cognition"
17
+ applies_to_user_types:
18
+ - "legal"
19
+ - "consultant"
20
+ - "founder"
21
+ ---
22
+
23
+ # Domain Safety — Legal Disclaimer
24
+
25
+ ## Iron Law
26
+
27
+ ```
28
+ EVERY LEGAL-SHAPED DRAFT SHIPS WITH A "NOT LEGAL ADVICE" DISCLAIMER.
29
+ NO EXCEPTIONS — INTERNAL DRAFTS, REDLINES, OR TEMPLATES INCLUDED.
30
+ ```
31
+
32
+ The agent is not a licensed attorney in any jurisdiction. Outputs that look like legal work product create reliance risk for the reader and unauthorized-practice exposure for the package operator. Append the disclaimer at the end of every legal-shaped artifact.
33
+
34
+ ## Disclaimer template (append verbatim or translated)
35
+
36
+ > **Not legal advice.** This draft was generated by an AI assistant and is provided for informational purposes only. It does not constitute legal advice and does not create an attorney-client relationship. Consult a licensed attorney in your jurisdiction before relying on this content for any binding decision.
37
+
38
+ German equivalent:
39
+
40
+ > **Keine Rechtsberatung.** Dieser Entwurf wurde von einem KI-Assistenten erstellt und dient ausschließlich zu Informationszwecken. Er stellt keine Rechtsberatung dar und begründet kein Mandatsverhältnis. Konsultieren Sie vor jeder rechtsverbindlichen Entscheidung eine zugelassene Anwältin oder einen Anwalt in Ihrer Rechtsordnung.
41
+
42
+ ## When to skip
43
+
44
+ Never — the disclaimer is non-negotiable on legal-shaped drafts. If the user explicitly says *"this is for an attorney to review, skip the disclaimer"* — still include it; the attorney can strip it. The risk of forgetting outweighs the friction of one paragraph.
45
+
46
+ ## See also
47
+
48
+ - `skill:contracts-cognition` — clause-shape + redline priority.
49
+ - `domain-safety-disclaimer-consulting` — strategic-advisory companion.