RFC Phase Pickup (auto-open backlog tickets for pending phases)
RFC — RFC Phase Pickup (auto-open backlog tickets for pending phases)
| Field | Value |
|---|---|
| Status | *ccepted*(2026phases:, mandatory for new multi (cancelled added per §6.3), registry at metacontextregistriesrfc |
| Author(s) | Rodrigo (with Claude as scribe) |
| Date | 2026 |
| Affects | RFC frontmatter schema (new phases: array); koder-spec-audit binary (new sub); commands/k (calls the new sub-command); existing RFCs are retrofitted opportunistically when amended; no breaking change for RFCs that decline to declare phases:` |
| Depends on | None directly. Applies generically to any RFC with Status: Accepted and a multi-phase migration plan, both existing (retrofit on amendment) and future. |
1. Summary
When an RFC is accepted with a migration plan that has multiple phases, the work between phases is at risk of being silently dropped. Today the pickup mechanism is human memory + RFC text — a known weak link. This RFC formalises a small frontmatter extension and a koder-spec-audit sub-command that, together, turn each pending phase into a backlog ticket automatically when its predecessor is marked done.
The mechanism is deliberately minimal: declare phases: in the RFC frontmatter; the audit walks accepted RFCs, finds the next pending phase whose dependencies are met, and opens a scaffolded ticket in the appropriate backlog.
This RFC closes a category of failure modes — "Phase 4 forgotten", "the migration ran out of steam between Phase 2 and 3" — that has surfaced repeatedly in Stack work and was raised explicitly during the discussion that produced policies-RFC-002-self-hosted-first.md.
2. Motivation
2.1 The recurring failure mode
The Stack uses RFCs with multiphase migration plans (`monorepoRFC003 / 005 / 008 / 009RFC, policies001RFC, policies002RFC, id009 / 010RFC-001 ... 006`, etc.). Each phase typically:, hub
- Lands in its own PR.
- Depends on the previous phase being merged.
- Has a clear scope captured in the RFC
§ Migration plansection.
Despite this discipline, phase progression is not automated. After Phase N lands, someone must remember to:
- Open a backlog ticket for Phase N+1.
- Find the right backlog (which module owns the next phase?).
- Translate the RFC's bullets into a ticket scope.
In practice this happens often enough that small RFCs complete, but large RFCs — exactly the ones with most phases — accumulate forgotten tail phases. RFC001's decommission stub (Phase 5) is a safehaven example because its prompt is a calendar date; phases without temporal triggers are the ones at risk.
2.2 Why existing mechanisms don't solve it
The Stack has three "remember the future" mechanisms (per policies/reuse-first.kmd-aligned discussion):
| Mechanism | Why it doesn't fully cover RFC phases |
|---|---|
| Backlog tickets | A ticket can only exist after someone opens it. The forgetting happens at the open step. |
meta/context/reminders.md |
Suited for date |
RFC § Migration plan text |
Documents the plan but does not produce a pickup signal. |
A small fourth mechanism, scoped to RFCs, closes the gap.
3. Design
3.1 RFC frontmatter extension
A new optional top-level field in RFC frontmatter:
---
title: "Reuse-First policy hierarchy"
status: Accepted
date: 2026-05-02
phases:
- id: 1
summary: "Extract reuse-first meta-policy from sdk-first.kmd"
status: done # pending | in-progress | done
landed_in: 7a3a62db0 # commit hash, optional
- id: 2
summary: "Author the four categorical sub-policies"
status: done
landed_in: 9c73390a0
depends_on: [1]
- id: 3
summary: "Sweep references in CLAUDE.md, commands, sibling policies, koder_kit RFC"
status: done
landed_in: 05da91e38
depends_on: [2]
- id: 4
summary: "Substantive behavioural audit hooks per sub-policy"
status: pending
depends_on: [3]
target_backlog: "engines/sdk/koder_kit" # optional override
- id: 5
summary: "Decommission sdk-first.kmd redirect stub"
status: pending
depends_on: [4]
target_date: "2026-08" # optional, soft trigger
---Schema:
- *id`*— integer, sequential within the RFC. Required.
- *summary`*— short description, 1 line. Required.
- *status
** — enumpending | in-progress | done`. Required. - *landed_in
** — commit hash that completed the phase. Optional; populated when status flips todone`. - *depends_on
** — list of phase IDs that must bedone` before this phase is eligible to open. Optional; defaults to "previous phase if any". - *target_backlog`*— path to the backlog where the auto-opened ticket should land. Optional; defaults are inferred (see §3.3).
- *target_date
** — ISO-8601 month (YYYYMM`) or full date. Optional; if present, the ticket is also held until that date. Useful for stubdecommission phases.
Existing RFCs without a phases: field are ignored by the pickup mechanism — backwards-compatible by design. Retrofit is opportunistic, not mandatory.
3.2 koder-spec-audit rfc-phase-pickup
A new subcommand of the existing `koderspec-audit` binary. Three modes:
- *-eport
** (default): walksmetadocsstack/rfcs