Universe Write Contract — Decision Log
What was decided, what was rejected, and what remains open for the universe write contract.
Decided
Section titled “Decided”| # | Decision | Rationale |
|---|---|---|
| 1 | Five verbs available in every universe | One vocabulary for one intent. The alternative gave a logged subject a second set of verb names for the same operations |
| 2 | One parameterized write base, not two disjoint interfaces | The only consumer generic over every subject is DataAuthorityService; under two interfaces it must be split or made generic over which interface it holds |
| 3 | One argument carrier per verb | Only update can carry idempotency or effective-time ordering today, and a delete writing a tombstone successor has no way to say how it should be ordered |
| 4 | delete and affirm fix their own act | The universe must know its own act in order to fix it, which is also why retireKind sits on the interface |
| 5 | retireKind mandatory on every occurrence universe | See the rejected proposal below |
| 6 | touch is a method, not a helper | Follows from declaring the five verbs on the base with carriers |
| 7 | The split reaches Table and Persistence | In scope for this change; no migrations, no second flag day |
| 8 | affirm on a basic subject is touch with a staleness guard | An affirmation that cannot be stale asserts nothing, and basic rows carry record ids, so the check is free |
Rejected: per-shape verb names
Section titled “Rejected: per-shape verb names”Under this option a logged subject would have createOccurrence, commit and appendRefusal, and no create at all. It satisfies “the illegal call does not compile” and violates decision 1 — the five verbs would not be available in any universe, they would be two disjoint vocabularies, and every caller would carry a second vocabulary for the same intent.
Rejected: two disjoint interfaces
Section titled “Rejected: two disjoint interfaces”This kept the five verb names but declared them twice, on a basic and an occurrence interface, with no common write base. Two arguments were made for it and both were wrong.
The first was that basic callers would have to write Unit at every call site. That was an artifact of choosing Unit as the basic act; with Nothing? the value is null, and a convenience overload removes even that.
The second was that the composite bases must distinguish the shapes anyway, so a type parameter that must be pattern-matched is worse than two types. Deferring the child-universe variant removed the premise: composites bind to the basic universe and never see an occurrence parent, so nothing pattern-matches on the act.
Rejected: retireKind on a sub-interface
Section titled “Rejected: retireKind on a sub-interface”The proposal was to put retireKind on a sub-interface so a log with no delete-shaped kind could have no delete at all — the absence made structural rather than checked. It was withdrawn, and how it failed is the part worth keeping.
It rested on the phrase “two logs decline by the model’s word.” One half of that was a gloss of model silence, not a declaration — traced to a line that asserted it without citation, since struck and corrected. The other half is genuine model text, with a nuance neither party had: depletion does not close a cycle; only a committed withdrawal or the successor’s request does.
The general form is worth more than the instance. A type system may make an absence unwriteable only when the absence is a decision. Silence is not a decision, and “by the model’s word” needs the line. The practice this produced is recorded as the rule that an absent declaration is not a declared absence.
How far fill may reach. Unresolved, and the operator’s to settle. It decides whether the second illegal call class closes. Closing it changes the table, not any interface in this design. The cost has been measured: at the stack tip, zero adopters break.
What affirm means on a subject with no kind vocabulary was raised and answered — it is touch with a staleness guard — but the answer is a reading of the mechanism rather than a separate ruling, and it is recorded here so that a later reader does not mistake it for one.
A note on the record
Section titled “A note on the record”Two claims in the source material were measured wrong and corrected: a count that matched an identifier rather than its binding, and a property of one commit stated as a property of a stack. Both corrections are folded into the pages here rather than left as errata, and both produced practice entries that outlived them.
Copyright: © Arda Systems 2025-2026, All rights reserved