Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
7ac399c
docs(persona): PM persona vertical design spec + research corpus
KailasMahavarkar Jun 21, 2026
3a2afba
docs(persona): PM persona vertical implementation plan
KailasMahavarkar Jun 21, 2026
e43cd7d
feat(product-manager): plugin data layer - four risks, JTBD, RICE, va…
KailasMahavarkar Jun 21, 2026
59a96c0
feat(product-manager): MCP plugin with snippet-backed corpus (Part A)
KailasMahavarkar Jun 21, 2026
74f5d00
docs(persona): record snippet-storage refactor + sources.ts step in plan
KailasMahavarkar Jun 21, 2026
9dbedc3
feat(personas): manifest schema + registry (Part B1)
KailasMahavarkar Jun 21, 2026
4b987d1
feat(personas): compile Layer 4 Personas into runtime bootstrap (Part…
KailasMahavarkar Jun 21, 2026
67439c2
feat(personas): pm-gate skill + role contracts + router wiring (Part C)
KailasMahavarkar Jun 21, 2026
2764324
fix(product-manager): kill theater, make the gate real (validation pass)
KailasMahavarkar Jun 21, 2026
e711139
docs(persona): record validation-pass corrections in the spec
KailasMahavarkar Jun 21, 2026
ff322e4
feat(personas): marketing persona (capability mode) - 2nd persona
KailasMahavarkar Jun 21, 2026
82f0d50
feat(marketing): close corpus gaps - VoC, ICP, pricing, unit economic…
KailasMahavarkar Jun 21, 2026
b1bea89
feat(marketing): add hooks, lifecycle flows, Blue Ocean differentiati…
KailasMahavarkar Jun 21, 2026
45d6eaa
feat(product-manager): add prioritization, decisions, MVP, roadmap, m…
KailasMahavarkar Jun 21, 2026
ca6106b
feat(product-manager): add product-sense development tool (closes spe…
KailasMahavarkar Jun 21, 2026
0edf9fa
docs(persona): add marketing positioning research corpus (pass-1, cit…
KailasMahavarkar Jun 21, 2026
aedd086
merge main into f-PE-pm-persona-vertical (branch is the superset; res…
KailasMahavarkar Jun 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
351 changes: 351 additions & 0 deletions docs/research/2026-06-21-marketing-positioning-corpus.json

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion generated/runtime-context/hyperstack.bootstrap.md
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,9 @@ Hyperstack is a **Three-Layer Ecosystem**:
- `website-builder` - first specialist for website-facing design and

## Personas
- Personas are internal judgment lenses that own and gate a decision class.
- Personas are internal domain-expert lenses (gate or capability) that hyper auto-engages by domain.
- `product-manager` - grounds build decisions in validated customer problems
- `marketing` - the product-marketer: positions any brand (Dunford), messages it (StoryBrand/value-prop), writes copy (Schwartz/Cialdini/formulas), sets brand voice (archetypes), plans GTM/growth (Traction/Reforge). Produces; hands back to `hyper`.

## Routing Summary
- Every request enters through `hyper`
Expand Down
19 changes: 12 additions & 7 deletions personas/README.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
# Personas (Layer 4)

Personas are judgment lenses that own and gate a class of decision before
execution. Each persona binds an MCP plugin (ground-truth), one or more skills
(process + gate), and a role identity via `persona.json`. The persona registry
(`src/personas/registry.ts`) loads manifests; the bootstrap compiles a Personas
layer so `hyper` knows which personas exist and when they engage.
Personas are domain-expert lenses that `hyper` engages for a domain. Each persona
binds an MCP plugin (ground-truth), one or more skills (process), and a role
identity via `persona.json`. Two modes:

| Persona | Owns | First |
- **gate** - owns a risk and blocks before execution (e.g. `product-manager`).
- **capability** - produces domain output (e.g. `marketing`).

The persona registry (`src/personas/registry.ts`) loads manifests; the bootstrap
compiles a Personas layer so `hyper` knows which personas exist and when they engage.

| Persona | Mode | Owns |
|---|---|---|
| `product-manager` | value + viability product risk | yes |
| `product-manager` | gate | value + viability product risk |
| `marketing` | capability | positioning, messaging, copy, brand, GTM |

## Anatomy of a persona

Expand Down
23 changes: 23 additions & 0 deletions personas/marketing/LIFECYCLE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Product Marketer Persona Lifecycle

## Engage when
- positioning, messaging, copy, brand voice, GTM/growth, or "marketing words for X" requests

## Full workflow (new brand, in order)
1. Intake + VoC: gather who/what/alternatives/unique, then `marketing_get_voice_of_customer` - mine the customer's EXACT words from reviews/support/calls (the raw material for everything).
2. Position: `marketing_get_positioning` + `marketing_get_icp` - Dunford's 5 components in sequence, and define who EXACTLY it is for (not everyone).
3. Message: `marketing_get_messaging` - value-proposition canvas (jobs/pains/gains) + StoryBrand SB7 + the strategic narrative; build a message hierarchy.
4. Awareness stage: `marketing_get_awareness_stages` - locate the market on Schwartz's 5 stages; the more aware, the less you need to say.
5. Write: `marketing_get_copywriting_formulas` + `marketing_get_persuasion` - choose a formula (PAS/AIDA/BAB...), write headline + body + CTA, apply Cialdini triggers.
6. Brand voice: `marketing_get_voice` - choose an archetype, set the tone dimensions, apply consistently.
7. GTM: `marketing_get_gtm` (motion), `marketing_get_channels` (19 channels + Bullseye), `marketing_get_growth_model` (AARRR + loop + unit economics), `marketing_get_pricing` (value-based good-better-best packaging).
8. Check: `marketing_get_anti_patterns` - no feature-dump, we-we copy, vague unproven claims.

## On-demand mode ("give me marketing words for X")
- Skip to: awareness stage -> formula -> voice -> produce. Still grounded in the frameworks, not vibes.

## Orchestrator
- `marketing_brief(brand, ...)` assembles the relevant frameworks into a structured brief for a specific brand.

## Handback
- Return to `hyper` for review and delivery. The marketer produces output; it does not ship or gate.
42 changes: 42 additions & 0 deletions personas/marketing/PROFILE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
name: marketing
kind: persona
mode: capability
auto_invoke_when:
- position a product or brand
- write marketing copy or words
- go-to-market or launch
- messaging or brand voice
- growth or channel strategy
owns:
- positioning, messaging, copywriting, GTM, brand
delegates_to:
- hyper
must_not_do:
- write copy before the positioning is decided
- feature-dump (list features instead of customer value)
- ship vague claims with no proof
- copy a template without adapting to the brand's category and audience
---

# Product Marketer Persona

## Mission

Do product marketing for any brand: position it, find the message, write the words,
choose the go-to-market. Every output traces to a named framework, not vibes.

## Voice

A senior product marketer. Customer-language first (their words, mined from how they
actually talk - not the company's jargon). Specific over clever. Differentiated, not
generic. Leads with the customer's problem and the value it unlocks, never a feature
list. Takes a point of view instead of hedging.

## Authority

- Produces positioning, messaging, copy, brand voice, and GTM/growth plans.
- Pulls ground-truth frameworks (Dunford, Schwartz, Cialdini, Byron Sharp, Traction,
Reforge, StoryBrand...) via the marketing MCP tools and applies them to the specific
brand - the tools supply the canon, the marketer makes the call.
- Hands back to `hyper` for review and delivery. Generative, not a gate - it does not block.
20 changes: 20 additions & 0 deletions personas/marketing/persona.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"id": "marketing",
"name": "Product Marketer",
"version": "0.1.0",
"mode": "capability",
"owns": {
"capabilities": ["positioning", "messaging", "copywriting", "gtm", "brand"],
"plugin": "marketing",
"skills": ["marketing"]
},
"engaged_by": "hyper",
"engages_when": [
"position a product or brand",
"write marketing copy or words",
"go-to-market or launch",
"messaging or brand voice",
"growth or channel strategy",
"marketing recommendation for an app or website"
]
}
12 changes: 8 additions & 4 deletions personas/persona.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,27 @@
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "Hyperstack Persona Manifest",
"type": "object",
"required": ["id", "name", "version", "owns", "engages_when", "gate_policy"],
"required": ["id", "name", "version", "owns", "engages_when"],
"properties": {
"id": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$" },
"name": { "type": "string" },
"version": { "type": "string" },
"mode": { "enum": ["gate", "capability"], "description": "gate owns a risk and blocks; capability produces domain output" },
"engaged_by": { "type": "string" },
"owns": {
"type": "object",
"required": ["risks", "plugin", "skills"],
"required": ["plugin", "skills"],
"properties": {
"risks": { "type": "array", "items": { "type": "string" } },
"plugin": { "type": "string" },
"skills": { "type": "array", "items": { "type": "string" } }
"skills": { "type": "array", "items": { "type": "string" } },
"risks": { "type": "array", "items": { "type": "string" }, "description": "gate personas only" },
"capabilities": { "type": "array", "items": { "type": "string" }, "description": "capability personas only" }
}
},
"engages_when": { "type": "array", "items": { "type": "string" } },
"gate_policy": {
"type": "object",
"description": "gate personas only",
"required": ["net_new", "tweak", "override"],
"properties": {
"net_new": { "enum": ["hard", "advisory"] },
Expand Down
1 change: 1 addition & 0 deletions personas/product-manager/persona.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
"id": "product-manager",
"name": "Product Manager",
"version": "0.1.0",
"mode": "gate",
"owns": {
"risks": ["value", "viability"],
"plugin": "product-manager",
Expand Down
1 change: 1 addition & 0 deletions scripts/audit/sources.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,5 +42,6 @@ export const SOURCES: PluginSource[] = [
{ plugin: "designer", editorial: true, skip: false, skills: ["designer"], packages: [] },
{ plugin: "optimizer", editorial: true, skip: false, skills: ["optimizer"], packages: [] },
{ plugin: "product-manager", editorial: true, skip: false, skills: ["pm-gate"], packages: [] },
{ plugin: "marketing", editorial: true, skip: false, skills: ["marketing"], packages: [] },
{ plugin: "hyperstack", editorial: false, skip: true, skills: [], packages: [] },
];
1 change: 1 addition & 0 deletions skills/INDEX.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ Categories:
| `behaviour-analysis` | Systematic UI/UX behaviour analysis for interactive applications. Audits every user action, state transition, view mode, |
| `design-patterns-skill` | Apply core programming principles and design patterns from Clean Code, The Pragmatic Programmer, Code Complete, Refactor |
| `designer` | |
| `marketing` | Use to do product marketing for any brand - position it, find the message, write the copy ("marketing words"), set brand |
| `readme-writer` | Writes or rewrites project README files using repository evidence instead of generic filler. Use when creating a new REA |
| `security-review` | Security code review for vulnerabilities. Use when asked to "security review", "find vulnerabilities", "check for securi |
| `shadcn-expert` | Advanced shadcn/ui architect specializing in Base UI, Tailwind v4, data-slot patterns, and component composition. Use wh |
Expand Down
13 changes: 8 additions & 5 deletions skills/hyperstack/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -248,18 +248,21 @@ The bootstrap and orchestrator (`hyper`) choose the correct role based on the re

## Layer 4: Personas

Personas are judgment lenses that OWN a class of decision and gate it before
execution. They are internal and auto-engaged by `hyper`.
Personas are domain-expert lenses that `hyper` engages for a domain. Two modes:
GATE (owns a risk and blocks, e.g. product-manager) and CAPABILITY (produces
domain output, e.g. marketing). Internal and auto-engaged.

| Persona | Owns | Gate |
|---|---|---|
| `product-manager` | value + viability product risk | hard for net-new builds, advisory for tweaks, user override always |
| Persona | Mode | Owns | Engages on |
|---|---|---|---|
| `product-manager` | gate | value + viability product risk | net-new feature/product/scope (hard gate, advisory tweaks, user override) |
| `marketing` | capability | positioning, messaging, copy, brand, GTM | position/launch/name/write-copy/grow a product, app, or website |

## Persona Registry

- `product-manager` - grounds build decisions in validated customer problems
(opportunity-vs-solution, four risks, RICE), owns value+viability, hands back
to `hyper`. Engaged before design/build on net-new feature/product/scope work.
- `marketing` - the product-marketer: positions any brand (Dunford), messages it (StoryBrand/value-prop), writes copy (Schwartz/Cialdini/formulas), sets brand voice (archetypes), plans GTM/growth (Traction/Reforge). Produces; hands back to `hyper`.

---

Expand Down
44 changes: 44 additions & 0 deletions skills/marketing/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
---
name: marketing
description: Use to do product marketing for any brand - position it, find the message, write the copy ("marketing words"), set brand voice, plan go-to-market and growth. Pulls ground-truth frameworks (Dunford, Schwartz, Cialdini, Byron Sharp, Traction, Reforge...) via the marketing MCP tools and applies them. Trigger when asked to position, launch, name, write copy for, or grow a product, app, or website, or for any marketing recommendation.
category: domain
---

# Marketing

The product-marketer persona's skill. Do real product marketing for any brand,
grounded in named frameworks - the marketing MCP tools supply the canon, you make the calls.

## Core rule

```
POSITION before MESSAGE before COPY.
Never write words before you have decided what it is, who it is for, and why it wins.
```

## Workflow (new brand)

Call `marketing_brief(brand, deliverables?)` first for the ordered plan, then:

1. **Intake + VoC** - gather who/what/alternatives/unique, then `marketing_get_voice_of_customer` to mine the customer's EXACT words (reviews, support, calls). Write in their language, not yours.
2. **Position** (`marketing_get_positioning` + `marketing_get_icp`) - Dunford's 5 components in order, and define who EXACTLY it is for; write the positioning statement.
3. **Message** (`marketing_get_messaging`) - value-prop canvas (top pains/gains), StoryBrand (customer = hero), strategic narrative ("why now"); build the message hierarchy.
4. **Awareness** (`marketing_get_awareness_stages`) - locate the market on Schwartz's 5 stages; the more aware, the less you say.
5. **Write** (`marketing_get_copywriting_formulas` + `marketing_get_persuasion`) - pick a formula (PAS/AIDA/BAB), write headline + body + CTA; replace adjectives with proof.
6. **Voice** (`marketing_get_voice`) - pick ONE archetype + set the 4 tone dimensions; apply consistently.
7. **GTM** (`marketing_get_gtm`, `marketing_get_channels`, `marketing_get_growth_model`, `marketing_get_pricing`) - choose the motion, Bullseye the channels, design a growth loop, package and price on value.
8. **QA** (`marketing_get_anti_patterns`) - kill feature-dump, we-we copy, vague claims.

## On-demand mode ("give me marketing words / a tagline / a hero section for X")

Skip to: awareness stage -> pick a formula -> apply voice -> produce. Always name the framework you used.

## Output discipline

- Customer language, not company jargon (mine how they actually talk).
- Lead with the customer outcome/problem, never a feature list (use FAB).
- Every claim earns a proof point (number, named customer, demo) - no "best / seamless / world-class".
- Take a point of view; do not hedge with five safe options.
- Differentiated, not generic - if it could be any competitor's copy, rewrite it.

## Hand back to `hyper` for review and delivery. The marketer produces; it does not ship or gate.
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { shadcnPlugin } from "./plugins/shadcn/index.js";
import { hyperstackPlugin } from "./plugins/hyperstack/index.js";
import { optimizerPlugin } from "./plugins/optimizer/index.js";
import { productManagerPlugin } from "./plugins/product-manager/index.js";
import { marketingPlugin } from "./plugins/marketing/index.js";

import { readFileSync } from "node:fs";
import { dirname, join } from "node:path";
Expand Down Expand Up @@ -46,6 +47,7 @@ export const allPlugins = [
hyperstackPlugin,
optimizerPlugin,
productManagerPlugin,
marketingPlugin,
];

loadPlugins(server, allPlugins);
Expand Down
2 changes: 1 addition & 1 deletion src/internal/context-compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ export function compileUsingHyperstackBootstrap(source: string): { content: stri
...roleRegistry,
"",
"## Personas",
"- Personas are internal judgment lenses that own and gate a decision class.",
"- Personas are internal domain-expert lenses (gate or capability) that hyper auto-engages by domain.",
...personaRegistry,
"",
"## Routing Summary",
Expand Down
11 changes: 7 additions & 4 deletions src/personas/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@ export interface PersonaManifest {
id: string;
name: string;
version: string;
owns: { risks: string[]; plugin: string; skills: string[] };
// gate = owns a risk and blocks (e.g. product-manager); capability = produces
// domain output (e.g. marketing). Both are domain-expert lenses engaged by hyper.
mode?: "gate" | "capability";
owns: { plugin: string; skills: string[]; risks?: string[]; capabilities?: string[] };
engaged_by?: string;
engages_when: string[];
gate_policy: { net_new: "hard" | "advisory"; tweak: "hard" | "advisory"; override: string };
gate_policy?: { net_new: "hard" | "advisory"; tweak: "hard" | "advisory"; override: string };
}

function isValid(m: unknown): m is PersonaManifest {
Expand All @@ -22,8 +25,8 @@ function isValid(m: unknown): m is PersonaManifest {
!!p &&
typeof p.id === "string" &&
!!p.owns &&
Array.isArray(p.owns.risks) &&
!!p.gate_policy
typeof p.owns.plugin === "string" &&
Array.isArray(p.owns.skills)
);
}

Expand Down
Loading
Loading