Token-efficient retrieval using depth levels (L0-L5) and heading-based sections. Use for any file reads.
Token-efficient retrieval system using markdown-native section detection.
Core Principle: Never read a full file when partial content suffices.
Choose retrieval depth by need:
| Level | Need | Method | Lines |
|---|---|---|---|
| L0 | Exists? | Grep(output: files_with_matches) |
~1 |
| L1 | Count? | Grep(output: count) |
~1 |
| L2 | Lookup value | Grep(pattern, -C:2) |
~5 |
| L3 | Overview | Read(limit: 40) |
~40 |
| L4 | Section | Grep heading ā Read(offset, limit) | ~50 |
| L5 | Full | Read() - justify first |
All |
What do I need?
āā Does X exist? āāāāāāāāāāāŗ L0: Grep files_with_matches
āā How many X? āāāāāāāāāāāāāŗ L1: Grep count
āā What is X's value? āāāāāāŗ L2: Grep with context
āā What does X do? āāāāāāāāāŗ L3: Read limit:40
āā How to use X for Y? āāāāāŗ L4: Section extraction
āā Implement X fully? āāāāāāŗ L5: Full read (target only)
| Scenario | Tool | Parameters |
|---|---|---|
| Check skill exists | Grep | output: files_with_matches |
| Count matches | Grep | output: count |
| Get specific row | Grep | pattern, -C: 0-2 |
| Read frontmatter | Read | limit: 25 |
| Read frontmatter+summary | Read | limit: 40 |
| Extract section | Read | offset: N, limit: 50 |
| Full understanding | Read | (no limit) |
Sections are defined by headings and horizontal rules:
## Section A
Content...
--- ā Section A ends here (horizontal rule)
## Section B ā Or section ends at next same-level heading
Content...
No custom markers needed. Standard markdown structure.
1. Grep("^## Section Name$", file) ā line 15
2. Grep("^---|^## ", file, offset: 16) ā next break at line 30
3. Read(file, offset: 15, limit: 15) ā lines 15-30
A section ends at the first of:
--- (horizontal rule)## (same-level heading)# (higher-level heading)# Extract Summary section
Grep("^## Summary$", file) ā line 20
Grep("^---|^## ", file, offset: 21) ā line 28
Read(file, offset: 20, limit: 8)
# Extract Quick Reference section
Grep("^## Quick Reference$", file) ā line 30
Grep("^---|^## ", file, offset: 31) ā line 55
Read(file, offset: 30, limit: 25)
WRONG: Read entire SKILL-INDEX.md to find one skill
RIGHT: Grep("skill-name", SKILL-INDEX.md, -C:1)
WRONG: Read 5 skill files to understand what they do
RIGHT: Read each with limit:40 (frontmatter + summary)
WRONG: Read entire agent file to check if it has a skill
RIGHT: Grep("skills:.*skill-name", agent.md)
1. Check index file (SKILL-INDEX.md, AGENT-INDEX.md)
2. Extract needed info via grep
3. Only read source file if index insufficient
All files have metadata in first 20 lines:
---
name: identifier
description: "one-line summary"
layer: 1-4
keywords: [searchable, terms]
---
To get metadata: Read(file, limit: 20)
Standard markdown headings define extractable sections:
## Summary ā Grep target
Brief description.
---
## Quick Reference ā Grep target
| Col | Col |
To extract section: Grep heading ā find end ā Read range
Full read justified when:
---
name: identifier
description: "One-line (< 100 chars)"
layer: 1-4
keywords: [grep, targets]
---
# Title
## Summary
2-3 sentences. Key purpose.
---
## Quick Reference
| Pattern | Usage |
|---------|-------|
---
## Patterns
### Pattern 1
Content...
### Pattern 2
Content...
---
## Related
- [link](path)
| Heading | Purpose | Required |
|---|---|---|
## Summary |
Quick understanding (L3) | Yes |
## Quick Reference |
Lookup tables (L2-L3) | Yes |
## Patterns |
Implementation details | For skills |
## Scope |
Does/Does NOT | For agents |
## Related |
Cross-references | Recommended |
---
# Required
name: string # Identifier (grep target)
description: string # One-line (< 100 chars)
layer: number # 1=foundation, 2=framework, 3=feature, 4=workflow
# Recommended
keywords: string[] # Grep targets
depends_on: string[] # Prerequisites
complements: string[] # Often-used-with
# Optional
used_by: string[] # Agents/commands using this
tech_stack: string[] # Technologies
auto_apply: boolean # Auto-trigger on match
---
## Master Index
| Name | L | Keywords | Path |
|------|---|----------|------|
| skill-a | 2 | key1,key2 | skills/skill-a/SKILL.md |
| skill-b | 1 | key3,key4 | skills/skill-b/SKILL.md |
---
## Lookup by Keyword
| Keyword | Skills |
|---------|--------|
| entity | abp-framework, abp-entity, domain-modeling |
Grep usage:
Grep("skill-a", INDEX.md, output: content, -C: 0)
ā | skill-a | 2 | key1,key2 | skills/skill-a/SKILL.md |
Old approach (2,434 lines):
Read(AGENT-QUICK-REF.md) ā 127 lines
Read(abp-developer.md) ā 144 lines
Read(SKILL-INDEX.md) ā 337 lines
Read(3 skill files) ā 1,283 lines
Protocol approach (~265 lines):
Read(abp-developer.md) ā 108 lines (target)
Grep("abp-developer", AGENT-INDEX.md) ā 1 line
Grep(skills from agent, SKILL-INDEX.md) ā 11 lines
Read(3 skills, limit:40 each) ā 120 lines
Savings: 89%
# L0: Just check existence
Grep("^name: xunit-testing", .claude/skills, output: files_with_matches)
ā .claude/skills/xunit-testing-patterns/SKILL.md
# L4: Section extraction (markdown-native)
Grep("^## Quick Reference$", skill.md) ā line 30
Grep("^---|^## ", skill.md, offset: 31) ā line 55
Read(skill.md, offset: 30, limit: 25)
ā Just the Quick Reference section
description is one line, under 100 charskeywords include grep targets## Summary section present (2-3 sentences)## Quick Reference has lookup tables--- separators between major sections