RFC Phase Pickup (auto-open backlog tickets for pending phases)

Accepted

RFC — RFC Phase Pickup (auto-open backlog tickets for pending phases)

Field Value
Status *ccepted*(20260502) — defaults ratified: field name phases:, mandatory for new multiphase RFCs, status enum `pending | inprogress | done | cancelled (cancelled added per §6.3), registry at metacontextregistriesrfcphasepickups.md` (markdown), SupersededWithdrawn RFCs skipped by audit.
Author(s) Rodrigo (with Claude as scribe)
Date 20260502
Affects RFC frontmatter schema (new phases: array); koder-spec-audit binary (new subcommand `rfcphasepickup); commands/khousekeep.md (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 / 009, policiesRFC001, policiesRFC002, idRFC009 / 010, hubRFC-001 ... 006`, etc.). Each phase typically:

  • Lands in its own PR.
  • Depends on the previous phase being merged.
  • Has a clear scope captured in the RFC § Migration plan section.

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 datetriggered events, not phasetriggered. Forcing phase progression into date-triggered reminders is fragile (phases run on review cadence, not calendar).
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** — enum pending | in-progress | done`. Required.
  • *landed_in** — commit hash that completed the phase. Optional; populated when status flips to done`.
  • *depends_on** — list of phase IDs that must be done` 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): walks metadocsstack/rfcs

Source: ../home/koder/dev/koder/meta/docs/stack/rfcs/policies-RFC-003-rfc-phase-pickup.md