
Skill Progressive Disclosure Design
- 1.9k installs
- 178 repo stars
- Updated August 1, 2026
- samber/cc-skills
skill-progressive-disclosure-design is an agent skill that Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable triggering. U.
About
Each section that recommends a direction includes explicit pros and cons The decisions in this skill are trade offs not rules The model using this skill should reason from the trade offs to the user s specific situation rather than apply rules blindly Triggering vs disclosure separate these first Two problems get conflated and need separating before any splitting decision Triggering is whether Claude invokes the skill at all Driven entirely by the YAML description File splitting does not affect triggering If the question is my skill doesn t trigger reliably do not split files fix the description use run_loop py from the skill creator skill Progressive disclosure is what loads after the skill activates SKILL md body always loads references only loads when SKILL md tells the model to read a specific file scripts executes without loading into context at all This is where context protection happens
- name: skill-progressive-disclosure-design
- description: Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable
- compatibility: Designed for Claude or similar AI agents.
- Follow skill-progressive-disclosure-design SKILL.md steps and documented constraints.
- Follow skill-progressive-disclosure-design SKILL.md steps and documented constraints.
Skill Progressive Disclosure Design by the numbers
- 1,910 all-time installs (skills.sh)
- +16 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #664 of 16,546 AI & Agent Building skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
skill-progressive-disclosure-design capabilities & compatibility
- Capabilities
- name: skill progressive disclosure design · description: decide how to split skill content b · compatibility: designed for claude or similar ai · follow skill progressive disclosure design skill
- Use cases
- orchestration
What skill-progressive-disclosure-design says it does
name: skill-progressive-disclosure-design
description: Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable triggering. Use this whenever creating a new Claude skill, refactoring an existi
compatibility: Designed for Claude or similar AI agents.
npx skills add https://github.com/samber/cc-skills --skill skill-progressive-disclosure-designAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.9k |
|---|---|
| repo stars | ★ 178 |
| Security audit | 3 / 3 scanners passed |
| Last updated | August 1, 2026 |
| Repository | samber/cc-skills ↗ |
When should an agent use skill-progressive-disclosure-design and what problem does it solve?
Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable triggering. Use this whenever creating a new Claude skill, refactoring an existing one, or wh
Who is it for?
Developers invoking skill-progressive-disclosure-design as documented in the skill source.
Skip if: Skip when requirements fall outside skill-progressive-disclosure-design documented scope.
When should I use this skill?
Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable triggering. Use this whenever creating a new Claude skill, refactoring an existing one, or wh
What you get
Outputs aligned with the skill-progressive-disclosure-design SKILL.md workflow and stated deliverables.
- refactored SKILL.md
- reference file structure
By the numbers
- Recommends refactoring when SKILL.md exceeds 300–400 lines
Files
Skill Progressive Disclosure Design
Each section that recommends a direction includes explicit pros and cons. The decisions in this skill are trade-offs, not rules. The model using this skill should reason from the trade-offs to the user's specific situation rather than apply rules blindly.
Triggering vs. disclosure: separate these first
Two problems get conflated and need separating before any splitting decision.
Triggering is whether Claude invokes the skill at all. Driven entirely by the YAML description. File splitting does not affect triggering. If the question is "my skill doesn't trigger reliably", do not split files, fix the description (use run_loop.py from the skill-creator skill).
Progressive disclosure is what loads after the skill activates. SKILL.md body always loads. references/* only loads when SKILL.md tells the model to read a specific file. scripts/* executes without loading into context at all. This is where context protection happens.
If the user is asking about splitting because of triggering issues, surface the confusion first and redirect.
Default: do not split
A monolithic SKILL.md beats a split one until proven otherwise.
Split only when at least one is true:
- SKILL.md exceeds ~400 lines and content has natural branches.
- Empirical evidence (eval transcripts) shows the model wasting context on irrelevant sections.
- Specific content is large and only needed in narrow conditions.
Pros of staying monolithic:
- Single context load, no router prose to maintain.
- No tool-call overhead from reading references.
- No risk of the model loading the wrong reference or skipping a needed one.
- Easier to maintain: one file, one source of truth.
- Better for highly interconnected content where context is global.
- Easier for human reviewers to read end-to-end.
Cons of staying monolithic:
- Every invocation pays the full token cost, even when only 10% of the content is relevant.
- Does not scale past ~500 lines without degrading the model's ability to find what matters.
- No mechanism to gate rare or niche content.
- All content must justify its always-loaded status.
- Maintenance gets harder as the file grows.
Three split axes that work
1. Variant branch
User intent selects exactly one path. SKILL.md holds the decision logic and shared workflow. Each references/<variant>.md holds path-specific detail.
my-skill/
├── SKILL.md # decision tree + shared steps
└── references/
├── variant-a.md
├── variant-b.md
└── variant-c.mdExamples of clean variants: cloud provider, database engine, framework choice, output format, language.
Pros:
- Each invocation loads only the matching variant; large savings when variants are big.
- Variants evolve independently, simplifying maintenance.
- Adding a new variant does not bloat existing content.
- Mental model is easy: select one path based on input.
- Maps cleanly to user intent that already mentions the variant.
Cons:
- Requires routing logic in SKILL.md, eating back some of the line savings.
- Cross-cutting changes touch every variant file, multiplying effort.
- Risk of treatments diverging across variants over time.
- If user intent is ambiguous, the model may load multiple variants and lose the savings.
- If variants share more than ~60% of their content, the abstraction breaks down.
2. Workflow vs. reference data
SKILL.md holds the procedure (verbs, sequence, decisions). references/ holds lookup material queried by key.
Good reference content: schemas, error code tables, API surface listings, example galleries, configuration option matrices, design tokens.
Pros:
- Highest leverage of all splits: lookups are narrow, the model reads one entry.
- Natural conceptual boundary (procedure vs. data).
- Reference can grow large without affecting per-invocation cost.
- Adding new reference entries does not touch the workflow.
- Reference data can often be machine-generated and regenerated.
Cons:
- The model must know what to look up before reading. Pointer must encode lookup keys explicitly.
- Fails when the workflow needs to weave reference data inline rather than at discrete points.
- Splits content that is conceptually unified, harder for human readers.
- The model may miss broader context that lives only in the reference.
- Lookup data that is small (under ~50 lines total) is rarely worth splitting.
3. Depth tier (common path vs. edge cases)
SKILL.md covers the 80% case. references/edge-cases.md covers the rest.
The pointer must read like:
If you see X, Y, or Z, stop and read references/edge-cases.md before continuing.Pros:
- Common path stays minimal, fast, cheap.
- Edge cases can be exhaustive without polluting every invocation.
- Easy to extend edge-case coverage without touching the common path.
- Mirrors how experts work: defaults first, exceptions on demand.
Cons:
- The load condition must be sharp and observable from user input. Most edge cases do not satisfy this.
- Vague conditions cause either always-loading (waste) or never-loading (dead weight).
- Edge cases get less testing because evals naturally cluster on common queries.
- The model may follow the common path past a point where it should have escalated.
- The 80/20 estimate is often wrong; what looked like an edge case turns out to be common.
Splits that do not work
For each anti-pattern, "why it appears attractive" shows what makes designers reach for it; "why it fails" shows what goes wrong in practice.
Topic-based splits where invocations do not cluster by topic
A testing skill split into unit.md, integration.md, mocks.md is a typical example.
Why it appears attractive:
- Conceptually clean, mirrors how a human would organize documentation.
- Easy to navigate as a maintainer.
- Plausibly reduces context per invocation.
Why it fails:
- Real tasks span 2-3 topics, forcing multiple loads per invocation.
- Cross-topic concerns get duplicated or fragmented.
- The savings are theoretical, not empirical.
Splitting to hit a line target without a real branching condition
Why it appears attractive:
- A heuristic ("keep SKILL.md under 400 lines") feels like a clean rule to satisfy.
- Splitting feels like progress.
Why it fails:
- Without a branching condition, references load in parallel or always, providing no savings.
- Adds router prose to SKILL.md, often making the total content longer.
Rare-but-critical content in references/
Why it appears attractive:
- The content is large or specialized.
- Moving it out of SKILL.md feels like good hygiene.
Why it fails:
- References are optional by design; the model may skip them.
- If the content is critical, it must be loaded reliably, which means SKILL.md.
- "Rare" and "critical" together is usually a sign the skill is doing two jobs and should be two skills.
Cosmetic splits (Examples, Notes, Tips files)
Why it appears attractive:
- Reduces visual clutter in SKILL.md.
- Feels like good organization.
Why it fails:
- No load condition: either always loaded (wasted tool call) or never loaded (dead content).
- Implies an importance hierarchy that does not exist at runtime.
- Frequently hides content from the model that needs it.
Pointer hygiene
When SKILL.md points at a reference, the pointer is the entire load contract. Rules:
- Name the user-visible signal that triggers the load. "If the user mentions snapshot tests" not "for testing concerns".
- One sentence per pointer. Do not summarize the reference content in SKILL.md.
- Encode the load condition in the filename.
go126-simd.mdnotadvanced.md. - Top-of-file table of contents for any reference over 300 lines.
- If two references are co-loaded in most runs, merge them.
Pros of strict pointer hygiene:
- Wrong-load rate drops sharply.
- Filename encodes load condition, self-documenting for future maintainers.
- Forces upfront clarity about when each reference is needed.
- Makes architecture evals easier to interpret.
Cons of strict pointer hygiene:
- Some content has no crisp trigger; rules force awkward formulations.
- Filenames become long and awkward.
- Requires discipline; easy to drift over time.
- Can over-constrain useful loads when the trigger condition is genuinely fuzzy.
Use scripts/ before references/
For anything deterministic (formatting, validation, schema generation, file transforms, regex-heavy parsing), a script in scripts/ beats prose in references/.
Pros of scripts over reference prose:
- Zero context cost for execution.
- Deterministic, repeatable output.
- Reusable across invocations without re-reading.
- Can be unit tested independently.
- Often faster than prose-driven generation by the model.
Cons of scripts:
- Requires the runtime to support script execution; not all environments do.
- Less flexible than letting the model reason over prose.
- Harder to handle unanticipated edge cases without code changes.
- Adds a maintenance burden: code in the skill needs to keep working.
- Users cannot easily customize behavior without editing the script.
- Failure modes are sharper: script errors stop the workflow.
Decision checklist
Before splitting any content out of SKILL.md, answer:
1. Does this content have a sharp, observable load condition the model can detect from user input? 2. Will splitting actually reduce context, accounting for the router prose added to SKILL.md? 3. Is this reference data (lookup) or procedural (sequence)? Procedural content usually stays. 4. Could a script handle this deterministically instead? 5. Across realistic invocations, what fraction of runs would load this file? Below 20%, inline or delete — rarely-loaded references rarely justify the routing overhead. 20–80% is the split sweet spot. Above 80%, promote into SKILL.md — the routing cost exceeds the load savings.
If the answer to question 1 is unclear, do not split.
Evaluating skill architecture
Architecture evaluation is different from output evaluation. Output evals ask "did the skill produce the right thing?". Architecture evals ask "did the skill load the right files for the right reasons, at acceptable cost?". Same harness, different metrics. Run both. Output quality is the floor; architecture is optimization above that floor.
Pros of running architecture evals:
- Catches dead references, dead SKILL.md sections, and mis-routed content.
- Quantifies whether a split actually saved tokens or just looked clean.
- Reveals real load patterns that intuition misses.
- Forces the eval set to cover all declared paths, surfacing dead paths.
- Compounds with output evals to catch regressions across both axes.
Cons of running architecture evals:
- Requires harness setup beyond standard output evals.
- Eval-set design for path coverage takes work.
- Metrics need calibration per-skill (thresholds vary with cost profile).
- Output evals are still required; this adds to total iteration cost.
- Easy to over-optimize for token cost at the expense of output quality.
Eval set design for architecture
Output evals optimize for output quality across realistic queries. Architecture evals optimize for path coverage. The eval set must exercise every code path the skill claims to have, otherwise the metrics are noise.
Construct, at minimum:
- One query per declared variant (if the skill uses variant-branch splits).
- One query per edge-case branch (if depth-tier splits exist).
- One query per major lookup category (if reference-data splits exist).
- One query that should hit the common path only and load zero references.
- 2-3 off-topic queries that should not trigger the skill at all (also tests the description).
If no realistic query triggers a given reference file, that file is dead. Inline it or delete it before running anything.
Instrumentation
Each eval run is executed by a subagent with the skill loaded. Capture per run:
1. Full transcript including every tool call. 2. Which references/* files were read (parse view calls on paths inside the skill directory). 3. Whether scripts/* were invoked. 4. Total tokens and wall time. 5. The output (for the parallel output-quality eval).
Persist as transcript.json and loads.json per run, alongside the standard output. The harness from skill-creator already records tokens and time in timing.json; extend its grading step to extract reference loads from transcripts.
Metrics per reference file
Across all eval runs, for each references/*.md:
- Load rate: fraction of runs that read it.
- Co-occurrence: for each other reference, fraction of runs that loaded both.
- Use rate when loaded: of the runs that loaded it, did the content visibly inform the output (cited content, applied procedure, used schema)? Inspect transcripts.
- Re-read rate: fraction of runs that loaded the same file twice.
Metrics for the skill overall
- Median and p95 tokens per invocation, with and without references.
- SKILL.md utilization: read transcripts and identify sections of SKILL.md the model never references in any run. Strong candidates for deletion.
- Path coverage: did every declared path get hit by at least one query?
Decision rules
| Observation | Action |
|---|---|
| Reference loaded in <20% of runs | Inline into SKILL.md or delete — routing overhead not justified |
| Reference loaded in 20–80% of runs | Leave split — the sweet spot; routing pays off |
| Reference loaded in >80% of runs | Promote into SKILL.md — always-load cost beats routing cost |
| Two references co-load in >70% of runs | Merge into one file |
| Reference loaded but not used in output | Fix or remove the pointer in SKILL.md |
| Reference re-read inside the same run | SKILL.md routing is unclear; clarify |
| No query triggers a reference | Delete the reference |
| SKILL.md section never referenced in any run | Delete that section |
These thresholds are starting points. Tune them based on the cost profile: small references with cheap loads tolerate lower load rates than large ones.
Comparing two architectures
When choosing between architectures (monolithic vs. split, or split A vs. split B):
1. Run the identical eval set against both versions. 2. Run output-quality evals on both. Confirm no regression. If quality drops, the architecture change is a loss regardless of token savings. 3. Compare median tokens, p95 tokens, and median time per run. 4. Compare path coverage: does each version reliably reach the same outputs through the expected paths?
A split that saves 15% tokens but adds variance in output quality is worse than the monolith. Reliability beats efficiency.
What the metrics will not tell you
- Whether the SKILL.md prose is clear. Read transcripts for confused tool calls and dead-end attempts.
- Whether the description triggers correctly. That is a separate eval (use
run_loop.pyfrom theskill-creatorskill). - Whether content placement matches user mental models. Subjective; review with a human.
The split that looked clean at design time rarely matches real load patterns. Trust the transcripts over your intuitions.
Output when advising
When asked to advise on a specific skill's organization:
1. Diagnose first. Is this a triggering question or a disclosure question? 2. Quote relevant content from the existing SKILL.md (or the user's description of it) before recommending. 3. Propose the minimum viable split. Resist splitting into more files than necessary. 4. For each proposed reference file, write the exact pointer sentence that would go in SKILL.md. 5. Surface the trade-offs explicitly. Use the pros/cons in this skill as the model for how to present a recommendation. 6. If unsure whether a split helps, recommend instrumentation (eval the skill, read transcripts) before committing.
{
"skill_name": "skill-progressive-disclosure-design",
"metadata": {
"eval_methodology": "adversarial — each eval has a trap the model falls into without the skill",
"without_skill_runner_note": "When running without-skill evals, disable ALL skills from this plugin. Do NOT load any skill that covers overlapping content about skill structure, SKILL.md organization, or context window management."
},
"evals": [
{
"id": 1,
"prompt": "My skill isn't triggering reliably — it activates maybe 30% of the time. The SKILL.md is 350 lines. Should I split it into a main file and reference files to make it lighter and easier for Claude to activate?",
"trap": "Without the skill, the model may suggest splitting as a solution to triggering problems, confusing context load with activation. The skill explicitly separates triggering (controlled entirely by the YAML description) from progressive disclosure (what loads after activation).",
"expected_output": "Identifies this as a triggering problem, not a disclosure problem. States clearly that file splitting does NOT affect triggering. Recommends fixing the YAML description field instead. Does NOT recommend splitting as a solution.",
"files": [],
"assertions": [
{ "id": "1.1", "description": "response identifies this as a triggering problem, not a disclosure/context problem" },
{ "id": "1.2", "description": "response explicitly states that file splitting does NOT affect whether a skill triggers" },
{ "id": "1.3", "description": "response recommends fixing the YAML description field to improve triggering" },
{ "id": "1.4", "description": "response does NOT recommend splitting files as a solution to the triggering problem" },
{ "id": "1.5", "description": "response explains that triggering is driven entirely by the description field, not by file size or structure" }
]
},
{
"id": 2,
"prompt": "I have a testing skill (400 lines) covering unit tests, integration tests, and mocking patterns. I want to split it into SKILL.md + references/unit-tests.md + references/integration-tests.md + references/mocks.md for cleaner organization. Good idea?",
"trap": "Without the skill, the model likely approves this as 'clean organization' — the structure looks tidy conceptually. The skill explicitly warns that topic-based splits fail because real tasks span 2-3 topics, forcing multiple loads per invocation and losing the expected context savings.",
"expected_output": "Identifies this as a topic-based split anti-pattern. Warns that real tasks span multiple topics, forcing multiple reference loads. Explains that savings are theoretical. Recommends against this split.",
"files": [],
"assertions": [
{ "id": "2.1", "description": "response identifies this as a topic-based split (not a variant, workflow, or depth split)" },
{ "id": "2.2", "description": "response warns that real testing tasks typically span multiple topics (e.g., unit tests with mocks), requiring multiple file loads" },
{ "id": "2.3", "description": "response explicitly recommends AGAINST this split structure" },
{ "id": "2.4", "description": "response explains that context savings from this type of split are theoretical, not empirical" },
{ "id": "2.5", "description": "response does NOT approve the split as a good organization strategy" }
]
},
{
"id": 3,
"prompt": "I have a security scanning skill. There's a section covering critical authentication bypass checks — it's only needed when the code touches auth modules, which happens about 15% of runs. Should I move this to references/auth-checks.md to reduce context in normal runs?",
"trap": "Without the skill, the model likely approves this: 15% load rate sounds like a good candidate for a reference file. The skill explicitly warns that rare-but-critical content must NOT go in references/ because references are optional by design and the model may skip them.",
"expected_output": "Warns that references/ is optional and the model may skip reading it. Flags this as the rare-but-critical anti-pattern. Advises against moving critical security checks to references/. Suggests keeping it in SKILL.md or splitting into a separate skill.",
"files": [],
"assertions": [
{ "id": "3.1", "description": "response warns that references/ is optional and the model may skip reading it" },
{ "id": "3.2", "description": "response advises against putting critical content in references/" },
{ "id": "3.3", "description": "response identifies or alludes to the 'rare but critical' anti-pattern" },
{ "id": "3.4", "description": "response does NOT approve moving critical auth checks to references/auth-checks.md" }
]
},
{
"id": 4,
"prompt": "My SKILL.md has a large 'Examples and Tips' section at the end (80 lines). I want to move it to references/examples.md to keep the main file clean. Thoughts?",
"trap": "Without the skill, the model often approves this as good hygiene. The skill warns that cosmetic splits (Examples, Notes, Tips files) either become dead content (never loaded) or always-loaded waste (no observable trigger), with no real benefit.",
"expected_output": "Identifies this as a cosmetic split anti-pattern. Warns there is no observable load condition for examples/tips. Explains this creates either dead content or a wasteful always-load. Advises against this split.",
"files": [],
"assertions": [
{ "id": "4.1", "description": "response identifies this as a cosmetic split (Examples/Tips files are explicitly an anti-pattern)" },
{ "id": "4.2", "description": "response warns there is no sharp, observable load condition for 'examples and tips' content" },
{ "id": "4.3", "description": "response explains this creates either dead content (never loaded) or a wasteful always-load" },
{ "id": "4.4", "description": "response advises against moving examples/tips to a separate reference file" }
]
},
{
"id": 5,
"prompt": "My SKILL.md is 450 lines. Our project's convention is to keep SKILL.md under 400 lines. What's the best way to split it so I hit the target?",
"trap": "Without the skill, the model immediately suggests split plans (which sections to move, how to restructure). The skill explicitly warns against splitting to hit a line target without a real branching condition, and notes that router prose often eats back the savings.",
"expected_output": "Questions whether there is a real branching condition before suggesting any split. Warns against splitting purely to hit a line-count target. Notes that router prose added to SKILL.md eats back line savings. May suggest trimming redundant content as an alternative.",
"files": [],
"assertions": [
{ "id": "5.1", "description": "response questions whether there is a real branching condition or load condition before suggesting any split" },
{ "id": "5.2", "description": "response warns against splitting solely to meet an arbitrary line-count target" },
{ "id": "5.3", "description": "response does NOT immediately jump to a split plan without first checking for branching conditions" },
{ "id": "5.4", "description": "response mentions or implies that router prose added to SKILL.md offsets the line savings from splitting" },
{ "id": "5.5", "description": "response suggests content reduction (trimming, deleting redundant sections) as an alternative to splitting" }
]
},
{
"id": 6,
"prompt": "I'm building a cloud deployment skill that covers AWS, GCP, and Azure. Each cloud has completely different CLI commands, IAM models, and networking concepts. The SKILL.md is already 600 lines and growing. How should I structure this?",
"trap": "Without the skill, the model might suggest topic-based splits (commands.md, iam.md, networking.md) or just advise trimming content. The skill identifies cloud provider as a clean variant axis for variant-branch splits where user intent selects exactly one path.",
"expected_output": "Recommends a variant branch split with each cloud provider as its own reference file. Identifies cloud provider as a clean variant axis. Suggests SKILL.md holds decision logic and shared workflow. Explains that each invocation loads only the matching provider's reference.",
"files": [],
"assertions": [
{ "id": "6.1", "description": "response recommends a variant branch split (not a topic-based split)" },
{ "id": "6.2", "description": "response identifies cloud provider (AWS/GCP/Azure) as the variant axis" },
{ "id": "6.3", "description": "response suggests each cloud provider gets its own references/ file" },
{ "id": "6.4", "description": "response explains that SKILL.md holds decision logic and shared workflow, not provider-specific content" },
{ "id": "6.5", "description": "response explains that each invocation loads only the matching variant, saving context" }
]
},
{
"id": 7,
"prompt": "My GraphQL skill has a 50-step procedure and a comprehensive table listing 200 GraphQL directives with their syntax, arguments, and usage examples. The whole thing is 900 lines. How should I structure this?",
"trap": "Without the skill, the model might suggest topic splits or general trimming. The skill specifically identifies 'lookup material queried by key' (like API surface listings, schemas) as the best candidate for workflow vs. reference data splits.",
"expected_output": "Recommends workflow vs. reference data split. Suggests keeping the procedure (steps, decisions) in SKILL.md. Suggests moving the directives table to references/. Explains the directives table is lookup material queried by key, not procedural content.",
"files": [],
"assertions": [
{ "id": "7.1", "description": "response recommends a workflow vs. reference data split" },
{ "id": "7.2", "description": "response suggests keeping the 50-step procedure in SKILL.md" },
{ "id": "7.3", "description": "response suggests moving the directives table to a references/ file" },
{ "id": "7.4", "description": "response identifies the directives table as lookup material queried by key (not procedural content)" },
{ "id": "7.5", "description": "response explains that the model reads only the relevant entries, not the entire table" }
]
},
{
"id": 8,
"prompt": "I want to add a depth-tier reference for edge cases to my GraphQL skill. The edge cases I'd put there are: complex nested queries, circular references between types, and union type resolver quirks. Should I create references/edge-cases.md?",
"trap": "Without the skill, the model likely approves: 'edge cases' sounds like a textbook depth-tier candidate. The skill warns that depth-tier splits only work when the load condition is sharp and observable from user input — vague conditions cause always-loading or never-loading.",
"expected_output": "Evaluates or asks whether the load conditions are sharp and observable from user input. Warns that vague conditions cause always-loading or never-loading. Questions whether these specific edge cases can be detected upfront. Does NOT unconditionally approve creating references/edge-cases.md.",
"files": [],
"assertions": [
{ "id": "8.1", "description": "response questions or evaluates whether the load conditions are sharp and observable from user input" },
{ "id": "8.2", "description": "response warns that vague conditions cause either always-loading (waste) or never-loading (dead weight)" },
{ "id": "8.3", "description": "response evaluates whether these specific edge cases (nested queries, circular refs, union resolvers) can be detected from user input before loading" },
{ "id": "8.4", "description": "response does NOT unconditionally approve creating references/edge-cases.md without addressing the load condition sharpness" }
]
},
{
"id": 9,
"prompt": "I'm creating a brand new code review skill from scratch. It will cover readability, security, performance, maintainability, and testing concerns. I'm planning to start with separate reference files for each concern area. Is this a good starting structure?",
"trap": "Without the skill, the model may approve starting pre-split as organized. The skill's default is 'do not split' — a new skill should start monolithic. Pre-splitting without empirical evidence (eval transcripts) showing irrelevant sections loading is premature.",
"expected_output": "Recommends starting with a monolithic SKILL.md. Advises against pre-splitting a new skill before getting eval evidence. Warns that code review tasks typically span multiple concern areas. Applies the 'default: do not split' principle.",
"files": [],
"assertions": [
{ "id": "9.1", "description": "response recommends starting with a single monolithic SKILL.md" },
{ "id": "9.2", "description": "response advises against pre-splitting before gathering empirical evidence (evals or transcripts)" },
{ "id": "9.3", "description": "response warns that code review tasks likely span multiple concern areas, similar to the testing topic-split failure" },
{ "id": "9.4", "description": "response applies the 'default: do not split' principle explicitly or implicitly" }
]
},
{
"id": 10,
"prompt": "Review this pointer I wrote in my SKILL.md: 'For advanced scenarios, see references/advanced.md for more information.'",
"trap": "Without the skill, the model may accept this as reasonable. The skill has explicit pointer hygiene rules: the pointer must name a user-visible signal, must be one sentence, must not summarize content, and the filename must encode the load condition.",
"expected_output": "Identifies multiple pointer hygiene violations: no sharp user-visible signal named, 'advanced' filename is too vague and doesn't encode a load condition, 'for more information' is a non-trigger phrase. Suggests improvement with a specific observable signal.",
"files": [],
"assertions": [
{ "id": "10.1", "description": "response identifies that the pointer lacks a sharp, observable user-facing signal (no 'if the user mentions X' trigger)" },
{ "id": "10.2", "description": "response flags 'advanced.md' as too vague a filename that doesn't encode the load condition" },
{ "id": "10.3", "description": "response flags 'for more information' as a weak non-trigger phrase (does not identify when to load)" },
{ "id": "10.4", "description": "response suggests improving the pointer with a specific, observable signal from user input" },
{ "id": "10.5", "description": "response recommends renaming the file to encode the actual load condition (e.g., not 'advanced.md')" }
]
},
{
"id": 11,
"prompt": "My YAML configuration skill validates config files using 50 regex-based validation rules with specific error messages. I'm planning to put all 50 rules in references/validation-rules.md so the main file stays clean. Good approach?",
"trap": "Without the skill, the model might approve references/ as reasonable for large reference material. The skill explicitly recommends scripts/ over references/ for anything deterministic — regex validation is deterministic, repeatable, and better as a script.",
"expected_output": "Recommends scripts/ over references/ for deterministic regex validation. Explains zero context cost for script execution. Notes scripts can be unit tested independently. Does NOT recommend references/ as the primary solution.",
"files": [],
"assertions": [
{ "id": "11.1", "description": "response identifies the validation rules as deterministic/repeatable content" },
{ "id": "11.2", "description": "response recommends using scripts/ instead of references/ for the validation logic" },
{ "id": "11.3", "description": "response mentions that scripts have zero context cost (they execute without loading into context)" },
{ "id": "11.4", "description": "response notes that scripts can be unit tested independently" },
{ "id": "11.5", "description": "response does NOT recommend references/validation-rules.md as the primary or preferred solution" }
]
},
{
"id": 12,
"prompt": "I want to split my CI/CD skill: move the troubleshooting section (120 lines covering 8 failure types) to references/troubleshooting.md. The main workflow would stay in SKILL.md. Does this make sense?",
"trap": "Without the skill, the model may approve: 120 lines seems splittable, troubleshooting sounds like a good candidate for depth-tier or reference. The skill's decision checklist requires a sharp, observable load condition — the model must assess whether the 8 failure types can be detected from user input.",
"expected_output": "Applies the decision checklist before approving. Asks about a sharp, observable load condition for troubleshooting content. Considers whether router prose would eat back line savings. Does NOT immediately approve without addressing load condition sharpness.",
"files": [],
"assertions": [
{ "id": "12.1", "description": "response applies or references a checklist/decision process before approving the split" },
{ "id": "12.2", "description": "response asks or evaluates whether there is a sharp, observable load condition for the troubleshooting section" },
{ "id": "12.3", "description": "response considers whether the added router prose in SKILL.md would reduce the net line savings" },
{ "id": "12.4", "description": "response does NOT immediately approve the split without addressing load condition sharpness" }
]
},
{
"id": 13,
"prompt": "My SQL skill has two reference files: references/basic-queries.md and references/joins.md. After reviewing my eval transcripts, I notice that in every single run, both files get loaded together. Should I keep them separate for organizational clarity?",
"trap": "Without the skill, the model may say 'yes, keep them separate — separation of concerns is good'. The skill has an explicit co-occurrence rule: when two references co-load in >70% of runs, merge them.",
"expected_output": "Identifies this as a co-occurrence problem. Recommends merging the two files. References the ~70% co-load threshold or explains that always-co-loaded references should be merged. Does NOT recommend keeping them separate for organizational reasons.",
"files": [],
"assertions": [
{ "id": "13.1", "description": "response identifies the always-co-loading as a co-occurrence problem" },
{ "id": "13.2", "description": "response recommends merging the two reference files into one" },
{ "id": "13.3", "description": "response references a threshold (e.g., >70% co-load) or the principle that always-co-loaded files should be merged" },
{ "id": "13.4", "description": "response does NOT recommend keeping them separate for organizational clarity" }
]
}
]
}
Related skills
FAQ
What is skill-progressive-disclosure-design?
Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable triggering. Use this whenever creating a new Claude skill, refactoring an
When should I use skill-progressive-disclosure-design?
Decide how to split skill content between SKILL.md and reference files for context efficiency and reliable triggering. Use this whenever creating a new Claude skill, refactoring an
Is skill-progressive-disclosure-design safe to install?
Review the Security Audits panel on this page before production use.