The Grid git.pp — one engine, many grids

connecting…

One record. Every seat sees its scope. Nothing moves without a ruling.

Two people. One kid. One month — derived, not discussed.

Chat threads lose this argument: “that Monday” slides, the subtext evaporates, and nobody can tell which version of a day is standing. So the month lives here instead — a default that simply happens unless somebody proposes otherwise, and an append-only record of every proposal, ruling, question and reason. The grid below is a fold of those two things, recomputed from the record. Nothing is ever edited or deleted.

Demo data — Mara and Jonas are 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. Alternating weeks, handover Fridays at 18:00. The week that starts Friday October 2 is Mara's; it alternates from there, Friday to Thursday. A day's color is who has the kid that night — on Fridays the day changes hands at 18:00. Soccer practice stands every Tuesday and Thursday at 17:00. If nobody proposes anything, this 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
This week (Fri 2026-10-09 – Thu 2026-10-15), the kid is with:
  Fri 2026-10-09 — Jonas
  Sat 2026-10-10 — Jonas
  Sun 2026-10-11 — Jonas
  Mon 2026-10-12 — Mara
  Tue 2026-10-13 — Jonas
  Wed 2026-10-14 — Jonas
  Thu 2026-10-15 — Jonas
Pending proposal seed-09: the kid 2026-10-26 → Mara — proposed by Jonas (tentative); cells: the kid 2026-10-26. It is a color, not a fact, until another seat rules.

Sit in a seat — the same record, rendered for where you sit

Open a cell — the description and the equation

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.