oficina / sheets Public

suite-amendment: consume the suite doctrine — review record open

On branch suite-amendment

Branch suite-amendment at f18adaa, opened as the review record before merge, per AGENTS.md: "push and open the branch discussion, then squash-merge to main. Never merge without the discussion existing first."

What this is, honestly. A transcription made at merge time — not an independent review pass and not an approval. The branch's reasoning lives in its single commit message, and the squash would flatten it; this thread is where it survives. Opened by the memoria session, on Paul's instruction to merge the three suite-amendment branches (2026-09-05). The commit was read from a fresh clone of the branch rather than from any checkout on the shared box, because a checkout there was found the same evening with a current ref and a stale working tree.

What the branch does

Appendix A.3 of the suite sharing doctrine. PRODUCT.md principle 2 and spec §8.3 move the boundary from the instance to the team (suite ruling 1), so a same-team memoria may pull team-visible sheets; across a team label nothing moves, unchanged. §8.2 records where team standing comes from in each shape and keeps per-sheet roles local. §9.1's copy of the home call contract becomes a citation. AGENTS.md keeps its same-commit rule and gains a second beside it for the doctrine. A new §9a lists the consumed rulings, names S6 as Sheets' alone, and says the hand-off and S8 are not consumed yet.

It also records the one thing that travelled the other way: Sheets ruling 12 — link sharing is viewer-or-commenter, never editor — became the read-only half of suite ruling 15, after a draft of the doctrine proposed an anonymous link editor and was corrected against this spec.

The commit message, verbatim

Consume the suite doctrine, and keep the local rule that was never the problem

Appendix A.3 of the suite sharing doctrine (oficina/suite, revision 4,
commit 210312f).

PRODUCT.md principle 2 and spec §8.3 both said the boundary is the
instance. It is the team (suite ruling 1): a team's instances across every
app are one trust domain, so a same-team memoria may pull team-visible
sheets. Across a team label, nothing moves, and that has not changed.

§8.2 says where team standing comes from — the home's roster in suite shape,
$SHEETS_OWNERS and the local member rows in lone shape — and that per-sheet
roles stay here. The doctrine deliberately does not unify them: a role
vocabulary designed from three specs at once would fit none, and it moves to
the contract module only when two apps have shipped the same one. Sheets has
commenter, calendar has no such role, Docs has none. That moment is not now.

§9.1's five-call contract is cited rather than restated. This section had
already caught itself drifting once, in its own words — "the first draft
called this the four-call contract and then admitted a fifth in a
subsection" — and then drifted again from the other side, because the home
now has six calls with a seventh and eighth designed. The note was right
about the mechanism and could not fix it: the fix is not to count more
carefully, it is to stop keeping a second copy. What is Sheets' own stays,
including the correction about the home hashing rather than the instance.

AGENTS.md keeps its same-commit rule. A draft of the doctrine proposed
replacing it, reading it as a cross-repository claim — but it says that where
*this file* disagrees with *its own design spec*, the spec wins and both are
fixed together, and both files live here. It is a local obligation that
works and was never what broke. A second rule is added beside it for the
doctrine, which genuinely cannot be one commit.

New §9a lists the consumed rulings with the doctrine's commit and revision,
names S6 as Sheets' alone, and says S8 and the hand-off are not consumed yet.

It also records the one thing that travelled the other way: ruling 12, link
sharing is viewer-or-commenter never editor, is now suite ruling 15's
read-only half. A draft of the doctrine proposed an anonymous link editor
and had to be corrected against this spec — and the reason Sheets gave is
the reason the suite took it, that every version row carries an actor and an
anonymous editor writes unattributed rows into history.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

One thing a reader should know, and it is not a blocker

This branch cites the doctrine at revision 4, 210312f. The doctrine is now at revision 7, 2b78680 — three revisions on. Gate 9 (citation currency) fails a spec more than one revision behind, so §9a's recorded revision is stale on arrival and owes a bump to revision 7.

It is not a merge blocker today because gate 9 is not built: §12 step 2 schedules gates 1 to 4 only, and the module on main carries no currency script — the "revision behind" code in conformance.go and fixtures.go is S2 item-revision handling, a different thing. The staleness is a correctness debt, not a red gate.

One of those later revisions matters here more than it does elsewhere. §9a names S6 as Sheets' alone. Revision 5 left S6 in the contract table and in A.4 with no step in §12 at all; revision 6 gave it a step but placed it before memoria's slice 1, implying a dependency that does not exist; revision 7 moved it to step 4, after slice 1 and before slice 2, and states in the step that slice 1 does not need it. So the call this spec claims is now scheduled, which it was not when this branch was written. Sheets serves it, memoria calls it, and nobody else does either.

Merge gate

amadan ci status oficina/sheets -branch suite-amendment → CI passed at f18adaa, exit 0.