Skip to content

Universe Write Contract — Decision Log

What was decided, what was rejected, and what remains open for the universe write contract.

#DecisionRationale
1Five verbs available in every universeOne vocabulary for one intent. The alternative gave a logged subject a second set of verb names for the same operations
2One parameterized write base, not two disjoint interfacesThe only consumer generic over every subject is DataAuthorityService; under two interfaces it must be split or made generic over which interface it holds
3One argument carrier per verbOnly 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
4delete and affirm fix their own actThe universe must know its own act in order to fix it, which is also why retireKind sits on the interface
5retireKind mandatory on every occurrence universeSee the rejected proposal below
6touch is a method, not a helperFollows from declaring the five verbs on the base with carriers
7The split reaches Table and PersistenceIn scope for this change; no migrations, no second flag day
8affirm on a basic subject is touch with a staleness guardAn affirmation that cannot be stale asserts nothing, and basic rows carry record ids, so the check is free

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.

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.

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.

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.