probe-to-brainstorm-llm.md
---
domain: complex
verb: probe
constraint-type: enabling
problem: "{problem statement}"
scale: "{boulder|pebble}"
---
## 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
1. **Probe result**: {refuted|surprise} — original hypothesis didn't hold
2. **Domain**: Staying Complex — need new hypotheses via brainstorm
3. **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: `$PRAXIS_DIR/thinking/probes/{project}/{date}-{slug}-llm.md`
## 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 `$PRAXIS_DIR/thinking/probes/` 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 `$PRAXIS_DIR/thinking/{type}/{date}-{slug}-llm.md` 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 do NOT count toward the cap.
probe-to-investigate-llm.md
---
domain: complicated
verb: analyze
constraint-type: governing
problem: "{problem statement}"
scale: "{boulder|pebble}"
---
## 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
1. **Probe result**: {confirmed|refuted|partial|surprise}
2. **Domain shift**: Complex → Complicated (cause-effect now understood)
3. **Rationale**: {probe revealed enough structure for expert analysis}
## Actions Taken
- Probe executed: {summary of probe steps}
- Patterns sensed: {what emerged}
- Knowledge written: `$PRAXIS_DIR/thinking/probes/{project}/{date}-{slug}-llm.md`
## 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 `$PRAXIS_DIR/thinking/probes/` 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 `$PRAXIS_DIR/thinking/{type}/{date}-{slug}-llm.md` 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 do NOT count toward the cap.
probe-to-probe-llm.md
---
domain: complex
verb: probe
constraint-type: enabling
problem: "{problem statement}"
scale: "{boulder|pebble}"
---
## 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
1. **Probe result**: {partial} — some signal, need different angle
2. **Domain**: Staying Complex — not enough structure for Complicated yet
3. **Rationale**: {partial result suggests refined hypothesis worth testing}
4. **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: `$PRAXIS_DIR/thinking/probes/{project}/{date}-{slug}-llm.md`
## 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 `$PRAXIS_DIR/thinking/probes/` 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 `$PRAXIS_DIR/thinking/{type}/{date}-{slug}-llm.md` 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 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).
reference.md
# 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` | `surprise`
- `GATE`: 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:
1. Write full probe result to `$PRAXIS_DIR/thinking/probes/{project}/{date}-{slug}-llm.md` (collision: append `-2`, `-3`, etc.)
2. Fill `probe-to-probe-llm.md` with:
- 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
3. Re-invoke `/probe` with the filled handoff as `$ARGUMENTS`
4. 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 `$PRAXIS_DIR/thinking` files do not count toward cap.
---
## Knowledge File Convention
Output path: `$PRAXIS_DIR/thinking/probes/{project}/{date}-{slug}-llm.md`
`{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.
SKILL.md
---
name: probe
description: "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)."
allowed-tools: AskUserQuestion, Read, Glob, Grep, WebSearch, WebFetch, Write, Bash, Task
model: opus
context: main
argument-hint: <hypothesis to probe>
cynefin-domain: complex
cynefin-verb: probe
---
# Probe
Safe-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 Claude Code bug: outside Plan Mode, AskUserQuestion silently returns empty answers without showing UI.
**If answers are empty**: DO NOT proceed with assumptions. Instead:
1. Output: "⚠️ Questions didn't display (known Claude Code bug outside Plan Mode)."
2. Present the options as a **numbered text list** and ask user to reply with their choice number.
3. 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 `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 `$PRAXIS_DIR/thinking/probes/{project}/{date}-{slug}-llm.md`.
`{project}` = current project folder name (e.g., `agent-skills`, `gtd-pcm`). Create `$PRAXIS_DIR/thinking/probes/{project}/` 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.
**Guard**: If `$PRAXIS_DIR` is unset, warn user and skip artifact persistence: `⚠️ $PRAXIS_DIR not set — artifact not persisted. Set via: export PRAXIS_DIR="$HOME/dev/praxis"`
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 | `probe-to-investigate-llm.md` |
| partial (enough signal) | Some evidence, ready for expert analysis | Complex → Complicated | `probe-to-investigate-llm.md` |
| partial (need another angle) | Some evidence, hypothesis needs sharpening | Complex → Complex (re-probe) | `probe-to-probe-llm.md` |
| refuted / surprise | Hypothesis failed or unexpected result | Complex → Complex (brainstorm) | `probe-to-brainstorm-llm.md` |
Handoff token budget: target 300 tokens inline, flex 200-500, hard cap 600. References to `$PRAXIS_DIR/thinking` files do not count toward cap.
Self-transition: if result is `partial` and hypothesis can be sharpened, re-invoke `/probe` via `probe-to-probe-llm.md` with accumulated context. Prior cycles compressed to 200 tokens at 800-token accumulated cap.
---
## Refs
- `reference.md` — probe types, observability format, input quality table
- `probe-to-investigate-llm.md` — handoff: confirmed/partial → Complicated
- `probe-to-brainstorm-llm.md` — handoff: refuted/surprise → Complex (brainstorm)
- `probe-to-probe-llm.md` — handoff: partial → Complex (self-transition)