---
title: Lifecycle
description: "Nine states for a Wolf-managed spec, carried as frontmatter."
---

# Lifecycle

Six states on the happy path, three exits. These sit *inside* the four stages
of [Handoff](/how-to-fly/handoff) — `requested`, `building` and `merged` are
finer detail on stages 2 to 4, not a replacement for them. The `## Build`
checkbox on a spec page stays exactly as handoff defines it; `status:` and the
`## Conformance` block below sit alongside it.

```text
  draft ──▶ ready ──▶ requested ──▶ building ──▶ merged ──▶ conformed
    │         │           │            │           │
    │         │           │            │           └─▶ short  (shipped, misses spec)
    │         │           └────────────┴───────────────▶ blocked
    └─────────┴───────────────────────────────────────▶ abandoned
```

| State | Means | Owner | Exit condition |
|---|---|---|---|
| `draft` | being argued in the wiki | wiki author | 3+ falsifiable ACs exist |
| `ready` | agreed, no PR yet | wiki author | a human says go |
| `requested` | spec PR open | Wolf | spec PR merged |
| `building` | tracking issue open, code in flight | engineering | impl PR merged |
| `merged` | code is in, evidence not yet asserted | engineering | all ACs ticked |
| `conformed` | every AC ticked, every link live | Wolf | terminal |
| `short` | shipped, one or more ACs unmet | Wolf | new spec revision |
| `blocked` | waiting on a human decision | named human | decision recorded |
| `abandoned` | deliberately not built | wiki author | terminal, page kept |

## Why `short`

No prior art has it. [ADR](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)
supersedes, [PEP 1](https://peps.python.org/pep-0001/) rejects, Rust separates
merged from implemented — none of them record *shipped but wrong*.

This repo needs that state because docs are never reconciled to what shipped.
An unmet acceptance criterion has to stay visible. So `short` is never fixed
by editing the page: it is fixed by a new spec revision, the same way ADRs
keep a superseded record rather than rewriting it.

Whether anyone will actually set `short` is an open question — it requires
someone to admit the build missed.

## Carry it as frontmatter

```yaml
---
title: Per-tenant rate limiting
status: building          # draft|ready|requested|building|merged|conformed|short|blocked|abandoned
spec_pr: https://github.com/beliefengines/<repo>/pull/42
tracking: https://github.com/beliefengines/<repo>/issues/57
impl_pr: https://github.com/beliefengines/<repo>/pull/61
---
```

## Evidence is pushed, never pulled

Whether Wolf may read PR state at all is
[undecided](/be-agent-wolf/open-questions). What follows assumes some answer
to that.

This repo cannot read code, so it cannot verify anything. Engineering asserts
conformance in the PR by ticking each AC with a link. Wolf copies the links
onto the spec page. The wiki stores a claim and a pointer — never an artifact.
Wolf never writes a tick on its own authority.

```text
  ENGINEERING REPO                        WIKI (be-internal)
  ┌──────────────────────────┐            ┌──────────────────────────┐
  │ impl PR                  │            │ spec page                │
  │  AC-1 ✓ -> CI run URL    │  Wolf      │  status: conformed       │
  │  AC-2 ✓ -> test name     │ ─copies──▶ │  ## Conformance          │
  │  AC-3 ✓ -> CI run URL    │  URLs      │  AC-1 ✓ <link> asserted  │
  │ reviewed + merged        │  only      │       by @dev 2026-09-02  │
  └──────────────────────────┘            └──────────────────────────┘
       artifacts live HERE                   pointers live HERE
```

The exact shape of that `## Conformance` block is proposed, not settled — one
line per AC, `AC-1 ✓ asserted by @dev — <url> — 2026-09-02`.
