Skip to main content

sage-gates

Sage's quality gates and the file checks each workflow must pass. Use when an edit was blocked, when asking why a hook stopped you, when a gate fails or reports UNVERIFIABLE, before claiming work is done, or when you need the spec/plan preconditions for build, fix, or architect.

Jump to install

Source facts

Repository
xoai/sage
Last source activity
July 11, 2026 at 18:22
Detected SKILL.md language
English
Stars
26
Forks
7

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
sage-gates
description
Sage's quality gates and the file checks each workflow must pass. Use when an edit was blocked, when asking why a hook stopped you, when a gate fails or reports UNVERIFIABLE, before claiming work is done, or when you need the spec/plan preconditions for build, fix, or architect.
version
1.0.0
type
system
# Gates Two different mechanisms share the word "gate", and confusing them is how people end up arguing with a hook. | | Hooks | Gates | |---|---|---| | **When** | Before a tool call (PreToolUse) | After work, on demand | | **What** | Block the edit itself | Score the result | | **Failure mode** | **Fail open** — a broken hook must not brick the session | **Fail closed** — an unrun gate is not a passed gate | | **Examples** | `sage-spec-gate.sh`, `sage-tdd-gate.sh` | Gates 1–6 | Hooks are guards, not gates. ## Why you were blocked **"Sage spec gate: no spec exists for the active cycle."** A cycle in `.sage/work/*/manifest.md` has `gate_state: pre-spec`, and you tried to edit a source file. Write the spec, get `[A]`, and the manifest advances to `spec-approved`. Then the edit lands. **"Sage TDD gate: tests before code."** No test has been written for this change. Write the failing test first. The gate accepts a dirty/untracked test file or a red commit (tests touched, no source) as evidence. **Completion blocked.** The manifest cannot reach `complete` while `gate_state` is anything short of `gates-passed`, and it cannot complete with an unresolved `qa:` disposition. This is Rule 5 with a script behind it. Neither hook is arguing with you. Both are stating a precondition you can satisfy in about a minute. ## The workflow file checks **Build (Standard+) — BEFORE implementing, verify both files exist on disk:** - `.sage/work/<initiative>/spec.md` — `status: completed` - `.sage/work/<initiative>/plan.md` — `status: completed` If either is missing, create it first. No exceptions. *Do not rationalize past this:* | The thought | The reality | |---|---| | "The design is clear from earlier discussion" | Not a spec file. | | "The user described what they want" | Not a spec file. | | "This is straightforward" | If it is Standard scope, a spec is required. | | "Just build it" | Write a minimal five-line spec and get `[A]`. | **Branch gate (Standard+, git projects).** Before implementation commits begin, HEAD must not be the default branch — unless a branching decline is recorded in the initiative's decision log. Merging is **always** a user-gated `[M]` action. No workflow path merges on its own. Full protocol: `sage/core/capabilities/execution/git-discipline/SKILL.md`. **Gate sequence (build):** 1. Spec → `.sage/work/` → `[A]`/`[R]` → wait 2. Plan → `.sage/work/` → `[A]`/`[R]` → wait 3. Implement (tests before code, via the build loop) 4. Verify with **pasted** test output → `[A]`/`[R]` **Fix — scope AFTER root cause:** 1. Investigate the root cause with evidence → `[A]`/`[R]`/`[S]` → wait 2. **Then** scope the fix: - Surgical (1–2 files) → proceed - Moderate (3–5 files) → write a fix plan first → `[A]`/`[R]` - Systemic (5+ files, interface changes) → escalate to `/build` or `/architect` 3. Implement → verify with pasted output → `[A]`/`[R]` Do not fix before the root cause is confirmed. Do not skip fix scoping — a "quick fix" that touches eight files is a rebuild wearing a smaller word. **Architect — brief BEFORE design:** 1. Complete all three elicitation rounds (vision, constraints, gaps). Each produces visible output. `brief.md` must exist before design begins. Do not compress the rounds. Do not skip them because "I understand the system." 2. Design with ADRs → `.sage/docs/` → spec → `.sage/work/` → `[A]`/`[R]` 3. Milestone plan → `[A]`/`[R]` → phased build; each milestone follows the build gates independently. ## Verify before claiming done (Rule 5, in full) Before presenting any completion checkpoint: - Tests exist for the new or changed functionality - Tests **pass** — paste the actual output, do not summarize it - The implementation matches the spec or plan - If tests do not exist or do not pass, **the task is not done** **Spec compliance is adversarial.** Do not trust your own report that the implementation matches the spec. You wrote it; you are the last one who will notice what it does not do. Verify independently, or let a fresh reviewer do it. ## The three-state exit contract Gate scripts exit `0` pass, `1` fail, `2` **unverifiable**. Exit 2 is the one that matters. It exists because "the suite is green" and "there is no suite" are different claims that used to share exit 0 — which is precisely how a gate reports success on code it never looked at. **Exit 2 is never a pass.** It is also not a failure: it has produced no evidence either way. On exit 2, present the choice and record it: ``` [P] Proceed unverified — logged as a waiver in .sage/decisions.md [F] Fix verification setup — install the runner, then re-run ```
View on GitHub