Use when defining project vision and strategic direction. Triggers: 'why this project', 'define vision', 'project goals', 'what are we building'.
Purpose: Create a strategic overview that answers: Who is this for? What problem does it solve? Where are we? Where are we going? How are we getting there? What are we NOT building?
What it does: Collects core vision inputs, generates .shipkit/why.json, provides strategic context for all future sessions.
Protocol: This skill follows the canonical elicitation protocol defined in install/shared/references/elicitation-protocol.md (the mechanics — marker, state files, resume). The steps below are this skill's specific application of that protocol.
Calibration: Apply install/shared/references/ground-or-ask-calibration.md (the intelligence — propose vs ask). Ground first: propose every vision field you can tie to a cited signal (the opening prompt, README, codebase, package.json), tagged with its source; flag low-leverage guesses as guessed. Only the genuinely-unknown high-leverage fields (who it's for, the core problem, the one-way-door constraints) become NEEDS_ELICITATION questions. Do not ask what a signal already answers; do not silently invent a high-leverage field. Runs autonomous (propose + few questions) by default; interactive when signals are thin.
User triggers:
Auto-suggested: Session start if why.json doesn't exist (via shipkit-session-start.py)
None - This can be the first skill you run (even before shipkit-project-context)
Recommended order:
/shipkit-why-project - Define strategic vision/shipkit-stage - Set project stage, constraints, and business metrics/shipkit-product-discovery - Define personas & user needs/shipkit-product-definition - Design solution blueprint/shipkit-product-goals - Define user-outcome success criteria (P-*)Before checking elicitation state, attempt a context-based shortcut:
README.md, package.json (name, description, keywords), existing source files, any .shipkit/*.json files.why.json proposal based on what you found.stage.json (via /shipkit-stage)..shipkit/why.json directly and skip to Step 6 (confirm to user)..shipkit/why.json if it exists..shipkit/reviews/direction-assessment.json if present. If the latest review lists a gap against this artifact, archive the existing file to .shipkit/.archive/why.YYYY-MM-DD.json and regenerate addressing the gap. Otherwise, exit early with a "no changes needed" report — the reviewer already accepted it.Read .shipkit/elicitation/why-project/answers.md.
Classify each A: line as real or placeholder:
[awaiting answer], empty string, literal A: with nothing after.Then:
targetUsers, problem, currentState, vision, approach): synthesize .shipkit/why.json from those answers per the schema in Step 5. Update progress.json with status: complete, set completed_at and last_elicited_at to current ISO 8601 UTC timestamp. Skip to Step 6. Do NOT overwrite answers.md — the user's input is preserved as-is.answers.md — append a new turn header to the existing file for the unanswered questions only.answers.md in Step 4 since no real content exists.Apply the calibration gate FIRST (do not ask what a signal already answers). Run the grounding pass from ground-or-ask-calibration.md: for each field below, check the cited signals (opening prompt, README, package.json, codebase). If a signal grounds the field → propose it (tagged with source), do NOT include it as a question. Only include a question for a field that is ungrounded AND high-leverage (targetUsers, problem, and any one-way-door constraint are the high-leverage ones; vision/approach are high-leverage only if ungrounded; the optional fields are low-leverage → propose flagged defaults, don't ask). The list below is the full menu; the actual turn asks only the ungrounded-high-leverage subset — often 0-3, not all 8.
Produce that calibrated question set for the current turn. Two-turn split (recommended) when several core fields are genuinely ungrounded:
Turn 1 — core foundation (Q1–Q3):
targetUsersproblemcurrentStateTurn 2 — direction + optional (Q4–Q5 + optional):
4. "What does success look like? What's the vision?" → vision
5. "What's the approach? How are we getting there?" → approach
6. (Optional) "What are the measurable success criteria? (or skip)" → successCriteria
7. (Optional) "Any enduring constraints? (e.g., must run on mobile, no paid APIs — or skip)" → constraints
8. (Optional) "What are we explicitly NOT building? (or skip)" → nonGoals
Note on constraints: Capture only enduring project-level constraints here. Stage-specific constraints like "AU curriculum only for POC" belong in
stage.json.
For optional fields (Q6–Q8): if the user skips, set the corresponding field to an empty array [].
One-turn mode is also acceptable for pilot: ask all 8 questions in a single turn if context suggests the user prefers a direct Q&A session.
Write the following files. All timestamps ISO 8601 UTC.
.shipkit/elicitation/why-project/questions.md — overwrite with current turn's questions using the schema from install/shared/references/elicitation-protocol.md:
---
skill: shipkit-why-project
turn: <n>
last_updated: <ISO 8601 UTC>
---
## Turn <n>
1. Question text (field: `targetUsers`)
2. ...
.shipkit/elicitation/why-project/answers.md — DO NOT write this file from the fork. The main session creates and maintains this file when it collects answers via AskUserQuestion. Writing placeholders here from the fork clobbers any real user answers (pre-populated or from prior turns). The fork's job is to emit the marker and signal which questions need answering — questions.md carries that information.
If you want to leave a clear breadcrumb, you may create an empty answers.md with only the frontmatter header only if the file does not already exist. Never overwrite an existing answers.md.
.shipkit/elicitation/why-project/progress.json — create or update:
{
"skill": "shipkit-why-project",
"status": "in_progress",
"elicitation_turn": <n>,
"started_at": "<ISO 8601 UTC>",
"last_updated_at": "<ISO 8601 UTC>",
"completed_at": null,
"last_elicited_at": "<ISO 8601 UTC>",
"total_questions_planned": 5,
"questions_answered": <count from prior turns>,
"confidence": "medium"
}
Emit the following as the final line of your output:
NEEDS_ELICITATION:shipkit-why-project
status=paused
turn=<n>
questions_file=.shipkit/elicitation/why-project/questions.md
reason=awaiting user answers for turn <n>
Do not synthesize why.json. Do not invent answers. Return immediately after emitting the marker.
Only reached when real answers are available — from the context shortcut (Step 0), a pre-populated answers.md (Step 2), or completed elicitation.
Location: .shipkit/why.json
Output format: See references/output-schema.md for complete schema.
Key fields:
{
"$schema": "shipkit-artifact",
"type": "project-why",
"version": "1.0",
"lastUpdated": "{Current date YYYY-MM-DD}",
"createdAt": "{First creation date - preserve if updating}",
"source": "shipkit-why-project",
"vision": "{answer to Q4}",
"problem": "{answer to Q2}",
"targetUsers": "{answer to Q1}",
"currentState": "{answer to Q3}",
"successCriteria": ["{parsed from Q6, or []}"],
"constraints": ["{parsed from Q7, or []}"],
"nonGoals": ["{parsed from Q8, or []}"],
"approach": "{answer to Q5}"
}
Update progress.json: set status: complete, completed_at and last_elicited_at to current ISO 8601 UTC timestamp.
Output:
.shipkit/why.json)/shipkit-stage to set project stage and business metrics/shipkit-product-discovery to define user needs and personasCreates .shipkit/why.json (auto-loaded by shipkit-session-start.py)
Elicitation state (persists as audit trail):
.shipkit/elicitation/why-project/questions.md.shipkit/elicitation/why-project/answers.md.shipkit/elicitation/why-project/progress.jsonCopy and track:
targetUsers)problem).shipkit/why.json.shipkit/elicitation/why-project//shipkit-stage for project stage and business metrics/shipkit-product-discovery for user needs/shipkit-stage - Recommended next step — Set project stage, constraints, and business metrics/shipkit-product-discovery - Define personas, user needs, and journeys/shipkit-project-context - Scan technical stack (can run in parallel with discovery)/shipkit-engineering-definition - Engineering blueprint and architecture decisions/shipkit-spec - Create feature specs (can reference vision for alignment)On update (if why.json exists): .shipkit/why.json - Read old values as defaults
Never reads other files - This is the starting point
Artifact strategy: replace — Overwrites the existing artifact file. Previous content is not preserved.
Creates/Updates: .shipkit/why.json - OVERWRITE AND REPLACE
Write Strategy: OVERWRITE AND REPLACE
createdAt date preserved from original when updatingshipkit-session-start.py auto-loads why.json (~200 tokens)
Result: Claude starts every session knowing who/why/where/how, enabling better aligned suggestions.
Guardrails Check: Before moving to next task, verify:
.shipkit/?/shipkit-work-memory for continuity.If NEEDS_ELICITATION:shipkit-why-project was emitted: The skill paused without writing why.json. The main session should run /shipkit-why-project inline (where AskUserQuestion is available), answer the questions in .shipkit/elicitation/why-project/questions.md, then re-invoke the original skill or orchestrator to resume. See install/shared/references/elicitation-protocol.md for full handling instructions.
Natural capabilities (no skill needed): Implementation, debugging, testing, refactoring, code documentation.
Suggest skill when: User needs to set project stage (/shipkit-stage), define user needs (/shipkit-product-discovery), or check project status.
Vision is defined when:
.shipkit/createdAt preserved if updating).shipkit/elicitation/why-project/ with ISO 8601 UTC timestampsNEEDS_ELICITATION:shipkit-why-project is the final output line; why.json was NOT writtenRemember: This is strategic context, not requirements. Keep it high-level. Answer "why" not "how". Think vision, not spec.
Schema reference: See references/output-schema.md for complete JSON schema.
Example: See references/example.json for a sample output.
npx skills add stefan-stepzero/shipkit-why-project下载完整 Skill 目录,包含 SKILL.md 及所有相关文件
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer