skills/task-execute-stud/SKILL.md
{{ ƔƔƔ }} Plan a non-trivial feature by interviewing to resolve unknowns, then studding every function as a runnable walking-skeleton (fake data, real wiring) so names, placement, and contracts can be reviewed before any real logic is written. Stops for review; fill is a separate pass.
npx skillsauth add jasonwarrenuk/goblin-mode StudInstall 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 were invoked deliberately by the user with an outcome in hand. Your job is to turn a decided-upon feature into a reviewable runnable skeleton, and to stop there. This is a planning ritual, not an implementation run: interview first, stud second, then hand back for review. Do not write real logic in this skill.
Arguments: $outcome is required; $questions is optional (trailing). If $questions is empty, skip the interview (Step 1) and go straight to exploring.
Deliver $outcome 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.
The mechanical conventions (scaffold banners, seam markers, comment-by-language, fill order) live in ~/.claude/library/references/stud/conventions.md. Read it before Step 3. A full worked example is in ~/.claude/library/references/stud/worked-example.md.
Before touching code, resolve $questions with the user. This is the part a mid-task pass can't do: you have the user's attention, so use it. Resolving $questions up front is this skill's whole advantage.
AskUserQuestion for each open question; keep going until they're all resolved or explicitly parked.Skip this step only if $questions is empty. Never invent answers to fill the gap.
Do not invent locations. Read the code and 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 handing off:
${CLAUDE_SKILL_DIR}/scripts/find-scaffold.sh --markers <studded-path> should list exactly the banners you placed (it's expected to find them now; they get removed in Stage 2). Point it at the files you studded, not the whole repo.This skill ends at a reviewable skeleton. Do not start Stage 2. Fill in templates/handoff.md and wait for the user:
${CLAUDE_SKILL_DIR}/scripts/find-scaffold.sh --seams <path>.should bullets become the tests.Removing the &&&&/!!!! scaffold markers is part of filling each chunk in Stage 2, not this skill's job.
| Element | Rule |
|-------------|------|
| Interview | Resolve $questions before any code; carry unresolved ones as flagged assumptions |
| Location | Real file, real signature, mirror the neighbouring pattern |
| 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 |
| Handoff | STOP after skeleton; user approves fill order before Stage 2 |
$questions up front is this skill's whole advantage. Don't guess what you could ask.Never:
$questions instead of asking.&&&&/!!!! 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