Probe
Safe-to-fail experiment for Complex domain problems where cause-effect is only visible in retrospect. Two-phase: foreground qualify → background probe → sense result. Use when: probe, safe-to-fail, test hypothesis, experiment with hypothesis, Complex domain with hypothesis. NOT for brainstorming (use brainstorm) or known cause-effect (use investigate).
npx skills add github:pantheon-org/tekhne --skill software-engineering--probeSafe-to-fail experiment in Complex domain. Cause-effect only visible in retrospect — probe to sense patterns, not to prove.
Probing: $ARGUMENTS
Check for handoff context: if $ARGUMENTS references a probe-to-probe-llm.md file, load it before Phase 1 — carried context accelerates qualification.
⚠️ AskUserQuestion Guard
CRITICAL: After EVERY AskUserQuestion call, check if answers are empty/blank. Known harness bug: outside Plan Mode, AskUserQuestion silently returns empty answers without showing UI.
If answers are empty: DO NOT proceed with assumptions. Instead:
- Output: “⚠️ Questions didn’t display (known harness bug outside Plan Mode).”
- Present the options as a numbered text list and ask user to reply with their choice number.
- WAIT for user reply before continuing.
Phase 1: Qualify (foreground — MANDATORY)
ENTRY GATE: Phase 2 does not start until Phase 1 is complete. No bypass path exists.
1.1 Parse hypothesis
Extract from $ARGUMENTS or handoff context:
- Hypothesis statement (what you believe might be true)
- Enabling constraints already known (carry forward from prior cycles — do NOT rediscover)
- Confirm/refute criteria already defined (carry forward, update if refined)
If no hypothesis present: AskUserQuestion — ask user to state the hypothesis. Do not proceed without one.
1.2 Identify enabling constraints
Bounds without prescribing path:
- Scope: time, access, reversibility boundary
- Immutable: production systems, data integrity, user-facing state
- Variable: what can be freely changed within experiment
Carry forward from prior cycles unchanged unless explicitly updated.
1.3 Define confirm/refute criteria
Before running: define observable signals. For each criterion:
- Confirmed: observable evidence that supports the hypothesis
- Refuted: observable evidence that contradicts the hypothesis
- Surprise: unexpected result that suggests a different hypothesis
Criteria must be defined before Phase 2 executes. Gate on this.
1.4 Present probe plan
Output:
🔬 Probe → [constraints] → [steps] → [expected patterns] → [confirm/refute criteria] → GATE
Probe type (see references/reference.md): architecture | library | prompt | integration | design
1.5 Entry gate
AskUserQuestion — one call:
- “Proceed with probe? [Yes / Revise hypothesis / Revise criteria / Abort]”
On confirm: Phase 2 executes. On anything else: loop back to 1.1–1.4.
Phase 2: Execute (background)
Configuration: isolation: worktree + run_in_background: true
Runs only after Phase 1 entry gate passes.
2.1 Execute probe steps
Run the experiment as defined in Phase 1. Prefer minimal, reversible actions. Gate frequency is SPARSE — enabling constraints bound the agent, not human micromanagement.
2.2 Sense patterns
Observe results against confirm/refute criteria:
- What signal emerged?
- What was unexpected?
- What constraints were discovered during execution?
2.3 Persist Thinking Artifact ⚠️ MANDATORY
MUST execute before exit gate. DO NOT skip. DO NOT wait for user to ask.
Write probe result to a thinking artifact file in your configured workspace (e.g., thinking/probes/{project}/{date}-{slug}-llm.md).
{project} = current project folder name. Create the directory if missing.
Collision handling: If filename exists, append sequence: {date}-{slug}-2-llm.md, {date}-{slug}-3-llm.md, etc. First write gets clean name.
thinking/probes/{project}/{date}-{slug}-llm.md
thinking/probes/{project}/{date}-{slug}-2-llm.md
Guard: If workspace root is not configured, warn user and skip artifact persistence.
Content: hypothesis + enabling constraints + steps taken + observations + sensed patterns + result classification.
2.4 Exit gate
Classify result: confirmed | refuted | partial | surprise
Produce B4-compatible handoff:
| Result | When | Transition | Template |
|---|---|---|---|
| confirmed | Hypothesis holds | Complex → Complicated | references/probe-to-investigate-llm.md |
| partial (enough signal) | Some evidence, ready for expert analysis | Complex → Complicated | references/probe-to-investigate-llm.md |
| partial (need another angle) | Some evidence, hypothesis needs sharpening | Complex → Complex (re-probe) | references/probe-to-probe-llm.md |
| refuted / surprise | Hypothesis failed or unexpected result | Complex → Complex (brainstorm) | references/probe-to-brainstorm-llm.md |
Handoff token budget: target 300 tokens inline, flex 200-500, hard cap 600. References to thinking files do not count toward cap.
Self-transition: if result is partial and hypothesis can be sharpened, re-invoke probe via references/probe-to-probe-llm.md with accumulated context. Prior cycles compressed to 200 tokens at 800-token accumulated cap.
Philosophy
- Probe to sense patterns, not to prove: one successful probe is a weak signal, not a decision.
- Keep every probe safe to fail: time-boxed, reversible and isolated from production state.
- Define what confirms, refutes and surprises before running anything, so results cannot be bent to fit the hypothesis.
- Change the hypothesis after a refutation instead of repeating the same experiment.
When to Use
- The problem space is in the Cynefin Complex domain: cause-and-effect relationships are only visible in retrospect, not in advance.
- You have a falsifiable hypothesis but no reliable way to reason your way to a conclusion — experimentation is the only path forward.
- The cost of a failed experiment is low and bounded: time-boxed, reversible, and isolated from production state.
- You are entering unknown territory — a new architecture, library, integration pattern, or service boundary where prior knowledge does not transfer.
- A previous probe returned
partialorsurpriseand you need to sharpen the hypothesis before escalating to expert analysis.
When Not to Use
- The problem has a known solution or a clear best practice — use investigate instead (Complicated domain, cause-effect knowable by experts).
- No hypothesis exists yet and the goal is creative divergence — use brainstorm instead (diverge before you converge).
- The action cannot be reversed or rolled back: if failure has permanent side effects, it is not a probe.
- The team needs a guaranteed outcome by a fixed deadline — probes produce signals, not commitments.
- The experiment would require production traffic or real user data to execute — probes must run in isolation.
Anti-Patterns
NEVER run a probe with production traffic
WHY: The value of a probe is learning at low cost; exposing real users to experimental code defeats this.
BAD: Route 10% of live customer requests to the experimental code path. GOOD: Shadow the calls or run against staging with synthetic data.
NEVER treat probe results as proof
WHY: Complex domains resist confirmation; one successful probe is a weak signal, not a decision.
BAD: “It worked once in isolation, so the approach scales.”
GOOD: Record the result as confirmed and hand it to investigate for expert analysis.
NEVER design an irreversible probe
WHY: Reversibility is the core property that makes probing safe; irreversible probes transfer all risk back to the team.
BAD: Run a destructive schema migration on shared data to see what happens. GOOD: Use a staging branch or feature flag that can be rolled back.
NEVER skip Phase 1 qualification
WHY: Without pre-defined criteria, confirmation bias dominates and results are interpreted to fit the hypothesis rather than test it.
BAD: Start executing steps before confirm/refute criteria exist. GOOD: Pass the Phase 1 entry gate with constraints and criteria agreed first.
NEVER carry a failed hypothesis forward unchanged
WHY: Re-running the same experiment expecting different results is wishful thinking, not probing.
BAD: Re-probe a refuted hypothesis with a slightly bigger sample. GOOD: Revise the hypothesis, or route to brainstorm, before the next probe.
NEVER proceed on empty AskUserQuestion answers
WHY: An empty answer means the question was never shown, so any assumption replaces the user’s decision.
BAD: Treat blank answers as “Yes” and start Phase 2. GOOD: Present the options as a numbered text list and wait for the reply.
NEVER skip the thinking artifact
WHY: The artifact is the durable record that makes handoffs and later cycles possible; without it the learning is lost.
BAD: Go straight to the exit gate because the result seems obvious. GOOD: Write the artifact in the configured workspace before classifying and handing off.
NEVER start a probe without a hypothesis
WHY: A probe without a falsifiable statement has nothing to confirm or refute, so it produces noise.
BAD: Begin exploring because the topic “feels risky”. GOOD: Ask the user to state the hypothesis and do not proceed until one exists.
NEVER route a result against the handoff table
WHY: The transition encodes what the evidence supports; misrouting sends the next phase down the wrong path.
BAD: Send a refuted or surprise result to investigate.
GOOD: Send refuted and surprise to brainstorm, confirmed and sufficient partial to investigate, and partial needing another angle to probe.
Usage Examples
Probing a new caching strategy:
# Problem: unknown whether Redis or Memcached fits the read pattern
# Probe: run both on 1% of traffic for 24h, measure hit rate + latency
# Reversible: yes (feature flag)
Probing a service extraction:
# Problem: unclear if extracting auth into a microservice reduces coupling
# Probe: shadow the auth calls for 48h without routing real traffic
Probing an LLM prompt strategy:
# Problem: uncertain whether chain-of-thought prompting improves accuracy for this task
# Probe: run 50 test cases through both zero-shot and CoT variants
# Confirm: CoT accuracy >= zero-shot + 10% on held-out eval set
# Refute: no measurable difference, or CoT latency cost exceeds acceptable threshold
# Reversible: yes (eval harness only, no production change)
Probing a database schema migration approach:
# Hypothesis: adding a surrogate UUID primary key reduces join complexity in reporting queries
# Step 1: create a staging branch with the new schema
# Step 2: run the existing reporting query suite against staging
./scripts/run-query-benchmarks.sh --env staging --compare main
# Step 3: compare execution plans and latency — confirm/refute threshold: >=20% reduction
# Reversible: yes (staging only, main schema untouched)
References
| Topic | Reference | When to Use |
|---|---|---|
| Probe types and observability | references/reference.md | Classifying the probe type and recording observations |
| Probe to investigate | references/probe-to-investigate-llm.md | Result is confirmed or partial with enough signal |
| Probe to brainstorm | references/probe-to-brainstorm-llm.md | Result is refuted or surprise |
| Probe to probe | references/probe-to-probe-llm.md | Result is partial and the hypothesis needs another angle |
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.
Probe to Brainstorm Handoff
Thinking Trail
- Considered: {probe hypothesis and what was tested}
- Rejected: {hypothesis refuted — need new hypotheses}
- Surprised by: {unexpected data that invalidates original framing}
- Models used: Safe-to-fail experiment design
- Constraints discovered: {enabling constraints still present — problem remains complex}
Decisions
- Probe result: {refuted|surprise} — original hypothesis didn’t hold
- Domain: Staying Complex — need new hypotheses via brainstorm
- Rationale: {probe eliminated one path but problem still has no clear cause-effect}
Actions Taken
- Probe executed: {summary}
- Hypothesis refuted or surprise result
- Knowledge written: thinking artifact file for this probe
Output
Probe result: {refuted|surprise} What was learned: {what the probe eliminated or revealed} Why brainstorm: {need fresh hypotheses — old ones exhausted}
Domain Transition
From: Complex (probe) → To: Complex (brainstorm) No domain shift — staying in Complex. Probe refuted hypothesis; returning to divergent exploration with new information.
For /brainstorm
- Context: Probe refuted “{hypothesis}” — see thinking artifacts for evidence
- What’s eliminated: {DO NOT regenerate these hypotheses — already tested and failed}
- New signals: {what the probe revealed that should inform new hypotheses}
- Constraint update: {any new enabling constraints discovered during probe}
- Goal: Generate new hypotheses that account for probe findings
- Do NOT: Revisit refuted hypothesis or its variants
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.
Probe to Investigate Handoff
Thinking Trail
- Considered: {probe hypothesis and what was tested}
- Rejected: {alternative interpretations eliminated by probe results}
- Surprised by: {unexpected patterns or data discovered during probe}
- Models used: Safe-to-fail experiment design
- Constraints discovered: {governing constraints revealed by probe — cause-effect now visible}
Decisions
- Probe result: {confirmed|refuted|partial|surprise}
- Domain shift: Complex → Complicated (cause-effect now understood)
- Rationale: {probe revealed enough structure for expert analysis}
Actions Taken
- Probe executed: {summary of probe steps}
- Patterns sensed: {what emerged}
- Knowledge written: thinking artifact file for this probe
Output
Probe result: {confirmed|refuted|partial|surprise} Key finding: {one-sentence summary} Patterns: {discovered patterns that inform investigation}
Domain Transition
From: Complex (probe) → To: Complicated (investigate) Constraint shift: enabling → governing. Probe revealed cause-effect relationships. The problem now has known good approaches — expert analysis applies.
For /investigate
- Investigation focus: {specific question informed by probe findings}
- Known constraints: {governing constraints revealed by probe}
- Probe evidence: {key data points from probe — reference thinking artifact file}
- Patterns to investigate: {what the probe surfaced that needs deeper analysis}
- Eliminated causes: {DO NOT re-investigate — probe already ruled these out}
- Do NOT: Re-probe — sufficient structure exists. Analyze with expertise.
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.
Probe to Probe Handoff
Thinking Trail
- Considered: {prior probe hypothesis and what was tested}
- Rejected: {interpretations eliminated by prior probe}
- Surprised by: {unexpected patterns — partial result needs different angle}
- Models used: Safe-to-fail experiment design
- Constraints discovered: {enabling constraints — updated from prior probe cycle}
Decisions
- Probe result: {partial} — some signal, need different angle
- Domain: Staying Complex — not enough structure for Complicated yet
- Rationale: {partial result suggests refined hypothesis worth testing}
- Refined hypothesis: {new or sharpened hypothesis based on prior probe}
Actions Taken
- Prior probe executed: {summary of cycle N}
- Partial result: {what was confirmed, what remains uncertain}
- Knowledge written: thinking artifact file for this probe cycle
Output
Prior probe result: {partial} Confirmed so far: {what holds} Still uncertain: {what needs another probe cycle} Refined hypothesis: {sharpened for next cycle}
Domain Transition
From: Complex (probe cycle N) → To: Complex (probe cycle N+1) Self-transition — staying in Complex. Prior probe produced partial result. Refining hypothesis and probing again with accumulated knowledge.
For /probe
- Refined hypothesis: {sharpened hypothesis accounting for prior cycle findings}
- Prior enabling constraints: {carry forward — do NOT rediscover}
- Prior confirm/refute criteria: {carry forward, update if refined}
- What’s confirmed: {from prior cycle — do NOT re-test}
- What’s refuted: {from prior cycle — do NOT retry}
- New angle: {what to test differently this cycle}
- Accumulated probe history: Cycle {N} → partial. See thinking artifact files for full trail.
- Do NOT: Re-qualify from scratch — Phase 1 should be faster with carried context
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. Prior cycles: {count}. If total accumulated > 800 tokens, compress prior trails to 200 tokens (keep: confirmed facts, active constraints, rejected paths only).
probe Reference
Probe Types
| Type | What is probed | Typical steps | Containment |
|---|---|---|---|
| architecture | Structural feasibility — can this design hold? | Scaffold minimal implementation, run against real constraints | Worktree isolation, no prod writes |
| library | Fit of an external library or tool | Install, write minimal integration test, observe behavior | Sandboxed env, pinned version |
| prompt | LLM behavior under specific conditions | Run prompt variants, collect outputs, compare against criteria | Stateless, no persistent writes |
| integration | Compatibility between two systems | Send minimal real requests, observe response shape and error surface | Read-only or staging environment |
| design | User or team response to a design decision | Prototype minimal artifact, present to stakeholder, sense reaction | No code commitment |
All probe types: safe-to-fail, minimal footprint, reversible by default. If a step cannot be reversed, it must be explicitly approved at Phase 1 entry gate.
Observability Format
Every probe emits this format at Phase 1 plan presentation and Phase 2 exit gate:
🔬 Probe → [constraints] → [steps] → [patterns] → [result] → GATE
Examples:
🔬 Probe → [worktree, no prod writes] → [scaffold adapter, run unit tests] → [error surface, type compatibility] → confirmed → GATE
🔬 Probe → [staging env, read-only] → [send 3 API requests, inspect response] → [rate limit hit at step 2] → surprise → GATE
Fields:
constraints: enabling constraints from Phase 1.2 (comma-separated, abbreviated)steps: probe steps executed (comma-separated, abbreviated)patterns: what emerged (observations, not conclusions)result:confirmed|refuted|partial|surpriseGATE: signals human checkpoint — always present, always last
Input Quality Table
Five elements required for a valid probe. If any are missing or weak, the agent asks or proposes — never skips.
| Element | Strong input | Weak/missing input | Agent fallback |
|---|---|---|---|
| Hypothesis | Specific, falsifiable statement: “X will behave like Y under condition Z” | Vague goal: “I want to see if this works” | AskUserQuestion: “State one specific hypothesis — what do you believe is true, and under what condition?” |
| Enabling constraints | Named: scope, reversibility boundary, time box | Absent or implied | Agent proposes based on context: “I suggest constraining to [worktree / staging / 30 min]. Confirm or adjust.” |
| Confirm/refute criteria | Observable signals defined before execution | “We’ll know it works when it works” | Agent proposes: “Confirmed if [X]. Refuted if [Y]. Surprise if [Z]. Revise or proceed?” |
| Prior probe results | Carried from probe-to-probe-llm.md handoff context |
First cycle — none expected | Skip gracefully: no prior context needed on first invocation |
| Scope boundary | Explicit system/component boundary stated | Unbounded (“the whole system”) | Agent proposes minimum viable scope: “I suggest scoping to [component]. Expand if needed.” |
Fallback rule: agent asks or proposes — user validates. Never skip an element silently. Never assume a hypothesis the user did not state.
Self-Transition Protocol
When result is partial and a refined hypothesis is identifiable:
- Write full probe result to a thinking artifact file (e.g.,
thinking/probes/{project}/{date}-{slug}-llm.md). On collision, append-2,-3, etc. - Fill
probe-to-probe-llm.mdwith:- Refined hypothesis (sharpened, not repeated)
- Carried enabling constraints (unchanged unless probe discovered new ones)
- What was confirmed (do not re-test)
- What was refuted (do not retry)
- New angle to probe
- Re-invoke
probewith the filled handoff as$ARGUMENTS - Phase 1 qualification is faster — skip rediscovery of confirmed facts
Accumulated context cap: 800 tokens total across a chain. At cap, compress prior cycles to 200 tokens (keep: confirmed facts, active constraints, rejected paths). References to thinking files do not count toward cap.
Knowledge File Convention
Output path: thinking/probes/{project}/{date}-{slug}-llm.md (under your configured workspace root)
{project} = current project folder name. On collision (file exists), append sequence: -2, -3, etc.
Required sections in knowledge file:
- Hypothesis (as stated at Phase 1)
- Enabling constraints (as approved at entry gate)
- Steps taken (ordered list)
- Observations (raw — what was seen)
- Sensed patterns (interpreted — what the observations suggest)
- Result:
confirmed|refuted|partial|surprise - Eliminated causes (for refuted: what was ruled out — do not re-probe)
Naming: {YYYY-MM-DD}-{hypothesis-slug}-llm.md. Slug is lowercase hyphenated, derived from hypothesis subject.