@skyf0xx/hedgehog 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -167
- package/bin/cli.mjs +41 -14
- package/package.json +1 -1
- package/src/agents/landing-builder.md +12 -10
- package/src/agents/landing-copywriter.md +137 -0
- package/src/agents/landing-critic.md +11 -8
- package/src/agents/landing-sequencer.md +1 -1
- package/src/agents/landing-strategist.md +13 -104
- package/src/agents/landing-systems.md +41 -43
- package/src/skills/hedgehog-bootstrap-landing-page-core/SKILL.md +1 -1
- package/src/skills/hedgehog-landing-loop/SKILL.md +43 -18
- package/src/templates/CLAUDE.core.landing-page.md +23 -23
- package/src/templates/TODO.core.landing-page.md +2 -1
package/README.md
CHANGED
|
@@ -2,232 +2,107 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@skyf0xx/hedgehog)
|
|
4
4
|
|
|
5
|
+
AI writes code fast. Without guardrails, that speed turns into **unreviewable, drifting architecture**.
|
|
5
6
|
|
|
6
|
-
|
|
7
|
+
Hedgehog is a **build discipline** for Claude Code: a **fixed stack, an enforced build order**, and a set of agents and skills that make **good engineering the default** instead of something you have to ask for.
|
|
7
8
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
**Build faster**, **save context**, stay aligned, and **ship** software you can still understand six months later.
|
|
11
|
-
|
|
12
|
-
Hedgehog pairs **BMAD's planning** with **disciplined execution**, in one workflow.
|
|
13
|
-
|
|
14
|
-
- Build: Hedgehog execution discipline
|
|
15
|
-
- Plan: BMAD workflow
|
|
16
|
-
- Ship: Quality gates and incremental loops
|
|
9
|
+
Hedgehog runs BMAD for planning, then enforces the build that follows with tooling: Nx boundaries, commit hooks, and phase gates.
|
|
17
10
|
|
|
18
11
|

|
|
19
12
|
|
|
20
|
-
## Hedgehog
|
|
21
|
-
|
|
22
|
-
1. An opinionated stack
|
|
23
|
-
2. An enforced build order
|
|
24
|
-
3. Agents and skills that make good engineering the default
|
|
13
|
+
## What Hedgehog builds
|
|
25
14
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
NestJS, Drizzle, ts-rest, Next.js, backend-first (see **The Hedgehog
|
|
29
|
-
Loop**, below). A second core, `landing-page`, applies the same
|
|
30
|
-
discipline to a different shape — Astro, GSAP, a fixed pipeline for
|
|
31
|
-
turning a brief into a traceable, non-templated page instead of a
|
|
32
|
-
domain-module build order (see **The Chain Method**, below). Which core
|
|
33
|
-
applies is decided once, at planning intake, from what you describe.
|
|
15
|
+
1. **Full-stack TypeScript apps**: built module by module, backend first, on one fixed stack
|
|
16
|
+
2. **Landing pages**: a fixed pipeline from brief to a distinct, traceable page on modern frameworks
|
|
34
17
|
|
|
35
|
-
##
|
|
18
|
+
## How it stays reliable
|
|
36
19
|
|
|
37
|
-
- **Progressive layering
|
|
38
|
-
- **Small context loops
|
|
39
|
-
- **Self-documenting architecture
|
|
40
|
-
- **Traceable evolution
|
|
20
|
+
- **Progressive layering**: each core builds one stable layer at a time: types → schema → backend → UI on `full-stack-app`; brief → feeling → tokens → sequence → artifact on `landing-page`
|
|
21
|
+
- **Small context loops**: work is decomposed into atomic, verifiable changes
|
|
22
|
+
- **Self-documenting architecture**: the codebase carries the context, not the AI's memory
|
|
23
|
+
- **Traceable evolution**: every decision is preserved through conventional commits
|
|
41
24
|
|
|
42
25
|

|
|
43
26
|
|
|
44
27
|
## Why Hedgehog Exists
|
|
45
28
|
|
|
46
|
-
AI coding starts fast, then breaks down. Context accumulates, prompts get longer, architecture drifts
|
|
29
|
+
AI coding starts fast, then breaks down. Context accumulates, prompts get longer, architecture drifts, and adding one more feature starts to feel dangerous.
|
|
47
30
|
|
|
48
|
-
|
|
31
|
+
### Plans expire. Structure doesn't
|
|
49
32
|
|
|
50
|
-
|
|
33
|
+
Without a mechanically enforced build order, an AI (or a person) has to hold the whole plan in its head (architecture, sequencing, past decisions) as an ever-growing prompt.
|
|
51
34
|
|
|
52
|
-
|
|
35
|
+
Hedgehog doesn't ask the AI to remember a plan. It makes the plan visible in the structure of the build, so the architecture itself guides the next step.
|
|
53
36
|
|
|
54
|
-
|
|
37
|
+
### The AI never has to guess what's next
|
|
55
38
|
|
|
56
|
-
|
|
39
|
+
Hedgehog turns the build into a sequence of small, deterministic steps instead of asking the AI to hold an entire application in context. The exact sequence depends on the project's core: a stateful app and a landing page don't share a build order, so they don't share an enforcement mechanism either.
|
|
57
40
|
|
|
58
|
-
|
|
41
|
+
For example, the `full-stack-app` core builds each module progressively, schema → contract → repository → service → controller. Tests gate every step before the next one starts, and backend comes first, so every module gets a working, typed API before any screen is built. The frontend consumes stable capabilities instead of growing in parallel with backend complexity.
|
|
59
42
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
Backend comes first. Every module gets a working, typed API before any screen is built. The frontend becomes a consumer of stable capabilities, not a parallel source of complexity.
|
|
63
|
-
|
|
64
|
-
The build order is not something you negotiate with the AI. It is encoded into the process — the same is true on the `landing-page` core, just for a different sequence (see **The Chain Method**, below).
|
|
43
|
+
The build order isn't something you negotiate with the AI. It's encoded into the process, per core (see **The Hedgehog Loop**, below).
|
|
65
44
|
|
|
66
45
|

|
|
67
46
|
|
|
68
|
-
## The Hedgehog Loop
|
|
47
|
+
## The Hedgehog Loop
|
|
48
|
+
|
|
49
|
+
Every core runs the same loop: plan, bootstrap, then build in a fixed,
|
|
50
|
+
mechanically-enforced order on an opinionated stack.
|
|
69
51
|
|
|
70
52
|
``` text
|
|
71
|
-
Planning intake - BMAD-METHOD's
|
|
72
|
-
|
|
73
|
-
↓
|
|
74
|
-
Bootstrap (once per project)
|
|
53
|
+
Planning intake - BMAD-METHOD's planning shelf, mined into this core's
|
|
54
|
+
scoping artifact
|
|
75
55
|
↓
|
|
76
|
-
|
|
56
|
+
Bootstrap
|
|
77
57
|
↓
|
|
78
|
-
|
|
58
|
+
Build in gated steps
|
|
79
59
|
↓
|
|
80
|
-
|
|
81
|
-
↓
|
|
82
|
-
Repeat for the next module or the next step
|
|
60
|
+
Repeat for the next step
|
|
83
61
|
```
|
|
84
62
|
|
|
85
|
-
|
|
86
63
|

|
|
87
64
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
A different shape gets a different loop, not a variant of this one —
|
|
91
|
-
there's no domain module to build, so the enforced order is a pipeline
|
|
92
|
-
instead of a layer sequence:
|
|
93
|
-
|
|
94
|
-
``` text
|
|
95
|
-
Planning intake - BMAD-METHOD's brief/PR-FAQ/PRD/UX spec, mined into a
|
|
96
|
-
subject/audience/single-job statement (planner agent)
|
|
97
|
-
↓
|
|
98
|
-
Bootstrap (once per project - Astro + Tailwind workspace)
|
|
99
|
-
↓
|
|
100
|
-
Strategy - subject statement → adjective pairs → visceral/behavioral/
|
|
101
|
-
reflective sort → top/heart/base note timing (landing-strategist)
|
|
102
|
-
↓
|
|
103
|
-
Systems - ingredient dials + copy voice (parallel) → token system →
|
|
104
|
-
signature motif (landing-systems)
|
|
105
|
-
↓
|
|
106
|
-
Sequence - per-section transitions, weight, pacing (landing-sequencer)
|
|
107
|
-
↓
|
|
108
|
-
Audit - traceability/distinctiveness + usability, reconciled to a pass
|
|
109
|
-
(landing-critic) - redlines route back to the phase that owns them
|
|
110
|
-
↓
|
|
111
|
-
Build - the artifact, in Astro (landing-builder)
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
Every choice traces back to a sentence in the subject statement, or it
|
|
115
|
-
gets cut — that traceability is what keeps the output from converging on
|
|
116
|
-
the same templated look every AI-generated page defaults to.
|
|
65
|
+
Each core defines its own build order and stack.
|
|
117
66
|
|
|
118
67
|
## Installation
|
|
119
68
|
|
|
120
|
-
From an empty project folder:
|
|
69
|
+
From an empty project folder ask Claude to install:
|
|
121
70
|
|
|
122
71
|
``` bash
|
|
123
|
-
|
|
124
|
-
|
|
72
|
+
# 1. Full-stack app (Nx, NestJS, Drizzle, ts-rest, Next.js)
|
|
73
|
+
npx @skyf0xx/hedgehog init --ts-full-stack-app
|
|
125
74
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
``` bash
|
|
130
|
-
npx @skyf0xx/hedgehog init --core=landing-page
|
|
75
|
+
# 2. Landing page (Astro, Tailwind, GSAP)
|
|
76
|
+
npx @skyf0xx/hedgehog init --landing-page
|
|
131
77
|
```
|
|
132
78
|
|
|
133
|
-
Then open Claude Code and describe what you want to build.
|
|
134
|
-
`planner` agent decides which core actually applies (overriding the
|
|
135
|
-
installer's default if what you describe doesn't match it), then runs
|
|
136
|
-
that core's own planning intake — both cores run BMAD-METHOD's
|
|
137
|
-
brainstorming, brief, PR-FAQ, PRD, UX spec, and deep-recon in full;
|
|
138
|
-
`full-stack-app` mines that output into scope boundary and domain
|
|
139
|
-
vocabulary, `landing-page` mines it into a subject/audience/job
|
|
140
|
-
statement. Once you confirm, it scaffolds the project itself.
|
|
141
|
-
|
|
142
|
-
The chosen core's workspace - for `full-stack-app`: Nx, `packages/config`,
|
|
143
|
-
`packages/db`, `apps/api`, `apps/web`, and every enforcement file; for
|
|
144
|
-
`landing-page`: the Astro + Tailwind workspace and its animation library
|
|
145
|
-
set - lands instantly from a pre-verified template rather than being
|
|
146
|
-
generated live; bootstrap then verifies it (and, on `full-stack-app`,
|
|
147
|
-
runs whichever add-ons planning intake determined your project needs).
|
|
148
|
-
|
|
149
|
-
Or paste the repo URL to your Agent and have it install for you.
|
|
79
|
+
Then open Claude Code and describe what you want to build.
|
|
150
80
|
|
|
151
|
-
|
|
152
|
-
changes from a newer release with:
|
|
81
|
+
To update:
|
|
153
82
|
|
|
154
83
|
``` bash
|
|
155
84
|
npx @skyf0xx/hedgehog update
|
|
156
85
|
```
|
|
157
86
|
|
|
158
|
-
This refreshes `.claude/agents/` and `.claude/skills/` only
|
|
87
|
+
This refreshes `.claude/agents/` and `.claude/skills/` only. It never
|
|
159
88
|
touches `CLAUDE.md`, `TODO.md`, the core workspace, or
|
|
160
89
|
`skills/BMAD`, since those carry project-specific or write-once content.
|
|
161
90
|
|
|
162
91
|
## For Builders
|
|
163
92
|
|
|
164
|
-
Hedgehog
|
|
165
|
-
|
|
166
|
-
Once the project brief is defined, Hedgehog takes over the execution: breaking the work into steps, following the build order, validating progress, and keeping decisions traceable.
|
|
167
|
-
|
|
168
|
-
Under the hood, it applies the practices experienced engineers rely on:
|
|
169
|
-
|
|
170
|
-
- iterative delivery
|
|
171
|
-
- small units of work
|
|
172
|
-
- an opinionated stack
|
|
173
|
-
- clear architectural boundaries
|
|
174
|
-
- ports and adapters
|
|
175
|
-
- continuous verification
|
|
176
|
-
- conventional commits
|
|
93
|
+
Once the project brief is defined, Hedgehog takes over execution: breaking the work into steps, following the build order, validating progress, and keeping every decision traceable.
|
|
177
94
|
|
|
178
|
-
|
|
95
|
+
Under the hood, it applies practices experienced engineers already rely on: iterative delivery, small units of work, clear architectural boundaries, ports and adapters, continuous verification, conventional commits. AI builds inside those constraints, so you don't have to manage every implementation detail.
|
|
179
96
|
|
|
180
97
|
## Architecture
|
|
181
98
|
|
|
182
|
-
Hedgehog is a package of agents and skills, built on an opinionated stack per core so the build order above is mechanical and enforced by the tooling itself.
|
|
183
|
-
|
|
184
|
-
### `full-stack-app` core
|
|
185
|
-
|
|
186
|
-
| Layer | Choice | Why |
|
|
187
|
-
| --- | --- | --- |
|
|
188
|
-
| Monorepo | Nx | Enforces module boundaries at compile time. |
|
|
189
|
-
| Package manager | pnpm | Prevents accidental cross-package dependencies. |
|
|
190
|
-
| Backend | NestJS | Modules naturally mirror Hedgehog's build progression. |
|
|
191
|
-
| ORM | Drizzle + drizzle-zod | Database schema is the single source of truth. |
|
|
192
|
-
| Database | PostgreSQL | Simple, relational, predictable. |
|
|
193
|
-
| Local infra | Docker Compose | Postgres/Redis run identically on every machine. |
|
|
194
|
-
| Platform | Railway | Infrastructure is available from the first commit. |
|
|
195
|
-
| API contract | ts-rest | Contracts are code, not documentation. |
|
|
196
|
-
| Validation | Zod | One schema for runtime and compile time. |
|
|
197
|
-
| Auth | Better Auth | Secure by default from day one. |
|
|
198
|
-
| Data fetching | TanStack Query | UI consumes typed APIs, never implementation details. |
|
|
199
|
-
| Web | Next.js + ShadCN + Tailwind | UI remains a thin presentation layer. |
|
|
200
|
-
| Mobile | Expo + RN Reusables | Shares contracts and design tokens with web. |
|
|
201
|
-
| Jobs | BullMQ + Redis | Async boundaries exist before they're needed. |
|
|
202
|
-
| Logging | Pino | Structured logs from the first feature. |
|
|
203
|
-
| Linting | ESLint + Prettier | One shared standard across every module. |
|
|
204
|
-
| Testing | Vitest + Playwright | Every step is verifiable before progressing. |
|
|
205
|
-
| Commits | Conventional Commits | Architectural decisions become permanent history. |
|
|
206
|
-
| Observability | Sentry | Failures map cleanly back to module boundaries. |
|
|
207
|
-
|
|
208
|
-
### `landing-page` core
|
|
209
|
-
|
|
210
|
-
Every choice below maps to a specific dial or phase in the Chain
|
|
211
|
-
Method — nothing here is a default reached for out of habit:
|
|
212
|
-
|
|
213
|
-
| Layer | Choice | Why |
|
|
214
|
-
| --- | --- | --- |
|
|
215
|
-
| Framework | Astro | Zero-JS-by-default shell; islands only where interaction is actually needed. |
|
|
216
|
-
| Styling | Tailwind (v4, CSS-first) | Config as token layer only — no component library pre-deciding how things look. |
|
|
217
|
-
| Animation | GSAP + ScrollTrigger | Owns per-section pacing and top/heart/base fade timing with real control. |
|
|
218
|
-
| Scroll feel | Lenis | The "weight and suspension" dial, instead of default browser scroll physics. |
|
|
219
|
-
| Copy reveal | SplitType | Line/word/char splitting — makes copy rhythm visible in motion, not just static text. |
|
|
220
|
-
| Motif | SVG-first + Paper.js | Hand-authored graphics; Paper.js for a motif that evolves (augmentation/inversion) across sections. |
|
|
221
|
-
| Motif transforms | GSAP MorphSVGPlugin | Ships free inside the `gsap` package — for a motif that physically transforms across sections. |
|
|
222
|
-
| Texture | Custom SVG noise/grain filter | Cheap materiality layer nothing else in the stack owns. |
|
|
223
|
-
| Design handoff | Figma MCP / Stitch MCP | Input only, at the Strategist/Builder boundaries — never allowed to set spacing/style defaults directly. |
|
|
224
|
-
| 3D (rare) | React Three Fiber | Only when the subject is genuinely spatial; skipped by default. |
|
|
99
|
+
Hedgehog is a package of agents and skills, built on an opinionated stack per core so the build order above is mechanical and enforced by the tooling itself. See [ARCHITECTURE.md](ARCHITECTURE.md) for details.
|
|
225
100
|
|
|
226
101
|
## How Hedgehog Compares
|
|
227
102
|
|
|
228
103
|
Superpowers and BMAD both improve on raw prompting: one gives the AI good habits, the other a planning process. Alone, either can still be broken by convention.
|
|
229
104
|
|
|
230
|
-
Hedgehog runs BMAD for planning
|
|
105
|
+
Hedgehog runs BMAD for planning, then enforces the build that follows with tooling and tight boundaries.
|
|
231
106
|
|
|
232
107
|
| | Superpowers | BMAD | Hedgehog + BMAD |
|
|
233
108
|
| --- | --- | --- | --- |
|
|
@@ -235,7 +110,7 @@ Hedgehog runs BMAD for planning on both cores — the same full shelf either way
|
|
|
235
110
|
| **Order comes from** | Skill instructions the agent is told to follow | Sequenced documents (brief → PRD → architecture → stories) | Tooling (Nx, lefthook, phase gate) |
|
|
236
111
|
| **Enforcement mechanism** | None. Prompted convention | None. One optional checklist between phases | Execution mechanically enforced |
|
|
237
112
|
| **Unit of work** | A task, planned in worktree-isolated steps | A story, derived from PRD and architecture docs | A module layer (schema → contract → repo → service → controller → UI) |
|
|
238
|
-
| **Stack** | Whatever the project already uses | No stack opinion | One locked stack per core
|
|
113
|
+
| **Stack** | Whatever the project already uses | No stack opinion | One locked stack per core, chosen once at planning intake |
|
|
239
114
|
| **Context per step** | As much as the task pulls in | A full brief, PRD, and architecture doc per story | One module layer at a time - BMAD's docs are mined once, up front |
|
|
240
115
|
| **Finding a bug** | Search wherever the task touched | Search wherever the story touched | Search one layer, in one module, in a fixed order |
|
|
241
116
|
| **Real cost** | No safety net if the model shortcuts its own process | Documentation overhead most solo projects don't need | Stack and order aren't negotiable |
|
package/bin/cli.mjs
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
// into the current repo, so the discipline travels with the project.
|
|
4
4
|
//
|
|
5
5
|
// Usage:
|
|
6
|
-
// npx @skyf0xx/hedgehog init scaffold, full-stack-app core (default)
|
|
7
|
-
// npx @skyf0xx/hedgehog init --
|
|
6
|
+
// npx @skyf0xx/hedgehog init scaffold, ts-full-stack-app core (default)
|
|
7
|
+
// npx @skyf0xx/hedgehog init --landing-page scaffold the landing-page core instead
|
|
8
8
|
// npx @skyf0xx/hedgehog init --force overwrite files that already exist
|
|
9
9
|
// npx @skyf0xx/hedgehog update refresh .claude/agents + .claude/skills
|
|
10
10
|
// npx @skyf0xx/hedgehog --help
|
|
@@ -20,6 +20,16 @@ const DEST_ROOT = process.cwd();
|
|
|
20
20
|
const CORES_ROOT = join(PKG_ROOT, 'src/golden-cores');
|
|
21
21
|
const DEFAULT_CORE = 'full-stack-app';
|
|
22
22
|
|
|
23
|
+
// One install flag per core, named for what a user is asking to build
|
|
24
|
+
// rather than the internal src/golden-cores/<name> directory — the two
|
|
25
|
+
// diverge deliberately so the CLI's public surface can stay stable
|
|
26
|
+
// while cores are renamed or added underneath it. Adding a core means
|
|
27
|
+
// adding one entry here (and a matching src/golden-cores/<dir>).
|
|
28
|
+
const CORE_FLAGS = {
|
|
29
|
+
'--ts-full-stack-app': 'full-stack-app',
|
|
30
|
+
'--landing-page': 'landing-page',
|
|
31
|
+
};
|
|
32
|
+
|
|
23
33
|
// ── tiny ANSI helpers (no deps) ─────────────────────────────────────────
|
|
24
34
|
const useColor = process.stdout.isTTY && !process.env.NO_COLOR;
|
|
25
35
|
const paint = (code, s) => (useColor ? `\x1b[${code}m${s}\x1b[0m` : s);
|
|
@@ -148,16 +158,18 @@ CLAUDE.md / TODO.md templates into the repo root, so the discipline is
|
|
|
148
158
|
committed alongside your code.
|
|
149
159
|
|
|
150
160
|
${bold('Usage')}
|
|
151
|
-
npx @skyf0xx/hedgehog init
|
|
152
|
-
npx @skyf0xx/hedgehog init --
|
|
153
|
-
npx @skyf0xx/hedgehog init --
|
|
154
|
-
npx @skyf0xx/hedgehog
|
|
161
|
+
npx @skyf0xx/hedgehog init scaffold, ${DEFAULT_CORE} core (default)
|
|
162
|
+
npx @skyf0xx/hedgehog init --ts-full-stack-app scaffold the full-stack-app core explicitly
|
|
163
|
+
npx @skyf0xx/hedgehog init --landing-page scaffold the landing-page core instead
|
|
164
|
+
npx @skyf0xx/hedgehog init --force overwrite existing files
|
|
165
|
+
npx @skyf0xx/hedgehog update refresh .claude/agents + .claude/skills
|
|
155
166
|
npx @skyf0xx/hedgehog --help
|
|
156
167
|
|
|
157
168
|
Available cores: ${cores.join(', ')}
|
|
158
169
|
|
|
159
|
-
After it runs, commit the payload, open Claude Code, and
|
|
160
|
-
|
|
170
|
+
After it runs, commit the payload, open Claude Code, and describe what
|
|
171
|
+
you want to build — the planner agent runs planning intake, then hands
|
|
172
|
+
off to bootstrap.
|
|
161
173
|
|
|
162
174
|
${bold('update')} re-copies only .claude/agents and .claude/skills from the
|
|
163
175
|
installed Hedgehog version, so an already-bootstrapped project can pick up
|
|
@@ -226,14 +238,20 @@ async function init({ force, core }) {
|
|
|
226
238
|
console.log('Next steps:');
|
|
227
239
|
console.log(` 1. ${bold('git add -A && git commit -m "chore: install Hedgehog"')}`);
|
|
228
240
|
console.log(` 2. ${bold('pnpm install')}`);
|
|
229
|
-
console.log(` 3. Open Claude Code and
|
|
230
|
-
console.log(
|
|
241
|
+
console.log(` 3. Open Claude Code and describe what you want to build.`);
|
|
242
|
+
console.log(
|
|
243
|
+
dim(
|
|
244
|
+
` The ${bold('planner')} agent runs planning intake, then hands off to bootstrap.`,
|
|
245
|
+
),
|
|
246
|
+
);
|
|
247
|
+
console.log();
|
|
248
|
+
console.log(dim(`Core: ${bold(core)} (installer default — planner may override it).`));
|
|
231
249
|
console.log(
|
|
232
250
|
dim(
|
|
233
251
|
core === DEFAULT_CORE
|
|
234
252
|
? '(Nx, packages/config, packages/db, apps/api, apps/web) — bootstrap\n' +
|
|
235
|
-
'
|
|
236
|
-
: 'bootstrap
|
|
253
|
+
'runs whichever add-ons (Auth, Queue, Mobile) intake calls for.'
|
|
254
|
+
: 'bootstrap runs whichever add-on steps this core defines, if any.',
|
|
237
255
|
),
|
|
238
256
|
);
|
|
239
257
|
}
|
|
@@ -279,8 +297,17 @@ async function main() {
|
|
|
279
297
|
}
|
|
280
298
|
const cmd = args[0];
|
|
281
299
|
const force = args.includes('--force') || args.includes('-f');
|
|
282
|
-
const
|
|
283
|
-
|
|
300
|
+
const coreFlag = args.find((a) => a in CORE_FLAGS);
|
|
301
|
+
if (coreFlag === undefined && args.some((a) => a.startsWith('--core='))) {
|
|
302
|
+
const attempted = args.find((a) => a.startsWith('--core='));
|
|
303
|
+
console.error(
|
|
304
|
+
`${red('Unknown flag:')} ${attempted}\n\n` +
|
|
305
|
+
`Use an explicit core flag instead: ${Object.keys(CORE_FLAGS).join(', ')}\n`,
|
|
306
|
+
);
|
|
307
|
+
process.exitCode = 1;
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
const core = coreFlag ? CORE_FLAGS[coreFlag] : DEFAULT_CORE;
|
|
284
311
|
|
|
285
312
|
if (cmd === 'init') {
|
|
286
313
|
await init({ force, core });
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: landing-builder
|
|
3
|
-
description: Use for the build phase of the Chain Method (landing-page core) — implementing the audited spec exactly in Astro, Tailwind, GSAP/ScrollTrigger/Lenis, SplitType, and Paper.js/SVG for the motif. Runs last, only after landing-critic returns a pass. Specializes in this core's stack; builds to spec, never improvises around it.
|
|
3
|
+
description: Use for the build phase of the Chain Method (landing-page core) — implementing the audited spec exactly in Astro, Tailwind, GSAP/ScrollTrigger/Lenis, SplitType, and Paper.js/SVG for the motif, placing landing-copywriter's final copy verbatim. Runs last, only after landing-critic returns a pass. Specializes in this core's stack; builds to spec, never improvises around it.
|
|
4
4
|
model: sonnet
|
|
5
5
|
color: green
|
|
6
6
|
tools: Read, Glob, Grep, Edit, Write, Bash
|
|
@@ -10,9 +10,10 @@ You are the landing-builder role in the Hedgehog discipline's Chain
|
|
|
10
10
|
Method (`hedgehog-landing-loop`), running step 10: Builder. Your input is
|
|
11
11
|
the full audited spec — `landing-strategist`'s emotional target,
|
|
12
12
|
`landing-systems`'s token system and motif, `landing-sequencer`'s pacing
|
|
13
|
-
spec, all reconciled and passed by
|
|
14
|
-
exactly. Anything that can't be built
|
|
15
|
-
the chain to the phase that owns it —
|
|
13
|
+
spec, `landing-copywriter`'s final copy, all reconciled and passed by
|
|
14
|
+
`landing-critic`. You build to spec exactly. Anything that can't be built
|
|
15
|
+
as specified gets flagged back up the chain to the phase that owns it —
|
|
16
|
+
never silently improvised around.
|
|
16
17
|
|
|
17
18
|
## Stack (locked)
|
|
18
19
|
|
|
@@ -54,19 +55,19 @@ the chain to the phase that owns it — never silently improvised around.
|
|
|
54
55
|
- Wire Lenis once, globally, matching the specified scroll feel.
|
|
55
56
|
- Implement the motif exactly as specified, in `src/motifs/`, referenced
|
|
56
57
|
from whichever sections `landing-systems`'s continuity rule calls for.
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
58
|
+
- Place `landing-copywriter`'s final copy verbatim — headline, section
|
|
59
|
+
body, CTA text. You don't rewrite copy for "flow" once you're
|
|
60
|
+
implementing it.
|
|
60
61
|
|
|
61
62
|
## Workflow
|
|
62
63
|
|
|
63
64
|
1. Confirm `landing-critic` returned a pass — if not, stop; there's
|
|
64
65
|
nothing for you to build yet.
|
|
65
66
|
2. Read the full chain: emotional target, token system, motif, pacing
|
|
66
|
-
spec — not just the sequencer's output in isolation.
|
|
67
|
+
spec, final copy — not just the sequencer's output in isolation.
|
|
67
68
|
3. Build section by section, in `landing-sequencer`'s order, each
|
|
68
69
|
section's GSAP timeline matching its specified beat.
|
|
69
|
-
4. Wire Lenis, the motif, and copy per spec.
|
|
70
|
+
4. Wire Lenis, the motif, and `landing-copywriter`'s copy per spec.
|
|
70
71
|
5. Verify: `pnpm astro check`, `pnpm lint`, `pnpm build` all clean.
|
|
71
72
|
6. Commit as `feat(landing): build`.
|
|
72
73
|
|
|
@@ -85,7 +86,8 @@ the chain to the phase that owns it — never silently improvised around.
|
|
|
85
86
|
implementing it, that's a Correction Protocol case routed to
|
|
86
87
|
`landing-sequencer`, not a unilateral fix.
|
|
87
88
|
- Never rewrite copy for flow, brevity, or personal taste once it's
|
|
88
|
-
spec'd — `landing-
|
|
89
|
+
spec'd — `landing-copywriter`'s final copy is placed as written, not a
|
|
90
|
+
draft to polish.
|
|
89
91
|
- Never install a library outside this core's locked stack. A felt need
|
|
90
92
|
for one (an icon set, a component library, a different animation
|
|
91
93
|
engine) usually signals a gap upstream in the chain, not a build-time
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: landing-copywriter
|
|
3
|
+
description: Use for the copy phase of the Chain Method (landing-page core) — final, word-for-word page copy (headline, section body, CTA text) written to the voice spec and section structure. Runs after landing-sequencer, before landing-critic. Specializes in producing copy the user reviews and signs off on as its own artifact, before any of it reaches Astro markup.
|
|
4
|
+
model: sonnet
|
|
5
|
+
color: pink
|
|
6
|
+
tools: Read, Glob, Grep, Edit, Write
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are the landing-copywriter role in the Hedgehog discipline's Chain
|
|
10
|
+
Method (`hedgehog-landing-loop`). Your input is the full chain so far —
|
|
11
|
+
`landing-strategist`'s emotional target, `landing-systems`'s voice spec
|
|
12
|
+
and token system, `landing-sequencer`'s section list and beat
|
|
13
|
+
structure. Your output is the actual copy: the headline, every section's
|
|
14
|
+
body text, and every CTA, word for word, section by section, as its own
|
|
15
|
+
reviewable artifact. Nobody reads drafted copy for the first time buried
|
|
16
|
+
in Astro markup — it exists here first, as prose the user can read and
|
|
17
|
+
redline before `landing-builder` ever runs.
|
|
18
|
+
|
|
19
|
+
## Stack (locked)
|
|
20
|
+
|
|
21
|
+
None — you write prose into `.hedgehog/chain/`, not code. `landing-builder`
|
|
22
|
+
places what you write into components verbatim; it doesn't draft.
|
|
23
|
+
|
|
24
|
+
## Core Responsibilities
|
|
25
|
+
|
|
26
|
+
**In:** emotional target spec (`landing-strategist`) + voice spec and
|
|
27
|
+
token system (`landing-systems`) + section list, weights, and beat
|
|
28
|
+
structure (`landing-sequencer`)
|
|
29
|
+
**Out:** final copy for every section — headline (plus 2 backups), body
|
|
30
|
+
text, CTA text — following the voice spec's rhythm and verb-mode rules
|
|
31
|
+
exactly, placed against the beat `landing-sequencer` assigned each
|
|
32
|
+
section (setup/build/payoff, where specified)
|
|
33
|
+
|
|
34
|
+
Write to the section list in order. Each section's copy serves the beat
|
|
35
|
+
`landing-sequencer` gave it — a setup beat states the situation, a build
|
|
36
|
+
beat adds the complication or proof, a payoff beat resolves it. A
|
|
37
|
+
section's copy that doesn't match its assigned beat is a mismatch to fix
|
|
38
|
+
here, not something `landing-builder` should quietly patch later.
|
|
39
|
+
|
|
40
|
+
Apply the voice spec literally: the sentence rhythm, verb mode, user-side
|
|
41
|
+
naming, and omission rules `landing-systems` set are not suggestions —
|
|
42
|
+
if a section is genuinely unwritable within them, flag it back to
|
|
43
|
+
`landing-systems` rather than breaking the voice to make the section
|
|
44
|
+
work.
|
|
45
|
+
|
|
46
|
+
## Writing standard
|
|
47
|
+
|
|
48
|
+
Every line ships or it doesn't — there is no draft tier. Apply these
|
|
49
|
+
directly while writing, not as a pass after:
|
|
50
|
+
|
|
51
|
+
- **Cut inflated words.** No "delve," "landscape," "robust,"
|
|
52
|
+
"comprehensive," "leverage," "seamless," "cutting-edge," "elevate,"
|
|
53
|
+
"unlock," "empower," "streamline," "game-changer," "unlock," "harness,"
|
|
54
|
+
"revolutionize," or any word from that register. State the plain verb
|
|
55
|
+
or noun instead.
|
|
56
|
+
- **No negation formulas.** Never write "It's not X — it's Y" or "This
|
|
57
|
+
isn't about X, it's about Y." State the positive claim directly.
|
|
58
|
+
- **No hedge stacks.** Never pair "could potentially," "may eventually,"
|
|
59
|
+
or "might ultimately" — pick one claim and state it.
|
|
60
|
+
- **No unnamed authority.** Never write "studies show," "experts agree,"
|
|
61
|
+
or "research suggests" without naming the source. If there's no source,
|
|
62
|
+
the claim doesn't ship in that form — reframe it as the subject's own
|
|
63
|
+
claim, or cut it.
|
|
64
|
+
- **No manufactured drama.** No "here's the interesting part," "the
|
|
65
|
+
catch?", "plot twist," or rhetorical-question openers ("But what does
|
|
66
|
+
this mean?"). State the thing.
|
|
67
|
+
- **No stock closers.** Never end a section on "the future looks
|
|
68
|
+
bright," "only time will tell," or a modal-stacked prediction ("may
|
|
69
|
+
become one of the most important..."). End on the specific claim.
|
|
70
|
+
- **Vary sentence length on purpose.** Mix short (3–8 words) and long
|
|
71
|
+
(20+) — uniform sentence length across a section reads as machine
|
|
72
|
+
output, not voice.
|
|
73
|
+
- **One em dash per roughly 1,000 words, not a tic.** Prefer commas,
|
|
74
|
+
periods, or parentheses. If a draft leans on em dashes to link every
|
|
75
|
+
other clause, rewrite the sentence structure instead.
|
|
76
|
+
- **No inline-header bullet dumps for persuasive copy.** A list of 5+
|
|
77
|
+
bare noun phrases reads as generated. Where prose is called for by the
|
|
78
|
+
voice spec, write prose — reserve bullets for genuinely list-shaped
|
|
79
|
+
content (a feature enumeration, a pricing breakdown), not for
|
|
80
|
+
arguments.
|
|
81
|
+
- **No synonym cycling.** If the subject is named once, name it the same
|
|
82
|
+
way throughout a section — don't rotate "the app / the platform / the
|
|
83
|
+
tool / the solution" to avoid repetition; repetition of the clearest
|
|
84
|
+
word is correct.
|
|
85
|
+
- **Concrete over abstract.** A claim like "significant improvement"
|
|
86
|
+
ships only with the number, name, or comparison that makes it
|
|
87
|
+
checkable. If the brief or `landing-strategist`'s output doesn't supply
|
|
88
|
+
one, the claim doesn't ship in that form.
|
|
89
|
+
|
|
90
|
+
## Workflow
|
|
91
|
+
|
|
92
|
+
1. Read the full chain: `landing-strategist`'s emotional target,
|
|
93
|
+
`landing-systems`'s voice spec and token system, `landing-sequencer`'s
|
|
94
|
+
section list and beat structure — not a summary of any of them.
|
|
95
|
+
2. Write the headline plus 2 backups, each usable against the subject
|
|
96
|
+
statement's single job.
|
|
97
|
+
3. Write each section's copy in `landing-sequencer`'s order, to its
|
|
98
|
+
assigned beat.
|
|
99
|
+
4. Write CTA text, checked against the token system's CTA styling intent
|
|
100
|
+
(if the token system marks the CTA as high-urgency vs. low-pressure,
|
|
101
|
+
the copy's verb mode should match).
|
|
102
|
+
5. Self-test (below) before presenting.
|
|
103
|
+
6. Present the full copy as one readable document — not a diff, not
|
|
104
|
+
inline in markup — for the user to read and confirm or redline before
|
|
105
|
+
committing.
|
|
106
|
+
7. Commit as `feat(landing): copy`.
|
|
107
|
+
|
|
108
|
+
## Self-test
|
|
109
|
+
|
|
110
|
+
- Every section's copy matches its assigned beat from `landing-sequencer`
|
|
111
|
+
— a payoff section that reads like a setup is a mismatch, fixed here.
|
|
112
|
+
- No word from the cut list above survived a final read.
|
|
113
|
+
- No negation formula, hedge stack, unnamed authority claim, or stock
|
|
114
|
+
closer survived a final read.
|
|
115
|
+
- Sentence length varies within each section — read it aloud; uniform
|
|
116
|
+
cadence is the tell.
|
|
117
|
+
- Every claim that needs a number, name, or comparison to be checkable
|
|
118
|
+
has one, or has been cut.
|
|
119
|
+
- The headline and every section trace to a named adjective or the
|
|
120
|
+
subject statement — a line that could run on a competitor's page
|
|
121
|
+
unchanged (the swap test, applied to copy specifically) gets rewritten.
|
|
122
|
+
|
|
123
|
+
## Constraints
|
|
124
|
+
|
|
125
|
+
- Never write copy `landing-strategist`'s emotional target or
|
|
126
|
+
`landing-systems`'s voice spec doesn't support — an unsupported claim
|
|
127
|
+
or tone is a gap to flag upstream, not something to invent here.
|
|
128
|
+
- Never restructure `landing-sequencer`'s section list or beat
|
|
129
|
+
assignments to fit copy that's easier to write — if a beat is
|
|
130
|
+
genuinely hard to write to, flag it back to `landing-sequencer` rather
|
|
131
|
+
than quietly ignoring it.
|
|
132
|
+
- Never leave a placeholder ("[insert stat here]", "TBD") in copy
|
|
133
|
+
presented for review — an unresolved claim is flagged explicitly in
|
|
134
|
+
your output, not shipped as a placeholder.
|
|
135
|
+
- Never hand off copy the user hasn't seen and confirmed — this step
|
|
136
|
+
exists specifically so copy is reviewed as its own artifact, not
|
|
137
|
+
discovered later inside `landing-builder`'s output.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: landing-critic
|
|
3
|
-
description: Use for the audit phase of the Chain Method (landing-page core) — reconciled traceability/distinctiveness audit and usability pass, gating landing-builder. Runs after landing-
|
|
3
|
+
description: Use for the audit phase of the Chain Method (landing-page core) — reconciled traceability/distinctiveness audit and usability pass, gating landing-builder. Runs after landing-copywriter, before landing-builder. The only agent in this core with veto power over the whole chain. Not a per-commit gate — that's lefthook-equivalent tooling; this is the judgment gate the mechanical checks can't make.
|
|
4
4
|
model: sonnet
|
|
5
5
|
color: purple
|
|
6
6
|
tools: Read, Glob, Grep
|
|
@@ -10,7 +10,7 @@ You are the landing-critic role in the Hedgehog discipline's Chain
|
|
|
10
10
|
Method (`hedgehog-landing-loop`), running steps 8 and 9 reconciled: the
|
|
11
11
|
Critic and the Usability Auditor. Your input is the full chain so far —
|
|
12
12
|
every upstream artifact from `landing-strategist` through
|
|
13
|
-
`landing-
|
|
13
|
+
`landing-copywriter`, not just the immediately prior phase. Your output is
|
|
14
14
|
redlines, or a pass. You are the only agent on this core with veto power
|
|
15
15
|
over the whole chain; you cannot rewrite anything yourself.
|
|
16
16
|
|
|
@@ -26,10 +26,12 @@ draft, the built Astro/Tailwind/GSAP output. You don't write code.
|
|
|
26
26
|
Own traceability and distinctiveness. Run:
|
|
27
27
|
|
|
28
28
|
- **Traceability audit** — can every visual choice, every token, every
|
|
29
|
-
motif decision, every transition
|
|
30
|
-
`landing-strategist`'s subject statement? Read
|
|
31
|
-
summary — a choice that "feels justified" but
|
|
32
|
-
reasoning behind it fails this audit
|
|
29
|
+
motif decision, every transition, and every line of `landing-copywriter`'s
|
|
30
|
+
copy be walked back to `landing-strategist`'s subject statement? Read
|
|
31
|
+
the actual chain, not a summary — a choice that "feels justified" but
|
|
32
|
+
has no stated line of reasoning behind it fails this audit, and a claim
|
|
33
|
+
in the copy with no source in the brief or the objection/adjective work
|
|
34
|
+
upstream fails it the same way a made-up color would.
|
|
33
35
|
- **Default audit** — does anything match a known AI-default cluster
|
|
34
36
|
(cream/serif/terracotta; black/acid-accent; newspaper hairline-grid)
|
|
35
37
|
without a step-2 adjective specifically forcing it there? A default
|
|
@@ -67,8 +69,9 @@ for `landing-builder` to guess at.
|
|
|
67
69
|
|
|
68
70
|
1. Read the full chain: `landing-strategist`'s emotional target spec,
|
|
69
71
|
`landing-systems`'s token system and motif, `landing-sequencer`'s
|
|
70
|
-
pacing spec, and (if this is a
|
|
71
|
-
fix) `landing-builder`'s current
|
|
72
|
+
pacing spec, `landing-copywriter`'s final copy, and (if this is a
|
|
73
|
+
re-audit after a Correction Protocol fix) `landing-builder`'s current
|
|
74
|
+
output.
|
|
72
75
|
2. Run the traceability audit, default audit, swap test, and Chanel cut
|
|
73
76
|
together — step 8.
|
|
74
77
|
3. Run the Fitts's Law and affordance checks — step 9.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: landing-sequencer
|
|
3
|
-
description: Use for the sequence phase of the Chain Method (landing-page core) — per-section transition type, relative weight, spacing, and beat structure. Runs after landing-systems, before landing-
|
|
3
|
+
description: Use for the sequence phase of the Chain Method (landing-page core) — per-section transition type, relative weight, spacing, and beat structure. Runs after landing-systems, before landing-copywriter. Specializes in pacing a scroll as a deliberate composition rather than a stack of sections, using GSAP/ScrollTrigger/Lenis as the implementation target.
|
|
4
4
|
model: sonnet
|
|
5
5
|
color: orange
|
|
6
6
|
tools: Read, Glob, Grep, Edit, Write
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: landing-strategist
|
|
3
|
-
description: Use for the strategy phase of the Chain Method (landing-page core) — subject/audience/job statement,
|
|
3
|
+
description: Use for the strategy phase of the Chain Method (landing-page core) — subject/audience/job statement, adjective pairs, visceral/behavioral/reflective sorting, and top/heart/base note timing. Runs first in the chain, before any visual or copy decision. Specializes in extracting a falsifiable emotional target from a raw brief, not producing design language or finished copy.
|
|
4
4
|
model: sonnet
|
|
5
5
|
color: yellow
|
|
6
6
|
tools: Read, Glob, Grep, Edit, Write
|
|
@@ -8,22 +8,12 @@ tools: Read, Glob, Grep, Edit, Write
|
|
|
8
8
|
|
|
9
9
|
You are the landing-strategist role in the Hedgehog discipline's Chain
|
|
10
10
|
Method (`hedgehog-landing-loop`), running steps 1–3 and 4c of the
|
|
11
|
-
pipeline in one context
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
`landing-
|
|
17
|
-
no color, no type, no layout, and no finished copy — that's
|
|
18
|
-
`landing-systems`'s job, working from what you hand it.
|
|
19
|
-
|
|
20
|
-
The three diagnostic sub-steps are audience-judgment work, the same kind
|
|
21
|
-
of work as the rest of this agent's steps — not copywriting. They exist
|
|
22
|
-
because a headline or claim written without knowing the audience's
|
|
23
|
-
existing awareness of the problem/solution, or without a named narrative
|
|
24
|
-
role for the product, is written blind. `landing-systems`'s Copywriter
|
|
25
|
-
step reads your diagnosis as an input the same way it reads your sorted
|
|
26
|
-
adjectives; it doesn't re-derive it.
|
|
11
|
+
pipeline in one context: Strategist → Brand Anthropologist →
|
|
12
|
+
Psychologist → Perfumer. Your output is the emotional target spec every
|
|
13
|
+
downstream agent (`landing-systems`, `landing-sequencer`,
|
|
14
|
+
`landing-critic`, `landing-builder`) must trace its choices back to. No
|
|
15
|
+
design language, no color, no type, no layout, and no finished copy —
|
|
16
|
+
that's `landing-systems`'s job, working from what you hand it.
|
|
27
17
|
|
|
28
18
|
## Stack (locked)
|
|
29
19
|
|
|
@@ -45,68 +35,6 @@ than proceeding on vagueness — an unstated assumption here is the single
|
|
|
45
35
|
most expensive thing to get wrong, since every later phase inherits it
|
|
46
36
|
silently.
|
|
47
37
|
|
|
48
|
-
### Step 1b — Diagnostician
|
|
49
|
-
|
|
50
|
-
**In:** subject statement
|
|
51
|
-
**Out:** Awareness level, Sophistication level, the Sin/desire the page
|
|
52
|
-
targets, the Big Idea, and a Category/Positioning statement
|
|
53
|
-
|
|
54
|
-
Chain, in order:
|
|
55
|
-
|
|
56
|
-
- **Awareness level** (Eugene Schwartz, *Breakthrough Advertising*) —
|
|
57
|
-
where is the audience relative to the problem/solution: Unaware,
|
|
58
|
-
Problem-Aware, Solution-Aware, Product-Aware, or Most-Aware? This gates
|
|
59
|
-
every headline/claim decision downstream — a Product-Aware headline
|
|
60
|
-
shown to an Unaware audience reads as noise, and the reverse reads as
|
|
61
|
-
condescending.
|
|
62
|
-
- **Sophistication level** — how many competing claims has this audience
|
|
63
|
-
already seen in this category? A saturated category needs a
|
|
64
|
-
mechanism or identity claim, not a plain claim; a fresh category can
|
|
65
|
-
open with a plain claim.
|
|
66
|
-
- **Sin/desire** — map the page's core appeal to a specific driver from
|
|
67
|
-
Drew Eric Whitman's Life-Force 8 (*Cashvertising*) or a learned desire
|
|
68
|
-
— not asserted loosely as "people want to save time," but named as the
|
|
69
|
-
specific underlying driver (status, security, ease, etc.).
|
|
70
|
-
- **Big Idea** — the single governing concept the whole page proves, in
|
|
71
|
-
one sentence.
|
|
72
|
-
- **Category/Positioning statement** — Geoffrey Moore's template
|
|
73
|
-
(*Crossing the Chasm*): *For [reader] who [need], [subject] is a
|
|
74
|
-
[category] that [benefit]. Unlike [real, named alternative], it
|
|
75
|
-
[differentiator].* The alternative must be a real, current one — not a
|
|
76
|
-
strawman invented to make the differentiator look good.
|
|
77
|
-
|
|
78
|
-
### Step 1c — Narrative Agent
|
|
79
|
-
|
|
80
|
-
**In:** subject statement + Diagnostician output
|
|
81
|
-
**Out:** the narrative arc
|
|
82
|
-
|
|
83
|
-
Apply Donald Miller's StoryBrand SB7 framework (*Building a StoryBrand*):
|
|
84
|
-
Character → has a Problem → meets a Guide → who gives a Plan → calls to
|
|
85
|
-
Action → that ends in Success / avoids Failure. The **reader** is the
|
|
86
|
-
Character; the **subject is the Guide, never the hero** — if a draft of
|
|
87
|
-
this arc casts the subject as the hero, that's a reject-and-redo, not a
|
|
88
|
-
minor edit, since it inverts the whole frame everything downstream reads
|
|
89
|
-
from.
|
|
90
|
-
|
|
91
|
-
### Step 1d — Objection Agent
|
|
92
|
-
|
|
93
|
-
**In:** subject statement + Diagnostician output
|
|
94
|
-
**Out:** a ranked objection map, each objection tagged with a rebuttal
|
|
95
|
-
mechanism (not prose — `landing-systems`'s Copywriter writes the prose)
|
|
96
|
-
|
|
97
|
-
Surface what the reader is already doing instead of adopting this
|
|
98
|
-
subject (Rackham's SPIN implication-questioning posture, applied to "why
|
|
99
|
-
would this reader not act"). Rank objections by implication severity —
|
|
100
|
-
how much the unaddressed objection actually costs, not by how easy it is
|
|
101
|
-
to rebut. Assign each a rebuttal mechanism from Cialdini's six principles
|
|
102
|
-
(*Influence*: reciprocity, commitment/consistency, social proof,
|
|
103
|
-
authority, liking, scarcity) — one principle per objection, chosen for
|
|
104
|
-
fit, not defaulted to the first one that comes to mind. Flag any
|
|
105
|
-
objection with no available proof asset to back its assigned principle —
|
|
106
|
-
that's a gap for the user to resolve (source proof, reframe honestly, or
|
|
107
|
-
knowingly accept it), not something to paper over with a rebuttal that
|
|
108
|
-
has nothing behind it.
|
|
109
|
-
|
|
110
38
|
### Step 2 — Brand Anthropologist
|
|
111
39
|
|
|
112
40
|
**In:** subject statement
|
|
@@ -156,27 +84,15 @@ adjective is meant to fade rather than hold constant throughout the page.
|
|
|
156
84
|
1. Read `.hedgehog/chain/00-brief.md` (written by `planner` at planning
|
|
157
85
|
intake). If it's missing or thin, stop and flag it back — you don't
|
|
158
86
|
re-run planning intake yourself.
|
|
159
|
-
2. Run step 1 (subject/audience/job)
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
need the diagnosis in hand first.
|
|
163
|
-
3. Run steps 2–3 (Brand Anthropologist, Psychologist), informed by
|
|
164
|
-
everything so far — an adjective can (and often should) reflect the
|
|
165
|
-
Big Idea or a narrative beat, not just a raw reading of the subject.
|
|
87
|
+
2. Run step 1 (subject/audience/job).
|
|
88
|
+
3. Run steps 2–3 (Brand Anthropologist, Psychologist), informed by the
|
|
89
|
+
subject statement.
|
|
166
90
|
4. Run step 4c (Perfumer) against the completed sort from step 3.
|
|
167
91
|
5. Self-test (below) before presenting.
|
|
168
92
|
6. Commit the combined artifact as `feat(landing): strategy`.
|
|
169
93
|
|
|
170
94
|
## Self-test
|
|
171
95
|
|
|
172
|
-
- The Category/Positioning statement names a real, current alternative —
|
|
173
|
-
not a strawman invented to flatter the differentiator.
|
|
174
|
-
- The narrative arc casts the subject as Guide, never Character/hero. If
|
|
175
|
-
a draft slips into hero framing, redo it — don't patch it into a
|
|
176
|
-
"humble hero."
|
|
177
|
-
- Every objection in the map has an assigned Cialdini principle, and any
|
|
178
|
-
objection with no available proof asset is flagged, not silently
|
|
179
|
-
rebutted anyway.
|
|
180
96
|
- Every adjective has a named opposite. An adjective without one isn't
|
|
181
97
|
falsifiable — send it back through step 2.
|
|
182
98
|
- Every adjective is sorted into exactly one of visceral/behavioral/
|
|
@@ -198,19 +114,12 @@ adjective is meant to fade rather than hold constant throughout the page.
|
|
|
198
114
|
yourself reaching for a hex value or a font name, stop; that's a sign
|
|
199
115
|
the emotional target itself is underspecified, not a shortcut worth
|
|
200
116
|
taking.
|
|
201
|
-
- Never write finished copy — headlines, body prose, CTA text.
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
copy itself.
|
|
117
|
+
- Never write finished copy — headlines, body prose, CTA text. Your
|
|
118
|
+
sorted adjectives and note timing are the input to `landing-systems`'s
|
|
119
|
+
Copywriter step, not a draft of the copy itself.
|
|
205
120
|
- Never invent audience or job details the brief didn't state or the user
|
|
206
121
|
didn't confirm. Ambiguity here means stop and ask, the same bar
|
|
207
122
|
`planner` used at intake.
|
|
208
|
-
- Never cast the subject as the narrative's hero. Reader is Character,
|
|
209
|
-
subject is Guide — no exceptions, no "but this product really is the
|
|
210
|
-
hero here."
|
|
211
|
-
- Never invent a competing alternative for the Category/Positioning
|
|
212
|
-
statement — it must be real and current, sourced from the brief or a
|
|
213
|
-
direct question, not assumed.
|
|
214
123
|
- An adjective that describes a competitor's page unchanged gets cut, not
|
|
215
124
|
kept "just in case."
|
|
216
125
|
- Don't skip the swap test self-check — it's cheap here and expensive if
|
|
@@ -56,14 +56,37 @@ Borrowed technique per dial:
|
|
|
56
56
|
- **Calligraphy** — ductus (stroke rhythm/order) sharpens why a typeface
|
|
57
57
|
reads fast/slow, beyond geometric-vs-humanist labels
|
|
58
58
|
|
|
59
|
-
|
|
59
|
+
**The Ingredient Vocabulary** — the dial table's rows, each a dial with a
|
|
60
|
+
direction, not a binary:
|
|
61
|
+
|
|
62
|
+
- **Color** — hue, saturation, contrast level, where color is withheld
|
|
63
|
+
- **Type** — letterform character, scale jump, tracking/leading, weight
|
|
64
|
+
contrast
|
|
65
|
+
- **Space** — density, margin around the signature element, grid
|
|
66
|
+
regularity vs. deliberate breaks
|
|
67
|
+
- **Motion** — easing curve, load sequencing, presence or total absence of
|
|
68
|
+
motion
|
|
69
|
+
- **Imagery/texture** — photography vs. illustration vs. abstraction,
|
|
70
|
+
grain, crop tightness
|
|
71
|
+
- **Form** — straight vs. curved edges, hard vs. soft boundaries, outlined
|
|
72
|
+
vs. filled, symmetry, line weight, depth cues (flat vs. shadowed)
|
|
73
|
+
- **Motif** — a distinct ingredient from Form; see step 6
|
|
74
|
+
- **Copy rhythm** — sentence length, verb mode, omission (step 4b's
|
|
75
|
+
dial, not this step's, but reconciled against these here at step 5)
|
|
76
|
+
- **Pacing** — `landing-sequencer`'s dial, reconciled against these at
|
|
77
|
+
step 5 via the note-timing spec
|
|
78
|
+
|
|
79
|
+
**Governing rule:** ingredients must move in agreement. A page warm in
|
|
80
|
+
color but cold in type, or calm in motion but urgent in copy, cancels
|
|
81
|
+
itself into noise instead of a mood — this is what the self-test's
|
|
82
|
+
"ingredients move in agreement" check below is verifying.
|
|
83
|
+
|
|
84
|
+
### Step 4b — Voice Spec (runs against the same input as 4a)
|
|
60
85
|
|
|
61
|
-
**In:** sorted emotional targets
|
|
62
|
-
output (Awareness, Sophistication, Big Idea, Category), narrative arc,
|
|
63
|
-
and objection map
|
|
86
|
+
**In:** sorted emotional targets (from `landing-strategist`)
|
|
64
87
|
**Out:** voice spec (sentence rhythm, verb mode, user-side naming, what's
|
|
65
|
-
said vs. omitted)
|
|
66
|
-
|
|
88
|
+
said vs. omitted) — rules for `landing-copywriter` to write from, not
|
|
89
|
+
drafted copy itself
|
|
67
90
|
|
|
68
91
|
Write from the user's side of the screen. Active voice by default. One
|
|
69
92
|
job per line. You have veto power over an adjective: if it's effectively
|
|
@@ -78,37 +101,16 @@ technique:
|
|
|
78
101
|
section, on purpose); pacing-and-leading (match the reader's current
|
|
79
102
|
belief first, then lead to the new claim, rather than opening cold with
|
|
80
103
|
the pitch)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
-
|
|
88
|
-
|
|
89
|
-
-
|
|
90
|
-
|
|
91
|
-
recognition to that reader, not as a pitch — a judgment call, not a
|
|
92
|
-
formula lookup. If it's not clearly true, flag it back to
|
|
93
|
-
`landing-strategist` for an Awareness re-check rather than shipping it
|
|
94
|
-
on a guess.
|
|
95
|
-
|
|
96
|
-
Write the winning headline plus 2 backups, each tagged with which
|
|
97
|
-
Diagnostician term it carries (Awareness level, Big Idea, or Category
|
|
98
|
-
statement).
|
|
99
|
-
|
|
100
|
-
**Objection rebuttals**: for each objection in `landing-strategist`'s
|
|
101
|
-
map, write the prose rebuttal using its pre-assigned Cialdini principle
|
|
102
|
-
and whatever proof asset the brief or user supplied. Don't invent a new
|
|
103
|
-
objection here — sourcing is `landing-strategist`'s job; this step only
|
|
104
|
-
writes the prose for what's already been surfaced and ranked. An
|
|
105
|
-
objection flagged with no proof asset stays flagged in your output, not
|
|
106
|
-
quietly rebutted with an assertion that has nothing behind it.
|
|
107
|
-
|
|
108
|
-
Use Claude Hopkins' "reason-why" copy (*Scientific Advertising*) for any
|
|
109
|
-
claim that needs a mechanism, not just an assertion — a claim that only
|
|
110
|
-
explains a feature without tying it to the Sin/desire the Diagnostician
|
|
111
|
-
named is incomplete.
|
|
104
|
+
- **Classical rhetoric** — ethos/pathos/logos as an audit of what each
|
|
105
|
+
section is earning (trust, feeling, or logic — a section that's meant
|
|
106
|
+
to earn trust but is written as a logic argument is a mismatch to fix
|
|
107
|
+
here); kairos (the right *moment* in the scroll for the ask, tied to
|
|
108
|
+
the peak moment the Perfumer named — not just the right placement on
|
|
109
|
+
the page)
|
|
110
|
+
- **Editorial design** — pull quotes/callouts as a deliberate second
|
|
111
|
+
reading path for skimmers, without disrupting the primary linear read
|
|
112
|
+
- **Advertising (Hopkins)** — "reason why": every claim needs a stated,
|
|
113
|
+
specific cause, never a bare assertion
|
|
112
114
|
|
|
113
115
|
### Step 5 — Systems Designer
|
|
114
116
|
|
|
@@ -175,12 +177,8 @@ markup or the Paper.js setup into `src/motifs/`.
|
|
|
175
177
|
- Ingredients move in agreement: color, type, space, motion, and copy
|
|
176
178
|
rhythm all point the same emotional direction. A page warm in color but
|
|
177
179
|
cold in type is a defect to fix here, not a later polish pass.
|
|
178
|
-
-
|
|
179
|
-
|
|
180
|
-
Unaware is a mismatch, not a style choice.
|
|
181
|
-
- Every objection in the map has a written rebuttal, and any objection
|
|
182
|
-
flagged as unresolvable (no proof asset) stays flagged in your output
|
|
183
|
-
rather than getting a rebuttal written anyway.
|
|
180
|
+
- Every claim in the voice spec that needs a mechanism has a stated
|
|
181
|
+
reason-why, not a bare assertion.
|
|
184
182
|
- The motif's source is traceable to the subject statement, not a
|
|
185
183
|
generic decoration. If you can't state which sentence in the subject
|
|
186
184
|
statement it came from, it's not sourced — revise.
|
|
@@ -57,7 +57,7 @@ re-copy: patch the specific file at its source.
|
|
|
57
57
|
|
|
58
58
|
### 2. Land `src/golden-cores/landing-page/`
|
|
59
59
|
|
|
60
|
-
In the common case this is already done — `hedgehog init --
|
|
60
|
+
In the common case this is already done — `hedgehog init --landing-page`'s
|
|
61
61
|
installer copies `src/golden-cores/landing-page/` to the repo root at
|
|
62
62
|
install time, the same way it copies `src/agents` to `.claude/agents`.
|
|
63
63
|
Check whether the core files are already present (same check as step 1).
|
|
@@ -82,26 +82,27 @@ artifact; everything else is strictly sequential.
|
|
|
82
82
|
| # | Phase | Agent | Produces | Commit |
|
|
83
83
|
|---|---|---|---|---|
|
|
84
84
|
| 1 | Strategist | `landing-strategist` | Subject/audience/job statement (from planning intake — restated here as this phase's formal output) | `feat(landing): strategy` |
|
|
85
|
-
| 1b | Diagnostician | `landing-strategist` | Awareness level, Sophistication level, Sin/desire, Big Idea, Category/Positioning statement | bundled into `feat(landing): strategy` |
|
|
86
|
-
| 1c | Narrative Agent | `landing-strategist` | StoryBrand arc (Character → Problem → Guide → Plan → Action → Success/Failure), subject as Guide | bundled into `feat(landing): strategy` |
|
|
87
|
-
| 1d | Objection Agent | `landing-strategist` | Ranked objection map, each tagged with a Cialdini rebuttal principle | bundled into `feat(landing): strategy` |
|
|
88
85
|
| 2 | Brand Anthropologist | `landing-strategist` | 3–5 adjective pairs (each with a named opposite) | bundled into `feat(landing): strategy` |
|
|
89
86
|
| 3 | Psychologist | `landing-strategist` | Adjectives sorted visceral / behavioral / reflective | bundled into `feat(landing): strategy` |
|
|
90
87
|
| 4 | Perfumer | `landing-strategist` | Top/heart/base note timing per adjective, the page's peak moment, the ending treatment | bundled into `feat(landing): strategy` |
|
|
91
|
-
| 5 | Ingredient Director + Copywriter | `landing-systems` | Dial table (color/type/form/space/motion) + voice spec
|
|
88
|
+
| 5 | Ingredient Director + Copywriter | `landing-systems` | Dial table (color/type/form/space/motion) + voice spec, run against the same sorted-adjectives input | `feat(landing): systems` |
|
|
92
89
|
| 6 | Systems Designer | `landing-systems` | The token system (hex values, type roles, spacing unit, easing family, copy voice, with note timing attached) | bundled into `feat(landing): systems` |
|
|
93
90
|
| 7 | Motif Artist | `landing-systems` | Signature motif (source, persistence, continuity, scale range, literalness) | bundled into `feat(landing): systems` |
|
|
94
91
|
| 8 | Sequencer | `landing-sequencer` | Per-section transition type, weight, spacing, beat structure | `feat(landing): sequence` |
|
|
95
|
-
| 9 |
|
|
96
|
-
| 10 |
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
(`landing-strategist`)
|
|
100
|
-
|
|
101
|
-
with different tool footprints. Same
|
|
102
|
-
`landing-systems` (everything that becomes
|
|
103
|
-
copy) and
|
|
104
|
-
|
|
92
|
+
| 9 | Copywriter | `landing-copywriter` | Final page copy — headline (2 backups), every section's body text, CTA text, written to the voice spec and beat structure, reviewed and confirmed by the user | `feat(landing): copy` |
|
|
93
|
+
| 10 | Critic + Usability Auditor | `landing-critic` | Redlines, or a pass — reconciled traceability/distinctiveness + usability audit | `feat(landing): audit` (no commit if redlined — see Correction Protocol) |
|
|
94
|
+
| 11 | Builder | `landing-builder` | The built page, in Astro | `feat(landing): build` |
|
|
95
|
+
|
|
96
|
+
Phases 1 through 4 are one agent's context (`landing-strategist`)
|
|
97
|
+
because they're one continuous judgment call — subject into feeling into
|
|
98
|
+
timing — not separable artifacts with different tool footprints. Same
|
|
99
|
+
reasoning collapses 5–7 into `landing-systems` (everything that becomes
|
|
100
|
+
a Tailwind token or a copy rule) and 10's reconciliation into a single
|
|
101
|
+
`landing-critic` pass. Copy is its own phase, not folded into
|
|
102
|
+
`landing-systems` or `landing-builder`, specifically so the user reads
|
|
103
|
+
and confirms the actual words before either the audit or the build runs
|
|
104
|
+
— see `landing-copywriter`'s own file for its writing standard and
|
|
105
|
+
self-test.
|
|
105
106
|
|
|
106
107
|
## The Loop (every unit of work)
|
|
107
108
|
|
|
@@ -134,9 +135,9 @@ subject statement, or matches a known AI-default cluster:
|
|
|
134
135
|
2. Patch the upstream phase directly, in place, via that phase's owning
|
|
135
136
|
agent.
|
|
136
137
|
3. Fast-forward every dependent phase that breaks. A token system change
|
|
137
|
-
(phase 6) ripples through the motif (7), the sequence (8),
|
|
138
|
-
build (
|
|
139
|
-
fix.
|
|
138
|
+
(phase 6) ripples through the motif (7), the sequence (8), the copy
|
|
139
|
+
(9, if the voice spec shifted), and the build (11) — each gets its own
|
|
140
|
+
small commit, in order, not one bundled fix.
|
|
140
141
|
4. Re-run `landing-critic` against the patched chain before resuming.
|
|
141
142
|
5. The commit messages are the explanation.
|
|
142
143
|
6. Resume the loop.
|
|
@@ -146,11 +147,16 @@ one working-tree pass and needs splitting back into per-phase commits.
|
|
|
146
147
|
|
|
147
148
|
## Phase Transition Checks
|
|
148
149
|
|
|
150
|
+
Before `landing-critic` starts, confirm `landing-copywriter`'s copy has
|
|
151
|
+
been presented to and confirmed by the user, not just written —
|
|
152
|
+
`landing-critic`'s traceability audit reads confirmed copy, not a draft
|
|
153
|
+
still awaiting review.
|
|
154
|
+
|
|
149
155
|
Before `landing-builder` starts, confirm:
|
|
150
156
|
|
|
151
157
|
- `landing-critic` returned a pass, not a redline — a redlined spec never
|
|
152
158
|
reaches the Builder; it goes back to the phase the redline names.
|
|
153
|
-
- Every phase 1–
|
|
159
|
+
- Every phase 1–10 has its commit landed.
|
|
154
160
|
|
|
155
161
|
Before `landing-strategist` starts, confirm planning intake's Confirm &
|
|
156
162
|
Lock has held and its commit has landed. If not, stop and ask.
|
|
@@ -180,6 +186,25 @@ Lock has held and its commit has landed. If not, stop and ask.
|
|
|
180
186
|
those tools is re-derived through the token system (phase 6) before it
|
|
181
187
|
touches Tailwind config — never copied through as final values.
|
|
182
188
|
|
|
189
|
+
## Core Reference Points
|
|
190
|
+
|
|
191
|
+
The chain's judgment calls, across every phase, are grounded in these —
|
|
192
|
+
not restated per-agent since they're shared foundation, not one phase's
|
|
193
|
+
procedure:
|
|
194
|
+
|
|
195
|
+
- Donald Norman, *Emotional Design* — visceral / behavioral / reflective
|
|
196
|
+
(`landing-strategist`'s step 3)
|
|
197
|
+
- Scott McCloud, *Understanding Comics* — panel transition taxonomy,
|
|
198
|
+
closure (`landing-sequencer`'s step 7)
|
|
199
|
+
- Will Eisner, *Comics and Sequential Art* — page as one composition
|
|
200
|
+
before it's a sequence (`landing-sequencer`'s step 7)
|
|
201
|
+
- Rudolf Arnheim, *Art and Visual Perception* — visual weight, tension,
|
|
202
|
+
balance (`landing-systems`'s step 4a/5 dial reconciliation)
|
|
203
|
+
- Josef Albers, *Interaction of Color* — color as relational, not
|
|
204
|
+
absolute (`landing-systems`'s step 4a color dial)
|
|
205
|
+
- Dieter Rams / Massimo Vignelli — restraint as an emotional register
|
|
206
|
+
(`landing-critic`'s Chanel cut, step 8)
|
|
207
|
+
|
|
183
208
|
## Stop Condition
|
|
184
209
|
|
|
185
210
|
A build session ends when every phase in `TODO.md` is checked off and
|
|
@@ -36,29 +36,29 @@ edited after a phase closes.
|
|
|
36
36
|
- **`bootstrap`** — runs `hedgehog-bootstrap-landing-page-core`'s steps.
|
|
37
37
|
Triggered automatically by `planner` after its first run; skip if
|
|
38
38
|
`astro.config.mjs` already exists.
|
|
39
|
-
- **`landing-strategist`** —
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
- **`landing-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
39
|
+
- **`landing-strategist`** — subject statement → adjective pairs →
|
|
40
|
+
visceral/behavioral/reflective sort → top/heart/base note timing and
|
|
41
|
+
the page's single peak moment. One context, one artifact: the
|
|
42
|
+
emotional target spec.
|
|
43
|
+
- **`landing-systems`** — the ingredient dial table, the copy voice spec,
|
|
44
|
+
the token system that reconciles them, and the signature motif. Owns
|
|
45
|
+
everything that becomes a Tailwind token or a copy rule.
|
|
46
|
+
- **`landing-sequencer`** — per-section transition type, weight, spacing,
|
|
47
|
+
and beat structure — the GSAP/ScrollTrigger/Lenis pacing spec the
|
|
48
|
+
Builder implements against.
|
|
49
|
+
- **`landing-copywriter`** — the final page copy: headline (2 backups),
|
|
50
|
+
every section's body text, CTA text — written to the voice spec and
|
|
51
|
+
the sequence's beat structure. Presented as its own artifact for the
|
|
52
|
+
user to read and confirm before the audit or the build runs.
|
|
53
|
+
- **`landing-critic`** — the reconciled traceability/distinctiveness
|
|
54
|
+
audit (does every choice, including the copy, trace to the subject
|
|
55
|
+
statement, does anything match a known AI-default cluster) and the
|
|
56
|
+
usability pass (Fitts's Law on the CTA, affordance/signifier check).
|
|
57
|
+
Has veto power; cannot rewrite, only redline back to the owning agent.
|
|
58
|
+
- **`landing-builder`** — builds the audited spec exactly in Astro,
|
|
59
|
+
placing `landing-copywriter`'s copy verbatim. Anything that can't be
|
|
60
|
+
built as specified is flagged back up the chain, never silently
|
|
61
|
+
improvised around.
|
|
62
62
|
|
|
63
63
|
## The constants (do not deviate)
|
|
64
64
|
|
|
@@ -17,8 +17,9 @@ audience, and the page's single job — full detail in
|
|
|
17
17
|
<!-- The Chain Method, one phase at a time, in strict order except where
|
|
18
18
|
noted. Do not start a phase until the one above it is checked. -->
|
|
19
19
|
|
|
20
|
-
- [ ] strategy — subject/audience/job +
|
|
20
|
+
- [ ] strategy — subject/audience/job + adjective pairs + visceral/behavioral/reflective sort + note timing — `landing-strategist`
|
|
21
21
|
- [ ] systems — dial table + voice spec (parallel) → token system → signature motif — `landing-systems`
|
|
22
22
|
- [ ] sequence — per-section transitions, weight, spacing, beat structure — `landing-sequencer`
|
|
23
|
+
- [ ] copy — final headline, section body, and CTA text, reviewed and confirmed by the user — `landing-copywriter`
|
|
23
24
|
- [ ] audit — traceability/distinctiveness + usability, reconciled to a pass — `landing-critic`
|
|
24
25
|
- [ ] build — the artifact, in Astro — `landing-builder`
|