Frame
Sense-making before action. Classify problem using Cynefin triangulation (3 tests + decomposition) to route to the right skill chain. Use when: frame, what approach, how should I start, which skill, where to begin, unsure what to do. NOT for known tasks — just do them.
npx skills add github:pantheon-org/tekhne --skill software-engineering--frame-problemSense-make → triangulate → decompose if needed → route. The domain decides the agent pattern, not just the skill.
Framing: $ARGUMENTS
Mindset
- Keep every classification as a hypothesis you test against the user’s answers, never a verdict you announce.
- Check your own confidence with suspicion. You hold expert knowledge on nearly everything, so every problem looks analysable to you and drifts towards Complicated.
- Use what people can observe (history, repeatability, separability) and derive the domain yourself. Self-classification by constraint type is unreliable.
- Stop at the handoff. Framing never proposes a fix, a diagnosis or an implementation.
AskUserQuestion Guard
Some agentic harnesses silently return blank answers from AskUserQuestion outside their planning mode, with no UI shown. Check the answers after EVERY call.
- Stop if any answer is empty or blank, and do not proceed on assumptions.
- Write the notice below, with the options as a numbered text list.
- Do not continue until the user replies with a number.
Questions didn't display (known harness bug outside planning mode).
Reply with the number of your choice:
1) [option one] 2) [option two] 3) [option three]
Procedure
Step 0. Auto-classify (skip when $ARGUMENTS is empty)
- Read $ARGUMENTS for constraint language: “was working, now failing” signals Degraded, “we think X causes Y” signals a hypothesis, “we need a <thing>” signals a solution-shaped statement.
- Check your confidence. Below 80%, go to Step 1.
- Run the Adjacent Domain Challenge before you propose anything, at 80% or above. Use one or two sentences to argue for the nearest neighbouring domain, then say why the original holds or does not.
- Test for Complex whenever you land on Complicated: would two experts disagree, is the combination genuinely novel, has this exact combination been tried here?
- Use this shape for the proposal:
🎯 Auto-classified: [Domain] (constraint: [type]) → Verb: [probe|analyze|execute|act|decompose]
→ Proposed route: [skill chain]
⚖️ Adjacent challenge: what if this is [nearest domain]? [argument, and why the original holds]
Confirm? [Yes / Re-classify manually]
Step 1. Triangulate
Use a single AskUserQuestion call for three concrete questions the user can answer accurately. Load references/triangulation-tests.md for the exact wording and options.
- T1 asks who has done this before (Keogh scale), and measures whether expertise exists.
- T2 asks whether the same inputs give the same result, and measures predictability.
- T3 asks whether the problem can be taken apart and reassembled, and measures entanglement.
- Q-Scale asks boulder or pebble. Avoid asking it when the answer to T2 is Chaotic.
- Q-Complicated sub applies only to T1=Complicated with T2=ordered: Evolving →
investigate, Degraded →troubleshoot, Both →investigatewith atroubleshootsub-task.
Write 2-3 clarifying sub-questions first when $ARGUMENTS is vague or broad, and put them in the same call.
Read the answers by majority. Classify with high confidence when all three agree. Use the majority when two of three agree, and report the dissenting test as a liminal signal. Start Step 1.5 when all three disagree or T3 answers composite. Do not let T1 win alone against T2 and T3.
Step 1.5. Decompose (tests disagree or the problem is composite)
Snowden’s rule: if you cannot agree on it, break it down until you can.
- Define 2-4 sub-problems from $ARGUMENTS.
- Apply the three tests to each sub-problem from context. Do not re-ask the user.
- Use this domain map shape:
🧩 Composite problem, sub-parts in different domains:
├── [sub-problem 1]: [Domain] → [verb] → [skill]
├── [sub-problem 2]: [Domain] → [verb] → [skill]
└── Proposed sequence: [order]
- Keep dependency order first: a sub-problem that blocks the others (a failing service) is stabilised before anything else. Start with the Complex parts among independent ones, because probes take longest to return signal.
- Call
AskUserQuestionwith “Adjust / Confirm / Re-frame” before routing.
Step 2. Classify and route
| Domain | Verb | Scale | Route | OpenSpec |
|---|---|---|---|---|
| Clear | execute | Pebble | Just code it | No |
| Clear | execute | Boulder | openspec-develop directly |
Yes |
| Complicated, Evolving | analyze | Any | investigate → openspec-plan |
Boulder only |
| Complicated, Degraded | analyze | Any | troubleshoot → stabilise → re-frame |
No |
| Complicated, Both | analyze | Any | investigate + troubleshoot sub-task |
Boulder only |
| Complex, no hypothesis | probe | Any | brainstorm → probe → openspec-plan |
Yes |
| Complex, has hypothesis | probe | Any | probe → sense → openspec-plan |
Yes |
| Liminal Complicated↔Complex | probe+analyze | Any | probe first to resolve the boundary → re-frame |
No |
| Chaotic | act | none | experiment → stabilise → frame-problem |
No |
| Confused | decompose | Any | Step 1.5 if not done, else ask for more context | none |
| Composite | per part | Mixed | Follow the domain map from Step 1.5 | Per part |
Use 🎯 [Domain] → [Verb] → [skill chain] | OpenSpec: [yes/no] | Scale: [boulder/pebble] for a single-domain result. Use the full domain map for a composite result.
Step 3. Handoff
- Use the handoff template that matches the route (see References) and fill in the thinking trail, decisions and accumulated context.
- Call
AskUserQuestionwith “Start chain / Re-frame / Skip framing”. - Call the first skill with $ARGUMENTS on confirm, or with the first sub-problem for a composite result.
When to Use
- The problem statement is vague, contradictory or solution-shaped (“we need a microservice”).
- The team disagrees on what the problem is or what success looks like.
- A previous attempt failed despite correct execution, so the framing was probably wrong.
- You cannot tell whether to investigate, probe, troubleshoot or experiment.
- The scope is unclear: pebble or boulder, one domain or several.
When Not to Use
- The task is fully specified and unambiguous. Execute it.
- You already know the Cynefin domain and the next skill.
- The problem is a simple bug with a clear reproduction path. Use
troubleshootdirectly. - The user has explicitly asked to skip framing and go to a named skill.
- Time is critical and the domain is Chaotic. Start with action and frame later.
Anti-Patterns
- NEVER frame the problem as a solution. “We need a microservice” is not a problem statement. Why: a solution-framed problem forecloses better options; restate it as a need, such as “reduce deployment coupling”.
- NEVER skip domain classification. Why: Clear problems need best practice and Complex problems need probes; applying one to the other fails in production.
- NEVER accept the first framing at face value. Why: the first statement is usually a symptom, and the real constraint sits one “why?” deeper.
- NEVER classify as Complicated just because you have knowledge. Why: fluent expertise bypasses the probe path that Complex problems need, which yields confident but wrong solutions.
- NEVER skip the Adjacent Domain Challenge when auto-classifying. Why: a verdict never tested at the nearest boundary sends liminal problems to the wrong verb (analyse instead of probe), the usual gotcha at that boundary.
- NEVER ask the user to name the constraint type. Why: people misclassify their own situation, so ask the three tests and derive the domain yourself.
- NEVER propose a fix while framing. Why: a solution offered before the domain is settled anchors the chain on one answer and skips the safe-to-fail experiments.
NEVER let T1 (expertise) alone override a T2/T3 disagreement
BAD:
T1: "our team has done this before" -> Complicated
T2: "results vary heavily by customer segment" -> Complex
T3: "entangled, changing one part changes the whole" -> Complex
Verdict: Complicated (T1 wins because "we have expertise")
GOOD:
T1: Complicated, T2: Complex, T3: Complex -> 2 of 3 agree -> Complex
Route: probe, with T1 noted as a liminal signal (some governing constraints exist)
Why: T1 measures whether expertise exists, not whether the outcome is predictable. A majority across all three tests decides, never T1 alone.
Usage Examples
# "The dashboard is slow" -> ask what is slow, for whom, under what load
# Reframed: "Queries exceed 10s for accounts with >1000 records" (Complicated, Degraded)
# Route: troubleshoot
# "Add AI recommendations to the product page" -> unknown user behaviour, emergent
# Route: Complex, no hypothesis -> brainstorm -> probe
# "Migrate the monolith and fix the checkout bug" -> composite, T3 = some parts yes, some no
# checkout bug: Complicated/Degraded -> troubleshoot FIRST, because it blocks the rest
# monolith migration: Complex -> brainstorm -> probe -> openspec-plan
See references/worked-examples.md for full dialogues.
References
- Triangulation tests: exact question wording, answer mapping and misclassification traps
- Worked examples: end-to-end framing dialogues, including a composite case
- Frame → Brainstorm: handoff template, Complex with no hypothesis → brainstorm
- Frame → Probe: handoff template, Complex with a hypothesis → probe
- Frame → Probe (Liminal): handoff template, Liminal Complicated↔Complex → probe
- Frame → Investigate: handoff template, Complicated and evolving → investigate
- Frame → Troubleshoot: handoff template, Complicated and degraded → troubleshoot
- Frame → Experiment: handoff template, Chaotic → experiment
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
Expert-only knowledge the AI couldn't derive on its own — domain-specific patterns, production gotchas, decision frameworks, and non-obvious tool behaviour. High scores mean <5% redundancy with what the model already knows.
A clear philosophy plus numbered step-by-step workflows with explicit entry/exit points. Should answer: what is the core principle, how to execute it, and when (and when not) to apply it.
Explicit NEVER/WHY/consequence triplets with side-by-side bad/good examples. Generic warnings score low — concrete failure modes with real impact (security, correctness, performance) score high.
Proper frontmatter, single-task focus, activation keywords, and cross-harness portability. Skills must work across 40+ agentic harnesses without hardcoded paths or agent-specific references.
SKILL.md as a <100-line navigation hub pointing to focused references/ files. Content should be lazy-loaded on demand, not front-loaded. Includes actionable 'When to Use' conditions per reference.
Appropriate rigidity for the skill type: strict rules for critical/security skills, balanced steps for process skills, flexible options for tool skills. Mismatched calibration (too rigid or too loose) reduces score.
Rich activation keywords and trigger scenarios in the description so the skill fires when needed. Best descriptions read like an exhaustive list of the tasks and concepts that should invoke this skill.
Copy-paste-ready code, complete runnable examples, real file paths and commands. Pseudocode and abstract descriptions score low — concrete, executable content scores high.
Runtime validation via eval scenarios proving the skill actually changes agent behaviour. Requires evals/ directory, instructions.json, ≥3 scenarios, and ≥80% instruction coverage in summary.json.
No eval scenarios available.
Frame-Problem to Brainstorm Handoff
Thinking Trail
- Considered: {what approaches were weighed during framing}
- Rejected: {why other domains didn’t fit — prevents brainstorm re-exploring}
- Surprised by: {unexpected signals in the problem statement}
- Triangulation: T1={Keogh level}, T2={predictability}, T3={disassembly} — {convergence}
- Models used: Cynefin triangulation (Keogh + Predictability + Disassembly)
- Constraints discovered: {enabling constraints identified — cause-effect unclear}
Decisions
- Domain: Complex (enabling constraints — experimentation needed)
- Route: brainstorm → probe → openspec-plan
- Rationale: {why divergent exploration before probing}
Actions Taken
- Classified via Q1: enabling constraints identified
- Scale determined: {boulder|pebble}
Output
🎯 Complex → Probe → /brainstorm → /probe | OpenSpec: yes | Scale: {scale}
Domain Transition
From: Confused → To: Complex Constraint shift: unknown → enabling. Problem has no clear cause-effect; need divergent exploration to surface hypotheses before probing.
For /brainstorm
- Goal: Generate 3-5 hypotheses about what’s happening and why
- Constraint: Each hypothesis must be falsifiable —
probeneeds testable claims - Output format: Ranked hypotheses with confidence levels and suggested probe approaches
- Do NOT: Converge to a solution — brainstorm feeds
probe, not implementation
Accumulated Context
Token guidance: target 300 tokens inline. For depth, use references — point to thinking artifact files rather than embedding full content. Soft cap: 600 tokens inline per handoff. If you need more, move detail to a knowledge file and reference it. Accumulated cap: 800 tokens across a chain — compress to 200 at cap (keep: decisions, constraints, rejected paths). References to thinking files do NOT count toward the cap.
Frame-Problem to Experiment Handoff
Thinking Trail
- Considered: {what approaches were weighed during framing}
- Rejected: {why structured domains didn’t fit — constraints are absent}
- Surprised by: {chaos signals — urgency, incoherence, novel disruption}
- Triangulation: T1={Keogh level}, T2={predictability}, T3={disassembly} — {convergence}
- Models used: Cynefin triangulation (Keogh + Predictability + Disassembly)
- Constraints discovered: None — that’s the point. Constraints are absent.
Decisions
- Domain: Chaotic (absent constraints — crisis or deliberate disruption)
- Route: experiment → stabilize → frame-problem
- Rationale: {no analysis possible — must act first to impose minimal structure}
Actions Taken
- Classified via Q1: absent constraints identified
- Scale: not applicable (Chaotic bypasses scale assessment)
Output
🎯 Chaotic → Act → /experiment → stabilize → /frame-problem | OpenSpec: no
Domain Transition
From: Confused → To: Chaotic Constraint shift: unknown → absent. No cause-effect relationships visible. Must act to impose minimal constraints before any analysis is possible.
For /experiment
- Chaos type assessment: Determine accidental (crisis — something broke) vs deliberate (innovation — intentionally disrupting)
- Initial action: {first safe action to impose minimal structure}
- Gate requirement: Human gates after EVERY action — human IS the constraint
- Exit watch: Look for emerging structure → transition to
probewhen patterns appear - Do NOT: Attempt analysis or planning — act first, sense second
Accumulated Context
Token guidance: target 300 tokens inline. For depth, use references — point to thinking artifact files rather than embedding full content. Soft cap: 600 tokens inline per handoff. If you need more, move detail to a knowledge file and reference it. Accumulated cap: 800 tokens across a chain — compress to 200 at cap (keep: decisions, constraints, rejected paths). References to thinking files do NOT count toward the cap.
Frame-Problem to Investigate Handoff
Thinking Trail
- Considered: {what approaches were weighed during framing}
- Rejected: {why complex/chaotic didn’t fit — governing constraints exist}
- Surprised by: {signals that this is evolving, not degraded}
- Triangulation: T1={Keogh level}, T2={predictability}, T3={disassembly} — {convergence}
- Models used: Cynefin triangulation (Keogh + Predictability + Disassembly)
- Constraints discovered: {governing constraints — experts/best practices apply, system evolving}
Decisions
- Domain: Complicated (governing constraints, evolving system)
- Route: investigate → openspec-plan
- Rationale: {expertise can solve this — needs deep analysis, not experimentation}
Actions Taken
- Classified via Q1: governing constraints identified
- Q1.1: evolving (capacity growing, system improving)
- Scale determined: {boulder|pebble}
Output
🎯 Complicated → Analyze → /investigate → /openspec-plan | OpenSpec: {yes if boulder} | Scale: {scale}
Domain Transition
From: Confused → To: Complicated Constraint shift: unknown → governing. Best practices exist, experts can solve this. System is evolving — growing capacity, not failing.
For /investigate
- Problem focus: {specific technical question to investigate}
- Known constraints: {governing constraints — what rules/patterns apply}
- Expertise needed: {what domain knowledge is relevant}
- Expected output: Analysis + recommendation → feeds
openspec-planif boulder - Do NOT: Experiment — this domain has known good practices. Analyze, don’t probe.
Accumulated Context
Token guidance: target 300 tokens inline. For depth, use references — point to thinking artifact files rather than embedding full content. Soft cap: 600 tokens inline per handoff. If you need more, move detail to a knowledge file and reference it. Accumulated cap: 800 tokens across a chain — compress to 200 at cap (keep: decisions, constraints, rejected paths). References to thinking files do NOT count toward the cap.
Frame-Problem to Probe (Liminal) Handoff
Thinking Trail
- Considered: {what approaches were weighed during framing}
- Rejected: {why pure Complicated or pure Complex didn’t fit}
- Triangulation: T1={result}, T2={result}, T3={result} — {which disagreed and why}
- Liminal signal: {specific test that pointed to adjacent domain}
- Models used: Cynefin triangulation (Keogh + Predictability + Disassembly)
- Constraints discovered: {mix of governing + enabling constraints}
Decisions
- Domain: Liminal Complicated↔Complex (boundary state)
- Route: probe first (resolve boundary) → re-frame with evidence
- Rationale: {can’t tell if expertise applies or experimentation needed — probe to find out}
Actions Taken
- Triangulated: 2/3 tests or split signal detected
- Liminal state identified — not forcing a binary classification
- Scale determined: {boulder|pebble}
Output
🎯 Liminal Comp↔Complex → Probe → resolve boundary → /frame-problem | OpenSpec: deferred | Scale: {scale}
Domain Transition
From: Confused → To: Liminal Complicated↔Complex Constraint shift: unknown → mixed governing/enabling. Cannot yet determine if expertise resolves this or experimentation is needed.
For /probe
- Hypothesis: “This problem is analyzable by expertise” (probe to confirm or refute)
- Enabling constraints: {what bounds this probe}
- Confirm criteria: Expert analysis produces consistent, actionable recommendations → Complicated, route to
investigate - Refute criteria: Expert analysis produces contradictory or untestable recommendations → Complex, route to
brainstormorprobe - Do NOT: Skip Phase 1 entry gate. This probe resolves the domain boundary, not the problem itself.
Accumulated Context
Token guidance: target 300 tokens inline. For depth, use references — point to thinking artifact files rather than embedding full content. Soft cap: 600 tokens inline per handoff. If you need more, move detail to a knowledge file and reference it. Accumulated cap: 800 tokens across a chain — compress to 200 at cap (keep: decisions, constraints, rejected paths). References to thinking files do NOT count toward the cap.
Frame-Problem to Probe Handoff
Thinking Trail
- Considered: {what approaches were weighed during framing}
- Rejected: {why other domains didn’t fit}
- Surprised by: {unexpected signals}
- Triangulation: T1={Keogh level}, T2={predictability}, T3={disassembly} — {convergence}
- Models used: Cynefin triangulation (Keogh + Predictability + Disassembly)
- Constraints discovered: {enabling constraints — cause-effect unclear but hypothesis exists}
Decisions
- Domain: Complex (enabling constraints, user has hypothesis)
- Route: probe → sense → openspec-plan
- Rationale: {hypothesis already exists — skip brainstorm, go direct to probe}
Actions Taken
- Classified via Q1: enabling constraints identified
- Hypothesis detected in $ARGUMENTS
- Scale determined: {boulder|pebble}
Output
🎯 Complex → Probe → /probe → /openspec-plan | OpenSpec: yes | Scale: {scale}
Domain Transition
From: Confused → To: Complex Constraint shift: unknown → enabling. User has a hypothesis ready to test — direct probe without divergent brainstorm.
For /probe
- Hypothesis: {extracted or user-stated hypothesis}
- Enabling constraints: {what bounds this probe — codebase scope, time, tooling}
- Suggested confirm/refute criteria: {what would confirm or refute the hypothesis}
- Prior exploration: None (first probe) or {summary of brainstorm output if chained}
- Do NOT: Skip Phase 1 entry gate — qualify even if hypothesis looks complete
Accumulated Context
Token guidance: target 300 tokens inline. For depth, use references — point to thinking artifact files rather than embedding full content. Soft cap: 600 tokens inline per handoff. If you need more, move detail to a knowledge file and reference it. Accumulated cap: 800 tokens across a chain — compress to 200 at cap (keep: decisions, constraints, rejected paths). References to thinking files do NOT count toward the cap.
Frame-Problem to Troubleshoot Handoff
Thinking Trail
- Considered: {what approaches were weighed during framing}
- Rejected: {why complex/chaotic didn’t fit — governing constraints exist}
- Surprised by: {degradation signals — errors, declining quality}
- Triangulation: T1={Keogh level}, T2={predictability}, T3={disassembly} — {convergence}
- Models used: Cynefin triangulation (Keogh + Predictability + Disassembly)
- Constraints discovered: {governing constraints — known system, degrading behavior}
Decisions
- Domain: Complicated (governing constraints, degraded system)
- Route: troubleshoot → stabilize → re-frame
- Rationale: {system was working, now failing — diagnostic expertise applies}
Actions Taken
- Classified via Q1: governing constraints identified
- Q1.1: degraded (quality declining, system failing)
- Scale determined: {boulder|pebble}
Output
🎯 Complicated → Analyze → /troubleshoot → stabilize → re-frame | OpenSpec: no | Scale: {scale}
Domain Transition
From: Confused → To: Complicated Constraint shift: unknown → governing. System has known good state — it’s degrading from that state. Diagnostic expertise applies.
For /troubleshoot
- Symptom: {what’s broken or degrading}
- Known good state: {what it looked like when working}
- Recent changes: {what changed before degradation started}
- Diagnostic approach: Search-first — check learnings database, then systematic diagnosis
- Do NOT: Redesign — stabilize first, then re-frame if deeper changes needed
Accumulated Context
Token guidance: target 300 tokens inline. For depth, use references — point to thinking artifact files rather than embedding full content. Soft cap: 600 tokens inline per handoff. If you need more, move detail to a knowledge file and reference it. Accumulated cap: 800 tokens across a chain — compress to 200 at cap (keep: decisions, constraints, rejected paths). References to thinking files do NOT count toward the cap.
Triangulation Tests
Exact wording for Step 1 of the skill. Ask every applicable question in one AskUserQuestion call. Never ask the user to pick a Cynefin domain or a constraint type: people misclassify their own situation, so ask what they can observe and derive the domain yourself.
T1: “Who’s done this before?” (Keogh scale)
| Option | Answer | Reads as |
|---|---|---|
| 1 | Everyone on the team knows how | Clear |
| 2 | Someone on our team, or we have access to expertise | Complicated |
| 3 | Someone outside our organisation has, but not us | Complex |
| 4 | Nobody has ever done this | Complex, near Chaotic |
| 5 | I cannot even tell what “this” is | Confused |
T1 measures whether expertise exists. It says nothing about whether the outcome is predictable, so it must never decide alone.
T2: “Same inputs, same result?” (predictability)
| Option | Answer | Reads as |
|---|---|---|
| Yes | Yes, reliably | Ordered (Clear or Complicated) |
| Probably not | Path-dependent, sensitive to context | Unordered (Complex) |
| No | No relationship between action and outcome | Chaotic |
T3: “Can you take it apart?” (disassembly)
| Option | Answer | Reads as |
|---|---|---|
| Yes | Independent pieces that reassemble identically | Complicated at most |
| No | Entangled: changing a part changes the whole | Complex at minimum |
| Some | Some parts yes, some parts no | Composite, so decompose (Step 1.5) |
Q-Scale (skip when T2 is Chaotic)
- Boulder: multi-step, ambiguous or architectural.
- Pebble: a single file with an obvious implementation.
- Not sure: treat as a boulder until decomposition says otherwise.
Q-Complicated sub (only when T1=2 and T2=ordered)
- Evolving: the system is improving or growing capacity. Route to
investigate. - Degraded: it was working and is now failing. Route to
troubleshoot. - Both: improving on one dimension and degrading on another. Route to
investigatewith atroubleshootsub-task.
Reading the answers
| Agreement | Action |
|---|---|
| All 3 agree | Classify directly with high confidence. |
| 2 of 3 agree | Classify by the majority and report the dissent: 🎯 [Domain] (2/3 tests agree) then ⚠️ Liminal signal: T[N] suggests [adjacent domain]. |
| T1=2 and T2 ordered, but T3 entangled | Treat as Liminal Complicated↔Complex rather than plain Complicated: expertise covers the parts, not the interactions. Route probe first, then re-frame. |
| All 3 disagree, or T3 is composite | The problem spans domains. Decompose in Step 1.5. |
Misclassification traps
- Expertise bias. An engineer answers T1=2 and T2=ordered while T3 is entangled. The honest reading is Complex, not Complicated, because the expertise covers the parts and not the interactions.
- Overwhelm. A stressed team answers T2=chaotic when the situation is Complex with enabling constraints available. Slow down and decompose before routing to
experiment. - Contradiction. “Nobody has done this” together with “the result is predictable” cannot both be true. The parts sit in different domains, so decompose.
- Solution-shaped answers. If the user describes the problem as a missing technology (“we need Kafka”), restate it as a need before asking T1 to T3, or the tests measure the solution instead of the problem.
Worked Examples
Three end-to-end framings. Each shows the signal that drove the classification, the check that guarded against a wrong route, and the handoff template used.
1. Degraded service: auto-classify, challenge, route
Input: “Our API endpoint /v2/payments has been returning 500 errors since the deploy at 14:30. It was working fine this morning.”
- The phrase “was working, now failing” with a time-bound trigger is explicit Degraded language. Confidence is above 80%, so Step 0 proposes Complicated, Degraded.
- Adjacent Domain Challenge: could this be Complex, with an unpredictable failure mode? No. The system is known, the inputs are repeatable and the regression follows a deploy, so cause and effect are discoverable by analysis.
- Route:
troubleshoot→ stabilise → re-frame, OpenSpec No. Fillframe-problem-to-troubleshoot-llm.md, then confirm.
Wrong turns to avoid: routing to brainstorm because the cause is unknown (an unknown cause is not an unknowable one), or classifying Complex because the word “errors” sounds alarming.
2. Solution-shaped request with expertise bias
Input: “We need a microservice for notifications. We have built three of these.”
- Restate the problem first: “Notifications are coupled to the order flow and block releases” is a need; “a microservice” is a solution. Ask the user to confirm the restatement.
- Triangulate. T1=2 (the team has built these), T2=unordered (delivery behaviour varies heavily by customer segment), T3=entangled (preferences, channels and rate limits depend on each other).
- Two of three tests say Complex. T1 alone cannot override them, so the verdict is Complex with a liminal note that some governing constraints exist.
- No hypothesis exists yet, so route
brainstorm→probe→openspec-plan, OpenSpec Yes. Fillframe-problem-to-brainstorm-llm.md.
Wrong turn to avoid: accepting Complicated because “we have done this three times”. Three prior builds prove that expertise exists, not that this build is predictable.
3. Composite request
Input: “Improve developer experience, cut CI build times, fix auth service tech debt, and maybe move database.”
- Auto-classification confidence is low and the scope is broad. Write 2-3 clarifying sub-questions (“Which developers? What is the current build time and the target? What is driving the database question?”) and ask them with T1 to T3 and Q-Scale in one call.
- The answers disagree across the parts, so decompose:
🧩 Composite problem, sub-parts in different domains:
├── Database move: Complex, no hypothesis → brainstorm → probe → openspec-plan
├── Developer experience: Complex, enabling constraints → probe
├── CI build times: Complicated, Degraded → troubleshoot
└── Auth tech debt: Complicated, Evolving → investigate
Proposed sequence: nothing blocks anything else, so Complex parts first
- Confirm the decomposition with the user before routing, then invoke the first skill with the first sub-problem only.
Sequencing rule: a blocker goes first (for example a failing build that stops all other work), otherwise the Complex parts go first because probes take longest to return signal.