spec(SHARD-WP-0005 T2): split page identity / placement / content equivalence

Fixes bug B-1: page identity is a stable assigned handle (survives edits),
not a content fingerprint; fingerprints identify versions/content for the
equivalence mechanism. Chain: identity -> placements -> equivalence. (§7.2)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-15 01:07:37 +02:00
parent b5d2cbc330
commit c8dbe9b573
2 changed files with 26 additions and 11 deletions

View File

@@ -288,17 +288,32 @@ All shapes reduce to a common skeleton: **`(content | source, structure, provena
[derivation rule])`**. The page model stores the richest faithful form as canonical and treats [derivation rule])`**. The page model stores the richest faithful form as canonical and treats
any Markdown rendering of a non-Markdown shape as a *lossy projection* (I-4 + fidelity report). any Markdown rendering of a non-Markdown shape as a *lossy projection* (I-4 + fidelity report).
### 7.2 Identity, placement, addressing ### 7.2 Identity, placement, addressing — three distinct concepts
- **Identity** is a content-derived or native-id-wrapped key, *shard-scoped* so native UUIDs The earlier draft used "identity" for two different things and (worse) suggested deriving page
survive projection and don't collide. identity from a content fingerprint — which would make *editing a page change its identity* and
- **Placement** is separate: one identity → N placements (paths/shards) = a DAG. No single break every reference to it (review bug B-1). They are pulled apart here:
canonical path (I-9).
- **Span addressing** — adopt native span IDs where minted (Roam `:block/uid`, Logseq `id::`, - **Page identity — a *stable handle*.** A shard-scoped, durable key that **survives edits**:
Notion/CRDT UUID); else content fingerprint or path+range. The Xanadu tumbler is the ideal the backend's native page/note id where one exists (Roam/Notion/Trilium uid, a git path
the scheme aims at without requiring. treated as a name, a wiki page name), wrapped in a shard scope so it survives projection and
- **Provenance envelope** rides on every page and span (source shard, freshness, liveness, never collides across shards. Identity is *assigned/minted, not computed from content*.
overlay status, authz context, divergence, derivation lineage). References, placement, transclusion targets, and overlays all key on identity.
- **Placement — *where* an identity sits.** One identity → N placements (paths/shards) = a DAG;
no single canonical path (I-9). Placement can change without changing identity.
- **Content equivalence — *detecting sameness*, never identity.** A **content fingerprint** (or
span-set overlap) identifies a *version / a piece of content*, used to detect that two
*distinct identities* hold the same or derived content (the equivalence/chorus mechanism,
§8.4). A fingerprint is never a page's identity: same page, edited → new fingerprint, **same
identity**; two pages, identical content → same fingerprint, **different identities**.
- **Span addressing** — a sub-page address within an identity: adopt native span IDs where
minted (Roam `:block/uid`, Logseq `id::`, Notion/CRDT UUID); else a *position* address
(path+range) or a *content-fingerprint* address for equivalence/transclusion. The Xanadu
tumbler is the portable ideal the scheme aims at without requiring.
- **Provenance envelope** rides on pages and spans (see §7.3 for its layered, low-cost form).
So the chain is: **identity (stable) → placements (N, mutable) → equivalence (cross-identity
sameness, fingerprint-based)** — three concepts, three mechanisms, never conflated.
--- ---

View File

@@ -52,7 +52,7 @@ folded in) plus a new **"Known scaling risks & open problems"** section.
```task ```task
id: SHARD-WP-0005-T1 id: SHARD-WP-0005-T1
status: todo status: done
priority: high priority: high
state_hub_task_id: "0bb17223-b458-41a4-b86c-c36b2689cf81" state_hub_task_id: "0bb17223-b458-41a4-b86c-c36b2689cf81"
``` ```