generated from coulomb/repo-seed
spec(SHARD-WP-0005 T1): re-frame state model — three states, derived=f(canonical)
Replaces the two-bucket thesis with sharded-canonical / coordination-canonical (journal: overlays, bindings, aliases, merges) / derived-disposable. Fixes the I-2 contradiction (curator bindings can't be rebuilt). Updates §1, I-2, §3 dependency rule, §4 abstractions, §8.4. (review A-1) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -21,34 +21,51 @@ Scope relationship to the other specs:
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. The thesis: *canonical at the edges, derived in the middle*
|
## 1. The thesis: *canonical vs derived* (three states)
|
||||||
|
|
||||||
Everything in shard-wiki follows from one organising decision:
|
Everything in shard-wiki follows from one organising decision — that state comes in exactly
|
||||||
|
**three kinds**, and only one of them is disposable:
|
||||||
|
|
||||||
> **The canonical truth lives at the edges — in each shard (content) and in the Git
|
> **1. Sharded-canonical** — content owned by each shard (shard sovereignty).
|
||||||
> coordination journal (history). Everything shard-wiki computes in between — the union, the
|
> **2. Coordination-canonical** — durable state *born inside shard-wiki* that encodes human
|
||||||
> projections, the views, the query indexes — is _derived state that can be deleted and
|
> or cross-shard decisions and exists nowhere else: overlays (the local truth against a
|
||||||
> rebuilt_ from those edges.**
|
> read-only shard), curator equivalence bindings, alias tables, merge/reconciliation
|
||||||
|
> decisions. It lives in the **Git coordination journal**.
|
||||||
|
> **3. Derived-disposable** — everything shard-wiki *computes* from (1)+(2): the union graph,
|
||||||
|
> equivalence index, query indexes, projections, views. It can be deleted and recomputed.
|
||||||
|
>
|
||||||
|
> **Canonical = sharded ∪ coordination. Derived = a pure function of canonical:**
|
||||||
|
> `derived = f(sharded, coordination)`.
|
||||||
|
|
||||||
This is the architectural form of "orchestrator, not engine." shard-wiki never *becomes* the
|
This is the architectural form of "orchestrator, not engine." shard-wiki never *becomes* the
|
||||||
source of truth; it composes sources. The research earned this thesis empirically — every
|
source of truth; it composes sources and records the decisions it makes about them. The
|
||||||
serious system externalises its durable truth to files+VCS and treats the rest as derived:
|
research earned the *files-canonical* half empirically — every serious system externalises its
|
||||||
Logseq (DataScript index over plain files), ikiwiki (static HTML compiled from a git repo),
|
durable truth to files+VCS and treats the rest as derived: Logseq (DataScript index over plain
|
||||||
Glamorous Toolkit / Lepiter (live views over git-versioned JSON), Pharo (Tonel/Iceberg code
|
files), ikiwiki (static HTML compiled from a git repo), Glamorous Toolkit / Lepiter (live
|
||||||
as git text), Jupyter teams (nbstripout — outputs are derived noise). The one tradition that
|
views over git-versioned JSON), Pharo (Tonel/Iceberg code as git text), Jupyter teams
|
||||||
refuses this — the Smalltalk **image** — is exactly the one we record as a *boundary, not a
|
(nbstripout — outputs are derived noise). The one tradition that refuses this — the Smalltalk
|
||||||
backend* (`research/260614-squeak-pharo-deep-dive`).
|
**image** — is exactly the one we record as a *boundary, not a backend*
|
||||||
|
(`research/260614-squeak-pharo-deep-dive`).
|
||||||
|
|
||||||
|
The earlier draft of this blueprint used a two-bucket framing ("canonical at the edges,
|
||||||
|
derived in the middle"). That was wrong by omission: it had no home for **coordination-
|
||||||
|
canonical** state, and so contradicted itself by listing curator bindings and alias tables as
|
||||||
|
"derived/rebuildable" when a human binding manifestly cannot be rebuilt. The three-state model
|
||||||
|
fixes that crack (review finding A-1) and makes `derived = f(canonical)` *literally* true.
|
||||||
|
|
||||||
Three consequences fall straight out, and they are the spine of the rest of this document:
|
Three consequences fall straight out, and they are the spine of the rest of this document:
|
||||||
|
|
||||||
1. **Graceful degradation is free.** If the derived middle is always rebuildable, a backend
|
1. **Graceful degradation is free.** If the derived tier is always recomputable, a backend
|
||||||
that can only be read is still a first-class participant — you just derive less from it.
|
that can only be read is still a first-class participant — you just derive less from it.
|
||||||
2. **Provenance is tractable.** Because shard-wiki never claims to *be* the source, every
|
2. **Provenance is tractable.** Because shard-wiki never claims to *be* the source, every
|
||||||
derived artifact can always point back to the canonical edge it came from (union without
|
derived artifact can always point back to the canonical input it came from (union without
|
||||||
erasure is a structural property, not a feature bolted on).
|
erasure is a structural property, not a feature bolted on).
|
||||||
3. **The system is a pure function of its inputs.** `union/index/projection = f(shards,
|
3. **The derived tier is a pure function of canonical state.** `derived = f(sharded,
|
||||||
journal)`. Bugs in the middle are recoverable by rebuild; the edges are the only thing
|
coordination)`. Bugs in the derived tier are recoverable by recompute; only the two
|
||||||
that must be protected (and history protects them).
|
canonical tiers must be durably protected — sharded by each shard, coordination by the
|
||||||
|
Git journal (history). *Recomputability is a correctness property of the derived tier, not
|
||||||
|
a promise that a from-scratch rebuild is operationally cheap — see §8.4 and the
|
||||||
|
operational-envelope axis.*
|
||||||
|
|
||||||
### The dual narrow waist
|
### The dual narrow waist
|
||||||
|
|
||||||
@@ -73,7 +90,7 @@ principles fused with the research through-lines.
|
|||||||
| # | Invariant | Source |
|
| # | Invariant | Source |
|
||||||
|---|-----------|--------|
|
|---|-----------|--------|
|
||||||
| I-1 | **Orchestrator, not engine.** Core composes shards; it never replaces or homogenises them. | INTENT Stability Note |
|
| I-1 | **Orchestrator, not engine.** Core composes shards; it never replaces or homogenises them. | INTENT Stability Note |
|
||||||
| I-2 | **Canonical at the edges, derived in the middle.** Union/index/projection are rebuildable from shards + journal. | §1; Logseq/ikiwiki/GT through-line |
|
| I-2 | **Three states; derived = f(canonical).** State is sharded-canonical, coordination-canonical (journal), or derived-disposable. The derived tier (union/index/projection) is a pure, recomputable function of the two canonical tiers; only canonical state is durably protected. | §1; Logseq/ikiwiki/GT through-line |
|
||||||
| I-3 | **Capability-awareness is data.** A binding's abilities are a *profile* (positions on spectra), read by generic core logic — not per-backend branches. | synthesis v3 §2; INTENT capability-aware adapters |
|
| I-3 | **Capability-awareness is data.** A binding's abilities are a *profile* (positions on spectra), read by generic core logic — not per-backend branches. | synthesis v3 §2; INTENT capability-aware adapters |
|
||||||
| I-4 | **Union without erasure.** Every page/revision/projection/overlay/view carries its provenance, freshness, liveness, and divergence. | INTENT; provenance-granularity spectrum (Wikibase) |
|
| I-4 | **Union without erasure.** Every page/revision/projection/overlay/view carries its provenance, freshness, liveness, and divergence. | INTENT; provenance-granularity spectrum (Wikibase) |
|
||||||
| I-5 | **Overlay before mutation.** Writes to anything below write-through land as drafts/patches/MRs first; no silent remote mutation. | INTENT |
|
| I-5 | **Overlay before mutation.** Writes to anything below write-through land as drafts/patches/MRs first; no silent remote mutation. | INTENT |
|
||||||
@@ -124,8 +141,11 @@ carries provenance; an authz decision at L5 records the context under which cont
|
|||||||
Likewise a capability profile declared at L1 is consulted at L3 (can we write-through?), L4
|
Likewise a capability profile declared at L1 is consulted at L3 (can we write-through?), L4
|
||||||
(can we delegate a query?), and L5 (can this principal even reach the op?).
|
(can we delegate a query?), and L5 (can this principal even reach the op?).
|
||||||
|
|
||||||
The dependency rule is strict and downward: **L4 may be deleted and recomputed from L1–L3.**
|
The dependency rule is strict and downward, and it tracks the **three states (§1)**, not the
|
||||||
Nothing at L1–L3 may depend on L4 state.
|
layer numbers: **the derived-disposable tier (the whole of L4) may be deleted and recomputed
|
||||||
|
from canonical state (sharded content at L1 + coordination-canonical state in the L3 journal).**
|
||||||
|
Nothing canonical may depend on derived state. Note the journal at L3 is *canonical* (it holds
|
||||||
|
overlays, bindings, aliases, merges); only L4 is disposable.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -146,9 +166,13 @@ parallel terms.
|
|||||||
(paths/shards). Addressing, equivalence, and transclusion key on identity (I-9).
|
(paths/shards). Addressing, equivalence, and transclusion key on identity (I-9).
|
||||||
- **Provenance envelope** — the metadata wrapper every artifact carries: source shard,
|
- **Provenance envelope** — the metadata wrapper every artifact carries: source shard,
|
||||||
freshness, liveness, authorization context, overlay status, divergence, derivation lineage.
|
freshness, liveness, authorization context, overlay status, divergence, derivation lineage.
|
||||||
- **Coordination journal** — the L3 Git-backed record of change flows for a space.
|
- **Coordination journal** — the L3 Git-backed record of change flows for a space, and the
|
||||||
|
durable home of all **coordination-canonical** state (§1): overlays, curator equivalence
|
||||||
|
bindings, alias tables, merge/reconciliation decisions. This state is born inside shard-wiki,
|
||||||
|
exists nowhere else, and is *not* derived — it must be committed, never recomputed.
|
||||||
- **Overlay** — a non-destructive local edit against a remote/read-only/limited shard,
|
- **Overlay** — a non-destructive local edit against a remote/read-only/limited shard,
|
||||||
representable as draft/patch/commit/MR before destructive apply.
|
representable as draft/patch/commit/MR before destructive apply. Coordination-canonical: an
|
||||||
|
unapplied overlay is the local truth and lives in the journal.
|
||||||
- **Projection** — a derived view of shard content, typed on two axes (§8): *kind*
|
- **Projection** — a derived view of shard content, typed on two axes (§8): *kind*
|
||||||
(replication | derivation) × *liveness* (static … irreducibly-live).
|
(replication | derivation) × *liveness* (static … irreducibly-live).
|
||||||
- **Federation model** — the selected coordination strategy for a space (§ taxonomy, T17).
|
- **Federation model** — the selected coordination strategy for a space (§ taxonomy, T17).
|
||||||
@@ -311,11 +335,16 @@ composes per shard** (mechanism over policy, I-7):
|
|||||||
|
|
||||||
### 8.4 Union & projection (L4) — the derived cache
|
### 8.4 Union & projection (L4) — the derived cache
|
||||||
|
|
||||||
This whole layer is rebuildable from L1–L3 (I-2). It comprises:
|
This whole layer is **derived-disposable**: recomputable from canonical state — sharded
|
||||||
|
content + the **coordination-canonical** inputs in the journal (I-2). Crucially, the *automatic*
|
||||||
|
equivalence results are derived, but the **human/curatorial inputs they consume — alias tables
|
||||||
|
and curator equivalence bindings — are coordination-canonical (they live in the journal), not
|
||||||
|
derived**; recompute reads them, never regenerates them. It comprises:
|
||||||
|
|
||||||
- **Identity resolution & equivalence** — detect "same topic / derived content" path-
|
- **Identity resolution & equivalence** — detect "same topic / derived content" path-
|
||||||
independently (fingerprint, span-set overlap, alias table, curator binding); present as
|
independently from *derived* signals (content fingerprint, span-set overlap) **plus** the
|
||||||
**chorus-of-voices** or designated-canonical (a *policy* preset).
|
*coordination-canonical* inputs (alias table, curator binding); present as
|
||||||
|
**chorus-of-voices** or designated-canonical (a *policy* preset). (Scaling: §8.6.)
|
||||||
- **Union graph** — the navigable join of pages, links, and dimensions (namespace, genealogy,
|
- **Union graph** — the navigable join of pages, links, and dimensions (namespace, genealogy,
|
||||||
version, shard, equivalence). A *derived lens over canonical files+journal, never a new
|
version, shard, equivalence). A *derived lens over canonical files+journal, never a new
|
||||||
store* (the ZigZag boundary).
|
store* (the ZigZag boundary).
|
||||||
|
|||||||
Reference in New Issue
Block a user