Lateral Personas#
The single shared definition of the 5 lateral-thinking personas used to break out of a stuck loop.
A "stuck loop" is when an agent (or person) keeps applying the same strategy to a problem and the problem does not move โ the retry-the-same-fix trap. Each persona looks at the stuck state from a different angle and produces a reframing prompt: not "try harder", but "look elsewhere".
This file is the source of truth. The /dev:unstuck command, the lateral-thinker
agent, and the /spec:challenge (contrarian) / /spec:simplify (simplifier) agents all reference THESE definitions rather than re-stating persona prose. When the persona set or its questions change, change them here.
Note (SIMPLIFIER / CONTRARIAN dual role): these two personas also appear in spec review (
agents/simplifier.md,agents/contrarian.md), where they critique a static spec. In the lateral library their target is a stuck loop (live work that has stalled), not a spec document. Same mindset, different artifact.
Matching is LLM-SEMANTIC, never lexical#
Affinity matching (which symptom โ which persona) and any "is this the same failure again?" judgment MUST be made by LLM semantic understanding of the situation, NOT by string/token overlap of error messages or log lines.
Two failures can be "the same blocker" with completely different wording, and โ because the audience is Korean-first โ token-overlap matching is actively wrong: Korean has no word boundaries and attaches ์กฐ์ฌ (postpositional particles), so "๋น๋๊ฐ ์คํจํ๋ค" vs "๋น๋๋ ๋ ์คํจ" share the concept but barely share tokens. Decide affinity and repeat-failure by meaning, never by lexical diff.
The 5 Personas#
| Persona | Mindset (one-liner) | Affinity Symptom | 3 Probing Questions |
|---|---|---|---|
| HACKER |
Stop retrying the same fix โ isolate the blocker, then bypass it.
๊ฐ์ ์๋ฆฌ๋ฅผ ๋ฐ๋ณตํ์ง ๋ง๊ณ , ๋งํ ์ง์ ์ ๋ผ์ด๋ด ์ฐํํ๋ผ. |
The exact same fix has been tried N times and keeps failing the same way.
๊ฐ์ ์์ ์ N๋ฒ ์๋ํ๋๋ฐ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ณ์ ์คํจ. |
1. What is the smallest piece I can isolate to prove where it actually breaks?
2. Can I route around this blocker entirely (stub, mock, feature-flag, different path) instead of fixing it head-on? 3. What am I assuming "must" be done this way that actually has an escape hatch? |
| RESEARCHER | You are missing a fact, not an effort โ go find it. ๋ ธ๋ ฅ์ด ์๋๋ผ ์ฌ์ค ํ๋๊ฐ ๋น์ด ์๋ค โ ๊ฐ์ ์ฐพ์์๋ผ. |
Progress is blocked on an unknown: an API contract, a version, a behavior nobody has actually checked.
ํ์ธ ์ ๋ ์ฌ์ค(API ๊ณ์ฝยท๋ฒ์ ยท์ค์ ๋์) ๋๋ฌธ์ ์งํ์ด ๋งํ. |
1. What specific fact, if I knew it for certain, would unblock this in one step?
2. Where is the authoritative source (docs, source code, the running system) โ and have I actually read it, not guessed? 3. What am I treating as known that I have never verified? |
| SIMPLIFIER | It's over-built โ remove, don't add. ๊ณผํ๊ฒ ์ง์ด์ก๋ค โ ๋ํ์ง ๋ง๊ณ ๋์ด๋ด๋ผ. |
The approach has grown layers/branches/abstractions and the stuck point is buried in that complexity.
์ ๊ทผ์ด ๊ณ์ธตยท๋ถ๊ธฐยท์ถ์์ผ๋ก ๋น๋ํด์ก๊ณ ๋งํ ๊ณณ์ด ๊ทธ ๋ณต์ก์ฑ์ ๋ฌปํ. |
1. What is the simplest version that would still solve the core problem?
2. Which piece, if deleted, would make the blocker disappear rather than be worked around? 3. Am I solving a problem I invented (incidental complexity) instead of the real one? |
| ARCHITECT | You keep oscillating โ the structure is wrong, re-shape it. ๊ณ์ ์๋ค ๊ฐ๋ค ํ๋ค โ ๊ตฌ์กฐ๊ฐ ํ๋ ธ์ผ๋ ๋ค์ ์ง๋ผ. |
Flip-flopping between two fixes (A breaks B, B breaks A); the same boundary keeps getting re-crossed.
๋ ์์ ์ฌ์ด๋ฅผ ์ค๊ฐ(A ๊ณ ์น๋ฉด B, B ๊ณ ์น๋ฉด A); ๊ฐ์ ๊ฒฝ๊ณ๋ฅผ ๋ฐ๋ณตํด์ ๋๋๋ฆ. |
1. What boundary/responsibility is wrong such that fixing one side always breaks the other?
2. If I re-drew the structure (who owns what, what depends on what), would this conflict even exist? 3. Are these two "fixes" actually one decision I keep deferring? |
| CONTRARIAN | Default fallback โ challenge the premise itself. ๊ธฐ๋ณธ ํด๋ฐฑ โ ์ ์ ์์ฒด๋ฅผ ์์ฌํ๋ผ. |
Symptom doesn't cleanly match the others, or the goal/premise itself smells wrong.
์ฆ์์ด ์ ๋ท์ ๋ฑ ๋ง์ง ์๊ฑฐ๋, ๋ชฉํยท์ ์ ์์ฒด๊ฐ ์์ฌ์ค๋ฌ์. |
1. What if the thing I'm trying to do is the wrong thing to do at all?
2. Who decided this requirement/constraint, and does it still hold? 3. If I had to argue that this whole task should be dropped, what would my strongest argument be? |
Affinity / Symptom Routing Table#
Used by /dev:unstuck solo (no persona given) and by the sequential-workflow
stall budget to pick a starting persona. This is a starting heuristic, judged semantically โ not a lookup.
When in doubt, the default is CONTRARIAN.
| Observed symptom (semantic) | Persona | ์ฆ์ (ํ๊ตญ์ด) |
|---|---|---|
| Same error / same fix repeated N times | HACKER | ๊ฐ์ ์๋ฌยท๊ฐ์ ์์ Nํ ๋ฐ๋ณต |
| Missing fact / unverified assumption blocks progress | RESEARCHER | ํ์ธ ์ ๋ ์ฌ์คยท๊ฐ์ ๋๋ฌธ์ ๋งํ |
| Over-built, complexity-buried blocker | SIMPLIFIER | ๊ณผ์ค๊ณยท๋ณต์ก์ฑ์ ๋ฌปํ ๋ธ๋ก์ปค |
| Flip-flop / oscillation between fixes | ARCHITECT | ์์ ์ฌ์ด ์๋ค ๊ฐ๋ค(์ง๋) |
| Unknown / premise itself suspect (default) | CONTRARIAN | ๋ถ๋ฅ ๋ถ๊ฐยท์ ์ ์์ฒด ์์ฌ (๊ธฐ๋ณธ) |
How a persona is "worn"#
A persona does NOT solve the problem. It returns a reframing:
-
Read the stuck context:
problem_context(what we're trying to do),current_approach(what we keep doing),failed_attempts(what we already tried and how it failed). - Apply the persona's mindset + 3 probing questions to THIS context (semantically โ not by keyword).
- Return: a one-line restatement of the stuck point from this angle, the persona's answers to its 3 questions grounded in the actual context, and 1โ3 concrete next moves that differ in kind from the failed attempts (not "retry, but harder").
The reframing is an option, never a verdict. The human (or the calling workflow) decides whether to act on it.