$npx -y skills add UnpaidAttention/fable5-methodology --skill extended-problem-solvingExternalize reasoning to a scratchpad file for problems too large to hold in working memory — a persistent record of candidate approaches, eliminated branches and WHY they were eliminated, open questions, and current best hypothesis, updated as understanding evolves. Trigger this
| 1 | # Extended Problem Solving |
| 2 | |
| 3 | Some problems have more branches than working memory has slots. Held in-context, they cause the |
| 4 | signature failures: re-exploring a branch you already killed, half-remembering why you rejected |
| 5 | something, and losing the thread across a context break. The fix is a scratchpad on disk that |
| 6 | IS your working memory — you offload to it and re-derive from it rather than from recollection. |
| 7 | |
| 8 | ## Step 1: Open the scratchpad immediately |
| 9 | |
| 10 | Create `REASONING.md` (scratchpad dir or repo root; not committed unless asked). Structure — |
| 11 | all sections present from the start: |
| 12 | |
| 13 | ```markdown |
| 14 | # REASONING — <problem> |
| 15 | |
| 16 | ## Problem statement |
| 17 | <the actual question, precisely; refine it as it sharpens> |
| 18 | |
| 19 | ## Current best hypothesis |
| 20 | <the leading answer/approach right now — one paragraph, updated as it changes> |
| 21 | |
| 22 | ## Candidate approaches / branches |
| 23 | - [ACTIVE] B1: <approach> — status, what's promising |
| 24 | - [KILLED] B2: <approach> — ELIMINATED because <specific reason/evidence> |
| 25 | - [OPEN] B3: <approach> — not yet explored |
| 26 | |
| 27 | ## Confirmed facts |
| 28 | <things established with evidence — each with how it was confirmed> |
| 29 | |
| 30 | ## Open questions |
| 31 | <what's unresolved, ranked by how much it would unblock> |
| 32 | |
| 33 | ## Decisions |
| 34 | <choices made and why> |
| 35 | ``` |
| 36 | |
| 37 | ## Step 2: Record eliminations with their reason — always |
| 38 | |
| 39 | The highest-value entries are the KILLED branches. When you rule something out, write WHY with |
| 40 | the specific evidence: "B2 (in-memory cache) killed — 4 nodes, state must be shared; confirmed |
| 41 | per-node state allows 4× the limit." Without the reason on disk, you WILL wander back into a |
| 42 | dead branch an hour later and re-walk it. The reason is what makes the elimination permanent. |
| 43 | |
| 44 | ## Step 3: Update as understanding evolves |
| 45 | |
| 46 | - New fact confirmed → Confirmed facts, with how. |
| 47 | - Branch explored → flip its status, record the outcome. |
| 48 | - Best hypothesis changes → rewrite that section (don't just append; the current best must be |
| 49 | unambiguous at a glance). |
| 50 | - Update at every meaningful move, not in one batch at the end — the scratchpad is only a |
| 51 | memory if it's current. |
| 52 | |
| 53 | ## Step 4: Re-derive, don't half-remember, on return |
| 54 | |
| 55 | When you come back to a branch (after a context break, a compaction, or switching away and |
| 56 | back): RE-READ its scratchpad entry and re-derive from the confirmed facts. Do not proceed from |
| 57 | a fuzzy recollection of "where I was" — that recollection is exactly what's unreliable at this |
| 58 | scale, and trusting it is how contradictions creep in. The file is authoritative over memory |
| 59 | wherever they disagree. |
| 60 | |
| 61 | ## Step 5: Stop conditions — recognize grind and switch |
| 62 | |
| 63 | Watch for these and change strategy rather than grinding: |
| 64 | - **Circular reasoning:** you're revisiting a branch whose KILLED entry you wrote yourself. |
| 65 | Stop — it's already answered; read the reason. |
| 66 | - **Diminishing returns:** the last three updates added detail but didn't move the best |
| 67 | hypothesis or close an open question. The current strategy is exhausted — switch technique |
| 68 | (backward reasoning, minimal case, or get more evidence) or escalate to the user. |
| 69 | - **All branches killed:** the problem as framed has no solution → the Problem statement or an |
| 70 | assumption is wrong. Re-examine the framing, not the branches. |
| 71 | - **Thrashing:** best hypothesis flipping back and forth between two options → you're missing a |
| 72 | distinguishing fact. Name it in Open questions and go get THAT, instead of re-arguing. |
| 73 | |
| 74 | ## Worked example |
| 75 | |
| 76 | Problem: intermittent data corruption in a pipeline, cause unknown, spans ingestion → |
| 77 | transform → store across three services. |
| 78 | |
| 79 | - Scratchpad opened. Branches: B1 ingestion race, B2 transform off-by-one, B3 store |
| 80 | serialization, B4 clock/ordering. |
| 81 | - B2 explored → KILLED: "transform is pure, property-tested over 10k inputs, no corruption |
| 82 | reproduced — eliminated with evidence." (Recorded so it's never re-opened.) |
| 83 | - Confirmed fact: "corruption only on records processed within 100ms of each other — confirmed |
| 84 | from log correlation." This kills B2/B3 further and promotes B1. |
| 85 | - Best hypothesis rewritten to B1 (concurrent ingestion). Open question: "does the ingestion |
| 86 | queue guarantee per-key ordering?" — ranked top, most unblocking. |
| 87 | - Context compaction happens. On return: re-read |