← fstackCONTENT HISTORYWHAT CHANGED · RULE-BASED ANALYSIS
Update to fstack
Snapshot Sep 30, 2026 · 23:16 UTC · version 1.1.2
Collection source: not recorded for this historical snapshot.
First saved snapshot
No earlier snapshot is available to establish a change.
Compare saved observations
Download comparison JSONFull technical diff · 0 changed fields
Full snapshot data
{
"description": "Apply when reviewing or shaping code that's hard to trace. Count layers between question and answer, and hidden state in the reader's head; collapse one-caller wrappers and shrink mutable scope.",
"included_files": [],
"name": "principle-minimize-reader-load",
"skill_md_contents": "---\r\nname: principle-minimize-reader-load\r\ndescription: \"Apply when reviewing or shaping code that's hard to trace. Count layers between question and answer, and hidden state in the reader's head; collapse one-caller wrappers and shrink mutable scope.\"\r\nuser-invocable: false\r\ndisable-model-invocation: true\r\n---\r\n\r\n# Minimize Reader Load\r\n\r\nMaintainability is the work a reader must do to understand code. Track two axes:\r\n1. **Layers to trace.** How many indirections sit between the question and the answer.\r\n2. **State to hold.** How much hidden or mutable context the reader must keep in their head.\r\n\r\n**Why:** Code is read far more than it is written. LOC, cyclomatic complexity, and \"clean architecture\" are proxies. Reader load is the thing that matters. The two axes are independent. A flat file with 50 globals can be as hard to reason about as a 6-layer adapter stack. Guard both. This is the human analog of [Guard the Context Window](../principle-guard-the-context-window/SKILL.md): working memory is finite for readers too.\r\n\r\n**The pattern:**\r\n- **Collapse layers** that do not earn their keep: wrappers with one caller, adapters with no second implementation, indirection introduced for a future that never came. Inline them.\r\n- **Make adjacent layers change the abstraction.** A layer that repeats the same methods and arguments adds reader load without compression. Collapse pass-through layers.\r\n- **Demand interface compression.** A broad interface that hides little complexity makes readers learn both the surface and the implementation. Prefer boundaries that hide meaningful decisions.\r\n- **Shrink state scope:** prefer pure functions (returns over mutations), locals over fields, fields over module state, and module state over globals. Derive instead of sync.\r\n- **Name the invariant at the boundary,** not in every consumer, so the reader learns it once.\r\n- Before adding a layer or a piece of state, ask: does this reduce reader load somewhere else by at least as much?\r\n\r\n**The test:** Can a new reader answer \"where does X come from?\" and \"what can change X?\" in under 30 seconds? If not, cut layers or cut state.\r\n"
}SHA-256 of public snapshot: bcb0147e1f27158edc3b57ea4d108d80e32fd057503549f887fe757cd96fbd57