LogoSkills

LATERAL_PERSONAS

5 Lateral-Thinking Personas โ€” shared definition for stuck-loop reframing (HACKER / RESEARCHER / SIMPLIFIER / ARCHITECT / CONTRARIAN)

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#

PersonaMindset (one-liner)Affinity Symptom3 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 timesHACKER๊ฐ™์€ ์—๋Ÿฌยท๊ฐ™์€ ์ˆ˜์ • NํšŒ ๋ฐ˜๋ณต
Missing fact / unverified assumption blocks progress RESEARCHER ํ™•์ธ ์•ˆ ๋œ ์‚ฌ์‹คยท๊ฐ€์ • ๋•Œ๋ฌธ์— ๋ง‰ํž˜
Over-built, complexity-buried blockerSIMPLIFIER๊ณผ์„ค๊ณ„ยท๋ณต์žก์„ฑ์— ๋ฌปํžŒ ๋ธ”๋กœ์ปค
Flip-flop / oscillation between fixesARCHITECT์ˆ˜์ • ์‚ฌ์ด ์™”๋‹ค ๊ฐ”๋‹ค(์ง„๋™)
Unknown / premise itself suspect (default)CONTRARIAN๋ถ„๋ฅ˜ ๋ถˆ๊ฐ€ยท์ „์ œ ์ž์ฒด ์˜์‹ฌ (๊ธฐ๋ณธ)

How a persona is "worn"#

A persona does NOT solve the problem. It returns a reframing:

  1. 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).
  2. Apply the persona's mindset + 3 probing questions to THIS context (semantically โ€” not by keyword).
  3. 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.