DUNIN7 · LOOMWORKS · RECORD
record.dunin7.com
Status Current
Path substrate/loomworks-engagement-identity-record-v0_1.html

DUNIN7 · Loomworks · Decision Record

Engagement identity — record of decision

Version. v0.1
Date. 2026-06-25
Author. Claude.ai, under Operator direction, grounded on Claude Code (CC) read-only engine traces.
Status. Decision record. Captures what engagement identity is, what the engine implements, the design intent it diverged from, the misframings caught and corrected, and the Operator's decisions. Settled where marked; deferred items named.
Grounds on. CC read-only traces of the engagement model, ID generator (migration 0065), membership/contributor/invitation/claim wiring, and live dev data (2026-06-25). The 2026-05-17 addressing design. The 2026-06-09 Companion architecture foundation (Scope axis built on the identity scheme).

Plain-language summary

An engagement has more than one identifier, each doing a different job. The confusion that prompted this record came from treating the human-friendly E#### as if it carried identity everywhere — it does not. The settled position:

  • The UUID is the engagement's true identity — globally unique by construction, never changes, travels inside share-messages. The only handle that means the same thing across any boundary.
  • E#### is a local label — friendly, but only unique within one instance. Shared by all members in that instance; in a federated future, each instance assigns its own E#### to the same UUID.
  • The per-Operator number (your "23"; Personal is "0") is your own private handle, different per person.
  • The name ("Goosey") is for speaking.

Today the engine is in-instance only (no federation), so the cross-instance ambiguity people worry about cannot occur yet. The "running out of E numbers" worry is a non-issue — a 64-bit counter backs it. The only forward caveat is a frontend one: don't assume the ID is exactly four digits.

1. The four jobs of engagement identity

"Engagement identity" is not one thing. It is four identifiers serving four needs. Collapsing them caused the confusion.

JobWho uses itHandleScope
Speak / recallOperator, by voicethe name ("Goosey")local, human
Personal terse handleOperator, terselyoperator_sequence_number ("23"; Personal = "0")per-person, in one instance
Cross-person, in-instanceall membersE#### (display_identifier)instance-local, shared
Cross-boundary identitymachines / sharingthe UUID (primary key)global, unique by construction

Every job has a handle that exists today. Nothing is missing. The problem was never a missing identifier — it was treating the instance-local E#### as the cross-boundary handle when the UUID is.

2. What the engine implements (CC, 2026-06-25)

3. Contributorship today — Model A, in-instance

Model A — in-instance · federation absent

Consequence: within an instance, E#### is unambiguous — every member sees the same one. The cross-instance E#### collision cannot occur today; it is purely a federation-future concern.

4. The decisions (Operator)

4.1  The UUID is the engagement's identity. Globally unique, already exposed. Cross-boundary reference uses the UUID. Sharing is "a message with the ID (UUID) attached" — machine-mediated, not human-typed. No human-readable cross-instance ID is required, so no instance-identifier and no namespaced E#### need to be built.

4.2  E#### is a local label, assigned per instance. Within one instance, shared by all members. In the federation future, the receiving instance assigns its own local E#### to the same UUID — one UUID, many E####s. E#### never needs to be globally unique; two parties holding different E####s for the same UUID is expected.

4.3  The UUID is preserved on share, never regenerated. The load-bearing constraint of 4.2: the receiving instance stores the same UUID (wrapped in a fresh local E####). A new UUID would split identity and break the scheme. UUID is the invariant; E#### the variable.

4.4  Humans never reference E#### across instances. In-instance: address by name / operator_sequence_number / E####. Cross-instance: always the machine path (message + UUID / link). Each instance shows its own E####; the human acts on the shared thing, not a number.

4.5  The E#### scheme stays as-is. Four-digit minimum padding, instance-wide sequence. Not changed. (See §6 — capacity is a non-issue; the only forward caveat is a frontend one.)

5. Corrections preserved (the trajectory)

The path here included positions that were wrong and corrected against engine fact. Recorded so the reasoning is reconstructable, not just the destination.

Misframing: "E#### is the universal handle." Treated early on as if it carried identity across boundaries. Corrected: E#### is a per-instance sequence; the UUID is globally unique. The universal handle existed all along — the unsayable UUID, not the friendly E####.
Hypothesis: an "M" prefix / M0001 and a reserved 0001–0999 band. Raised from Operator recollection. Corrected by CC: no M prefix, no reserved band. One prefix (E), sequence starts at 1, E0001 is Administrative (oldest, not reserved-numbered). Personal is an ordinary E#### engagement row (visibility='personal'), not a separate object class.
Error: "the per-Operator number doesn't exist in the engine." Claude stated this while reasoning about the 2026-05-17 design. Corrected by CC: it exists — operator_sequence_number — with Personal at 0, as designed. Two of the design's three layers are in fact implemented.
"23" called illustrative. Claude twice treated "23" as an example. Corrected by CC: it is a live per-Operator number — the frontend references operator_sequence_number === 23 directly.
Design-vs-engine on Personal addressing. The 2026-05-17 design specified Personal as dual-addressed 0/Personal, not consuming the sequence. The engine gives Personal an ordinary E#### (consuming the sequence) and sets operator_sequence_number = 0. The 0 survives; "doesn't consume the global sequence" and "dual-addressed by name" are not implemented as designed. Noted, not resolved here.

6. "Running out of E numbers" — a non-issue

The one forward caveat is a frontend one: surfaces showing the ID must not hard-code a four-character width or assume exactly four digits — the ID can grow to E10000+. A render-robustness note for the engagement-list and any ID-displaying surface. No engine change. (Operator decision: leave the scheme alone; it only matters if it messes up an interface render, and the mitigation is the frontend caveat.)

Two known properties (recorded, not problems to fix): E#### is an instance-wide shared sequence, so numbers climb with total instance activity, not one Operator's. And a monotonic public sequence leaks the instance's engagement count and growth rate to anyone seeing E#### externally — mitigated by decision 4.4 (E#### is not shared externally; cross-boundary sharing is via UUID/link).

7. Consequence for the Companion (what this unblocks)

The Companion addresses engagements instance-locally: by name ("open Goosey"), by operator_sequence_number ("open 23"), and/or by E#### ("open E0007") — accepting whichever the Operator reaches for, since the engine carries all three. The UUID is the invisible cross-boundary identity, never spoken, carried inside any share-message. The canonical displayed handle stays E####.

This settles engagement addressing — the open question blocking the Companion home-surface design. The home can now be designed: engagements addressed and labeled locally, Personal as an engagement with visibility='personal' (it is an engagement — same machinery, distinguished by visibility), the UUID underneath as identity.

8. Deferred — named, not blocking