- name
- sage-build
- description
- Brief (medium+ tasks), Spec, Implementation plan
- version
- 1.0.0
- author
- Sage
- metadata
- {"hermes":{"tags":["Sage","Workflow","build"]}}
## When to Use
Load this skill when the user runs `/sage-build` or asks to build something (the Sage build workflow).
## Arguments
Hermes does NOT interpolate an in-body argument token. The user's arguments/flags arrive as a SEPARATE instruction line appended to this skill invocation. Wherever the steps below refer to "the user's arguments", use the text of that appended instruction line.
## Independent review (delegate_task)
When a step calls for an independent review, invoke `delegate_task` against the `sage-reviewer` skill. Hermes delegate_task has NO toolset-restriction parameter — read-only is prompt-enforced, and you MUST verify afterward that the reviewer made no edits (e.g. `git status` unchanged) before accepting its verdict.
RULES (apply to every step — non-negotiable):
- PERSONA: Read sage/core/agents/developer.persona.md for your mindset.
- Announce: "Sage → build workflow." before starting work
- FLAG PARSING: Before any other work, parse the arguments the user provided alongside this skill invocation (delivered as a separate instruction line, NOT a literal token) by invoking the
deterministic parser (in order — use the first one that works):
1. python3 sage/runtime/tools/sage_flags.py parse "the arguments the user provided alongside this skill invocation (delivered as a separate instruction line, NOT a literal token)" --config-path .sage/config.yaml
2. Prose-fallback per sage/core/capabilities/orchestration/flag-parser/SKILL.md
Trust the JSON output unconditionally. If "error" is non-null, surface
it to the user and stop. Recognized flags:
--quality-locked loop review/revise until clean (cap 10)
--no-quality-locked override config default to off for this run
--autonomous agent makes elicitation decisions
--no-autonomous override config default to off for this run
When announcing active modes, use the quality_locked_source and
autonomous_source fields from the JSON to label sources, e.g.
"Modes: --quality-locked (from .sage/config.yaml), --autonomous (from flag)".
Persist flag state to manifest.md frontmatter under "flags:".
- MEMORY FIRST: Before writing spec, plan, or starting implementation,
search sage-memory with the feature domain as query (limit: 5), then
search again with filter_tags: ["self-learning"] (limit: 5). Use findings
to avoid past mistakes. This is MANDATORY, not optional.
- Standard+ scope: spec.md MUST EXIST at .sage/work/ before implementing.
"Design is clear" is NOT a spec. "We discussed this" is NOT a spec.
A spec is a FILE. No file = no implementation. Write it first.
- [A] = REVIEW: When user picks [A] at spec or plan checkpoint,
you MUST run auto-review sub-agent BEFORE proceeding to the next phase.
[S] = Skip review (approve without review). Present [A] Review / [S] Skip
review at every spec and plan checkpoint. If you proceed without showing
auto-review findings after [A], you have violated the process.
Blocked rationalizations:
- "The spec is straightforward" — [A] means review. Period.
- "The user wants to move fast" — they picked [A], not [S]
- "I already reviewed while writing" — self-review is not independent
- "delegate_task might not work" — check first, skip only if truly unavailable
- GATE 3 INDEPENDENT: Code quality review (Gate 3) MUST use sub-agent when
delegate_task is available. Do NOT self-review when sub-agent is possible.
- GATE 8 AUTO-QA: Runs as part of quality gates sequence (Gate 8). Do NOT
skip because "quality gates already passed." It runs by position in the
gate sequence, not by your discretion.
- QUALITY-LOCKED LOOP: When --quality-locked flag is active, at every review
checkpoint use the deterministic checker:
python3 sage/runtime/tools/sage_flags.py check --review-output "<sub-agent text>"
--iteration <N> --history-json "<JSON of past iterations>"
Trust the returned JSON (counts, action). Do NOT decide "clean enough"
by reading findings yourself. See sage/core/capabilities/orchestration/quality-locked/SKILL.md.
- AUTO-PICK [A] WHEN BOTH FLAGS ACTIVE: If both --autonomous AND --quality-locked
are set, do NOT prompt the user at normal approval checkpoints (spec, plan,
ADR, root cause, fix plan). Auto-pick [A] Review (the only option consistent
with both flags). Print the auto-pick notice, log to manifest.md
auto_picked_checkpoints AND decisions.md BEFORE running the review, then
proceed. Exception checkpoints (quality-locked cap-reached, stuck-escalation,
autonomous unconfident-questions, sub-agent unavailable) still require user
input. See sage/core/capabilities/orchestration/autonomous/SKILL.md
"Auto-Pick at Checkpoints" for full rules.
- CODING PRINCIPLES: Load sage/core/capabilities/execution/coding-principles/SKILL.md
before every implementation task. 7 universal principles: clarity, error handling,
boundary guards, minimal scope, safe APIs, consistency, behavior testing.
- Save ALL artifacts to .sage/work/ or .sage/docs/ — never inline-only
- Checkpoints: present with [A] Review / [S] Skip review / [R] Revise — wait for response
- Choices: present with [1] [2] [3] bracket notation
- Verify: PASTE actual test output before claiming done — no summaries
- Never use code blocks for interaction (checkpoints, options, status)
- If user corrects your approach, store as self-learning before continuing
# Build Workflow
Feature development guided by Sage.
## Auto-Pickup
BEFORE ANYTHING: Scan `.sage/work/` for existing artifacts.
This scan is MANDATORY — check the DISK.
**Manifest-first path:** If `.sage/work/*/manifest.md` exists, run
`python3 sage/runtime/tools/manifest.py resume` (plugin installs:
`python3 "${CLAUDE_PLUGIN_ROOT}/tools/manifest.py" resume`; no python3 →
read the manifest by hand). The brief it prints is the primary context
source: resume at the phase indicated, with the manifest body as judgment
*context, not orders* — apply the resume authority order
(cycle-protocol.md): live user > recorded decisions > manifest prose,
and evidence over all of it.
**Fallback path:** If no manifest.md but artifacts exist, use file-scan
routing (below). Create manifest.md from inferred state before proceeding
(backfill). This preserves backward compatibility with pre-v1.0.9 cycles.
**File-scan routing (when no manifest):**
- No artifacts exist → Step 2 (scope assessment)
- Brief exists, no spec → Step 4 (spec)
- Spec exists, no plan → Step 5 (plan)
- Plan exists, not all completed → Step 6 (build-loop)
- All status: completed → offer next steps
You MUST follow this routing. Do not override it based on:
- Conversation context ("we discussed this before")
- User description ("the design is clear")
- Your own assessment ("this is straightforward")
The disk is the source of truth. Not your memory.
**Multiple in-progress:** Present list:
[1] Continue [initiative A] — [phase]
[2] Continue [initiative B] — [phase]
[3] Start something new
**Branch check (git projects):** when resuming, compare the current
branch against the initiative's recorded `branch:` manifest field
(see git-discipline); if they differ, surface it before proceeding.
Prefer the initiative whose recorded branch matches HEAD.
Read the initiative's decision log for recent context (global
`.sage/decisions.md` for cross-initiative context). Read the
`handoff` field in the most recent artifact's frontmatter if present.
**Upstream context:** Also scan `.sage/docs/` for research and
analysis artifacts (jtbd-*, ux-audit-*, opportunity-*, ux-evaluate-*).
If found, announce: "Sage: Found research/analysis context — [list].
Using as build input."
### Manifest Lifecycle (build workflow)
**Create** manifest.md when the first artifact is saved (brief or spec).
Use the template from `core/templates/manifest-template.md`.
**Update** manifest.md at EVERY checkpoint:
- Every [A]/[R]/[N] gate: update phase, status, `gate_state`, updated timestamp
- Phase transitions: update context summary if new information emerged
- New decisions: append to the manifest's decisions list
**gate_state at each checkpoint (machine field — the spec-gate hook reads it):**
- Spec approved `[A]` → `gate_state: spec-approved`
- Plan approved `[A]` → `gate_state: plan-approved`
- Entering the build-loop (Step 6) → `gate_state: building`
- All quality gates pass → `gate_state: gates-passed`
- Step 8 completion → `gate_state: complete`
Until `gate_state` reaches `spec-approved`, the Claude Code hook blocks edits to
source files — that is Rule 3 made mechanical. Advance it the moment the spec is
approved, not "later"; a stale `pre-spec` keeps blocking the very work you just
approved.
**Context budget pressure:** If the conversation is very long (many
tool calls, approaching context limits), write a manifest update BEFORE
suggesting a session break. This is the critical moment — capture the
judgment that's about to be lost.
**Session end ([N]):** Manifest update is MANDATORY. Write handoff
guidance and context summary before ending.
**Completion:** Set `status: complete` and `gate_state: complete` at Step 8.
The completion guard blocks this transition unless `gate_state` was already
`gates-passed` — so run the quality gates before closing (Rule 5).
**Anti-lazy-manifest contract:**
Context summary MUST NOT be:
- A copy of the spec's title or description
- "See spec.md for details"
- Generic guidance ("Continue with implementation")
The summary must contain judgment the spec doesn't contain.
**Shared cycle protocol:** decision-log targeting (Rule 7), gate_state
discipline, phase announcements, and the session-break contract are shared across
the delivery workflows — see `core/workflows/_shared/cycle-protocol.md`.
## Phase Announcements
At each major phase transition, announce before doing any phase work:
```
Sage: Entering UNDERSTAND phase [cycle-id] — gathering requirements via quick-elicit.
Sage: Entering PLAN phase [cycle-id] — creating implementation plan from spec.
Sage: Entering DELIVER phase [cycle-id] — implementing with TDD and quality gates.
Sage: Entering REVIEW phase [cycle-id] — running quality verification.
```
The cycle ID is the directory name under `.sage/work/` (e.g., `20260324-auth-flow`).
## Step 2: Assess Scope
Classify by structural complexity — not time, not gut feeling.
**Lightweight:** One component, no design decisions, no behavior changes
visible to other team members. The change is obvious from the request.
→ Skip to Step 6, implement directly.
**Standard:** Multiple components, OR any design decision, OR
coordination between modules. Spec file REQUIRED.
→ spec.md MUST exist at .sage/work/ before implementation.
→ plan.md MUST exist at .sage/work/ before implementation.
→ If the task also needs scope definition, write brief first (Step 3).
**Comprehensive:** New subsystem, cross-cutting changes, or multiple
stakeholder impact.
→ MUST write brief (Step 3) → spec (Step 4) → plan (Step 5) → implement.
**Complexity signals** (any ONE makes it Standard or above):
- Touches more than 3 files
- Involves a new API endpoint or data model change
- Requires coordination between multiple modules or services
- Has user-facing behavior changes (new UI, changed flow)
- Involves a decision a team member would need to know about
- Multiple layers affected (database + backend + frontend)
**Anti-downgrade:** When in doubt, classify as Standard, not Lightweight.
Do NOT downgrade to Lightweight to avoid writing a spec. If you find
yourself thinking "this is simple enough to skip the spec," that
thought is the signal to NOT skip the spec.
Present your assessment:
**Sage → build workflow.** [Scope] — [what makes it this scope].
Starting with [first required step].
If the user explicitly asks to skip a required step, write a minimal
5-line spec anyway (WHAT, WHY, HOW, DONE-WHEN), present [A]/[R], and
record the skip rationale in decisions.md.
## Step 2.5: Branch Setup (Standard+ scope, git projects)
For Standard or Comprehensive scope in a git repository, create the
initiative branch before any artifact or code work: read and follow
`sage/core/capabilities/execution/git-discipline/SKILL.md` — propose
`feat/<slug>`, confirm with the user, create from the default branch,
and record the branch name in the initiative's manifest frontmatter
(`branch:`). The capability owns dirty-tree, already-on-a-branch,
detached-HEAD, and decline handling. Lightweight scope skips
branching (it produces no multi-commit initiative). Not a git
repository → skip silently.
**Parallel-session note (`isolation: worktree`).** If
`isolation:` in `.sage/config.yaml` is `worktree` and this session is
in the main checkout (not a linked worktree), apply the **worktree
bounce** from git-discipline (offer `sage worktree <slug>` as a
guided menu) before branching in place. With `isolation: branch`
(default), ignore this — branch in place as below.
## Step 3: Brief (Standard with unclear scope, or Comprehensive)
If scope is unclear or the task is Comprehensive, elicit requirements
before defining the brief.
**If `autonomous_mode` is active** (from flag-parser): skip the
interactive elicitation rounds. Read
`sage/core/capabilities/orchestration/autonomous/SKILL.md` and follow
its pre-flight + decision protocol. Produce brief.md with a Rationale
block citing memory, codebase patterns, principles, and prior decisions.
If substantive unconfident decisions remain, surface them as a Zone 1
question block. Skip the rest of this step.
**Otherwise:**
For structured elicitation process, read
`sage/core/capabilities/elicitation/quick-elicit/SKILL.md`.
It provides 3 focused rounds (~2 minutes):
1. Intent — what should this do when working perfectly?
2. Boundaries — what should this NOT do?
3. Verification — how will we know it works?
If quick-elicit cannot be loaded, ask these three questions directly
and draft a brief from the answers.
Define: what to build, why, acceptance scenarios, and constraints.
Save to `.sage/work/YYYYMMDD-slug/brief.md` with frontmatter:
```yaml
```
🔒 **CHECKPOINT:**
Sage: Brief saved to .sage/work/YYYYMMDD-slug/brief.md
Decision: [key scope decisions]. (prepend to the initiative's decisions.md)
[A] Approve — continue to spec in this session
[R] Revise — tell me what to change
[N] New session — type /build to continue with spec
Pick A/R/N, or tell me what to change.
On approval: update brief frontmatter to `status: completed`.
Prepend decision to decisions.md (Rule 7).
## Step 4: Spec
Define: components, data model, APIs, key decisions, edge cases.
Resolve open questions from the brief.
**If `autonomous_mode` is active**: populate the spec using the
autonomous capability's decision protocol. Include a Rationale block
at the top of spec.md citing context sources. Surface unconfident
substantive decisions as Zone 1 questions before finalizing.
For detailed spec writing process, read
`sage/core/capabilities/planning/specify/SKILL.md`.
Save to `.sage/work/YYYYMMDD-slug/spec.md` with frontmatter:
```yaml
```
🔒 **CHECKPOINT:**
Sage: Spec saved to .sage/work/YYYYMMDD-slug/spec.md
Decision: [key technical decisions]. (prepend to the initiative's decisions.md)
[A] Review — sub-agent reviews spec, then continue to plan
[S] Skip review — approve without independent review
[R] Revise — tell me what to change
[N] New session — type /build to continue with planning
Pick A/S/R/N, or tell me what to change.
**On [A] Review:**
1. Update spec frontmatter to `status: completed`.
2. Write `handoff` field in frontmatter:
```yaml
handoff: |
Key decisions: [summary of choices made]
Open questions: [what's unresolved]
Risks: [what to watch for during implementation]
Next agent should: [specific guidance for planning phase]
```
3. Prepend decision to decisions.md (Rule 7).
4. **Run auto-review BEFORE proceeding to Step 5:**
Read `sage/core/capabilities/review/auto-review/SKILL.md`.
If conditions met (delegate_task available + Standard+ scope +
auto_review ≠ false in config):
Announce: "⚡ Running spec review (sub-agent)..."
Spawn sub-agent with the **Spec Review** prompt.
Pass the spec path and decisions.md path.
Present findings inline (see capability for format).
Prepend review verdict to decisions.md.
**If `quality_locked_mode` is active** (from flag-parser):
Read `sage/core/capabilities/orchestration/quality-locked/SKILL.md`
and run the review-revise loop instead of presenting findings to user.
Loop until the checker's exit decision (v1: clean bar or cap 10,
logged to manifest; `review_loop: v2`: the ledger controller —
`review.py close-round` computes and records every verdict).
If delegate_task NOT available:
Announce: "delegate_task not available — skipping independent review."
5. THEN proceed to Step 5.
**On [S] Skip review:**
1. Update spec frontmatter, write handoff, append decision (same as above).
2. Announce: "Skipping independent review."
3. Log to decisions.md: "Spec approved without auto-review (user chose [S])."
4. Proceed to Step 5.
## Step 5: Plan
Break into small, independently testable tasks. Each task: what to do,
done criteria, files involved. Use checkboxes as a guide.
**If `autonomous_mode` is active**: decompose tasks using the autonomous
capability's decision protocol. Each task's rationale (ordering,
dependencies, scope) cites codebase patterns or prior plans where
relevant. Include a Rationale block at the top of plan.md.
For detailed planning process, read
`sage/core/capabilities/planning/plan/SKILL.md`.
Save to `.sage/work/YYYYMMDD-slug/plan.md` with frontmatter:
```yaml
```
🔒 **CHECKPOINT:**
Sage: Plan saved to .sage/work/YYYYMMDD-slug/plan.md
[A] Review — sub-agent reviews plan, then start building
[S] Skip review — approve without independent review
[R] Revise — tell me what to change
[N] New session — type /build to start implementation
Pick A/S/R/N, or tell me what to change.
**On [A] Review:**
1. Prepend plan approach to decisions.md (Rule 7).
2. **Run auto-review BEFORE proceeding to Step 6:**
Read `sage/core/capabilities/review/auto-review/SKILL.md`.
If conditions met (delegate_task available + Standard+ scope +
auto_review ≠ false in config):
Announce: "⚡ Running plan review (sub-agent)..."
GitHub에서 보기