v0.31.0: meta-only repository topology (ROADMAP #36)
Retire the per-RFC-repo model. RFCs now live in their meta-repo entry (rfcs/<slug>.md) for their whole life; graduation is an in-place super-draft → active state flip that keeps the body in the entry — no repo creation, no body-strip, no five-step transaction, no rollback. SPEC: §1 topology rewritten (one meta/content repository, no per-RFC repos) with a deployer-facing "single content repository" framing; §2 (repo: always-null), §3 (active is in-place), §4, §9.8 (handoff frictions dissolve), and §13 fully rewritten (two-field dialog, "The flip", §13.6 RFC-0001 fold-back record). Code: graduation collapses to open+merge one frontmatter PR; branch/PR/ chat dispatch re-keyed on meta-residency (repo IS NULL) so active RFCs edit on the meta repo exactly as super-drafts do; the two "RFC has no repo" 409 guards removed; promote-to-branch slug-embeds an active RFC's auto-branch (edit-<slug>-<hex>) for shared-repo cache attribution; refresh_meta_branches + hygiene branch-resolution include meta-resident actives; the §9.8 read-only guard + pre_graduation_history scoped to legacy per-repo only; dead bot primitives + GraduateDialog repo field + blocking-PR popover removed. The repo: frontmatter field and the /blocking-prs endpoint are retained (schema stability / informational). Tests: graduation suite rewritten to the flip model; e2e + hygiene updated. Full backend suite 375 passed; frontend builds. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,59 @@ skip versions are the composition of each intervening adjacent
|
||||
release's steps in order — no A-to-B path is pre-computed beyond
|
||||
that.
|
||||
|
||||
## 0.31.0 — 2026-05-29
|
||||
|
||||
**Minor — meta-only repository topology (SPEC §1, ROADMAP #36). RFCs no
|
||||
longer graduate into their own Gitea repositories; every RFC lives in
|
||||
its meta-repo entry (`rfcs/<slug>.md`) for its whole life, and
|
||||
graduation is an in-place `super-draft → active` state flip that keeps
|
||||
the body in the entry. The per-RFC-repo machinery — repo creation,
|
||||
`RFC.md`/`README.md`/`.rfc/metadata.yaml` seeding, body-strip, the
|
||||
five-step transactional sequence and its rollback — is removed. This is
|
||||
the framework change behind a much simpler deployer story: one content
|
||||
repository, every RFC under `rfcs/`.**
|
||||
|
||||
What changed, concretely:
|
||||
|
||||
- **Graduation is a single flip.** `POST /api/rfcs/<slug>/graduate` now
|
||||
opens one meta-repo PR that re-serializes the entry with
|
||||
`state: active`, the integer `id`, and `graduated_at`/`graduated_by`
|
||||
— **body unchanged, `repo` left null** — then auto-merges it. No repo
|
||||
is created, nothing is seeded, and there is no rollback (an open- or
|
||||
merge-failure leaves the entry a super-draft; a failed merge's PR and
|
||||
branch are cleaned up). The Graduate dialog drops the **Repo name**
|
||||
field (two fields now: integer ID + owners) and the progress stack is
|
||||
two steps (`open_pr`, `merge_pr`).
|
||||
- **Active RFCs edit on the meta repo.** Branch/PR/chat dispatch keys on
|
||||
meta-residency (`repo IS NULL`) rather than `state == 'super-draft'`,
|
||||
so an active RFC's branches, body-edit PRs, threads, flags, and
|
||||
`changes` all live on the meta repo exactly as a super-draft's do.
|
||||
`promote-to-branch` names an active RFC's auto-branch
|
||||
`edit-<slug>-<hex>` so the shared-repo cache can attribute it.
|
||||
- **Open body-edit PRs no longer block graduation** (§9.8) — the body is
|
||||
kept, so they coexist with the flip.
|
||||
- **`refresh_rfc_repo` and the per-RFC read path are dead** for
|
||||
meta-only entries (the reconciler only sweeps entries with a non-null
|
||||
`repo`, of which there are none after the fold-back below).
|
||||
|
||||
**Upgrade steps:**
|
||||
|
||||
- Deployments **MUST** fold any already-graduated per-RFC-repo RFC back
|
||||
into its meta entry before/with this deploy: restore the per-RFC
|
||||
`RFC.md` body into `rfcs/<slug>.md`, set `repo: null` (keep
|
||||
`state: active` and the integer `id`), and archive the per-RFC repo.
|
||||
An entry left with a non-null `repo` keeps using the retained legacy
|
||||
read path, but **no new** per-RFC repos are ever created. For OHM,
|
||||
RFC-0001 `human` was folded back in driver session 0041.0 (§13.6).
|
||||
- No schema migration, no new config, no new secret, no overlay change.
|
||||
A plain code deploy applies it; the running reconciler reconciles the
|
||||
catalog on its next sweep (≤5 min).
|
||||
- The `repo:` frontmatter field and the `/api/rfcs/<slug>/blocking-prs`
|
||||
endpoint are **retained** (the field for schema stability + legacy
|
||||
entries; the endpoint as an informational, non-blocking surface), so
|
||||
no client contract is removed — `graduate/check` simply no longer
|
||||
returns a `repo` field and never reports `blocking_prs` as a gate.
|
||||
|
||||
## 0.30.2 — 2026-05-29
|
||||
|
||||
**Patch — header nav label: the persistent chrome link reverts from
|
||||
|
||||
Reference in New Issue
Block a user