From lineup
Use this skill to review or refresh the rolling work state next to a spitball. Trigger on phrases like 'update the lineup', 'review the lineup', 'what's at-bat', 'what's next', 'sharpen the next at-bat', 'is the spitball done', 'check completion', or whenever the user wants to advance the next-step view without doing implementation work. Reads the spitball + current state, promotes On Deck → At Bat (creates an at-bat file), and stops. Never auto-invokes at-bat or any implementation skill.
How this skill is triggered — by the user, by Claude, or both
Slash command
/lineup:lineupThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Manages a small rolling state document next to a spitball. The spitball
Manages a small rolling state document next to a spitball. The spitball
owns the destination (the W). The lineup owns the next three batters: At
Bat (concrete), On Deck (fuzzy), In the Hole (very fuzzy). This skill
reads current state and updates the lineup. It does NOT do the work —
that is at-bat.
at-bat.Create a task for each item and complete in order:
.spitball.json (or use defaults) to
get saveDir. Scan immediate children of saveDir for folders that
contain a spitball.md. Among those, the "live" lineups are folders
whose lineup.md does NOT begin with Status: Complete. (A folder
without lineup.md yet counts as live; this is the first run.)
lineup.md. If absent, this is the first lineup
cycle for this spitball: see "First-run bootstrap" below.Status: Complete at the top of lineup.md
and stop. Tell the user the spitball is delivered.NNN-<slug>.md file in
the lineup folder with the full required structure (see "At-bat
file structure" below). Counter is the next unused integer for this
folder; never reuse, never reset.lineup.md).lineup.md. Replace the At Bat pointer with the new file
name. Update the On Deck and In the Hole bullets. Append the
previously-completed at-bat to the Completed list (its file should
already be in completed/ — that move is at-bat's job, not yours).autoCommit is true (default). Commit the new at-bat
file and the updated lineup.md together with a short message like
Lineup: promote NNN-<slug>.at-bat. Tell the user the
lineup is sharpened and they can run at-bat when ready.If lineup.md does not exist yet for a spitball:
lineup.md with all three slots filled:
001-<slug>.md file (which you create
with the full structure).When you create a new at-bat file (NNN-<slug>.md), it MUST contain:
# At-Bat NNN: <title>
## What
<concrete description of the unit of work>
## Definition of done
<observable outcome that proves "done">
## Test plan
- Red: <a failing test that captures "done">
- Green: <expected behavior when it passes>
## Scope boundary
- In: <thing>
- Out: <related thing we are NOT touching here>
## Dependencies
- <prior at-bat or external thing>
If the work genuinely cannot be tested (pure docs, no-behavior config, exploratory spike), replace the Test plan section with explicit honesty:
## Test plan
- No automated test: <reason>
- Manual verification: <concrete steps>
You MUST push back on the no-test escape if the at-bat could be tested. The escape is for cases where automated testing genuinely doesn't fit, not for cases where it's inconvenient.
lineup.md structure# Lineup: <topic>
Spitball: spitball.md
## At Bat
→ NNN-<slug>.md
## On Deck
- <fuzzy bullet, one sentence>
## In the Hole
- <very fuzzy bullet, one sentence>
## Completed
- NNN-<slug>.md
- NNN-<slug>.md
When the spitball's completion criteria are met, prepend Status: Complete as the first line of the file. That marker is how a lineup
becomes inactive — there is no separate metadata.
digraph lineup {
"Discover active lineup" [shape=box];
"Multiple live?" [shape=diamond];
"Ask which one" [shape=box];
"Read spitball" [shape=box];
"Has completion criteria?" [shape=diamond];
"Ask user to add criteria" [shape=box];
"lineup.md exists?" [shape=diamond];
"First-run bootstrap" [shape=box];
"Completion met?" [shape=diamond];
"Mark Status: Complete\nand stop" [shape=doublecircle];
"Promote slots" [shape=box];
"Update lineup.md" [shape=box];
"Commit if autoCommit" [shape=box];
"Hand back to user" [shape=doublecircle];
"Discover active lineup" -> "Multiple live?";
"Multiple live?" -> "Ask which one" [label="yes"];
"Multiple live?" -> "Read spitball" [label="no, one live"];
"Ask which one" -> "Read spitball";
"Read spitball" -> "Has completion criteria?";
"Has completion criteria?" -> "Ask user to add criteria" [label="no"];
"Has completion criteria?" -> "lineup.md exists?" [label="yes"];
"Ask user to add criteria" -> "lineup.md exists?";
"lineup.md exists?" -> "First-run bootstrap" [label="no"];
"lineup.md exists?" -> "Completion met?" [label="yes"];
"First-run bootstrap" -> "Commit if autoCommit";
"Completion met?" -> "Mark Status: Complete\nand stop" [label="yes"];
"Completion met?" -> "Promote slots" [label="no"];
"Promote slots" -> "Update lineup.md";
"Update lineup.md" -> "Commit if autoCommit";
"Commit if autoCommit" -> "Hand back to user";
}
max(NNN across all files in the folder + completed/) + 1.001, 002, ..., 099,
100).Read .spitball.json from the repo root. Use these values:
saveDir — directory containing spitball folders. Defaults to
docs/spitballs/.autoCommit — whether to commit the at-bat file and updated lineup.md
after promotion. Defaults to true.There is no .lineup.json. If a value isn't in .spitball.json, use the
default.
npx claudepluginhub robmt/claude-tools --plugin lineupProvides a checklist for code reviews covering functionality, security, performance, maintainability, tests, and quality. Use for pull requests, audits, team standards, and developer training.