release(slice3): v0.49.0 — faceted left-pane filtering (§22.4a SLICE-3)

This commit is contained in:
Ben Stull
2026-06-07 17:43:56 -07:00
parent 276a625997
commit 6bb6d654fa
5 changed files with 1202 additions and 3 deletions
+39
View File
@@ -23,6 +23,45 @@ 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.49.0 — 2026-06-07
**Minor — faceted left-pane filtering (§22.4a SLICE-3).** A collection that
declares a metadata field schema (`fields:`, SLICE-2) now gets a **faceted
catalog left pane**: one collapsible filter group per `enum`/`tags` field plus
state, each with per-value **result counts** and multi-select checkboxes, and a
"filter values…" search box on `tags` groups so they stay usable at many values.
Filters compose — OR within a field, AND across fields — and a "malformed
metadata only" toggle surfaces entries failing their schema (INV-3). This is
SLICE-3 of the
[Configurable Collection Metadata](./docs/design/2026-06-06-configurable-collection-metadata.md)
design (§7.2); the single-entry and bulk metadata-edit UIs (SLICE-4/5) follow.
The collection-scoped list endpoint
(`GET /api/projects/{id}/collections/{cid}/rfcs`, and the project-scoped
default-collection alias) now honours filter query params
(`?priority=P0&tags=checkout&state=active&malformed=true`), returns a
`facets: {field → {value → count}}` block with drill-down counts, and includes
each entry's metadata `meta` mapping; an unknown filter field is a 400. Migration
034 adds the additive `cached_rfcs.meta_json` column that persists per-entry
metadata values for the index.
Non-breaking and opt-in (INV-5): a collection with **no `fields:`** keeps the
existing state-chip catalog unchanged, and the §22.13 default `document`
collection declares none — so **N=1 deployments see no change**. The unscoped
cross-collection `GET /api/rfcs` is untouched.
**Upgrade steps**
- Migration 034 (`cached_rfcs.meta_json`) applies automatically on startup
(additive, nullable). It is populated lazily as the corpus reconciler /
content-repo webhooks re-ingest each collection; until an entry is re-ingested
its `meta_json` is NULL and it contributes no facet values. Operators wanting
facets populated immediately MAY trigger a corpus refresh (the reconciler sweep
on next startup does this). **No data migration is required.**
- A deployment opts a collection into faceting by declaring an `enum`/`tags`
`fields:` block in its `.collection.yaml` (SLICE-2). A collection with no
`fields:` keeps the existing state-chip catalog unchanged.
## 0.48.0 — 2026-06-07
**Minor — collection field schema + central validation (§22.4a SLICE-2).** A
+7 -1
View File
@@ -897,7 +897,13 @@ a hierarchy on the user that gets in the way of finding by title.
- **Filter chip strip** — multi-select, AND-combined. Chips:
`State: super-draft | active | withdrawn`, `My RFCs` (I'm an owner
or arbiter), `Has open PRs`, `Unclaimed` (super-drafts with empty
`owners:`), `Tag: …`.
`owners:`), `Tag: …`. A collection that declares a metadata field
schema (§22.4a) replaces this chip strip with **faceted filter
groups** — one collapsible group per `enum`/`tags` field plus state,
each showing per-value result counts and multi-select checkboxes
(OR within a field, AND across fields); see the Configurable
Collection Metadata design. A collection with no `fields:` schema
keeps the chip strip described here unchanged.
### 7.2 The list rows
+1 -1
View File
@@ -1 +1 @@
0.48.0
0.49.0
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "rfc-app-frontend",
"private": true,
"version": "0.48.0",
"version": "0.49.0",
"type": "module",
"scripts": {
"dev": "vite",