skills/role-approach-stud/SKILL.md
Use when about to build a non-trivial feature and you want the shape reviewable before the logic. Studs every function in its real file as a runnable walking-skeleton (fake data, real wiring) so names, placement, and contracts are visible before any real logic is written. Lay the skeleton, then checkpoint for review.
npx skillsauth add jasonwarrenuk/goblin-mode Stud (approach)Install 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.
You reached for this skill mid-task because you're about to build something that spans several functions or files, and the shape should be reviewable before the logic. This is a technique you apply, not a ceremony you run: lay a runnable skeleton, prove the plumbing, then checkpoint so the shape can be reviewed before you fill it.
There is no interview here. You were triggered mid-flow, and the feature is already in play. If a genuine ambiguity blocks the skeleton, ask a single targeted question and move on; don't turn this into a planning session.
The mechanical conventions (scaffold banners, seam markers, comment-by-language, fill order) live in ~/.claude/library/references/stud/conventions.md. Read it before writing stubs. A full worked example is in ~/.claude/library/references/stud/worked-example.md.
State the mode-switch out loud so whoever's watching knows why the next diff is full of fakes and scaffold banners:
"I'm laying down a runnable skeleton before filling in the logic (stud skill); I'll checkpoint the shape before writing any real logic."
This line is load-bearing in the knowledge path: the user didn't ask for a skeleton, so tell them they're getting one and why.
Build the feature in two stages so it can be understood before it hits maximum complexity:
should bullet becomes a test.Core principle: shape before logic. A stud that runs (fake data, real wiring) is worth more than a doc, because you can execute the plumbing and see the flow before writing a line of real logic.
Do not invent locations. If you've already read the relevant files in this task, reuse what you know; otherwise explore now. Place each stud where it will actually live, matching the surrounding patterns (naming, the shape of similar functions, how coroutines/handlers/queries are already written).
At the top of the relevant module, write the data shapes that flow through the feature once (the input shape, the stored/returned shape) and reference them everywhere instead of re-describing them per function. This stops the input/output contracts from drifting apart as you stud.
Each stud is a real, named function in its real place, that:
should bullets. Short comment lines describing what the real function must do. These are human-readable now and become the literal test cases in Stage 2.SEAM: / HOOKS INTO: / SCHEMA CHANGE:; see the conventions reference).Example (Python; use the language's own comment syntax elsewhere):
def upsert_event(conn, ev):
# INSERT a new event, or UPDATE times if its id already exists.
# in: ServerEvent out: None
# SEAM: workshop resolved via get_or_create_workshop
# should INSERT for a new id
# should UPDATE times when the id exists and they changed
# should no-op when nothing changed
return None # fake
Coroutines / handlers / long-lived studs should still loop and log so running the skeleton visibly exercises the flow, even though the bodies are empty. See worked-example.md for a full three-function feature.
So a reviewer can see, at a glance, what is new code versus a change to existing code. Every marker is a comment (the skeleton must still run and lint) and is labelled scaffold so it's obviously temporary. The full banner formats (& new, ! edited; box for chunks, inline tag for single lines) are in ~/.claude/library/references/stud/conventions.md. Keep the box symbols consistent so a plain-text search (&&&&, !!!!) finds every scaffold marker for removal in Stage 2.
A stud skeleton that doesn't run is just a doc; the point is that it runs. Before you checkpoint:
${CLAUDE_SKILL_DIR}/scripts/find-scaffold.sh --markers <studded-path> should list exactly the banners you placed (expected now; removed in Stage 2). Point it at the files you studded, not the whole repo.You triggered this yourself mid-task, so don't barrel straight into Stage 2. Surface the shape and let it be reviewed before any real logic:
Show what ran and the flow it exercised (Step 5 output).
List the seams the reviewer must sign off: run ${CLAUDE_SKILL_DIR}/scripts/find-scaffold.sh --seams <path>.
State the fill order you'd take next (pure/leaf first; see the conventions reference):
should bullets become the tests.Then pause for the shape to be reviewed. Filling is Stage 2; removing the &&&&/!!!! scaffold markers happens as you fill each chunk, not here.
The whole reason you reached for a skeleton was to make the shape reviewable; skipping the checkpoint throws that away.
| Element | Rule |
|-------------|------|
| Announce | Say you're skeletoning first, and that you'll checkpoint before real logic |
| Location | Real file, real signature, mirror the neighbouring pattern (reuse files already read) |
| Body | Realistic fake return, never null/None |
| Shapes | Declared once at top, referenced everywhere |
| Behaviours | should … bullets → Stage 2 tests |
| Seams | SEAM: / HOOKS INTO: / SCHEMA CHANGE: |
| Banners | & new, ! edited; see conventions reference |
| Verify | Skeleton runs on fake data + lints clean |
| Checkpoint | Surface the shape for review before Stage 2 |
Never:
&&&&/!!!! scaffold markers behind as if they were permanent.Always:
tools
{{ 𝚫𝚫𝚫 }} Rebuild roadmap-system.zip, the distributable snapshot of the roadmap tooling (scripts, HTML template, conventions reference, and every roadmap-touching skill, including this one).
tools
--- name: "Suggest: Task" description: "{{ 𝚫𝚫𝚫 }} Suggest the next logical task — grounded in the roadmap's pre-vetted ready-set when one exists, codebase analysis otherwise" when_to_use: "When you don't know what to work on next and want a grounded recommendation rather than picking arbitrarily." model: haiku effort: low disable-model-invocation: true allowed-tools: ["Read", "Glob", "Grep", "Bash(python3:*)", "Bash(npm:*)", "Bash(bun:*)", "Bash(pnpm:*)", "Bash(deno:*)"] argument-hint: [named
development
{{ 𝛀𝛀𝛀 }} Convert an old simple-style roadmap (single Markdown, four statuses, <a name> anchors, roadmaps.json pointer registry) into the rich phase-array format (roadmaps.json source of truth + PHASE task list + prose overview).
data-ai
{{ ƔƔƔ }} Create a pull request to main — wordy or shiny (with screenshots), ready-for-review or draft