| name | persona |
| version | 0.0.5 |
| description | Conflict synthesis from antipattern ร signature axes. Generates a working persona prompt from your observed patterns. Triggers: "persona", "activate persona", "honne persona".
|
| ssl | {"scheduling":{"anti_triggers":["`.honne/persona.json` ๋ถ์ฌ ์ (whoami ๋จผ์ ์คํ)","`who am I` ์
๋ ฅ ์ โ whoami ์ substring ์ถฉ๋, whoami ์ฐ์ "]},"structural":{"scenes":["Step 1: Locale HITL","Step 2: Load and Validate","Step 3: Build Conflict Payload","Step 4: LLM Synthesis","Step 5: Render Personas"],"branches":["Step 2: persona check exit 66 โ halt with whoami suggestion","Step 2: STALE_DAYS > threshold โ warn + continue","Step 4: conflict_present=true โ 2 personas + judge","Step 4: conflict_present=false, 1 axis null โ 1 persona, judge=null","Step 4: conflict_present=false, both null โ all persona fields null"],"resumable":false},"logical":{"tools":["AskUserQuestion","bash","python3","Read","Write"],"side_effects":{"reads":[".honne/persona.json"],"writes":[".honne/cache/persona-synthesis.json # overwrite",".honne/personas/antipattern.md # overwrite",".honne/personas/signature.md # overwrite",".honne/personas/judge.md # overwrite"],"deletes":[],"network":[]},"idempotent":true,"rollback":".honne/personas/ ๋ .gitignore ๋์ โ ์คํ ์ cp -r .honne/personas .honne/personas.bak"}} |
honne โ Persona Synthesis
When invoked, execute Step 1 through Step 5 in order immediately. Do not summarize the skill or ask what the user wants โ invocation itself is the request. Start by asking the Step 1 question.
Step 1: Locale HITL
Invoke AskUserQuestion tool:
question: "Locale?"
options: [{"label":"ko","description":"ํ๊ตญ์ด"},{"label":"en","description":"English"},{"label":"jp","description":"ๆฅๆฌ่ช"}]
Set LOCALE from the reply. Do not use plain-text Q&A โ arrow-key selection only.
Step 2: Load and Validate
Check that persona.json exists:
bash "${CLAUDE_PLUGIN_ROOT}/scripts/honne" persona check --persona .honne/persona.json
- Exit 66 โ tell user: "
.honne/persona.json not found. Please run /honne:whoami first to generate your persona." Stop.
- Exit 0 โ proceed.
Check staleness:
python3 -c "import json,datetime; d=json.load(open('.honne/persona.json')); ts=datetime.datetime.fromisoformat(d.get('generated_at','2000-01-01T00:00:00Z').replace('Z','+00:00')); print((datetime.datetime.now(datetime.timezone.utc)-ts).days)"
Capture stdout as STALE_DAYS.
If STALE_DAYS exceeds 7 (or the value of HONNE_PERSONA_STALE_DAYS if set): warn "persona.json last updated {STALE_DAYS} days ago โ consider re-running /honne:whoami." Then continue.
Step 3: Build Conflict Payload
Read .honne/persona.json in your mental context. Construct CONFLICT_PAYLOAD as a JSON object without writing to any file or using heredocs:
CONFLICT_PAYLOAD = {
"locale": "<LOCALE>",
"antipattern": {
"claim": "<axes.antipattern.claim>",
"explanation": "<axes.antipattern.explanation>",
"evidence_strength": <axes.antipattern.evidence_strength>
} โ or null if antipattern axis is absent or claim is null,
"signature": {
"claim": "<axes.signature.claim>",
"explanation": "<axes.signature.explanation>",
"evidence_strength": <axes.signature.evidence_strength>
} โ or null if signature axis is absent or claim is null,
"supporting_axes": {
"<axis>": {"claim": "...", "explanation": "...", "evidence_strength": <val>}
for each of the 5 remaining axes: lexicon, reaction, workflow, obsession, ritual
}
}
Do NOT use python3 << 'EOF' or any heredoc. Assemble the payload in your mental context from the persona.json data you just read.
Step 4: LLM Synthesis
(a) Read synthesis prompt:
Read "${CLAUDE_PLUGIN_ROOT}/skills/persona/templates/persona_synthesis_prompt.${LOCALE}.md"
(b) Apply the synthesis prompt system instructions to yourself, with CONFLICT_PAYLOAD as the user input. Produce a STRICT JSON response:
{
"conflict_present": true,
"persona_antipattern": {
"name": "...",
"oneliner": "...",
"system_prompt": "..."
},
"persona_signature": {
"name": "...",
"oneliner": "...",
"system_prompt": "..."
},
"judge_system_prompt": "..."
}
Branch rules (enforced by synthesis prompt template):
conflict_present = true: both axes present โ generate two separate personas (antipattern and signature) + judge. All three fields REQUIRED.
conflict_present = false, one axis null: set absent persona to null. judge_system_prompt is null.
conflict_present = false, both axes null: all persona fields are null.
Constraints: each system_prompt โค 1000 tokens. judge_system_prompt โค 500 tokens. name โค 12 chars. oneliner โค 25 words.
(c) Save result: Write the JSON to {PWD}/.honne/cache/persona-synthesis.json. If JSON parse fails or response is empty, skip saving and output raw text with a warning.
Step 5: Render Personas
bash "${CLAUDE_PLUGIN_ROOT}/scripts/honne" render personas --persona .honne/persona.json --synthesis .honne/cache/persona-synthesis.json --locale "$LOCALE" --out-dir .honne/personas
Non-zero exit โ output the raw synthesis fields with a warning that file render failed.
Output to user โ choose the template matching the synthesis JSON state you saved in Step 4(c). Use LOCALE (ko/en/jp).
Case A โ conflict_present=true (both personas + judge):
- ko:
๋ ์ธ๊ฒฉ์ด ์์ฑ๋์์ต๋๋ค:\n- .honne/personas/antipattern.md โ {persona_antipattern.name}\n- .honne/personas/signature.md โ {persona_signature.name}\n- .honne/personas/judge.md โ ์ฌํ์\n\n๋ ์ธ๊ฒฉ์ ๋ถ์ด๋ ค๋ฉด /honne:crush <์ฃผ์ >๋ฅผ ์คํํ์ธ์.
- en:
Two personas generated:\n- .honne/personas/antipattern.md โ {persona_antipattern.name}\n- .honne/personas/signature.md โ {persona_signature.name}\n- .honne/personas/judge.md โ judge\n\nRun /honne:crush <topic> to stage a live debate.
- jp:
ใตใใคใฎใใซใฝใใ็ๆใใใพใใ:\n- .honne/personas/antipattern.md โ {persona_antipattern.name}\n- .honne/personas/signature.md โ {persona_signature.name}\n- .honne/personas/judge.md โ ๅฏฉๅค่
\n\nใฉใคใ่จ่ซใ่กใใซใฏ /honne:crush <ใใผใ> ใๅฎ่กใใฆใใ ใใใ
Case B โ conflict_present=false, exactly one persona non-null:
- ko:
ํ๋์ ์ธ๊ฒฉ๋ง ์์ฑ๋์์ต๋๋ค (๋ฐ๋ ์ถ์ด ๊ฐ์ง๋์ง ์์):\n- .honne/personas/{slot}.md โ {persona.name}\n\n/honne:crush ํ ๋ก ์ ๋ ์ถ์ด ๋ชจ๋ ํ์ํฉ๋๋ค. ๋ ๋ง์ ์ธ์
์ ์์งํ ๋ค /honne:whoami๋ฅผ ์ฌ์คํํ์ธ์.
- en:
Only one persona generated (opposite axis not detected):\n- .honne/personas/{slot}.md โ {persona.name}\n\n/honne:crush debate requires both axes. Collect more sessions and re-run /honne:whoami.
- jp:
ใใซใฝใใ1ใคใ ใ็ๆใใใพใใ (ๅๅฏพ่ปธใๆคๅบใใใพใใใงใใ):\n- .honne/personas/{slot}.md โ {persona.name}\n\n/honne:crush ใใฃใใผใใซใฏไธก่ปธใๅฟ
่ฆใงใใใใใซใปใใทใงใณใๅ้ใ /honne:whoami ใๅๅฎ่กใใฆใใ ใใใ
Where {slot} is antipattern or signature depending on which is non-null.
Case C โ conflict_present=false, both personas null:
- ko:
์ธ๊ฒฉ์ด ์์ฑ๋์ง ์์์ต๋๋ค (๋ ์ถ ๋ชจ๋ ๊ฐ์ง๋์ง ์์). ์ธ์
์ ๋ ์์งํ ๋ค /honne:whoami๋ฅผ ์ฌ์คํํ์ธ์.
- en:
No personas generated (neither axis detected). Collect more sessions and re-run /honne:whoami.
- jp:
ใใซใฝใใฏ็ๆใใใพใใใงใใ (ไธก่ปธใจใๆคๅบใใใ)ใใปใใทใงใณใ่ฟฝๅ ๅ้ใ /honne:whoami ใๅๅฎ่กใใฆใใ ใใใ
IMPORTANT: This skill only generates files. Do not claim the persona is running, applied, or in use. Personas are independent artifacts โ users invoke /honne:crush for live debate.