Skill-Based Architecture
Restructure oversized single-file Skills or scattered project rules into a well-organized Skill directory. Builds on the official minimal Agent Skill contract (name + description) and kicks in when a single small SKILL.md is no longer enough.
When to Use
- A single SKILL.md exceeds ~150 lines, mixing rules, workflows, and background material
- Project rules are scattered across
AGENTS.md, CLAUDE.md, CODEX.md, .cursor/rules/, .claude/, etc.
- User explicitly requests Skill-based architecture or rule consolidation
When NOT to Use
- Temporary repos with no durable instruction or task-routing need
- Teams with a working documentation system that do not want to migrate
- Do not force structured folders onto a small project; an explicit SBA request
may still materialize a complete direct
SKILL.md carrier
Progressive Rigor
Grow only under pressure. The materializer derives Single-file,
Folder-light, or Full/broad internally from target evidence; users do
not select a tier, profile, capability pack, or install mode. routing.yaml,
Task Execution, Task Closure, maintenance checks, and each harness surface need
their own routing/loading/ownership pressure. Split by abstraction (骨架/肉)
when content tangles invariant design theory with current-code facts: abstract
theory → architecture/, code maps → references/, house style →
conventions/, per-module landmines → gotchas/ (methodology stays in
rules/). Downgrade when content shrinks. Details:
references/progressive-rigor.md.
Evidence-Selected Structure
# direct
skills/<name>/SKILL.md
# folder-light or broad: only admitted owners/directories
skills/<name>/{SKILL.md,rules/,workflows/,references/,scripts/}
# routing.yaml appears only when route data has an independent owner
# root/tool entry and registration surfaces appear only for proven readers
Existing root entries are preserved. Emitted routed entries use a generated
routing.yaml bootstrap; direct entries point to the sole SKILL.md procedure.
Cursor registration exists only when Cursor is detected, declared, currently
used, or explicitly requested. See REFERENCE.md for sources.
Core Principles
- Single concise entry —
SKILL.md keeps a dual budget: description ≤ 25 lines (trigger phrases + activation) + body ≤ 90 lines (navigation). It navigates, not exhausts. ✓ Check: smoke-test reports both separately; over either → split intent clusters / move detail to sub-files.
- One skill folder when a folder is admitted — folder-light and broad results keep formal docs under
skills/<name>/; a direct result may remain a complete single SKILL.md carrier. ✓ Check: no emitted root entry becomes a second rule/workflow owner.
- Rules ≠ Flows —
rules/ for constraints, workflows/ for procedures. ✓ Check: any numbered steps in rules/? Any "always/never" in workflows/? Either = mixing.
- Routing.yaml as source when admitted — a direct carrier owns its sole
route in
SKILL.md; multiple/shared routes live only in routing.yaml, with
routed shells generated from it. ✓ Check: is there an independent selector
or consumer that justifies the manifest, and does its fitted sync check pass?
- Harness surfaces follow readers — create/merge only entries and
registrations supported by existing files/config, the current harness,
repository/team declaration, or an explicit request. ✓ Check: can every
emitted surface name its reader, and was every existing entry preserved?
- Progressive Rigor — three carriers (Single-file / Folder-light / Full)
grow only under pressure and are not user package choices. ✓ Check: can you
name the independent responsibility that forced every generated file?
- Description = coarse activation — domain boundary + real user trigger phrases; never enumerate workflow keywords nor summarize a workflow's steps — a step-summary becomes a shortcut the agent runs instead of reading the body (ref). ✓ Check: (a) can
routing.yaml task routes change without rewriting the description? (b) does the description or any route label carry HOW an agent could act on without opening the body/workflow? "no" to (a) or "yes" to (b) → fix.
- Gotchas are highest-value — maintain costly pitfalls actively; keep them discoverable. ✓ Check: is each high-cost gotcha activated by the admitted route owner (
SKILL.md or routing.yaml), not only buried in references/?
- Progressive disclosure — every loaded file needs an independent task-time reason; conditional content leaves the startup read set, and files every real caller co-loads should merge unless ownership/generation requires separate storage. ✓ Check: for each route read, can you name a request that needs it now and a next action it changes? No → conditionally route, merge, or remove it.
- Task Execution + Closure — after route selection, only one clear read-only or fixed-contract maintenance action/check with no new desired behavior executes directly. Any request that adds or changes user-visible behavior, a business flow/state, or an external contract follows
requirement-ready -> Task Anchor -> implementation-ready -> Native Plan -> mutation: an incomplete Requirement returns understanding, real risk/conflict, and the minimum normative question; a clear one needs no ceremonial confirmation; code owner and Current -> Target are proven before implementation steps. The Requirement is the target, the Anchor is its Goal/Done When/Boundaries projection, and the Plan is only its revisable implementation means. Present alignment proportionally, do not repeat visible native steps, and run a compact Anchor Checkpoint before every main step. Enter the applicable completion owner: a simple workflow may inline fitted verification/AAR/completion, while an independent Task Closure owner is materialized only when its own lifecycle pressure is admitted (ref). Workflow remains the domain procedure; Native Plan is only this Session's runtime step owner, with no planning-file persistence. ✓ Check: immediately before mutation, can you name the governing Requirement, Task Anchor projection, proven Current -> Target binding, active Plan step, and applicable completion proof without letting the Plan redefine its target?
- Durable-record rule — generic records generalize across projects; business global models stay project-specific but must survive implementation replacement (ref). ✓ Check: use the destination's test—cross-project pattern or cross-implementation business truth—without mixing code details into either.
- Self-maintenance — line counts signal evaluation, not automatic action. Split only for independently selected tasks; merge files universally co-loaded/co-changed unless ownership or generation explains the boundary. ✓ Check: can the before/after load matrix prove less irrelevant reading without losing definitions, conditions, boundaries, or reasons?
- Activation over storage — content in
references/ alone is not "captured"; it must be on the task path and change what the agent does when read. Reached-but-inert (correct, on-route, yet the agent would have proceeded identically without it) is a distinct failure from absent or unreachable — and no structural gate (orphan / route-reachability / smoke-test) can see it, only judgment can. ✓ Check: (a) trace the normal route — Agent hits the entry without hunting? (b) does hitting it change the next action — a file it now reads, a check it now runs, a step it now skips? "no" to either → stored, not activated.
- Token efficiency — Always Read defaults to empty; every addition needs proof that all real tasks require it before workflow selection. Domain and lifecycle knowledge loads only when evidence or a phase boundary can change the next action. ✓ Check: can any startup read be delayed without changing the first workflow decision? If yes, move it to that workflow checkpoint.
- Rationalizations Table — captures verbatim excuses from real pressure-test failures, organic or proven by a baseline run before shipping (ref, Phase 9). ✓ Check: every row traces to a real failure — no failure observed and unwilling to baseline it → imagined-pain, drop it.
- Response discipline — output short, precise, direct answers; avoid process narration, self-congratulation, gratuitous confirmations, and requirement restatement. Correct objective errors neutrally; do not infer user stance. ✓ Check: does each sentence serve the explicit request? No → delete it.
- Proof claims stay separated — fitted structural checks, source-disposition
migration evidence, and live Agent behavior prove different things. Green
structure cannot be promoted into semantic or behavioral correctness.
✓ Check: does the final claim name the exact layer actually run, and report
unavailable live evidence as no verdict?
Common Pitfalls
- Missing admitted harness surface — A project proves a Cursor/Claude/etc.
reader but its fitted registration/entry is absent → that harness never
discovers the formal owner. The opposite error is emitting every harness
without evidence and imposing permanent maintenance cost.
- Wrong routing carrier — A routed shell says only "go read SKILL.md"
without the generated
routing.yaml bootstrap, or a direct project gains an
empty manifest merely for uniformity → either recovery breaks or false
machinery appears.
- Vague / wrong-scope description — Description is passive, wrong-language, too narrow ("fix bug" only), or bloated with every workflow keyword → skill misses natural requests or over-fires; keep description domain-level and route tasks in SKILL.md
- Stored but not activated — or activated but inert — Costly pitfall recorded in
references/ but not surfaced in an owning workflow checkpoint or canonical route when task selection changes → future agents still miss it. Subtler form: it is on the route and gets read, but it's "correct but inert" — written as a background fact, not as a next action — so the agent reads it and proceeds unchanged. Reachable ≠ useful; the entry must change what the agent does, not merely be present and correct
- Completion responsibility lost during materialization — Agent considers
itself "done" after main work even though the admitted workflow/Closure owner
requires fitted verification or AAR. A simple workflow may own that behavior
inline; an independent
task-closure.md is not required merely for form.
Pure Q&A/read-only tasks remain exempt.
- Project-specific records — Lessons written as project narratives ("in our product module, we found…") instead of reusable knowledge → useless outside current context; apply generalization rule before recording
- No SessionStart hook on long sessions —
/clear or /compact silently drops SKILL.md from context; agent loses all routing and protocol awareness without the user noticing → install SessionStart hook if your harness supports it (see references/thin-shells.md § SessionStart Hook)
- Route skipping in multi-task sessions — Agent reads SKILL.md for the first task, then skips re-reading for subsequent tasks in the same session ("I already know the rules"). New tasks may match different routes; context may have been compressed. Result: agent works from partial/stale memory, misses critical rules, debugs in wrong direction for hours → SKILL.md template ships a tiered Session Discipline (re-match the route every task; re-read files only on route-change or compaction — cheap re-match catches different routes without re-reading everything); all shells carry the trigger
- Missing or performative Task Anchor / long-task drift — Agent starts a non-Simple task without a stable Goal/Done When, invents them only at the end, or dumps a fixed labeled block that duplicates the native Plan → use
templates/skill/workflows/task-execution.md; keep the Anchor as runtime state, present only useful alignment, and run reboot-check.md before final validation/commit if the original constraints are no longer fresh
- Imagined-pain engineering — Agent 提议加任何机制(规则/脚本/文件结构/模板章节)前没反问"这解决的是真痛点还是脑补":为未发生的失败加保险、为想象用户预建脚手架、为不存在的协议加 marker / 监控、给假设的"agent 偏差"立规矩。✓ Check:能给一个具体场景(file+line / commit / session)证明这事真发生过吗?给不出 → 不上。Historic: 5 ghost scripts (砍 2026-05-19), dossier schema (砍 2026-05-19), reflection-first mode shift (弃 2026-05-20), observations 日志 (拒上 2026-05-20)
Content Classification
| Content type — tier by abstraction: 骨架 (architecture/workflows/rules = invariant theory) vs 肉 (conventions/gotchas/references = current-code facts) · split playbook | Target | Kind |
|---|
| Abstract design theory — layering/contract/orchestration/transaction principles, the "why" (NOT the module map) | architecture/ | 骨架 |
| Code maps + background — module tree, dir layout, source index, build/env notes | references/ | 肉 |
| House style — naming, paths, commands, formats, must/never conventions | conventions/ | 肉 |
| Code-coupled landmines (symptom → cause → fix), split only by independently routed module | gotchas/ (selecting gotchas/index.md only after multi-file pressure) | 肉 |
| Step-by-step task procedures (process theory) | workflows/ | 骨架 |
| Prompts/reports/docs · editor config (thin shells) | docs/ · .cursor/ .claude/ | — |
Multi-Skill & Composition
Multi-skill repos — see references/multi-skill-routing.md (operating + fission + coexistence). For invoking other skills from your workflows (embedded / serial / subagent delegation), see references/skill-composition.md + starter templates/skill/workflows/invoke-skill.md.example.
Resources