/functional-area-resolver
Compress an agent's routing file (RESOLVER.md or AGENTS.md) by converting granular skill-per-row tables into functional-area dispatchers. Each area lists sub-skills in a "(dispatcher for: ...)" clause. The LLM reads one area entry and routes to the correct sub-skill. Proven via
$ npx -y skills add garrytan/gbrain --skill functional-area-resolver --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/functional-area-resolver
Context preview
The summary Claude sees to decide when to auto-load this skill.
Compress an agent's routing file (RESOLVER.md or AGENTS.md) by converting granular skill-per-row tables into functional-area dispatchers. Each area lists sub-skills in a "(dispatcher for: ...)" clause. The LLM reads one area entry and routes to the correct sub-skill. Proven via
SKILL.md
functional-area-resolver.SKILL.mdname: functional-area-resolver
version: 1.0.0
prompt_version: 1
description: |
Compress an agent's routing file (RESOLVER.md or AGENTS.md) by converting
granular skill-per-row tables into functional-area dispatchers. Each area
lists sub-skills in a "(dispatcher for: ...)" clause. The LLM reads one
area entry and routes to the correct sub-skill. Proven via held-out
A/B eval: dispatcher pattern outperforms naive pipe-table compression.
triggers:
- "compress agents.md"
- "compress my resolver"
- "resolver too big"
- "resolver.md too big"
- "agents.md too large"
- "shrink routing table"
- "slim down agents.md"
- "functional area resolver"
- "functional area dispatcher"
- "context-health agents"
- "context-health resolver"
- "reduce context budget"
tools:
- exec
- read
- write
- edit
mutating: true
# This skill names other skills (perplexity-research, brain-publish,
# etc.) in its dispatcher prose; the v0.36.x brain-first regex matches
# the word `perplexity` but the skill never actually calls external
# APIs. It rewrites local routing tables. Declarative opt-out.
brain_first: exempt
Functional-Area Resolver — Pattern for Compressing Routing Tables
Problem
Routing files (RESOLVER.md, AGENTS.md) grow as skills are added. Each skill gets its own row (trigger -> skill path). At ~200+ skills this hits 25-30KB, eating context budget that should go to actual work.
Solution: Functional-Area Dispatchers
Replace N rows per area with **one entry per functional area**. Each entry lists all sub-skills it can dispatch to in a `(dispatcher for: ...)` clause.
Before (270 rows, 25KB)
- Creating/enriching a person or company page -> `enrich`
- Fix broken citations in brain pages -> `citation-fixer`
- Publish/share a brain page as link -> `brain-publish`
- Generate PDF from brain page -> `brain-pdf`
- Read a book through lens of a problem -> `strategic-reading`
- Personalized book analysis -> `book-mirror`
- Brain integrity -> `brain-librarian`
...
After (13 rows, 13KB)
- **Brain & knowledge**: create/enrich/search/export brain pages, filing,
citations, publishing, book analysis, strategic reading, concept synthesis,
archive mining -> `brain-ops` (dispatcher for: enrich, query, brain-pdf,
brain-publish, brain-export, brain-librarian, citation-fixer, book-mirror,
strategic-reading, concept-synthesis, archive-crawler, ...)
Why It Works
The LLM doesn't need one row per sub-skill. It needs: 1. **Area recognition** — "this is about brain pages" -> Brain & Knowledge 2. **Sub-skill visibility** — the `(dispatcher for: ...)` list shows what's available 3. **The skill file itself** — once the LLM reads `brain-ops/SKILL.md`, it has full routing detail
This is a **two-layer dispatch**: routing file routes to the area, the area skill routes to the specific sub-skill. Each layer does one job well.
A/B Eval Results
Three resolver architectures tested across three Anthropic frontier models (Opus 4.7, Sonnet 4.6, Haiku 4.5) on real production AGENTS.md content, 20 hand-authored training fixtures + 5 held-out blind fixtures, n=3 seeded repeats per (fixture, variant). Two scoring rules: **STRICT** (predicted slug exactly equals expected) and **LENIENT** (predicted is in the same dispatcher area as expected). Both matter:
- STRICT measures: "does the LLM return the exact slug?"
- LENIENT measures: "does the LLM land in the right area, even if it picks a
more-specific sub-skill from `(dispatcher for: ...)`?" This is closer to production behavior — an agent that lands in `gmail` for an email intent succeeds even if the resolver entry said `executive-assistant`.
Training corpus (n=20, 3 seeds × 3 variants × 3 models, LENIENT)
| Variant | Opus 4.7 | Sonnet 4.6 | Haiku 4.5 | Size | |---|---|---|---|---| | baseline (270 bullet rows) | 81.7% ± 7.2% | 86.7% ± 7.2% | 73.3% ± 7.2% | 25KB | | **functional-areas** (this pattern) | **98.3% ± 7.2%** | **100% ± 0%** | **88.3% ± 7.2%** | **13KB** | | resolver-of-resolvers (no dispatcher clause) | 63.3% ± 14.3% | 41.7% ± 7.2% | 65.0% ± 12.4% | 10KB |
Held-out blind corpus (n=5, 3 seeds, LENIENT)
| Variant | Opus 4.7 | Sonnet 4.6 | Haiku 4.5 | |---|---|---|---| | baseline | 100% ± 0% | 100% ± 0% | 100% ± 0% | | **functional-areas** | **100% ± 0%** | **100% ± 0%** | **100% ± 0%** | | resolver-of-resolvers | 100% ± 0% | **73.3% ± 28.7%** | 100% ± 0% |
What the data shows
1. **Functional-areas BEATS baseline on training across all three models** (+13 to +17pp) at 48% the size. Held-out is saturated at 100% for both — within margin of error.
2. **The `(dispatcher for: ...)` clause is the load-bearing signal.** resolver-of-resolvers strips that clause and collapses to 41.7% on Sonnet — the catastrophic failure case the original PR predicted, now observed.
3. **The pattern works because the LLM can drill into the dispatcher list.** Most "STRICT failures" are the LLM picking a more-specific sub-skill (`gmail` instead of `executive-assistant`). That's the pattern working as designed. STRICT scoring under-counts; LENIENT scoring reflects production agent behavior.
4. **The pattern's value scales with model tier.** Compression gain (functional-areas vs baseline, training, LENIENT) is +17pp on Opus, +13pp on Sonnet, +15pp on Haiku. Sonnet shows the cleanest separation between functional-areas and resolver-of-resolvers (100% vs 41.7%) — model capacity affects how much the dispatcher signal matters.
Reproduce
cd evals/functional-area-resolver
node harness.mjs --model opus # ~225 LLM calls, ~$1.70 at Opus pricing
node harness.mjs --model sonnet # ~$1.00
node harness.mjs --model haiku # ~$0.30
node rescore.mjs baseline-runs/2026-05-11-opus-4-7.jsonl # zero-cost re-score
Receipts (model, prompt_template_hash, fixtures_hash, harness_sha, ts): `evals/functional-area-resolver/baseline-runs/2026-05-11-{opus-4-7,sonnet-4-6,haiku-4-5}.jsonl`.
Methodology
Read more
name: functional-area-resolver version: 1.0.0 prompt_version: 1 description: | Compress an agent's routing file (RESOLVER.md or AGENTS.md) by converting granular skill-per-row tables into functional-area dispatchers. Each area lists sub-skills in a "(dispatcher for: ...)" clause. The LLM reads one area entry and routes to the correct sub-skill. Proven via held-out A/B eval: dispatcher pattern outperforms naive pipe-table compression. triggers: - "compress agents.md" - "compress my resolver" - "resolver too big" - "resolver.md too big" - "agents.md too large" - "shrink routing table" - "slim down agents.md" - "functional area resolver" - "functional area dispatcher" - "context-health agents" - "context-health resolver" - "reduce context budget" tools: - exec - read - write - edit mutating: true # This skill names other skills (perplexity-research, brain-publish, # etc.) in its dispatcher prose; the v0.36.x brain-first regex matches # the word `perplexity` but the skill never actually calls external # APIs. It rewrites local routing tables. Declarative opt-out. brain_first: exempt
Functional-Area Resolver — Pattern for Compressing Routing Tables
Problem
Routing files (RESOLVER.md, AGENTS.md) grow as skills are added. Each skill gets its own row (trigger -> skill path). At ~200+ skills this hits 25-30KB, eating context budget that should go to actual work.
Solution: Functional-Area Dispatchers
Replace N rows per area with **one entry per functional area**. Each entry lists all sub-skills it can dispatch to in a `(dispatcher for: ...)` clause.
Before (270 rows, 25KB)
- Creating/enriching a person or company page -> `enrich` - Fix broken citations in brain pages -> `citation-fixer` - Publish/share a brain page as link -> `brain-publish` - Generate PDF from brain page -> `brain-pdf` - Read a book through lens of a problem -> `strategic-reading` - Personalized book analysis -> `book-mirror` - Brain integrity -> `brain-librarian` ...
After (13 rows, 13KB)
- **Brain & knowledge**: create/enrich/search/export brain pages, filing, citations, publishing, book analysis, strategic reading, concept synthesis, archive mining -> `brain-ops` (dispatcher for: enrich, query, brain-pdf, brain-publish, brain-export, brain-librarian, citation-fixer, book-mirror, strategic-reading, concept-synthesis, archive-crawler, ...)
Why It Works
The LLM doesn't need one row per sub-skill. It needs: 1. **Area recognition** — "this is about brain pages" -> Brain & Knowledge 2. **Sub-skill visibility** — the `(dispatcher for: ...)` list shows what's available 3. **The skill file itself** — once the LLM reads `brain-ops/SKILL.md`, it has full routing detail
This is a **two-layer dispatch**: routing file routes to the area, the area skill routes to the specific sub-skill. Each layer does one job well.
A/B Eval Results
Three resolver architectures tested across three Anthropic frontier models (Opus 4.7, Sonnet 4.6, Haiku 4.5) on real production AGENTS.md content, 20 hand-authored training fixtures + 5 held-out blind fixtures, n=3 seeded repeats per (fixture, variant). Two scoring rules: **STRICT** (predicted slug exactly equals expected) and **LENIENT** (predicted is in the same dispatcher area as expected). Both matter:
- STRICT measures: "does the LLM return the exact slug?"
- LENIENT measures: "does the LLM land in the right area, even if it picks a
more-specific sub-skill from `(dispatcher for: ...)`?" This is closer to production behavior — an agent that lands in `gmail` for an email intent succeeds even if the resolver entry said `executive-assistant`.
Training corpus (n=20, 3 seeds × 3 variants × 3 models, LENIENT)
| Variant | Opus 4.7 | Sonnet 4.6 | Haiku 4.5 | Size | |---|---|---|---|---| | baseline (270 bullet rows) | 81.7% ± 7.2% | 86.7% ± 7.2% | 73.3% ± 7.2% | 25KB | | **functional-areas** (this pattern) | **98.3% ± 7.2%** | **100% ± 0%** | **88.3% ± 7.2%** | **13KB** | | resolver-of-resolvers (no dispatcher clause) | 63.3% ± 14.3% | 41.7% ± 7.2% | 65.0% ± 12.4% | 10KB |
Held-out blind corpus (n=5, 3 seeds, LENIENT)
| Variant | Opus 4.7 | Sonnet 4.6 | Haiku 4.5 | |---|---|---|---| | baseline | 100% ± 0% | 100% ± 0% | 100% ± 0% | | **functional-areas** | **100% ± 0%** | **100% ± 0%** | **100% ± 0%** | | resolver-of-resolvers | 100% ± 0% | **73.3% ± 28.7%** | 100% ± 0% |
What the data shows
1. **Functional-areas BEATS baseline on training across all three models** (+13 to +17pp) at 48% the size. Held-out is saturated at 100% for both — within margin of error.
2. **The `(dispatcher for: ...)` clause is the load-bearing signal.** resolver-of-resolvers strips that clause and collapses to 41.7% on Sonnet — the catastrophic failure case the original PR predicted, now observed.
3. **The pattern works because the LLM can drill into the dispatcher list.** Most "STRICT failures" are the LLM picking a more-specific sub-skill (`gmail` instead of `executive-assistant`). That's the pattern working as designed. STRICT scoring under-counts; LENIENT scoring reflects production agent behavior.
4. **The pattern's value scales with model tier.** Compression gain (functional-areas vs baseline, training, LENIENT) is +17pp on Opus, +13pp on Sonnet, +15pp on Haiku. Sonnet shows the cleanest separation between functional-areas and resolver-of-resolvers (100% vs 41.7%) — model capacity affects how much the dispatcher signal matters.
Reproduce
cd evals/functional-area-resolver node harness.mjs --model opus # ~225 LLM calls, ~$1.70 at Opus pricing node harness.mjs --model sonnet # ~$1.00 node harness.mjs --model haiku # ~$0.30 node rescore.mjs baseline-runs/2026-05-11-opus-4-7.jsonl # zero-cost re-score
Receipts (model, prompt_template_hash, fixtures_hash, harness_sha, ts): `evals/functional-area-resolver/baseline-runs/2026-05-11-{opus-4-7,sonnet-4-6,haiku-4-5}.jsonl`.
Methodology
Search gives you raw pages. GBrain gives you the answer. It's the brain layer your AI agent has been missing — the only one that does synthesis, graph traversal, and gap analysis in one box.
Repo: garrytan/gbrain
Other skills on gbrain.
- /voice-persona-mars
Route to Mars (introspective thought partner / demo showman voice persona). Used when the operator wants depth, meaning, or impressive social demos rather than logistics. Mars handles SOLO mode (philosophy, presence, patterns) and DEMO mode (tool-driven showmanship)
Open skill - /voice-persona-venus
Route to Venus (sharp executive-assistant voice persona). Used for logistics — calendar, tasks, recent messages, brain lookups — at sub-second phone-call latency. The default voice persona unless DEFAULT_PERSONA=mars is set.
Open skill - /voice-post-call
Post-call handling for a voice session — turn the transcript into a brain page, post the summary to the operator's messaging surface, archive the audio. Belt-and-suspenders: fires both from a tool the voice persona can call mid-call AND from the automatic call-end handler in
Open skill - /retrieval-reflex
When/what to retrieve — open the brain page for a salient entity before answering from memory.
Open skill - /academic-verify
Verify a research claim or academic citation by tracing it through publication → methodology → raw data → independent replication. Routes through perplexity-research for the actual web lookup, then formats results as a citation-checked brain page. Use when a
Open skill - /archive-crawler
Universal archivist for personal file archives (Dropbox/B2/Gmail-takeout/local-mount/hard-drive-dump). Filters for high-value content (the user's own writing, ideas, relationships) and surfaces it interactively. REFUSES TO RUN without an explicit gbrain.yml
Open skill

