release(slice4): v0.50.0 — single-entry metadata edit + sidecar-aware writes (§22.4a SLICE-4)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Ben Stull
2026-06-07 19:17:25 -07:00
parent abd17a6cc8
commit 0d2fdfacf2
4 changed files with 57 additions and 2 deletions
+45
View File
@@ -23,6 +23,51 @@ 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.50.0 — 2026-06-07
**Minor — single-entry metadata edit + sidecar-aware writes (§22.4a SLICE-4).**
An authorized user can now edit one entry's schema-defined metadata directly from
its detail view. A new endpoint
`POST /api/projects/{id}/collections/{cid}/rfcs/{slug}/meta` takes `{values:{…}}`,
validates them against the collection's `fields:` schema at the write boundary
(INV-4), writes them to the entry's `<slug>.meta.yaml` **sidecar** with a **direct
commit** (D7 — no PR for authorized roles), and re-ingests. A legacy entry is
**lazy-migrated** to a clean body-only `.md` + sidecar on its first metadata edit.
The detail view renders one control per declared field (enum→select, tags→chips,
text→input), read-only without contribute access; `GET` on an entry now returns
its `meta` mapping and a `can_edit_meta` capability. This completes PUC-1 of the
[Configurable Collection Metadata](./docs/design/2026-06-06-configurable-collection-metadata.md)
design (§7.2); bulk edit (SLICE-5) follows.
Carried from SLICE-1: **every entry write path is now sidecar-aware.** Graduation,
ownership claim, retire/un-retire, mark-reviewed, the body-edit accept/flush
wrappers, and the PR-replay wrappers all dual-read an entry (so a migrated
body-only `.md` no longer crashes `entry.parse`) and write metadata changes to the
sidecar, keeping the `.md` body pure (INV-2) and never re-growing frontmatter; a
legacy entry lazy-migrates on its first metadata-bearing write. With the write
paths safe, the **Owner-gated collection-migration endpoint**
`POST /api/projects/{id}/collections/{cid}/migrate` now ships (PUC-5): it converts
a collection's legacy-frontmatter entries to clean body-only `.md` + sidecars in
one commit, idempotently.
Non-breaking and opt-in (INV-5): a collection with **no `fields:`** exposes no
edit panel and the edit endpoint returns 422 ("no editable fields"); the §22.13
default `document` collection declares none — so **N=1 deployments see no change**.
**Upgrade steps**
- No schema migration. The edit and migrate endpoints are additive; the sidecar
storage layer (mig 033) and `meta_json` index (mig 034) shipped in 0.47.0/0.49.0.
- A deployment adopts single-entry editing by declaring an `enum`/`tags`/`text`
`fields:` block in a collection's `.collection.yaml` (SLICE-2). Contributors+
on that collection (§22 Part B / S3 scope roles) may then edit from the detail
view; the change is a direct commit to the entry's sidecar.
- Operators MAY run `POST …/collections/{cid}/migrate` (collection Owner only) to
convert a collection's existing entries to clean body-only docs + sidecars up
front. It is idempotent and safe to re-run; dual-read means an un-migrated
collection keeps working, and entries lazy-migrate on their first metadata edit
regardless. **No data migration is required.**
## 0.49.0 — 2026-06-07
**Minor — faceted left-pane filtering (§22.4a SLICE-3).** A collection that