oficina / sheets Public

Shipping cadence, and colour allocation is order-independent

Paul's call, 2026-08-30: everything on a worktree on a branch, regular
commits pushed as they land, squash-merge to main only when the work is
done, approved — including the highest-capability-model review pass —
and CI is actually green. Any one of the three missing means it does not
merge.

Also from ui-guidelines-52: colour allocation must be a pure function of
a canonically ordered key set rather than of arrival order. Resolving
displacement by "who arrived later" means two clients viewing the same
sheet allocate differently, so the same person is green for one viewer
and blue for another and both trust it. Order by member id. The avoid
set is in their API rather than worked around caller-side, so collisions
happen only past the set's capacity.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01APtNStXDZ5H2fAc1ZuGqtS
Paul Campbell 2f286513d601124c5e25ee9b8b94c89d3743d871 parent 7297e0a
2 files changed, +37 −0
  • AGENTS.md +24 −0
  • docs/superpowers/specs/2026-08-30-sheets-design.md +13 −0
diff --git a/AGENTS.md b/AGENTS.md
index 3636d66..801585d 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -61,6 +61,30 @@ always welcome on top.
---
+## Shipping cadence — RULED 2026-08-30 by Paul
+
+**Everything happens on a worktree, on a branch.** Never directly on
+`main`, and never in the primary checkout.
+
+1. **Worktree per session.** One isolated workspace per piece of work.
+2. **Branch per piece of work**, cut from current `main`.
+3. **Commit regularly and push to the branch.** Small commits that tell the
+ story, pushed as they land — not one heroic commit at the end. A branch
+ that only exists locally is work nobody can see or recover.
+4. **Squash-merge to `main`** when, and only when, all three hold:
+ - the work is **done** — not "done except",
+ - it is **approved** — including the §Review pass by the
+ highest-capability model available,
+ - **CI is green** — actually green, checked, not assumed.
+
+Any one of the three missing means it does not merge. "CI was green
+before the last push" is not CI being green.
+
+Review happens on a **deployed canary**, never localhost. Shared hosts only
+ever run merged `main`.
+
+---
+
## Intent before code
CARLOS's first principle: the design doc precedes the build, and its
diff --git a/docs/superpowers/specs/2026-08-30-sheets-design.md b/docs/superpowers/specs/2026-08-30-sheets-design.md
index 397dc6b..843c7be 100644
--- a/docs/superpowers/specs/2026-08-30-sheets-design.md
+++ b/docs/superpowers/specs/2026-08-30-sheets-design.md
@@ -500,6 +500,19 @@ paint under a user fill, and a selected or frozen cell sits on something
else again. We pass what the cell actually sits on and the gate asserts the
pair against that exact colour.
+**Allocation is a pure function of a canonically ordered key set, never of
+arrival order** (ui-guidelines-52, 2026-08-30). If displacement resolves by
+"who arrived later", two clients viewing the same sheet allocate differently
+— the same person is green for one viewer and blue for another, and both
+trust it. With six people in a sheet that is a visible and confusing bug.
+Order by member id and displace within that order. The `avoid` set is a
+parameter of the API rather than a caller-side workaround, so collisions
+occur only past the set's capacity — the honest limit rather than an
+accident.
+
+Stability of a person's colour is **best-effort by design; separation is the
+hard guarantee.**
+
**Second entry point: distinguishable-colour allocation.** Contrast-
correctness and perceptual separation are different guarantees, so allocation
is its own function — hash a stable identity into the bounded hue set with a