Skip to content

RFC-0042 / ADR-0044: Collections stage 3 (accepted) - #102

Merged
Madraka merged 2 commits into
mainfrom
rfc/collections-stage-3
Oct 23, 2026
Merged

Madraka merged 2 commits into
mainfrom
rfc/collections-stage-3

Conversation

@Madraka

@Madraka Madraka commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Stage 3 of #71, after RFC-0040 (collections) and RFC-0041 (typed fields). Status: Draft; nothing is implemented.

Key decisions

  • Contract: three new optional collection settings, listFields (≤ 4 keys), expiry ({field, action: unlist|hide, afterMinutes?}) and structuredData ({type, properties}). contentList sections gain where (≤ 4 conditions) and orderBy. Which properties each type accepts, and with which field types, is a closed table in code. No schemaVersion bump.
  • JSON-LD presets: Event, JobPosting, Product and Recipe.
    • FAQPage is out: Google deprecated FAQ rich results.
    • Organization and LocalBusiness belong in site settings later.
    • No rating or review properties, because self-serving review markup breaks Google's policy.
    • An entry missing a required value emits no preset.
    • A new withStructuredData() replaces the generic BlogPosting. entryHead is unchanged, so old themes keep today's output.
    • Output is escaped by jsonLdText, capped at 32 KB.
  • Expiry is a render-time gate, not an automation. It reuses RFC-0008's time gates: min(availability.until, field date + grace).
    • unlist (default): the page stays live but leaves listings, feeds, the sitemap and search.
    • hide: 404.
    • No scheduler runs and nothing is rewritten, so nothing acts without a person. Moving a live gate earlier is treated like schedule_unpublish.
  • Listings by field: a closed set of operators per type; sorting by number and dates only; now is the only relative value. One evaluator is shared by themes, ContentList, the API, MCP and Studio. No indexes in stage 3 (nodes is shared across sites); a side table follows only if a 10,000-entry benchmark needs it. Studio list columns come from listFields.
  • Index pages: a "Create listing page" action creates an ordinary page with a contentList.
  • Per-collection feeds: <prefix>/rss.xml through a middleware, only where the theme answers 404.
  • References and repeaters: stage 4, with their own RFC.
  • Rollout: six PRs.

Schema check: pnpm gen (TS + Rust), the core-contracts tests (492) and cargo test -p cloudhal-schema pass. cargo-typify merged two inline property enums into one type, so they moved into named $defs; the RFC records this.

The 11 open questions, with recommended defaults, are at the end of the RFC.

🤖 Generated with Claude Code

JSON-LD presets (Event, JobPosting, Product, Recipe) mapped from
fields, expiry as a render-time gate (unlist or hide), listings
filtered and sorted by field with one shared evaluator, listing pages
and per-collection feeds; references and repeaters left for stage 4.
The schema diff was checked with pnpm gen (TypeScript and Rust) and
reverted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Madraka <8898640+Madraka@users.noreply.github.com>
@Madraka Madraka added the rfc A design proposal in docs/rfcs label Oct 23, 2026
Halil accepted RFC-0042 with every open question decided as
recommended. ADR-0044 records the decision.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Madraka <8898640+Madraka@users.noreply.github.com>
@Madraka Madraka changed the title RFC-0042: Collections stage 3 — presets, expiry, field listings (draft) RFC-0042 / ADR-0044: Collections stage 3 (accepted) Oct 23, 2026
@Madraka
Madraka merged commit 166691e into main Oct 23, 2026
4 checks passed
@Madraka
Madraka deleted the rfc/collections-stage-3 branch October 23, 2026 07:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

rfc A design proposal in docs/rfcs

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant