persona-roster-expander — Claude Code skill: how to install
Turns a seed list of personas into a tiered, judgment-mapped cast bounded by safety rules and exports the structure to a JSON file.
npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a claude-codeWhat persona-roster-expander does
The skill takes a seed roster, a decision domain, and a mandatory tiering constraint provided by the user. Each persona is assigned a strict tier (such as quote-only relay versus framed perspective) that limits what it can assert. Every adversarial voice is paired with a constructive counter-voice so that devil's-advocate roles never take the final turn.
To fill missing decision lenses, the skill suggests 2 to 4 extra roles. It delegates name generation to the persona-innovator agent and uses WebSearch to find verifiable anchors for the top candidates. Any proposed voice lacking a resolvable citation receives an explicit stub: prefix.
The process halts if you do not provide a domain safety rule, because the skill strictly avoids fabricating authority. The finalized cast is never left as plain chat text; it is verified by writing directly to a loadable file like personas.json.
What it helps with
- assign authority tiers to personas using explicit domain safety rules
- map character archetypes to concrete engineering decision lenses
- propose missing roles backed by verifiable external references
- export validated persona rosters directly to personas.json
Example prompts for the agent
- expand the persona roster and keep it faithful to our security policy
- /persona-roster-expander seed personas + domain + safety rule
- take these character archetypes and tell me what engineering judgment each one provides
How to install persona-roster-expander
1Skills CLI (Vercel)
npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a claude-code2Manually: put the files in place
~/.claude/skills/persona-roster-expander/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/persona-roster-expander/
1Skills CLI (Vercel)
npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a codex2Manually: put the files in place
.agents/skills/persona-roster-expander/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a cursor2Manually: put the files in place
.cursor/skills/persona-roster-expander/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install chrono-meta/forge-harness persona-roster-expander2Manually: put the files in place
.github/skills/persona-roster-expander/SKILL.md1Skills CLI (Vercel)
npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a gemini-cli2Platform CLI
gemini skills install https://github.com/chrono-meta/forge-harness --path plugins/fh-meta/skills/persona-roster-expanderManually: put the files in place
.devin/skills/persona-roster-expander/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about persona-roster-expander
How to install persona-roster-expander in Claude Code?
Install the skill using npx skills add chrono-meta/forge-harness --skill persona-roster-expander -a claude-code.
What does persona-roster-expander do?
It classifies persona seeds into permission tiers, binds each persona to a domain decision lens, and writes the structured cast to disk.
Why is the domain safety rule required upfront?
Without a caller-provided rule, personas tend to invent authority beyond domain boundaries, so the skill stops and requests an explicit constraint before proceeding.
Source text
SKILL.md · MIT
---
name: persona-roster-expander
description: Expands a named persona seed into a tiered, judgment-mapped cast — tiering each persona by a domain safety rule, mapping each to a decision-lens in the user's vocabulary, then proposing additional voices with sourced anchors.
user-invocable: true
allowed-tools: ["Read", "Grep", "WebSearch", "WebFetch", "Write", "Agent"]
model: sonnet
---
# persona-roster-expander
Takes a seed set of named personas and turns it into a usable judgment cast: each persona tiered by a
domain safety rule, mapped to a concrete decision-lens, plus a few proposed additions filling
uncovered lenses with real anchors. An innovator-family skill — generative, but bounded by a
caller-supplied safety rule so the expansion stays faithful to the domain's constraints.
> Origin: harvested from the-bible (2026-06-20) — an operator persona seed (priest/nun/angel/devil/
> God/Jesus/Holy-Spirit/apostles) tiered relay-vs-lens by a relay-safety rule and mapped to
> engineering-judgment lenses, +4 sourced proposals. **The grounds, inline, because the harvest
> record does not ship**: an ungated persona cast drifts into inventing its own authority — a voice
> given a lens will speak past what the domain lets it assert — so tiering by a *caller-supplied*
> rule is what keeps the expansion faithful, and the lens mapping is what makes a named voice
> usable as a decision instrument instead of flavor. Full harvest record — **hub-local, not
> distributed in the npm package**:
> `tracks/_contrib/field_harvest_2026-06-20_gate-locality-and-grounding-capabilities.md`.
## Triggers
- "broaden these personas" / "what other voices fit this cast"
- "map these roles to a decision lens"
- "expand the persona roster and keep it faithful to <rule>"
- `/persona-roster-expander {seed personas + domain + safety rule}`
### Natural Language Triggers (example user phrases)
- "내가 명명한 페르소나 후보군을 더 넓혀줘, 판단 매핑이랑 같이"
- "take these character archetypes and tell me what engineering judgment each one provides"
- "add a few more voices that cover a perspective these don't"
## Steps
1. **Collect the seed + the safety rule** — the named personas, the domain (what decisions they
reflect on), and the caller-supplied **tiering rule** (the hard constraint that decides what each
persona is allowed to do). Without an explicit safety rule, ask for one — do not invent authority.
2. **Tier each persona** by the safety rule (e.g. relay/quote-only vs lens/framed-perspective). State
a one-line justification per persona; the tier caps what the persona may emit.
3. **Map each to a decision-lens** in the **user's domain vocabulary** — what concrete judgment-
perspective does this voice provide, and when to invoke it. Pair any adversarial voice with a
constructive counter-voice (no adversary as the last word).
4. **Propose 2–4 additions** filling lenses the seed doesn't cover (delegate net-new *name*
generation to the `persona-innovator` agent — this skill's distinct value is the tiering +
lens-mapping, not naming). For the strongest 2–3, find a real anchor (a sourced
example/reference); **any remaining proposal ships with a literal `stub:` prefix** — unanchored
and unlabeled is not an allowed output (see Done When).
5. **Emit the tiered, lens-mapped cast** (named + proposed) by **writing it to a structured file**
the system can load (e.g. `personas.json`), then confirm the written file parses. Leaving the
cast in the response text only does not complete this step.
## Done When
- **Every persona has a tier + lens label + invoke-condition.** *Check class: mandatory-pass (binary — all three fields present per persona).*
- **Every proposal is either anchored or explicitly labeled a stub.** An anchored proposal names a source/reference that resolves; a proposal without one is emitted with a literal `stub:` prefix and is **not counted as a candidate**. *Check class: mandatory-pass (binary — each proposal carries either a resolving anchor or a `stub:` label; an unanchored, unlabeled proposal is FAIL). Anchor resolution is checked mechanically (fetch/look up the cited reference), not by judgment.* (This is the Done-When floor; Step 4's "strongest 2–3" is the effort target that sits above it — a 4th proposal may ship as `stub:` without violating either.)
- **The cast is materialized as a loadable artifact** (e.g. `personas.json`) that a consumer can parse — the file exists on disk and a parse of it succeeds against the declared schema (per persona: tier / lens / invoke-condition; per proposal additionally `anchor` or `stub:`). *Check class: mandatory-pass (binary — file exists and parses; a cast that exists only in the response text is UNMET).*
- **The tiering respects the caller's safety rule** (no persona exceeds its tier's allowed emission). *Check class: judged, pair: dispatch `fh-meta:challenger` at the tier-escalation angle — "find a persona whose lens mapping lets it emit beyond its tier". The pairing is a **different-agent** read; the author's own re-read does not satisfy it. If that agent is unreachable, record `pair: unavailable (<reason>)` — the condition stays UNMET and is **reported as a named residual**, never self-scored closed. It does **not** block delivery: a roster is a reversible artifact, so the degrade direction here is declare-and-ship, not fail-closed (that direction is reserved for irreversible surfaces — publish, delete, history-rewrite). Shipping with an UNMET pairing is honest; silently marking it met is the defect.*
## Guards
- **Caller-supplied safety rule is mandatory** — the skill tiers by the domain's rule, it does not
invent one (inventing authority is the failure this guard prevents).
- **Adversary never last** — any devil's-advocate voice is paired with a constructive counter-voice.
- **Anchors must be real** — a proposal without a resolvable anchor is a stub, not a candidate.
## Relationship to `persona-innovator` (agent)
`persona-innovator` *generates* names, frames, and frontier-absorption signals from scratch. This skill
takes an **existing seed** and adds the **tier-by-safety-rule + lens-to-domain mapping** — it is the
*structuring/governance* layer, not the *generator*. When net-new names are needed (Step 4), it
delegates to `persona-innovator` rather than reinventing generation.
## Independently executable
Yes — needs only the seed + rule + (for anchors) web search. Delegates name *generation* to
`persona-innovator` when invoked, but has no hard dependency on it for the core tier+lens mapping.
© chrono-meta · MIT · chrono-meta/forge-harness