From 55d04ce4ca730886d4041c345c039c3406c0afda Mon Sep 17 00:00:00 2001 From: Ben Stull Date: Fri, 5 Jun 2026 13:17:31 -0700 Subject: [PATCH] =?UTF-8?q?=C2=A722=20S2:=20release=20v0.41.0=20=E2=80=94?= =?UTF-8?q?=20create=20&=20navigate=20a=20second=20collection=20(@S2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Minor, non-breaking: named collections via .collection.yaml, create-collection endpoint, collection-scoped serve/propose, and the /p// collection directory. Completes acceptance @S2 (C3.6). 478 backend + 26 frontend green. Co-Authored-By: Claude Opus 4.8 (1M context) --- CHANGELOG.md | 57 +++++++++++++++++++ VERSION | 2 +- ...6-06-05-three-tier-projects-collections.md | 3 +- frontend/package.json | 2 +- 4 files changed, 61 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 74bd6b0..8eaf4f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,63 @@ 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.41.0 — 2026-06-05 + +**Minor (non-breaking) — §22 three-tier refactor, slice S2: *create & navigate a +second collection.* A deployment can now host more than one RFC collection per +project: a second collection is created, navigated, and proposed into beside the +default one. Purely additive — a single-collection deployment is unchanged (its +`/p//` still redirects into the sole collection, C3.7/C3.8). Completes +acceptance scenario `@S2` (C3.6: an anonymous reader of an empty public +collection sees an empty catalog with no propose action and a sign-in prompt).** + +See [`docs/design/2026-06-05-three-tier-projects-collections.md`](./docs/design/2026-06-05-three-tier-projects-collections.md) +(Part E slice S2) and the slice plan +[`docs/design/plans/2026-06-05-s2-second-collection.md`](./docs/design/plans/2026-06-05-s2-second-collection.md). +Scoped {owner, contributor} roles at the collection axis remain S3; the +role-keyed create/propose-first empty states remain S4. + +Added: + +- **Named collections via `.collection.yaml`** — the registry mirror walks each + project's content repo and upserts a collection per + `/.collection.yaml` manifest (`type`, optional `visibility` / + `initial_state` / `name`; `type` immutable per §22.4a, visibility inherits the + project's when omitted). The default collection still flows from + `projects.yaml`. +- **create-collection** — `POST /api/projects//collections` (deployment + owner/admin). The bot commits a `.collection.yaml` to the content repo's + `main`, then the registry re-mirrors so the `collections` row appears (the + registry stays the source of truth, §22.2). New reads + `GET /api/projects//collections` and `…/collections/`. +- **Collection-scoped serve + propose** — + `GET /api/projects//collections//rfcs[/]` and + `POST …/collections//rfcs/propose`. A propose writes the entry under the + target collection's `/rfcs/`. +- **Collection directory at `/p//`** — lists the project's visible + collections, or redirects into the sole one when there is exactly one + (preserving the S1 single-collection UX). The catalog rail + entry views read + the active `/c//` segment and scope to it. + +Changed: + +- **The corpus mirror is collection-grained** — `cache.refresh_meta_repo` + iterates each project's collections and reads each collection's + `/rfcs/`, keying `cached_rfcs` by `collection_id`. The default + collection keeps the shipped repo-root `rfcs/` path; N=1 serving is unchanged. + +> ### Upgrade steps (0.40.0 → 0.41.0) +> +> - No required operator action — the slice is additive and the default-collection +> paths are unchanged. A deployment **MAY** deploy this version with no config +> change and keep running exactly as on 0.40.0. +> - To add a second collection, a deployment owner/admin **MAY** call +> `POST /api/projects//collections` (or commit a `/.collection.yaml` +> to the content repo directly); the registry mirror picks it up on the next +> refresh. +> - Deployments that pin the framework version **MUST** bump their version pin to +> `0.41.0`. + ## 0.40.0 — 2026-06-05 **Minor (breaking URL) — §22 three-tier refactor, slice S1: the *collection* diff --git a/VERSION b/VERSION index 9b0025a..72a8a63 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.40.0 +0.41.0 diff --git a/docs/design/2026-06-05-three-tier-projects-collections.md b/docs/design/2026-06-05-three-tier-projects-collections.md index 2b858a9..a152e4c 100644 --- a/docs/design/2026-06-05-three-tier-projects-collections.md +++ b/docs/design/2026-06-05-three-tier-projects-collections.md @@ -549,7 +549,8 @@ means the deployment runs and either gains a capability or provably loses none exactly as before, now with a real collection layer and one extra path segment. **Completes:** `@S1` (the single-collection / single-project redirect skips). -- **S2 — Create & navigate a second collection.** Teach the registry mirror to +- **S2 — Create & navigate a second collection.** *(Shipped v0.41.0.)* Teach the + registry mirror to read `.collection.yaml`; add the bot-commit-wrapped **create-collection** endpoint (authorized by existing deployment owner/admin for now — the scoped role surface lands in S3); the project collection-directory at `/p//`; diff --git a/frontend/package.json b/frontend/package.json index c417a57..3cd1058 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "rfc-app-frontend", "private": true, - "version": "0.40.0", + "version": "0.41.0", "type": "module", "scripts": { "dev": "vite",