Skip to content
scsiwygest. ‘26
Sign in
get startedmcpcommunityapiplaygroundswaggersign insign up
project-state·Phase transitions and gates28 May 2026David Olsson
project-state

Phase transitions and gates

What you need: A scaffolded project-state/ with a phase preset selected.


A phase is a named stage in the project lifecycle. Each phase has a gate-in (what must be true to enter) and a gate-out (what must be true to leave). The phase-gate skill enforces these gates. It refuses transitions when gate artifacts are missing — no overrides, no soft warnings.

Five presets

Phase definitions come from presets in templates/phase-presets/. The preset is selected during scaffolding and recorded in manifest.yaml:

yaml
phases:
  preset: "agile-default"
  current_phase: "04-release"

grant-default

For grant-funded projects (PIC, NSERC, NIH, EU Horizon).

Gates are document-driven: MPA signed, ethics approval obtained, IP agreements filed. The PIC compliance pack adds PIC-specific criteria on top of these base gates (e.g., "PCAIS contribution agreement signed by all consortium members" as a planning gate-out).

agile-default

For engineering teams running Scrum/Kanban.

graph LR
  A[Discovery] --> B[Development]
  B --> C[Release]
  C --> D[Maintenance]

Lightweight gates. Discovery exits when scope and milestones are defined. Development exits when the release candidate passes hardening. Release exits when deployment is confirmed. Maintenance is the terminal phase.

waterfall-default

For traditional sequential projects.

Formal sign-off at each gate. Requirements gate-out requires a signed requirements document. Design gate-out requires approved architecture specs. Each phase produces a defined artifact that the next phase consumes.

client-engagement-default

For consulting and client-services work.

Client approval gates. Scoping exits when the statement of work is signed. Delivery exits when deliverables are accepted. Review is the feedback loop. Handoff is the terminal phase with knowledge transfer artifacts.

open-source-default

For community-governed projects.

Community readiness checks. Incubation exits when docs, CI, and a contributor guide exist. Active exits when the project reaches a stable API. Maintained is the long-term phase. Archived is the terminal phase.

The gate checklist

Ask for the gate status at any time:

What's blocking the gate?

The phase-gate skill reads the current phase's gate-out criteria and checks each one:

# Gate Status — 04-release (agile-default)

Gate-out criteria for "Release":

  [x] All milestones at 100% or deferred
  [x] No critical risks open
  [ ] Release notes published            ← BLOCKING
  [x] Changelog updated
  [ ] Version tag created                 ← BLOCKING

2 of 5 criteria unmet. Cannot transition to 05-maintenance.

Each criterion maps to a verifiable condition: a file exists, a milestone status is complete, a risk status is mitigated, a document is in documents/published/.

Transitioning

Request a transition:

Transition to maintenance phase

If gates are met, the transition happens:

Phase transition: 04-release → 05-maintenance

  [x] All milestones at 100% or deferred
  [x] No critical risks open
  [x] Release notes published
  [x] Changelog updated
  [x] Version tag created

Transition complete. state.json updated.
Activity logged: phase.transitioned 04-release → 05-maintenance

If gates are not met, the transition is refused:

Cannot transition from 04-release to 05-maintenance.

Unmet gate-out criteria:
  [ ] Release notes published
      → Publish release notes via /project-blog-publisher
  [ ] Version tag created
      → Create tag via /project-git

Resolve these items and try again.

The refusal names the blocking criteria and suggests which skill can resolve each one. This is not a warning you can override — the transition will not happen until the criteria are met.

Pack overrides

A compliance pack can add or modify gate criteria for any preset. The pack ships a profiles/phase-gate.yaml that augments the base preset:

yaml
# packs/pic-pcais/profiles/phase-gate.yaml
overrides:
  planning:
    gate_out:
      - id: mpa_signed
        label: "MPA signed by all consortium members"
        check: "documents/published/mpa-*.pdf exists"
      - id: ethics_approved
        label: "Ethics approval obtained"
        check: "decisions/*-ethics-approval.yaml exists with status: final"

Loading the PIC pack adds these criteria to the grant-default preset's planning phase. Without the pack, the base preset's gate criteria apply. Multiple packs compose — each pack's overrides are merged, not replaced.

Custom presets

You can write your own phase preset. Create a YAML file following the preset schema:

# templates/phase-presets/my-custom.yaml
id: my-custom
name: "Custom Lifecycle"
phases:
  - id: "01-research"
    name: "Research"
    gate_in: []
    gate_out:
      - id: lit_review_complete
        label: "Literature review document published"
        check: "documents/published/lit-review-*.md exists"
  - id: "02-prototype"
    name: "Prototype"
    gate_in:
      - id: research_complete
        label: "Research phase complete"
    gate_out:
      - id: prototype_demo
        label: "Prototype demonstrated to stakeholders"
  - id: "03-production"
    name: "Production"
    gate_in:
      - id: prototype_accepted
        label: "Prototype accepted"
    gate_out: []

Reference it from your manifest:

yaml
phases:
  preset: "my-custom"
  current_phase: "01-research"

The phase-gate skill reads your custom preset and enforces its gates identically to the built-in presets. See Customization for more on writing custom presets and packs.

Next step

Phase presets, gate criteria, and pack overrides are all forms of customization. Customization covers the full picture: what a pack contains, how to edit the reporting matrix, how to write custom presets, and how to author a new pack from scratch.