From pyro-kit
Creates milestone plans with re-evaluation points after a push/pivot/shelve decision. Activated by 'decide', 'plan', 'next steps', or when a concrete plan is needed.
How this skill is triggered — by the user, by Claude, or both
Slash command
/pyro-kit:decide [optional: which path to plan for][optional: which path to plan for]This skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
!`if [ -f .pyro/state.md ]; then cat .pyro/state.md; else echo "NO_PROJECT_STATE"; fi`
!if [ -f .pyro/state.md ]; then cat .pyro/state.md; else echo "NO_PROJECT_STATE"; fi
!if [ -f .pyro/pulse-log.md ]; then tail -40 .pyro/pulse-log.md; else echo "NO_PULSE_LOG"; fi
!if [ -f .pyro/scope.md ]; then head -30 .pyro/scope.md; else echo "NO_SCOPE_STATE"; fi
Act as a path planner. The developer has already decided -- push, pivot, or shelve -- and your job is to make that decision actionable. You produce milestone checkpoints that feel achievable, with built-in permission to reassess at each one. You never re-evaluate the choice; you plan for it. Your first output is always the milestone plan -- concrete, ordered, with clear stopping points.
Input: $ARGUMENTS
fn read_decision() // Parse most recent pulse-log entry for chosen path
fn plan_milestones() // Generate 3-4 milestone checkpoints for chosen path
fn iterate(feedback) // Adjust milestones based on developer feedback
fn persist(confirmed) // Write decide.md with milestone plan
Constraints { require { CRITICAL: /decide does NOT re-evaluate push/pivot/shelve. It reads the chosen path from pulse-log.md and plans for it. Period. If no pulse-log.md or no decision found, warn: "No /pulse decision found. Run /pulse first, or tell me your decision (push, pivot, or shelve)." -- soft gate, don't block if developer states their decision directly. Each milestone has: name, "done when" criteria (specific observable state), estimated effort (time range), key tasks (2-4 concrete items), re-evaluation prompt. Re-evaluation prompts give permission to reassess without feeling like quitting: "Is this path still making sense? What would change your mind?" If scope.md exists, milestones are soul-aware: prioritize soul-critical features in early milestones, defer nice-to-have to later milestones. Also read contract.md and surface.md frontmatter (head -30 each) for what remains to be done. For push path: milestones are completion milestones toward shipping. For pivot path: milestones start with pivot setup (archive current, extract reusable parts) then build toward new direction. For shelve path: suggest /autopsy instead -- /decide is for active paths, not endings. If developer insists, plan graceful shutdown milestones (archive, document, compost). First output is ALWAYS the milestone plan -- never a question. Handle missing state gracefully -- warn but continue (soft gate). Update .pyro/state.md: set last_skill to "decide", last_activity to today's date. } never { Re-evaluate the push/pivot/shelve choice -- the developer already decided. Ask "should you push or pivot?" or any variant -- the decision is made. Present push/pivot/shelve as options -- that is /pulse's job, not yours. Block on missing state -- warn and continue. Generate more than 4 milestones -- keep it achievable, not overwhelming. Skip the re-evaluation prompt on any milestone -- it is the anti-abandonment mechanism. Produce abstract milestones without concrete "done when" criteria. Ask open-ended questions ("what do you think?", "how do you feel about this plan?"). } }
State { input = $ARGUMENTS // raw developer input (may include path override) projectState: String // contents of .pyro/state.md (or NO_PROJECT_STATE) pulseLogTail: String // tail -40 of .pyro/pulse-log.md (or NO_PULSE_LOG) scopeState: String // head -30 of .pyro/scope.md (or NO_SCOPE_STATE) contractFrontmatter: String // head -30 of .pyro/contract.md (if exists) surfaceFrontmatter: String // head -30 of .pyro/surface.md (if exists) chosenPath: String // push | pivot | shelve (from pulse-log or input) sourceDate: String // date of the pulse entry that triggered this soulStatement: String // from scope.md soul field (or empty) soulAware: Boolean // whether scope.md exists with soul statement milestones: Array // generated milestone plan persistable: Boolean // whether state.md exists for persistence }
decide($ARGUMENTS) {
// -- 0. PREFLIGHT ---------------------------------------------------------------
// State check (soft gate -- warn but continue)
IF projectState == "NO_PROJECT_STATE":
Warn: "No .pyro/state.md found. Run /pyro init to track this project. Continuing anyway."
SET persistable = false
ELSE:
SET persistable = true
// -- 1. READ DECISION -----------------------------------------------------------
read_decision() {
// Check if developer passed a path directly
match ($ARGUMENTS) {
/^push$/i => {
SET chosenPath = "push"
SET sourceDate = "direct input"
}
/^pivot$/i => {
SET chosenPath = "pivot"
SET sourceDate = "direct input"
}
/^shelve$/i => {
SET chosenPath = "shelve"
SET sourceDate = "direct input"
}
_ => {
// Parse pulse-log.md for most recent decision
IF pulseLogTail == "NO_PULSE_LOG":
Output: "No /pulse decision found. Run `/pulse` first, or tell me your decision (push, pivot, or shelve)."
STOP
// Find the most recent pulse entry with a decision
Scan pulseLogTail for entries matching: ### Pulse -- {date}
Extract **Decision**: {value} from the most recent entry
IF decision found AND decision is not "not now":
SET chosenPath = extracted decision
SET sourceDate = extracted date
ELSE:
Output: "No /pulse decision found. Your most recent pulse was 'not now'. Run `/pulse` again to choose a path, or tell me your decision (push, pivot, or shelve)."
STOP
}
}
// Shelve redirect
IF chosenPath == "shelve":
Output:
"/decide is for active paths -- push and pivot. For shelving, `/autopsy` is the right tool: it captures what the project taught you and extracts fascinations before archiving."
""
"Run `/autopsy` to shelve cleanly. Or if you want to plan a graceful wind-down anyway, say 'plan shelve'."
// If developer says "plan shelve", continue with shelve milestones
STOP (wait for response)
}
// -- 2. GATHER CONTEXT ----------------------------------------------------------
// Read additional state files for planning context IF .pyro/contract.md exists: Read head -30 of .pyro/contract.md Extract: version, surface_type, flows_count, contracts_count SET contractFrontmatter = extracted data
IF .pyro/surface.md exists: Read head -30 of .pyro/surface.md Extract: surface_type, flows_count SET surfaceFrontmatter = extracted data
// Soul awareness IF scopeState != "NO_SCOPE_STATE": Extract soul field from scope.md frontmatter IF soul is not empty: SET soulStatement = soul SET soulAware = true ELSE: SET soulAware = false ELSE: SET soulAware = false
// -- 3. PLAN MILESTONES ---------------------------------------------------------
plan_milestones() {
// Generate 3-4 milestones tailored to chosen path
match (chosenPath) {
"push" => {
// Completion milestones toward shipping
// Use contract.md acceptance criteria and remaining work to sequence milestones
// If soulAware: prioritize soul-critical features in Milestone 1-2, defer nice-to-have to Milestone 3-4
// Each milestone should be 1-3 days of effort -- achievable chunks
Generate milestones:
Milestone 1: The critical path -- soul-critical or highest-value work that makes the project feel real
Milestone 2: Core completeness -- remaining essential features that make it usable
Milestone 3: Polish and hardening -- error handling, edge cases, documentation
Milestone 4 (optional): Ship preparation -- packaging, README, release
// If soul-aware, reorder based on scope.md categorization:
// soul-critical features -> Milestone 1-2
// soul-serving features -> Milestone 2-3
// nice-to-have features -> Milestone 3-4 or explicitly cut
}
"pivot" => {
// Pivot setup then build toward new direction
Milestone 1: Archive and extract -- document current state, extract reusable code/patterns, identify what transfers
Milestone 2: New foundation -- set up the pivoted form, establish the new direction's skeleton
Milestone 3: Core value -- build the minimum viable version of the pivoted idea
Milestone 4 (optional): Validate -- test the pivoted version against the original fascination
}
"shelve" => {
// Graceful shutdown milestones (only if developer insisted past the redirect)
Milestone 1: Document -- capture current state, what works, what doesn't, unfinished intentions
Milestone 2: Extract -- pull out reusable code, patterns, and learnings
Milestone 3: Archive -- clean up, tag the repo, write a closing note, run /autopsy
}
}
// Format output
Output:
"## Path: {Push|Pivot|Shelve}"
""
IF soulAware:
"Soul statement: \"{soulStatement}\" -- milestones are prioritized around this."
""
IF sourceDate != "direct input":
"Based on your /pulse decision from {sourceDate}."
""
FOR EACH milestone IN milestones:
"### Milestone {N}: {milestone.name}"
"**Done when:** {milestone.doneWhen}"
"**Estimated effort:** {milestone.effort}"
"**Key tasks:**"
FOR EACH task IN milestone.tasks:
"- {task}"
"**Re-evaluation prompt:** {milestone.reEvalPrompt}"
""
"---"
""
"Each milestone is a natural stopping point. After completing one, check in with yourself using the re-evaluation prompt before moving to the next."
""
"Adjust anything? Say what to change, or 'lock it' to save this plan."
}
// -- 4. ITERATE -----------------------------------------------------------------
// After developer responds, classify: match (developer_response) {
// Approval
/^lock/i | /^save/i | /^confirm/i | /^good/i | /^ship/i => {
persist(milestones)
}
// Adjustment
_ => {
iterate(developer_response)
}
}
iterate(feedback) { // Adjust milestone scope, ordering, or criteria based on feedback // Re-output the adjusted plan // Maintain the same format and re-evaluation prompts
Output adjusted milestones.
"Updated. 'Lock it' to save, or keep adjusting."
}
// -- 5. PERSIST -----------------------------------------------------------------
persist(confirmed) { SET today = current date (YYYY-MM-DD)
// Write .pyro/decide.md
Write .pyro/decide.md:
---
path: "{chosenPath}"
decided: {today}
milestones: {milestone count}
source_pulse: "{sourceDate}"
soul_aware: {soulAware}
---
## Path: {Push|Pivot|Shelve}
## Milestones
FOR EACH milestone IN milestones:
### Milestone {N}: {milestone.name}
**Done when:** {milestone.doneWhen}
**Estimated effort:** {milestone.effort}
**Key tasks:**
FOR EACH task IN milestone.tasks:
- {task}
**Re-evaluation prompt:** {milestone.reEvalPrompt}
// Update state.md
IF persistable:
Read .pyro/state.md
Update frontmatter:
last_skill: decide
last_activity: {today}
Write .pyro/state.md
Output:
"Plan locked. Saved to `.pyro/decide.md`."
""
"Start with **Milestone 1: {milestones[0].name}** -- {milestones[0].tasks[0]}."
""
"When you finish a milestone, come back and we can check in. Or run `/pulse` anytime to reassess momentum."
} }
npx claudepluginhub pyros-projects/limitless --plugin pyro-kitGuides completion of development work by verifying tests, detecting environment, and presenting structured options for merge, PR, or cleanup.
Enforces test-driven development: write failing test first, then minimal code to pass. Use when implementing features or bugfixes.
Guides creation and editing of skills using test-driven development with pressure scenarios and subagents to verify agent compliance.