One record. Every seat sees its scope. Nothing moves without a ruling.
Four services. Five engineers. One rotation — derived, not group-chatted.
Group chats lose this argument: “can you cover Thursday?” slides, a swap agreed on a call never reaches the roster, and nobody can tell which version of the week is standing. So the rotation lives here instead — a declared default that simply happens unless somebody proposes otherwise, and an append-only record of every swap, coverage ask, ruling and reason. The grid below is a fold of those two things. Nothing is ever edited or deleted.
Demo data — the team is fictional. The pattern is the point.
The engine, in five lines
Defaults stand — the standing grid derives from a declared rule — silence inherits it, no meeting required.
Proposals are a color — a pending delta against the default, never a fact, until another seat rules on it.
Reasons stay — a rejection keeps its reason attached to the cell forever; nothing is edited, nothing is deleted.
Seats see their scope — every rendering is computed server-side from the same record — what a seat can't see was never sent.
Pull, don't push — take your artefact away (.ics, JSON); write only through the port, as a record, under your own name.
The default.Weekly rotation, handover Mondays at 09:00. Each service rotates through its own roster: api — Priya → Tom → Ana; billing — Tom → Ana; ingest — Ana → Priya; search — Leo → Priya. The week of Monday September 28 opens the cycle, and it alternates from there. Billing is under a launch freeze Monday Oct 19 – Friday Oct 23: a proposal against those days must name the freeze in its note, or the port refuses it. If nobody proposes anything, the rotation is simply what happens: silence means the default holds.
Silence means the default holds. Talk only happens at the delta — and the delta wears a color.
Facts — from the record, in plain text
Freeze: Billing v2 launch freeze — billing, 2026-10-19 to 2026-10-23.
Uncovered: search on 2026-10-31 — nobody stands there.
Pending proposal oc-10: ingest 2026-10-24 → NOBODY (uncovered) — proposed by Priya Nair (tentative); cells: ingest 2026-10-24. It is a color, not a fact, until another seat rules.
Sit in a seat — the same record, rendered for where you sit
Click any cell in a full-grid seat. Its default, what stands now, any freeze, every record that touched it — rejected ones struck through, reasons attached. A cell that can explain itself.
The port — propose, counter-propose, and rule on what's pending
Pushes only happen here, as records, under your name. Rejecting another seat's proposal takes a reason — you'll be asked, and it stays attached forever. You cannot rule on your own proposal. To counter a proposal: use the “Counter — propose a different change” button on any pending proposal (in your inbox, or in its cell) — it brings you here with the proposal's id filled in; set the different change above, add a note, and Propose records it as a counter.
Pull & proof — artefacts out, and the re-fold
⬇ Pull my .ics— a copy to carry away; never a write back.
Projection digest (sha256 over the folded grid — the pin every seat is looking at):
…
— demo hygiene; the seed is the opening position.
The record — everything that ever happened here
Honest label. This record lives in this instance's own store — it is
an instance with the same operational fiction, demonstrating the shape: a default that
derives, a record that accumulates, a grid that is a pure fold, seats rendered
server-side. The git-native substrate (git.pp, Cloudflare Artifacts) is its
sibling submission.