A Claude Code skill that forces Claude to exhaust every available resource before saying "I can't / I don't know / not sure". Climbs a five-tier ladder, blocks lazy capitulation with a Stop hook.
You ask Claude something. Claude hedges — "I'm not sure", "it depends", "I'd need more context" — without having opened a single file, run a single search, or spawned a single sub-agent. You correct it. Claude apologises, tries one thing, hedges again. Three rounds later you realise Claude could have answered the question on turn one by reading one file plus running one web search.
This is not Claude being lazy. It's a default that optimises for "don't claim things you didn't verify" and accidentally produces "give up before claiming anything". The fix is not more confidence — it's more climbing.
resourceful flips the default: capitulation requires proof of effort. Specifically:
- A five-tier resource ladder. Local filesystem → system/git history → authenticated MCPs (Gmail, Calendar, Drive, GitHub, etc.) → open web + Context7 docs → delegated sub-agents.
- A banned-phrase list. "I'm not sure", "não sei", "outside my reach", "would need more info", "hard to say", and 20+ siblings.
- A Stop hook. Scans every outgoing assistant message. If it contains a banned phrase AND fewer than two ladder tiers were climbed AND no escalation report is present → blocks the message and forces another investigation pass.
- The escalation report. The only legitimate "blocked" — a structured template that names exactly what was tried per tier and exactly what input would unblock. No vague "I'd need more context".
The point isn't to make Claude omniscient. Some questions genuinely aren't answerable from where it sits. The point is that "I can't" must be proven, not assumed.
You: Where do we set the default rate limit?
Claude (without resourceful):
"I'm not sure where it's set — it could be in middleware or environment variables.
Could you share where you'd expect to find it?"
──────────────────────────────────────────────────────
You: Where do we set the default rate limit?
Claude (with resourceful):
[Grep -r 'rateLimit' src/ → 14 hits]
[Read src/middleware/rate-limit.ts:1-80]
[git log --all -S'RATE_LIMIT_DEFAULT' → commit a1b2c3d]
[Read .env.example → RATE_LIMIT_DEFAULT=60]
Default lives in RATE_LIMIT_DEFAULT (currently 60 in .env.example),
consumed by src/middleware/rate-limit.ts:42. Introduced in commit a1b2c3d.
Same question. With the skill installed, Claude climbed L1 + L2 of the ladder before answering. The user got a precise answer on turn one.
Inspect-then-run:
git clone https://github.com/pedroreisper/resourceful
cd resourceful
less install.sh # short, no obfuscation
bash install.sh --hook # installs skill + wires the Stop hookOr one-liner (trust the URL):
curl -fsSL https://raw.githubusercontent.com/pedroreisper/resourceful/main/install.sh | bash -s -- --hookThen /reload your Claude Code session.
mkdir -p ~/.claude/skills
git clone https://github.com/pedroreisper/resourceful ~/.claude/skills/resourceful
bash ~/.claude/skills/resourceful/hooks/install_hook.shbash install.sh --uninstall # removes the skill
# remove the Stop hook entry in ~/.claude/settings.json (search for pre_capitulation.py)| Tier | What | Example tools |
|---|---|---|
| L1 Local | Working tree, ~/.claude/, dotfiles, CLAUDE.md chain |
Read, Grep, Glob |
| L2 System | Git history, GitHub, Spotlight, processes, env | git log, gh search, mdfind, launchctl list |
| L3 MCPs | Gmail, Calendar, Drive, GitHub org, GoCardless, memory graph, Playwright, computer-use | mcp__claude_ai_Gmail__search_threads, etc. |
| L4 Web | Live web + current library docs | WebSearch, WebFetch, mcp__context7__* |
| L5 Agents | Delegated specialists | Agent(researcher), Agent(code-explorer), parallel general-purpose |
Two-tier minimum before any hedge. Five tiers preferred when the user explicitly asks for max effort ("be resourceful", "don't give up").
hooks/pre_capitulation.py runs on Stop events. It:
- Reads the latest assistant message text from the session transcript.
- Runs the banned-phrase regex catalogue against it (
references/banned-phrases.md). - Walks the recent transcript and counts distinct ladder tiers exercised (via tool-call classification).
- Looks for a valid escalation report (
BLOCKED:header +Tried:table with ≥2 non-skipped tiers +Needed:line). - Blocks the Stop only if: banned phrase present AND <2 tiers climbed AND no valid escalation. Otherwise allows.
The only legitimate "blocked" looks like this:
BLOCKED: Cannot decide between two equally valid migration paths without a product call.
Tried:
L1 (local): read src/auth/{legacy.ts,session.ts}, CLAUDE.md auth section
L2 (system): git log --all -S'sessionToken' (12 commits; no consensus)
L3 (mcps): Gmail search 'session migration' (3 threads, inconclusive); GH PR #318 closed, #421 stalled
L4 (web): WebSearch 'NextAuth v6 session migration breaking change' (docs incomplete)
L5 (agents): researcher spawned — confirms ambiguity in upstream docs
Needed: Pedro to choose (a) drop legacy `sessionToken` at migration vs. (b) dual-write for one cycle.
Hedging without this shape is auto-blocked.
| Situation | How the skill fires |
|---|---|
User invokes /resourceful |
Manual — top of session or mid-task. |
| User says "be resourceful", "don't give up", "go deeper", "investiga mais" | Trigger phrase — bar rises to all 5 tiers. |
| Claude is about to type "I'm not sure" | Stop hook — blocks unless tiers were climbed. |
| Research-shaped questions ("how do I…", "where is…", "is X possible…") | Skill self-applies as a checklist. |
- Trivial single-tool tasks.
- Pure-opinion asks ("which name do you prefer").
- The user has explicitly accepted a hedge ("just guess").
- Already produced a clean escalation report → answer the user's follow-up, don't re-climb.
did-it-actuallyverifies output against the request.resourcefulgoverns input — what was investigated. They compose: runresourcefulfor input quality,did-it-actuallyfor output quality.karpathy-guidelinessays "surface your assumptions".resourcefulsays "if your assumption is checkable, check it".briefing(Pedro's morning briefing) is a packaged L3 climb.paper-lookupis an L4 specialisation for academic queries.
resourceful/
├── SKILL.md # main skill spec, loaded by Claude Code
├── README.md # this file
├── LICENSE # MIT
├── install.sh # installer
├── references/
│ ├── resource-ladder.md # the five tiers, full tool examples
│ ├── banned-phrases.md # regex catalogue + accepted replacements
│ ├── escalation-template.md # the BLOCKED report format
│ └── examples.md # three worked runs
├── hooks/
│ ├── pre_capitulation.py # Stop hook
│ └── install_hook.sh # wires the hook into settings.json
└── scripts/
└── doctor.sh # verify install + hook wiring
- The hook is a regex pass — it will miss creatively-phrased hedges and occasionally false-positive on a literal phrase inside quoted user text. Tune
references/banned-phrases.mdto your taste. - Tier classification of
Bashcalls is heuristic (looks at the command string forgit/gh/mdfindetc.). A bash one-liner that mixes Tier 1 and Tier 2 work is counted as one tier. - The hook reads the session transcript file directly. Format changes in future Claude Code versions may require a small update to
read_transcript(). - The skill assumes English + Portuguese hedge vocabulary. Add patterns to
references/banned-phrases.mdfor other languages.
PRs welcome. Useful additions:
- More banned-phrase patterns in other languages.
- More tier classifiers (especially for new MCP servers).
- More worked examples in
references/examples.md— particularly the legitimate-escalation kind.
MIT. See LICENSE.