skills/design-driven/SKILL.md
Design-driven development methodology — the design/ directory is the single source of architectural truth; read it before coding, stay within its boundaries, and update it first when the system's shape changes. Use whenever starting development on this project, or when the user asks to create/update architecture docs, add a feature that may cross existing boundaries, refactor system structure, or understand the codebase architecture. Triggers on "design first", "update the design", "does this change the architecture", "write a design for", "what's the current design", or onboarding to a codebase's shape. Args — `/design-driven init` to configure a project, `bootstrap` to generate design from existing code, `audit` to reconcile design/ against current code.
npx skillsauth add lidessen/skills design-drivenInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A mini methodology: design/ is the skeleton, code is the muscle. Human shapes the skeleton, agent builds the muscle.
design/ is also the institutional memory that outlives any single agent session. Agents are ephemeral, but the architectural skeleton persists — each new agent reads it, works within its boundaries, and leaves the codebase in a state the next agent can trust.
When invoked with an argument, dispatch to the corresponding file:
/design-driven init → Read and follow commands/init.md.
One-time project plumbing: agent configs, empty directories, optional
hooks. Does not generate DESIGN.md./design-driven bootstrap → Read and follow commands/bootstrap.md.
Generate the initial design/DESIGN.md from an existing codebase.
Idempotently handles plumbing if init wasn't run first./design-driven audit → Read and follow commands/audit.md.
Reconcile an existing design/ against the current code: find drift,
classify findings, propose updates or retroactive proposals.Which command when:
init, then write DESIGN.md by handdesign/ → bootstrap (does init-style plumbing too)design/ exists, starting a task → no argument (normal loop)design/ exists and feels stale, or code has drifted → auditdesign-driven is the right tool when the system has identifiable shape worth committing to — modules, mechanisms, boundaries that won't be rewritten next week. Most ongoing engineering work fits.
When another phase is the better starting point:
/goal-driven set. design-driven becomes the
right tool once shape is the question, not direction./reframe first to redraw the skeleton from the new paradigm's
primitives; once it settles, graduate it into DESIGN.md.Signals during design-driven work that warrant another skill:
/evidence-driven init.design/decisions/NNN-*.md proposal,
don't keep patching.project/
├── design/ ← Permanent skeleton
│ ├── DESIGN.md ← System shape
│ ├── DESIGN-<aspect>.md ← Complex mechanisms (optional)
│ └── decisions/
│ ├── 001-outbox-over-direct-push.md ← adopted
│ └── 002-split-memory-tiers.md ← rejected
│
└── blueprints/ ← Implementation records
├── add-semantic-memory-search.md ← done (clean, no TODO)
└── refactor-agent-delegation.md ← in-progress (has TODO)
Two directories, clear separation: design/ is the architect's drawings
(system shape, permanent), blueprints/ is the builder's records
(task-level approach, kept for reference).
The design/ directory captures 30% — the critical skeleton. The agent has 70% freedom.
The 30% (in design/):
The 70% (agent decides freely):
Litmus test: If changing it would change the system's shape, it's the 30%. If it changes behavior within the same shape, it's the 70%.
The 30% constraint applies across the entire development cycle, not just during "architecture tasks". design/ is a constant frame; every phase — coding, testing, reviewing, debugging, refactoring, releasing, deprecating — operates inside it. Design-driven isn't one stage of the workflow; it's the skeleton every stage hangs on.
The 30/70 rule applies across every phase of work, but each phase has its own specific application — the bullets below name the concrete move per activity, not just the abstract principle.
For activities not listed, derive the application yourself: ask whether the action stays within the shape (70% — proceed) or changes it (30% — proposal). The bullets above are common cases, not an exhaustive checklist.
Every development task follows one path:
┌───────────────────────────────┐
│ Read design/DESIGN.md │ ← Always start here
│ Understand the skeleton │
└────────────┬──────────────────┘
│
┌───────▼────────┐
│ Does this task │
│ change the │
│ system's shape? │
└───┬─────────┬───┘
│ │
NO YES
│ │
│ ┌────▼───────────────────┐
│ │ Write proposal in │
│ │ design/decisions/ │ ← Context + proposal + alternatives
│ └────┬───────────────────┘
│ │
│ ┌────▼───────────────────┐
│ │ Human reviews │ ← Wait. Don't code until approved.
│ └────┬───────────────────┘
│ │
│ ┌────▼───────────────────┐
│ │ Update design/DESIGN.md│ ← Commit design change separately
│ └────┬───────────────────┘
│ │
┌───▼─────────▼───┐
│ Plan │ ← Draw the blueprint, set up scaffolding
├──────────────────┤
│ Build │ ← Code freely, track progress on scaffolding
├──────────────────┤
│ Verify │ ← Check against blueprint, tear down scaffolding
└──────────────────┘
"Changes the shape" = adding/removing/merging modules, changing how modules connect, altering a key mechanism, introducing a new architectural pattern. Use the 30/70 litmus test above: if you're unsure, it probably doesn't — just code.
Plan — Before drafting, you need two things: current state and pending claims on the area you're about to touch.
Current state lives in:
design/DESIGN.md — the shapePending claims live in:
blueprints/ — in-progress files that may conflict with your work## Follow-ups sections — scope-shaved work
that may be exactly what your task is, or what it depends ondesign/decisions/ — any proposal currently in proposed state
blocks source edits in its area until resolvedPast blueprints are records, not state. Don't reconstruct current
behavior by reading their Approach or (former) State sections — read
DESIGN.md and the code. If those two disagree, that's drift; stop and
run /design-driven audit rather than layer new work on a stale
skeleton.
If goal-driven is installed (goals/GOAL.md exists), read it as
part of Plan and decide which success criteria this task moves
forward. Add a **Serves:** C<n>, C<m> line to the blueprint header
(or **Serves:** none for infra cleanup that doesn't directly serve
a criterion). This makes the blueprint → goal traceability visible
in two directions: a future reader sees why the task exists; the
goal-driven session-end record can cite the blueprint when checking
that criterion. If the task doesn't visibly serve any criterion and
isn't infra cleanup, that itself is a signal — pause and ask whether
this task belongs in this initiative.
Then write blueprints/<task-name>.md with approach, scope, and
verification criteria upfront — how will you know this task is done?
The TODO and State sections are scaffolding: progress trackers, not
specs. See references/templates.md for the format.
Size tasks to fit within a single session. A workable heuristic: a blueprint should fit in ~10 TODO items, and its State section should contain enough context that a fresh agent could resume from the blueprint alone. If a task blows past either, split it.
Build — Code freely within design/ boundaries, following the blueprint's approach. Check off TODO items as you go. If you discover a better approach mid-build, update the blueprint first, then continue. Each completed TODO triggers a State update — immediately on check-off, rather than being deferred or optional. State is the resumption surface; if the session dies between TODO 4 and TODO 5, a fresh agent should be able to read State and pick up at TODO 5 without inferring from code. When a build-time decision is borderline (technically 70% but not obvious), log it in State so review can catch it.
Verify — Check the implementation against the verification criteria defined in Plan. Confirm: does it stay within design/ boundaries? Is the scope respected?
Verification needs a falsifiable check, not a feeling. Automated tests are the default — and TDD (write the failing test first, then the code that makes it pass) is the strongest form when the task type allows. Other forms are accepted when tests don't fit the work: a contract trace that demonstrates the new behavior end-to-end, a manual checklist run with evidence captured, a comparison against a known-good state. The form depends on the task; the falsifiability doesn't. "Looks right to me" isn't verification.
For projects where build-time discipline materially affects outcome quality, the evidence-driven skill is a sibling overlay that deepens this falsifiability rule (TDD cycle, anti-cargo-cult guards, evidence- trail State). Design-driven works alone without it; evidence-driven adds rigor on top when the work calls for it.
If evidence-driven is installed (its block is present in the
project's agent configs), each Verification check-off must cite a
falsifiable observation when ticked — [x] tests pass — 14/14 in store.test.ts, not bare [x]. The evidence can sit inline next to
the check or be recorded in State and referenced by line. A
verification ticked without an observation is rejected on review.
A failing test (or an observation during verify) that reveals something DESIGN.md doesn't account for is a signal about design silence, not a bug to patch around. Either fix DESIGN.md (doc-only drift), raise a proposal (shape-level), or add to Constraints / Non-goals — don't mute the test.
Close out — This step is what keeps DESIGN.md current state rather than a historical snapshot. Skipping it rots the skeleton silently; future tasks can no longer trust DESIGN.md, and the whole methodology collapses. Not optional.
Before tearing down scaffolding, reconcile:
## Follow-ups section with names and one-line intents. These are
forward-looking pending claims — the next task in this area picks
them up via its pending-claims scan.Then strip the TODO and State sections (keep Follow-ups), mark status
as done, commit the blueprint with the code.
The blueprint sits between design/ and code in granularity:
design/ "The system has a memory layer with shared facts and
per-conversation short-term context"
blueprint "Add semantic search to memory: integrate embedding model,
build index on startup, query during context assembly.
Reuse existing IMemoryManager interface."
code The actual embedder, vector store, query functions, tests
Skip the blueprint for bug fixes, small config changes, or tasks that take less time to do than to plan. Skipping the blueprint does not skip the design constraint — you still work inside DESIGN.md's boundaries, you just don't need a written plan to do it.
After verify — done blueprints stay in blueprints/ as a historical
record. They're not the next task's source of truth (DESIGN.md + code
is); they're audit trails and the home for Follow-ups. The folder
grows over time; if it gets unwieldy, move older ones under
blueprints/archive/ rather than deleting them.
When a task requires changing the system's shape:
design/decisions/NNN-title.md, where NNN
is the next unused three-digit number — scan design/decisions/,
take max+1, pad to three digits (start at 001 if empty). Fill in
every section except Cold review. See references/templates.md
for the format.references/cold-review-prompt.md, passing the DESIGN.md path and
the proposal path. The reviewer reads nothing else — no conversation
history, no drafts. Paste findings into the Cold review section;
address each inline (fix the proposal above, or write a rebuttal).
Don't skip this; see the rationale below.adopted or rejected.Adopted proposals update DESIGN.md — the proposal file stays as the reasoning record. Rejected proposals stay too — so the next person with the same idea can see why it was already considered.
Why the proposal template is heavier than other artifacts (Recommendation + alternatives with strongest cases + pre-mortem + adversarial cold review): skeleton rework is expensive, so shape decisions get more pressure-testing than implementation decisions. A thirty-minute pre-mortem plus a cold review pass is cheap next to an un-un-doable module split. If the template feels heavy for a given proposal, the proposal is probably too small to be a shape change — just code it.
Why cold review by a subagent, not self-review by the author.
The author who just wrote the proposal is the worst person to find
its blindspots: they already convinced themselves it's right. A
neutral fresh reviewer is better; an adversarial fresh reviewer —
explicitly told to assume there's a flaw and hunt for it, like QA
testing a developer's feature — is better still. Self-check after
you just wrote it is self-grading your own homework. See
references/cold-review-prompt.md for the reviewer prompt.
When design/DESIGN.md already exists, read it before every task. Pay attention to:
If the task fits within boundaries, just implement — no need to explain yourself. If it conflicts, surface the conflict before writing code.
design/DESIGN.md yet → run /design-driven bootstrap to explore
the codebase and generate the first version. See references/templates.md
for the DESIGN.md structure and references/writing-guide.md for style.design/DESIGN.md exists but feels out of sync with the code →
run /design-driven audit to collect drift and reconcile.For a concrete end-to-end example — one task going through read → decide
→ plan → build → verify — see references/example.md.
testing
Operational deployer for the lidessen skills collection — wires harness config (CLAUDE.md / AGENTS.md / .cursor/) in a target project, injects cross-cutting principles (e.g. principal contradiction first), and reconciles when lidessen evolves. Triggers on "/setup-lidessen-skills", "set up lidessen skills", "wire lidessen into this project", "sync lidessen principles", "install lidessen skills". Use after cloning or symlinking lidessen skills into a project, when adopting the collection, or when lidessen has new content the project hasn't picked up. Args — `init` to scaffold, `sync` to re-align with current lidessen, `audit` to check drift without writing. Pairs with harness (portable methodology); this is the lidessen-specific application layer.
development
Designing in territory where the industry is still groping for shape — AI-native systems, agent-first interfaces, any domain whose category is forming. Triggers on "AI native X", "agent-first X", "redefine X", "rebuild X from scratch under Y", "reframe X for Y", "what should X look like in the new paradigm", "design a system with no precedent", or the tension between "new shoes on the old path" and "a skeleton that holds on its own". Method — strip to 3-5 abstract functions, redraw the load-bearing skeleton from the new paradigm's primitives, stress-test without traditional crutches, then add familiar flesh as projection. Do NOT trigger for incremental redesigns within an existing paradigm (use design-driven), explanatory writing (use technical-article-writing), or vague "make it AI" requests. Pairs with design-driven (upstream) and goal-driven (parallel). Args — `/reframe init`, `close`, `explain [for <audience>]`.
development
Goal-driven methodology for multi-week initiatives where the destination is clearer than the path — GOAL.md as stable compass (General Line plus falsifiable success criteria), record captures what was tried and observed. Triggers on "set a goal", "track my progress on X", "this is exploratory", "I know the goal but not the path", or starting a months-long initiative without a clear technical shape. Use for research, exploratory features, learning projects with a shippable output, book/article series, job search, side-business launches. Do NOT trigger for single-task work, bug fixes, week-long features with a clear plan, vague aspirations ("be healthier"), habit tracking, or general life management. Pairs with design-driven (why/how-far vs what-shape) and runs parallel to reframe. Args — `/goal-driven set`, `review`, `close`.
development
Evidence-driven methodology for the execution layer — every claim of progress requires a falsifiable observation; "looks right to me" is rejected. Use for production code, regression-prone systems, or any task where build-time discipline materially affects outcome quality. Triggers on "set up TDD", "build discipline", "no progress without evidence", "test-first", "verify rigorously", "production code workflow". Do NOT trigger for prototypes, exploratory spikes, throwaway scripts, or doc-only changes. Pairs with design-driven (which defines what to verify; evidence-driven defines how) — each works alone. Args — `/evidence-driven init` to wire up agent configs and optional pre-commit hooks. No periodic-audit command; it's an always-on overlay.