Agent skill
smart-reading
Use when reading files or command output of unknown size to avoid blind truncation and context loss
Install this agent skill to your Project
npx add-skill https://github.com/majiayu000/claude-skill-registry/tree/main/skills/data/smart-reading
SKILL.md
Truncation creates false confidence: you think you "saw" the output, but the critical error was on line 247. </CRITICAL>
Smart Reading Protocol
A behavioral protocol for reading files and command output without losing critical context.
Invariant Principles
- No Silent Data Loss - Blind truncation (
head,tail -n, arbitrary pipes) creates false confidence. Critical errors often appear at end of output. - Size Before Strategy - Unknown content size requires measurement (
wc -l) before deciding read approach. - Intent-Driven Delegation - Subagents read ENTIRE content, return targeted summaries. Specify WHY you need content.
- Temp Files Demand Cleanup - Every capture requires explicit cleanup plan. Use
$$for collision-free naming.
The Problem
Claude often pipes output through head -100 to "save tokens." This causes:
- Silent data loss
- Missed errors (which often appear at the END)
- Wrong conclusions based on incomplete information
- Wasted debugging cycles
The Solution
Check size first. Then decide approach.
Unknown file/output → wc -l → decision → read directly OR delegate to subagent
Decision Matrix
| Line Count | Need Exact Text? | Action |
|---|---|---|
| ≤200 | Yes (editing) | Read directly, full file |
| ≤200 | No (understanding) | Read directly, full file |
| >200 | Yes (editing specific section) | Read directly with offset/limit to target section |
| >200 | No (understanding/analysis) | Delegate to Explore subagent with intent |
Before Reading Any File
wc -l < "$FILE" # Get line count first
Command Output Capture
For commands with unpredictable output size, capture to a temp file first using tee.
The Pattern
# Capture full output while still seeing it stream
command 2>&1 | tee /tmp/cmd-$$-output.txt
# Check size
wc -l < /tmp/cmd-$$-output.txt
# Apply decision matrix (read directly or delegate)
# ...
# ALWAYS cleanup
rm /tmp/cmd-$$-output.txt
Temp File Naming
Use $$ (process ID) to avoid collisions:
/tmp/cmd-$$-output.txt- general command output/tmp/test-$$-output.txt- test runs/tmp/build-$$-output.txt- build logs
When to Capture vs Delegate Entirely
| Scenario | Approach |
|---|---|
| Need to see output streaming AND analyze after | tee to temp file |
| Pure analysis, don't need streaming | Delegate entire command to subagent |
| Interactive command or watching for specific event | Run directly, no capture |
Cleanup Rules
-
Immediate cleanup after analysis:
bashrm /tmp/cmd-$$-output.txt -
Trap-based cleanup for complex flows:
bashtrap 'rm -f /tmp/cmd-$$-output.txt' EXIT -
Delegate to subagent - subagent handles its own cleanup </CRITICAL>
Capture Examples
Test run with capture:
pytest tests/ 2>&1 | tee /tmp/test-$$-output.txt
wc -l < /tmp/test-$$-output.txt # Check size
# If >200: delegate analysis of /tmp/test-$$-output.txt
# If ≤200: read directly
rm /tmp/test-$$-output.txt
Build with capture:
npm run build 2>&1 | tee /tmp/build-$$-output.txt
# Analyze...
rm /tmp/build-$$-output.txt
Pure delegation (no capture needed):
Task(Explore): Run `pytest tests/` and extract all failures with
stack traces. Return a summary of what failed and why.
Delegation Intents
When delegating to a subagent, specify WHY you need the file. The subagent reads the ENTIRE content and returns a targeted summary.
| Intent | Subagent Behavior | Example Prompt |
|---|---|---|
| Error extraction | Find all errors, warnings, failures. Return with context. | "Read the test output and extract all failures with their stack traces" |
| Technical summary | Comprehensive but condensed overview preserving structure | "Summarize this config file's structure and key settings" |
| Presence check | Does concept X exist? Where? | "Does this file implement rate limiting? If so, where and how?" |
| Diff-aware | What changed and why does it matter? | "Compare these two versions and explain the significant changes" |
| Structure overview | What's in this file, how is it organized | "Outline the structure of this module - classes, functions, their purposes" |
Delegation Template
Read [file/output] in full. [INTENT STATEMENT]
Return:
- [What you need back]
- [Any specific format requirements]
Do not truncate. Read the entire content before summarizing.
Anti-Patterns
Anti-Pattern Examples
Forbidden:
pytest tests/ 2>&1 | head -100 # WRONG: errors often at end
cat src/large_module.py # WRONG: might be 2000 lines
Required:
wc -l < src/large_module.py # Returns: 1847
# Now delegate to subagent for summary, or read specific section
Task(Explore): Run pytest tests/ and analyze the output. Extract all
test failures with their full tracebacks and error messages. Summarize
the failure patterns.
When Direct Reading is Correct
- Files known to be small (configs, small scripts)
- You need exact text for editing (use Read with offset/limit for large files)
- File is already in context from earlier in conversation
- Quick verification of specific lines you already know about
When Delegation is Correct
- Test output (failures cluster unpredictably)
- Build logs (errors often at end)
- Large source files when you need understanding, not exact text
- Multiple files to cross-reference
- Any output where you don't know what you're looking for
Reasoning Schema
Before running command with unpredictable output:
6. Capture with tee for post-analysis? Or delegate entire command?
7. If capturing: cleanup plan exists?
8. If delegating: intent specified clearly?
Self-Check
Before completing:
- Size checked before reading unknown content
- No blind truncation used
- Delegation includes explicit intent if used
- Temp files cleaned up if created
- Critical information not lost to truncation
If ANY unchecked: STOP and fix approach.
<BEFORE_RESPONDING> Before reading any file or command output:
- Do I know the size? If not, check with
wc -l - Is it ≤200 lines? → Read directly
- Is it >200 lines AND I need exact text? → Read with targeted offset/limit
- Is it >200 lines AND I need understanding? → Delegate with explicit intent
- Am I about to use
head,tail -n, or a truncating pipe? → STOP. Delegate instead.
Before running a command with unpredictable output:
- Should I capture with
teeto analyze after? Or delegate the entire command? - If capturing: Did I plan for cleanup?
- If delegating: Did I specify the analysis intent clearly? </BEFORE_RESPONDING>
Didn't find tool you were looking for?