一键导入
goals
Use when starting a new QRSPI pipeline run — captures user intent and constraints through interactive dialogue, then synthesizes a problem-framed goals.md
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Use when starting a new QRSPI pipeline run — captures user intent and constraints through interactive dialogue, then synthesizes a problem-framed goals.md
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Use when questions.md is approved and the QRSPI pipeline needs objective codebase and web research — dispatches parallel specialist subagents per question, collates per-question findings into research/summary.md
Use when starting a new QRSPI pipeline run — captures user intent and constraints through interactive dialogue, then synthesizes a problem-framed goals.md
Use when starting any conversation — establishes the QRSPI pipeline for agentic software development, requiring structured progression through Goals, Questions, Research, Design, Phasing, Structure, Plan, Parallelize, Implement, Integrate, Test, with Replan firing between phases
Per-phase implementation orchestrator. In full pipeline mode, resolves symbolic bases from parallelization.md to concrete commits, creates worktrees and stage commits, runs baseline tests, dispatches implementer + reviewer subagents per task per the wave schedule, runs the fix loop, presents the batch gate, and routes to the next route step (typically Integrate). In quick-fix mode, dispatches the single task (or a fix-task batch from fixes/{type}-round-NN/) through the same per-task implementer + reviewer flow, presents the batch gate (with quick-fix-mode menu), and routes to Test.
Per-phase implementation orchestrator. In full pipeline mode, resolves symbolic bases from parallelization.md to concrete commits, creates worktrees and stage commits, runs baseline tests, dispatches implementer + reviewer subagents per task per the wave schedule, runs the fix loop, presents the batch gate, and routes to the next route step (typically Integrate). In quick-fix mode, dispatches the single task (or a fix-task batch from fixes/{type}-round-NN/) through the same per-task implementer + reviewer flow, presents the batch gate (with quick-fix-mode menu), and routes to Test.
Use when starting any conversation — establishes the QRSPI pipeline for agentic software development, requiring structured progression through Goals, Questions, Research, Design, Phasing, Structure, Plan, Parallelize, Implement, Integrate, Test, with Replan firing between phases
| name | goals |
| description | Use when starting a new QRSPI pipeline run — captures user intent and constraints through interactive dialogue, then synthesizes a problem-framed goals.md |
PRECONDITION: Invoke qrspi:using-qrspi skill to ensure global pipeline rules are in context. (Idempotent on session re-entry. Subagents are exempt — SUBAGENT-STOP in using-qrspi handles that.)
Announce at start: "I'm using the QRSPI Goals skill to capture what you want to build."
If auto-mode is detected (presence of ## Auto Mode Active system-reminder), surface before the first interactive step: "This skill is collaborative — turn-by-turn dialogue produces better Goals quality than autonomous execution. Recommend exiting auto-mode (Shift+Tab to cycle modes). I'll proceed in either mode if you prefer." Do not force the user out; respect their choice.
Capture purpose, environmental constraints, and the per-goal problem frames that downstream skills work against. Runs as an interactive conversation in the main session, then launches a subagent to synthesize the artifact.
Goals is problem-framed, not solution-prescribing. Each goal states a problem, why it matters, and what is known. Solution candidates surface in "What we know so far" as possibilities for Design to weigh — NOT commitments.
Prohibition. Goals does NOT author file maps, phasing decisions, or detailed solution definitions; those are owned by downstream artifacts.
This section is the single source of truth for goals.md scope boundaries. It is the locked rule set the scope-reviewer dispatch loads at review time (Read by the qrspi-goals-scope-reviewer agent at runtime per its rules-loading procedure). Findings cite this list directly.
G1, G2, …) that downstream artifacts (questions, research, design, structure, plan, roadmap, future-*) reference,type field with allowed values known-fix | exploratory (see "Goal Type Field" below),Cross-Cutting Notes section. Top-level only when relationships between goals genuinely cross-cut. Omit when not needed.Acceptance blocks + Plan's per-task expectations. Goals does NOT enumerate per-goal acceptance criteria.The DEFERS list is about ownership of decisions, not mention of the deferred surface. The following incidental references are PERMITTED and MUST NOT be flagged as boundary violations by the scope-reviewer:
Decision locked during this Goals dialogue: or User-locked during Goals dialogue:. Provenance trumps the candidate-framing rule — the user is the authority, and recording the lock truthfully is more important than re-framing it as a candidate. The lock applies only to the goal's framing, not to Design's downstream decisions about how to implement it.could include, Design should weigh, candidate acceptance approach:) are PERMITTED. Sentences that bind acceptance with imperative verbs (Acceptance must include, Acceptance must measure) are NOT — those still violate the rule.## Cross-Cutting Notes. The actual phase boundaries and roadmap are still Phasing's call — Goals records the coupling rationale, not the phase decision.The scope-reviewer evaluates the deferred surface against these carve-outs FIRST before flagging a boundary finding. A scope finding is only valid when the artifact crosses the boundary in a way the carve-outs do not permit.
Every goal MUST carry a type field with value known-fix or exploratory, grounded in Knight risk-vs-uncertainty:
known-fix — risk. Well-characterized problem; bounded solution space. Cost-benefit reasoning applies normally.exploratory — uncertainty. The problem is partly uncharted; success criteria emerge through investigation. Exploratory goals are protected from cost-benefit reasoning that would defer them — value comes from learning that hasn't happened yet. Do NOT drop or down-rank because it "isn't shovel-ready" or "has unclear payoff."If neither fits, default to exploratory and flag the ambiguity under "What we know so far". Do NOT invent a third value.
Required inputs: None (this is the first step)
Before starting:
docs/qrspi/YYYY-MM-DD-{slug}/ (relative to the project root, not the plugin directory)
user-auth, "Build a search API for products" → product-search-api. If ambiguous, ask the user to confirm.using-qrspi) as in_progress.Goals runs in three contexts:
config.md, no goals.md. Run the full Interactive Dialogue + Pipeline Mode Selection.goals.md may already be approved. Validate config.md and continue from where the user left off.goals.md from roadmap.md + future-goals.md: Replan reads roadmap.md for the next phase's goal IDs, extracts matching entries from future-goals.md, and writes them as the new draft goals.md (status: draft). artifact_promote_next_phase has reset goals/research/design frontmatter to draft and deleted phase-scoped files (structure.md, plan.md, tasks/). The phases/phase-NN/ snapshot exists; config.md carries the original route and pipeline.Detecting next-phase restart: all three hold:
phases/phase-*/ snapshot directory existsgoals.md exists with status: draftconfig.md exists with valid route and pipelineBehavior on next-phase restart:
Fail-closed precondition. STOP on any failure — do NOT silently dialogue against an empty/partial draft (silent goal loss is the failure mode this guards):
roadmap.md exists in the artifact directory.future-goals.md exists.goals.md is non-empty and well-formed.roadmap.md's next-phase row.On failure, surface a concrete diagnostic and ask the user how to proceed (re-run Replan, hand-fix, abort).
Skip artifact-directory creation.
Skip the Pipeline Mode Selection questions (the existing config.md carries pipeline and route). Still run Config Validation to catch hand-edits.
Run a focused Interactive Dialogue against the auto-populated draft: confirm promoted goals match the user's next-phase expectation; capture new constraints (the Replan feedback file feedback/replan-phase-NN-round-MM.md is one input).
Re-synthesize goals.md (subagent) with the auto-populated content + new constraints. Preserve goal IDs from roadmap.md so downstream references stay valid.
Run the standard Review Round + Human Gate; on approval, write status: approved and let the pipeline cascade.
If config.md already exists (resuming a run), apply the Config Validation Procedure in using-qrspi/SKILL.md. Goals validates route, pipeline, second_reviewer, verifier_enabled, scope_tagger_enabled, visual_fidelity_required, and (when pipeline: quick) question_budget.
Questions to cover (order follows the conversation):
known-fix (risk — solution space bounded) or exploratory (uncertainty)? Default exploratory when uncertain; flag the ambiguity.Do NOT ask for per-goal acceptance criteria, file maps, phasing, or "what's out of scope" — those are owned by downstream artifacts.
When working a goal with the user, follow these rules.
Open with questions. Surface your list of open questions for the goal in chat. Work through them with the user one decision at a time.
One question at a time, with a recommended answer. Each question carries your proposed answer; the user confirms, amends, or rejects.
Ground first, ask second. Before asking the user any question — your own or one the user has asked back — consult the codebase, then the web. When a question touches industry best practice or external patterns, search the web for cited evidence rather than speculating or punting back. Escalate to the user only when no source surfaces a defensible answer.
When the user asks for your call, provide one. Give a grounded recommendation (sources per Rule 3) with named tradeoffs. Do not deflect with more questions. If grounding leaves the call indeterminate, say so and name what additional evidence would resolve it.
Sharpen fuzzy language. When the user uses imprecise vocabulary, propose the canonical term and ask for confirmation before moving on.
Walk every branch of the decision tree, including flow gaps. For each goal, resolve dependencies one-by-one. Do not move to the next goal until every branch surfaced is decided, explicitly deferred with a written reason, or split out as a separate goal. Branch completeness includes the end-to-end flow between any multi-actor decisions — actors named, operations sequenced, per-step inputs/outputs traced to producer and consumer, loud-failure paths named, context-cost call-out present. A flow with implicit hand-offs is an open branch; close it before moving on.
Lock decisions as they settle. Write each decision into the goal block under status: draft as it is confirmed. Do not accumulate decisions in chat across multiple goals before persisting.
Per Rule 8, write each locked goal directly to goals.md with status: draft as confirmed. The draft on disk is the durable record; the chat transcript is not.
Presence ≡ locked. The draft is a keyed map. A goal is locked iff its block appears. Tentative bodies, placeholder bodies, to be filled markers, TODO markers NEVER enter the draft. If a goal is not fully formed (Problem, Why we care, What we know so far all populated; concrete type value), it does not appear. This is the Evergreen-Output Rule applied to incremental persistence.
Keyed in-place overwrite on re-lock. Per-goal blocks are keyed by ID (### G1 — ...). On re-lock, overwrite in place — do NOT append a duplicate.
Resume after compaction. If /compact fires mid-phase, on resume:
Read the draft goals.md from disk and enumerate locked goals.
Ask the user whether all desired goals have been articulated. Goals runs before Research and has no upstream inventory to diff against — the user is the only authority on what work remains (the remaining-work computation is a user-driven question at Goals stage, not an inventory diff).
Surface the recovery diagnostic verbatim:
"Resumed after compaction — last locked decision: GNN (M decisions locked, K remaining). Continuing from G(NN+1)."
Continue from the next unlocked goal.
End-of-phase finalize pass. After the walkthrough completes:
type value.status: draft to status: approved. Only the finalize pass writes approved; hand-edits mid-phase are forbidden. When the user picks "Approve, skip review", the finalize pass still runs and the reviewer round is skipped.Simulated-compaction durability contract. A simulated compaction at a mid-phase decision (e.g., G15) followed by resume MUST produce a final artifact identical to a no-compaction run. The on-disk draft is the single source of truth for locked decisions; nothing about the chat transcript or in-session working memory is load-bearing across the compaction boundary.
After intent capture but before synthesizing goals.md, ask these questions one at a time:
Pipeline mode:
UX step (only ask if qrspi:ux skill exists — glob ~/.claude/plugins/cache/*/qrspi/*/skills/ux/; skip silently if not found):
Review depth (only ask when full pipeline is selected):
Second-model review (only ask if a second-reviewer vendor is available — run bash scripts/second-reviewer-available.sh; on non-zero exit, skip silently and write second_reviewer: false):
Write config.md. The fence below is the quick-pipeline writer output. For pipeline: full, use the same shape but (a) substitute the full route, (b) substitute pipeline: full, and (c) omit question_budget entirely — that field is pipeline: quick-only (caps Research specialist dispatch). Route templates live in using-qrspi/SKILL.md → "Route Templates"; UX does not apply to quick-fix. After writing, rewrite the Level 1 pipeline tasks to match.
---
created: YYYY-MM-DD
pipeline: quick
second_reviewer: true # or false
route:
- goals
- questions
- research
- plan # quick stops here before implement
- implement
- test
verifier_enabled: true # edit between rounds to disable for the whole run
scope_tagger_enabled: true # edit between rounds to disable convergence narrowing
visual_fidelity_required: false # default false unless opted into visual-fidelity binding chain
question_budget: 5
---
Launch a subagent to synthesize goals.md.
Subagent inputs:
goals.md on disk (REQUIRED — source of truth for pre-compaction locked decisions; the subagent MUST merge this draft with new conversation content rather than re-synthesize from conversation alone)Subagent task: Produce goals.md per the conformance template in skills/goals/references/goals-md-template.md (required sections and per-goal subsections, claim-before-evidence ordering, scannable bullets, no "be concise"). Pass the template path to the subagent and instruct it to read the file before drafting.
Any artifact in the QRSPI run directory governed by status: draft → approved frontmatter promotion (goals, design, structure, phasing, plan, parallelization, roadmap, future-goals, and any future artifact adopting this lifecycle) describes the current state of decisions. The reader is a downstream agent or future maintainer.
(Excludes by design: SKILL.md files — skills carry rule rationale legitimately; feedback/*.md — the designated home for dialogue exhaust; reviews/**/*.md — finding rationale; config.md — non-narrative.)
Litmus test (apply to every paragraph before write). Two filters, in order:
A sentence that only makes sense as a delta from a prior state is dialogue exhaust — strip it.
Permitted substantive content (do NOT confuse with dialogue exhaust):
## Trade-offs Considered — substantive content about the decision space, not about the document's history)Named antagonist patterns — strip on sight, substitute as shown:
| Antagonist pattern | Recognize by | Replace with |
|---|---|---|
| Session / drafting notes | "Rule X drafting note," "this collapsed from 3 to 1 because…" | Nothing — delete. If a fact matters, embed inline in the decision. |
| Version-history narration | "earlier draft said X," "previously," "originally," "pre-cleanup" | Nothing — git history holds versions. |
| Inside baseball | text addressed to "us" / "the author," meta-explanation of the document's own structure ("this section is split into A and B because…") | The decision the structure expresses — without the structural explanation. |
| Compaction-loss recovery notes | "this nuance was almost lost during…" | Nothing — if the nuance is needed, the rule itself carries it. |
| Failure-modes-prevented lists | bullets that justify why a rule exists rather than state what to do | Strengthen the rule's wording; delete the justification list. |
Decision-process history (drafts, review rounds, feedback applied, compaction recovery) lives in feedback files, review findings, PR descriptions, and git history — never in the artifact.
Iron Rule (template). No top-level Out of Scope, Success Criteria, or Acceptance Criteria section. What isn't a goal isn't in scope; acceptance is owned by Design's per-goal Acceptance blocks and Plan's per-task expectations. Capture user-volunteered exclusions as constraints (when they shape the solution space) or omit them.
Iron Rule (three subsections — emit all three). Every goal MUST carry exactly the three subsections Problem, Why we care, What we know so far. Omitting one is a synthesis defect. If the user did not articulate one during dialogue, re-enter dialogue to obtain it — do NOT write a placeholder, partial, or tentative body (presence ≡ locked). Do NOT add a fourth subsection — additional content belongs in What we know so far or in a Constraint.
Iron Rule (type field — concrete value). Emit ONE concrete value for each goal's type — either known-fix OR exploratory. NEVER emit the alternation literal known-fix | exploratory (template placeholder, not valid output). If uncertain, default to exploratory and explain under What we know so far.
Solutions-as-possibilities framing. When the user mentions a candidate fix, transcribe it under "What we know so far" with explicit framing ("candidate Design should weigh" / "possibility for Design to evaluate"). Do NOT promote it to Purpose, Constraints, or a Solution subsection.
Compaction checkpoint: pre-fanout. Parallel reviewer dispatch (up to four) reads goals.md + the agent-embedded reviewer protocol; saturated context multiplies bloat across the parallel set. See using-qrspi ## Compaction Checkpoints.
Call TaskCreate({ subject: "Recommend /compact (pre-fanout) — goals", description: "pre-fanout: parallel reviewer dispatch (up to four) reads goals.md. User decides whether to /compact." }).
Apply the Standard Review Loop from using-qrspi/SKILL.md. Four reviewer dispatches run in parallel on Goals (two Claude + two Codex when second_reviewer: true; two Claude when disabled).
Dispatch the round through dispatch-agent's high-level entry. Run scripts/dispatch-agent.sh --step goals --round ${ROUND} --artifact-dir <ABS_ARTIFACT_DIR> (plus the per-skill --output-dir/--artifact/--agents flags below). High-level mode invokes scripts/review-prep.sh to emit <ABS_ARTIFACT_DIR>/reviews/goals/round-${ROUND}.diff and threads diff_file_path: into each reviewer prompt; the orchestrator runs no git diff Bash redirect of its own. When the artifact directory is not inside a git repository, review-prep skips diff emission and diff_file_path: is omitted — reviewers fall back to the wrapped artifact body. When using-qrspi step 12 (ref selection) narrows the base ref, pass --base-ref "$(cat reviews/goals/round-$((ROUND-1))-commit.txt)" so review-prep narrows against the prior round's per-round commit SHA (using-qrspi step 12 owns the SHA-format validation and the anchor-file-missing:/sha-format-invalid: halt directions before the SHA reaches git diff); otherwise the dispatch-agent default applies. Scope-tag narrowing (when active) reaches reviewers as scope_hint: wrapped between <<<UNTRUSTED-SCOPE-HINT-START id=scope_hint>>> / <<<UNTRUSTED-SCOPE-HINT-END id=scope_hint>>> markers per the reviewer-protocol Reviewer Dispatch Contract.
Set the per-skill dispatch parameters below, then include the shared reviewer-dispatch prose. Include *-codex peer tags in REVIEW_AGENTS only when second_reviewer: true.
REVIEW_STEP="goals"
REVIEW_ROUND="${ROUND}" # current review round (NN)
REVIEW_OUTPUT_DIR="<ABS_ARTIFACT_DIR>/reviews/goals/round-${ROUND}/"
REVIEW_ARTIFACT="goals.md"
REVIEW_AGENTS="quality-claude=qrspi-goals-reviewer,scope-claude=qrspi-goals-scope-reviewer,quality-codex=qrspi-goals-reviewer,scope-codex=qrspi-goals-scope-reviewer"
With $REVIEW_STEP, $REVIEW_ROUND, $REVIEW_OUTPUT_DIR, $REVIEW_ARTIFACT, and $REVIEW_AGENTS set by the per-skill preamble above, run:
scripts/dispatch-agent.sh --step "$REVIEW_STEP" --round "$REVIEW_ROUND" \
--output-dir "$REVIEW_OUTPUT_DIR" --artifact "$REVIEW_ARTIFACT" \
--agents "$REVIEW_AGENTS"
dispatch-agent emits M lines on stdout (one per first-party reviewer; zero lines for a third-party-only batch). Each line has the form:
MODE=first_party TAG=<tag> SUBAGENT_TYPE=<agent-name> MODEL=<resolved-model> PROMPT_FILE=<absolute-path>
For every emitted spec line, invoke the Task tool with these arguments (parse the line as space-separated KEY=VALUE pairs; values contain no spaces):
subagent_type = the SUBAGENT_TYPE value, verbatimmodel = the MODEL value, verbatimprompt = the literal string "DISPATCH_FILE=<PROMPT_FILE-value>" — a single-line env-var-style reference; the prompt argument has no other contentInvoke all M Task tool calls in parallel in one orchestrator response (one Task call per spec line). The reviewer agent body's first instruction is to Read its DISPATCH_FILE — do not pre-Read the file yourself; the dispatch context belongs in the subagent's window, not the orchestrator's.
Iron law (orchestrator-side dispatch contract): invoke the Task tool exactly once per emitted spec line, with SUBAGENT_TYPE, MODEL, and PROMPT_FILE copied verbatim. Skipping a line, deduplicating across lines, modifying any value, or substituting a different subagent_type is a contract violation. The dispatch manifest ($REVIEW_OUTPUT_DIR/.dispatch-manifest.json) records expected dispatches; the apply-fix step's "expected tag produced no output" diagnostic catches missed or mis-routed Task invocations.
Capture each Task return value to disk before draining. After each Task call returns, write the subagent's reply text (the full Task return string) to $REVIEW_OUTPUT_DIR/.dispatch/<TAG>.raw using the create tool, where <TAG> is the TAG value from the corresponding spec line. This is mandatory regardless of whether the subagent appeared to write per-finding files itself. Rationale: when a subagent cannot use the Write tool (read-only sandbox; missing allowed-tools entry; tool denial at runtime) it emits findings via the <<<FINDING-BOUNDARY>>> stdout contract instead. await-round.sh recovers those findings via a universal stdout-fallback that reads .dispatch/<TAG>.raw and pipes it through third-party-finding-splitter.sh; without the captured .raw file the fallback has nothing to work with and the round looks (incorrectly) clean.
After all Task tool calls return AND all .raw captures are written (Task tool is synchronous; first-party subagents with working Write tools have already written their per-finding files by this point), drain any third-party background dispatches and finalize the round:
scripts/await-round.sh --round-dir "$REVIEW_OUTPUT_DIR"
await-round is no-op-safe — first-party-only rounds still call it; it returns immediately after reading the manifest. It writes a small $REVIEW_OUTPUT_DIR/.round-complete.json summary and (for third-party dispatches OR any entry that produced no per-finding files but has a .dispatch/<TAG>.raw capture) materializes per-finding files via third-party-finding-splitter.sh. It does NOT echo captured subagent payloads (CD-1 #4 output-bound contract).
Then read $REVIEW_OUTPUT_DIR/.round-complete.json and the per-finding files as needed for apply-fix. The raw per-reviewer prompt content (assembled by dispatch-agent into PROMPT_FILE) never enters the orchestrator's context — only the small spec lines + the small DISPATCH_FILE references passed to Task.
Present the synthesized goals.md to the user. Always state the review status: "Reviews passed clean in round N" or "Reviews found issues in round N which were fixed but not re-verified."
They can:
Approve → if reviews have not passed clean, note this and ask if they'd like a review loop before finalizing. Then write status: approved in frontmatter.
Request changes → write feedback to feedback/goals-round-{NN}.md (see using-qrspi Feedback File Format), continue the conversation, and re-synthesize with a new subagent that receives the original inputs + all prior feedback files. After re-generation and the review cycle, present:
Feedback applied. How would you like to proceed?
- More feedback (I have additional changes)
- Single review round (run Claude + Codex once, see findings)
- Loop until clean (autonomous review cycles)
- Approve (I'm satisfied, skip reviews)
Before responding, consider running
/compact— context may be saturated.
Omit option 2 if Codex is disabled in config.md. Omit the "fix issues" options (2 and 3) if there are no issues to fix.
If the artifact directory is inside a git repository, commit the approved goals.md, config.md, and reviews/goals/ (per-round per-reviewer files; see using-qrspi → "Commit after approval (when applicable)"). Otherwise skip — the approved frontmatter on disk is the durable record.
Compaction checkpoint: pre-handoff. Goals approved; the dialogue transcript and review-loop context are no longer load-bearing — the next skill reads goals.md on a fresh context. See using-qrspi ## Compaction Checkpoints.
Call TaskCreate({ subject: "Recommend /compact (pre-handoff) — goals", description: "pre-handoff: next skill reads goals.md on a fresh context; dialogue transcript no longer load-bearing. User decides whether to /compact." }).
IRON RULE — REQUIRED: Invoke the next skill in the config.md route after goals (typically qrspi:questions). Do NOT skip the handoff or invoke out of order. The route is locked at run start and the cross-skill transition is where downstream isolation begins (Questions must not see this conversation beyond goals.md).
type field, or carries a value other than known-fix / exploratoryOut of Scope or Success Criteria / Acceptance Criteria section — those concerns are deferred (see Goals OWNS / Goals DEFERS)| Rationalization | Reality |
|---|---|
| "The user already described what they want clearly" | Clear description ≠ complete goals. The per-goal Problem / Why we care / What we know so far frames still need explicit capture. |
| "This is a quick fix, goals are overkill" | Quick-fix mode exists — use it. Even quick fixes need a captured Problem and Why we care. |
| "I should add acceptance criteria so downstream knows when it's done" | Goals does NOT own acceptance criteria — Design's per-goal Acceptance blocks and Plan's per-task expectations do. Adding them here pre-commits Design. |
| "I should add an Out of Scope section to prevent creep" | Goals does NOT own out-of-scope decisions. What isn't a goal isn't in scope; project-level scope clarifications belong in Design's Approach. |
| "The scope is obvious" | Obvious scope is where scope creep hides. Write the per-goal Problem clearly so Design can scope its solution against it. |
| "This goal feels exploratory but I can't justify the cost so I'll mark it known-fix" | Cost-benefit reasoning is exactly what the exploratory tag protects against. Mark it exploratory honestly. |
| "Let me just start the research first" | Research without approved goals means you don't know what you're looking for. |
Rule: Each goal must be independently scopeable — moveable between phases without surgery. Bundled goals must be split with their own IDs. Red flag: a goal whose Problem bundles 3+ distinct problems that could be independently phased. Late splitting: classify per amendment severity (Minor / Major / Scope Unknown) — see replan/SKILL.md. Present each split as a before/after diff; user decides; update roadmap.md with new IDs. Common rationalization: "These items are related so they should be one goal" — Related ≠ coupled.
See references/worked-example.md for a good goals.md (Rate Limiter for Public API) and a contrastive bad goals.md with failure-mode analysis.
The override-critical rules for Goals, restated at end:
Do NOT synthesize goals.md until pipeline mode is selected and config.md is written. The user must explicitly choose quick or full. Synthesis without explicit choice locks the run into a default the user never agreed to.
Each goal must be independently scopeable. Bundled goals must be split into separate goals with their own IDs — they break Replan's roadmap-driven phase promotion.
Goals is problem-framed, not solution-prescribing. Each goal carries type (known-fix | exploratory) and exactly the three subsections — Problem, Why we care, What we know so far. No top-level Out of Scope or acceptance-criteria sections. Solution candidates are framed as possibilities for Design to weigh. The "Goals OWNS / Goals DEFERS" section is the locked scope contract.
Behavioral directives D1-D4 (encourage reviews after changes, no shortcuts for speed, no time-pressure skips, jargon-free user-facing text) apply — see using-qrspi/SKILL.md → "BEHAVIORAL-DIRECTIVES".