Files
shard-wiki/workplans/SHARD-WP-0002-federation-architecture.md
tegwick 714eaf6b5a synthesis v2: extend shard spectrum to full dive set (13 spectra); re-fold into SHARD-WP-0002
Extend the cross-dive synthesis from nine systems to the full fourteen
(added Joplin, Logseq, the CRDT cohort Anytype/AFFiNE/AppFlowy, Trilium).
Spectra grown 11 -> 13: new merge-model (none/git/conflict-notes/
native-CRDT) and content-opacity (plaintext/whole-shard-E2EE/per-item),
plus identity-vs-placement emphasis (Trilium note/branch DAG), Logseq's
in-file id:: addressing sweet spot, build-your-own derived query index,
and a six-mode attachment taxonomy (file-store native/interchange-mirror,
in-engine-host, local-REST, external-API, CRDT-replica, P2P). New
through-lines: CRDT changes the merge math; identity != placement;
metadata can be computed; attach surface != native store (+ substrate
migration). UC fold-in extended UC-44-59 -> UC-44-67.

Folded into SHARD-WP-0002: T11 thirteen spectra; T12 computed metadata +
multi-placement/DAG identity; T13 CRDT-log supplement; T14 full six-mode
attachment taxonomy; T15 HTML source model; T16 identity!=placement +
derived index. Context inputs += four dives; acceptance UC-26-67. No new
tasks, no new UCs (synthesis only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 17:25:32 +02:00

672 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: SHARD-WP-0002
type: workplan
title: "federation architecture design"
domain: whynot
repo: shard-wiki
status: active
owner: tegwick
topic_slug: whynot
created: "2026-06-08"
updated: "2026-06-14"
depends_on:
- SHARD-WP-0001
state_hub_workstream_id: "2af4c46d-cbfd-40ea-a94b-d9e60b0f9945"
---
# SHARD-WP-0002 — Federation architecture design
## Goal
Produce a **federation architecture specification** for shard-wiki: positioning
against prior art (Federated Wiki, git-backed wikis, ActivityPub), documented
**decisions and tradeoffs**, and ADR-ready design notes that resolve the open
questions raised by `research/260608-federation-concepts/` and UseCaseCatalog
UC-26UC-33.
Primary deliverable: `spec/FederationArchitecture.md` (created and filled by
this workplan's tasks).
Secondary deliverable (T11T16): the **shard adapter contract** constraints distilled
from the engine deep dives (T11T15, added 2026-06-13) and the modern-tool dives +
cross-dive synthesis (T16 and scope extensions, added 2026-06-14), feeding
`spec/TechnicalSpecificationDocument.md`. Federation architecture decides *what the
union does*; the adapter contract decides *what a backend must expose to participate*.
The two are co-dependent (the capability matrix T10 consumes the contract vocabulary
T11 defines), so they live in one workplan.
The cross-dive synthesis (`research/260614-shard-spectrum-synthesis/findings.md`, **v2
2026-06-14** — extended to the full dive set incl. Joplin, Logseq, the CRDT cohort
Anytype/AFFiNE/AppFlowy, and Trilium) reframes the contract around **thirteen capability
spectra** (addressing, content identity, **identity-vs-placement**, structure, history,
**merge model**, native query, translation, attachment mode, operational envelope, access
grant, **content opacity**, write granularity) — positions on a spectrum anchored at both
ends by a real system, with federation ops degrading by position — rather than a flat verb
checklist.
## Context
- Federation research: `research/260608-federation-concepts/findings.md`
- Engine deep dives (adapter-contract inputs, T11T15):
- `research/260608-wikiengines-overview/findings.md` (landscape; capability
heterogeneity, write granularity)
- `research/260613-xwiki-deep-dive/findings.md` (DB/component app-platform)
- `research/260613-twiki-deep-dive/findings.md` (file+RCS app-platform)
- `research/260613-foswiki-deep-dive/findings.md` (`Foswiki::Store` versioned
store interface = adapter-contract prior art)
- Conceptual + modern-tool dives (T16 + scope extensions, 2026-06-14):
- `research/260614-xanadu-deep-dive/findings.md` (reference-not-copy, transclusion,
tumbler span addressing — ideal)
- `research/260614-zigzag-deep-dive/findings.md` (information space as co-equal
dimensions; clone = transclusion — ideal)
- `research/260614-roam-deep-dive/findings.md` (block-DB, store UUIDs, Datalog,
in-app host)
- `research/260614-obsidian-deep-dive/findings.md` (file-over-app, in-file `^id`,
MetadataCache derived index, dual attach, ecosystem popularity)
- `research/260614-notion-deep-dive/findings.md` (closed SaaS, external-API-only,
DB schema+relations, operational envelope, scoped grant)
- `research/260614-joplin-deep-dive/findings.md` (SQLite-local, interchange/sync-mirror
attach, E2EE content opacity, local-REST)
- `research/260614-logseq-deep-dive/findings.md` (block-graph on plain files, in-file
`id::`, derived Datalog index, file→SQLite substrate migration)
- `research/260614-localfirst-workspaces-deep-dive/findings.md` (Anytype/AFFiNE/AppFlowy:
CRDT substrate, native merge, P2P/E2EE, CRDT-replica attach)
- `research/260614-trilium-deep-dive/findings.md` (note cloning → DAG / identity≠placement,
inherited+templated computed metadata, HTML-native, scripting+ETAPI, per-item opacity)
- `research/260614-shard-spectrum-synthesis/findings.md` (**synthesis v2**: the thirteen
capability spectra, shard family matrix, UC→task fold-in)
- Use cases: `spec/UseCaseCatalog.md` § A (UC-26UC-67; UC-34UC-43 are the
engine-attachment cases, UC-44UC-67 the conceptual + modern-tool cases)
- Aspiration: `INTENT.md` (orchestrator, not engine; mechanism over policy;
capability-aware adapters; Markdown-first, backend-neutral)
- Related workplan: `SHARD-WP-0001` (page resolution, namespaces, overlays,
provenance — federation architecture must align with, not duplicate, those
outputs)
**Non-goal:** Implement federation. This workplan produces architecture and
decision records only.
## Decision topics (overview)
| Topic | Key tradeoff | Primary UCs |
|-------|--------------|-------------|
| Orchestrator positioning | Adapter layer vs fedwiki-style homogeneous network | UC-02, UC-26 |
| Remix primitives | Fork vs overlay vs import vs link-only | UC-04, UC-26, UC-29 |
| Equivalent page identity | Title/path/alias/graph matching; chorus vs canonical | UC-27, UC-07 |
| History model | Per-shard journal vs Git coordination journal vs both | UC-29, UC-33 |
| Union composition | Server orchestrator vs client composition | UC-05, UC-27 |
| Change notification | Git ping, ActivityPub, poll — adapter transports | UC-31 |
| Space lifecycle | Permanent vs ephemeral; archive and carry-forward | UC-28, UC-30 |
| Transclusion depth | Whole-page projection vs inline span | UC-03, UC-32 |
| Consensus presets | Spread, merge, designated canonical — policy not core | UC-07, UC-27 |
| Capability matrix | Which federation ops require which adapter capabilities | UC-02UC-07 |
### Adapter-contract topics (T11T16, from engine + modern-tool dives)
| Topic | Key tradeoff | Primary UCs |
|-------|--------------|-------------|
| Adapter contract & capabilities | **Thirteen spectra** (not flat verbs); write granularity; operational envelope; access grant; **merge model**; **content opacity** | UC-02, UC-35, UC-38, UC-57, UC-61, UC-64 |
| Structured page model | Typed frontmatter vs sidecar vs blob; bodiless / multi-record; DB schema+relations; **computed (inherited/templated) metadata**; non-Markdown assets; query-defined pages; **multi-placement (DAG) identity** | UC-34, UC-39, UC-55, UC-58, UC-54, UC-66, UC-67 |
| History portability | Supplement (DB-internal incl. Notion/Joplin/Trilium; **CRDT-log**) vs import (open file history) | UC-36, UC-41 |
| Adapter binding | **Full mode taxonomy**: file-store (native *or* interchange/sync-mirror) / in-engine-host / local-REST / external-API / **CRDT-replica** / **P2P-no-central-endpoint**; per-binding choice; backend-swap / substrate-migration | UC-38, UC-40, UC-43, UC-50, UC-57, UC-60, UC-62, UC-64, UC-65 |
| Syntax translation | Lossless round-trip vs **lossy-with-fidelity-report** (HTML/blocks/CRDT) vs read-only degradation | UC-42, UC-59, UC-03 |
| Addressing, identity & navigation (T16) | Span addressing; content identity; **identity≠placement**; transclusion-as-reference; **derived query index**; dimensional/query views | UC-44, UC-45, UC-46, UC-47, UC-48, UC-51, UC-52, UC-54, UC-63, UC-66 |
---
## Architecture positioning and boundaries
```task
id: SHARD-WP-0002-T1
status: todo
priority: high
state_hub_task_id: "ea8fdb22-6c7f-4ac1-9799-1346abf3c3b7"
```
Write the opening sections of `spec/FederationArchitecture.md`:
- shard-wiki as **orchestration layer** over heterogeneous shards (contrast
Federated Wiki homogeneous JSON sites, ikiwiki homogeneous git wikis,
ActivityPub activity streams).
- Explicit **compare, do not equate** mapping from federation research §6.
- Architectural boundaries: what core owns vs adapters vs UI vs policy config.
- Relationship to `SHARD-WP-0001` outputs (resolution, namespaces, overlays).
**Tradeoffs to document:** Central Git coordination journal vs fully
decentralized peer sync; browser-composed union vs server-side orchestrator for
agents/CLI.
---
## Remix primitives: fork, overlay, import, reference
```task
id: SHARD-WP-0002-T2
status: todo
priority: high
state_hub_task_id: "fb7d4bce-5d2e-4602-9b63-85934d90e82d"
```
Define when each remix primitive applies and how they interact:
| Primitive | Typical trigger | Writes to remote? |
|-----------|-----------------|-------------------|
| **Reference** | Link only | No |
| **Projection** | Read remote page | No (cache optional) |
| **Overlay** | Edit read-only shard | No until explicit apply |
| **Import / fork** | Copy into writable shard | Source unchanged |
Resolve federation research open question #1. Cover capability-limited shards
(read-only, no diff/merge). Map to UC-26, UC-04, UC-29.
**Tradeoffs:** Fedwiki fork-as-default vs overlay-before-mutation; copy cost
and attribution portability vs link-only federation.
---
## Equivalent page identity and multi-version presentation
```task
id: SHARD-WP-0002-T3
status: todo
priority: high
state_hub_task_id: "8f2a333d-ddcc-4cc6-b6ed-1ba9b178eee3"
```
Specify how shard-wiki identifies "the same topic" across shards:
- Matching signals: normalized title, path, explicit alias table, link-graph
equivalence, manual curator binding.
- Presentation: chorus-of-voices (UC-27) vs designated canonical (policy).
- Link to UC-07 divergence detection and reconciliation triggers.
**Tradeoffs:** Automatic matching false positives vs manual curation burden;
showing all versions vs default canonical with alternates visible.
---
## History, attribution, and coordination journal
```task
id: SHARD-WP-0002-T4
status: todo
priority: high
state_hub_task_id: "5f39f48d-5142-4078-a84f-3245ec1add7e"
```
Define how edit history and attribution flow across federation operations:
- Per-shard revision model (Git commit, engine history, fedwiki-style journal
where applicable).
- Information-space **coordination journal** role for cross-shard operations
(fork, import, reconcile, space branch).
- Portable attribution requirements for UC-29 (frictionless remix).
**Tradeoffs:** Fedwiki journal-per-page vs Git-only; duplication of history vs
reconstructibility from coordination journal; storage cost of embedded media on
import.
---
## Union composition layer
```task
id: SHARD-WP-0002-T5
status: todo
priority: medium
state_hub_task_id: "3ff71e11-d0e9-4fda-b916-d6c34c51aa51"
```
Decide where the **union view** is assembled:
- Orchestrator API (server-side graph for agents, CI, non-browser clients).
- Optional client-side composition (fedwiki-style browser pull) as a consumer
pattern, not the only path.
- Caching, freshness, and invalidation interaction with UC-03, UC-05, UC-31.
**Tradeoffs:** Single composition point (simpler provenance) vs distributed
composition (fedwiki resilience); cache staleness vs live-pull latency.
---
## Change notification and subscription transports
```task
id: SHARD-WP-0002-T6
status: todo
priority: medium
state_hub_task_id: "9596e5e8-8d6b-4ed4-bcbc-ebb45e3168be"
```
Specify change-notification as an **optional adapter capability**:
- Transports: git hook / pinger (ikiwiki), ActivityPub Create/Update (XWiki),
WebDAV ETag, polling fallback.
- What a subscription triggers: projection refresh, reconciliation queue,
RecentChanges union entry (UC-31, UC-17).
- Out-of-scope vs in-scope for v1.
**Tradeoffs:** Push freshness vs implementation complexity; ActivityPub as
notification-only vs content-bearing share; dependency on external fediverse
infrastructure.
---
## Information space lifecycle
```task
id: SHARD-WP-0002-T7
status: todo
priority: medium
state_hub_task_id: "38134064-51ce-4f5a-80bf-b2cfbe381c59"
```
Model lifecycle states for root entities / information spaces:
- Active, read-only archived, retired (detached), merged-into-successor.
- Carry-forward workflow (UC-28, UC-30): selective import from archived shard.
- Space-level fork / branch (UC-33): coordination journal + shard config branch.
**Tradeoffs:** First-class ephemeral "happenings" vs permanent spaces only;
automatic archive vs manual; whether retirement deletes projections or preserves
read-only union entries.
---
## Transclusion and projection depth
```task
id: SHARD-WP-0002-T8
status: todo
priority: medium
state_hub_task_id: "5607732b-612a-4550-bb17-b8cd34979cf4"
```
Distinguish projection levels:
| Level | UC | Behavior |
|-------|-----|----------|
| Whole-page projection | UC-03 | Lazy full page from remote shard |
| Block/span transclusion | UC-32 | Inline embed with origin + freshness |
| Link reference | UC-08 | Pointer only |
Define provenance display requirements and staleness semantics for UC-32.
Reference Xanadu transclusion patterns without adopting unbuilt Xanadu scope.
**Tradeoffs:** Live transclusion fragility (link rot, remote down) vs snapshot
on import; core orchestrator support vs Markdown extension + adapter.
---
## Consensus and reconciliation policy catalog
```task
id: SHARD-WP-0002-T9
status: todo
priority: medium
state_hub_task_id: "adfca8b3-eb21-497d-9f51-65dc9269c810"
```
Document **configurable policy presets** (mechanism over policy):
- Fedwiki-spread (versions coexist; popularity implicit).
- Designated canonical shard (explicit write target).
- Git-merge reconciliation (ikiwiki-style).
- Overlay-only (no destructive merge on read-only sources).
- Vote-to-merge / editorial gate (optional, UI-layer).
Map presets to UC-07, UC-27. Core provides primitives; policy selects preset.
**Tradeoffs:** Default policy for L0 open mode vs team mode; exposing conflicts
vs auto-merge when backends support it.
---
## Federation operations capability matrix
```task
id: SHARD-WP-0002-T10
status: todo
priority: medium
state_hub_task_id: "c7a93d06-8631-43b4-bc7f-1b0a1cd1436f"
```
Produce a capability matrix: which federation operations require which adapter
capabilities (read, write, diff, merge, lock, version, publish, notify,
transclude-source).
Cross-check against INTENT capability-aware adapters principle. Identify
graceful degradation paths for limited backends (read-only participant,
projection-only, patch target).
This matrix **consumes the capability vocabulary defined in T11** — keep the two
in sync. Feeds `spec/TechnicalSpecificationDocument.md` adapter contract section.
---
# Shard adapter contract (folded from engine deep dives, 2026-06-13)
These tasks distill the cross-cutting **adapter-contract constraints** surfaced by
the four engine deep dives (wiki-engines landscape, XWiki, TWiki, Foswiki). They
answer *what a backend must expose to participate as a shard*, complementing the
federation tasks above (which answer *what the union does*). Output target:
`spec/TechnicalSpecificationDocument.md` (adapter contract section), cross-linked
from `spec/FederationArchitecture.md`.
Recurring cross-engine insight to honor: **structure and history in text files
federate far more easily than in a database**, and **Foswiki::Store already proves
the versioned-interface-with-swappable-backends pattern** the contract should adopt.
## Adapter contract: capability model & versioned interface
```task
id: SHARD-WP-0002-T11
status: todo
priority: high
state_hub_task_id: "a7379621-6694-488b-94ca-846b8e27e745"
```
Define the **capability-aware shard adapter contract** as a *versioned* interface,
taking `Foswiki::Store` + `Foswiki::Meta` as direct prior art (a real engine that
already separates store backend from core behind a stable interface).
- **Operation verbs:** `read, write, diff, merge, lock, version, publish, notify,
transclude-source, translate-syntax, structured-payload` (reconcile with T10).
- **Capability profile = the thirteen spectra** (synthesis v2 §2), each a *position* not a
boolean, so federation ops degrade by position:
1. addressing granularity (none → path → page-level store id → in-file span → in-file
block `id::` → store-UUID → portable tumbler)
2. content identity (none → path/title → fingerprint → span-set)
3. identity vs placement (path=identity → **identity separated from placement**:
Trilium note/branch; a page in many locations = a DAG)
4. structure (flat MD → frontmatter/`key::` → %META% → typed objects → DB
schema+relations → object-graph/ontology → **computed: inherited+templated**)
5. history (none → internal-only / **CRDT-log** → open-file → git-native)
6. **merge model** (none → git/text → conflict-notes/keep-both → **native-CRDT**)
7. native query (none → text → **build-your-own derived index** → datalog/graph → DB query)
8. translation (native → lossless → lossy-with-fidelity-report; incl. HTML)
9. attachment mode (file-store [native *or* interchange/sync-mirror] → in-engine-host →
local-REST → external-API → CRDT-replica → P2P/no-central-endpoint)
10. operational envelope (local/unbounded → realtime CRDT/WebSocket → rate-limited/
eventually-consistent/paginated)
11. access grant (open → token → OAuth scoped+revocable → P2P key/invite)
12. **content opacity** (plaintext → encrypted-at-rest whole-shard → **per-item**)
13. write granularity (whole-file → per-page/note → per-block)
- Versioning/compatibility rules for the contract itself; capability discovery
(static profile vs runtime negotiation).
**Inputs:** `260608-wikiengines-overview` §3, §5; `260613-foswiki-deep-dive` §2, §6;
`260614-shard-spectrum-synthesis` §2, §5 (v2). **Provides** the vocabulary T10's matrix
consumes. **UCs:** UC-02, UC-35, UC-38, UC-57, UC-61, UC-64.
**Tradeoffs:** Rich capability set (precise degradation) vs contract complexity;
static profile vs runtime capability negotiation.
---
## Page model: structured / typed payload representation
```task
id: SHARD-WP-0002-T12
status: todo
priority: high
state_hub_task_id: "7334a4a4-ba75-4fac-a8b4-8350d342b299"
```
Decide how the **backend-neutral, Markdown-first page model carries structured data
without flattening**:
The model must stretch **many ways at once** (synthesis v2 §3): prose Markdown, typed
*and computed* records, non-Markdown assets, reference/query-defined pages, and
**multi-placement (DAG) identity**.
- Source shapes: XWiki XObjects against an XClass; TWiki/Foswiki DataForms stored as
`%META:FIELD%` in text; Foswiki MetaDataPlugin **multiple records per topic**;
Semantic MediaWiki annotations; **Notion databases** (schema + typed properties +
inter-record **relations** + rollups/formulas) — the apex of database-as-pages.
- Representation choice: typed frontmatter vs sidecar file vs opaque provenance blob.
Prefer **in-text structure** (frontmatter/`%META%`, git-diffable); tolerate DB
structure via sidecar + fidelity report (T15).
- **Bodiless pages** (UC-39): may a page be purely structured, no Markdown body?
- **N typed records per page** (not one form) must be representable.
- **Non-Markdown content types** (UC-55): drawings (Excalidraw), spatial canvases
(JSON Canvas), images, attachments — typed asset vs opaque blob vs content-type
registry, with provenance, not flattened away.
- **Inter-record relations** (UC-58): represented as typed links in the union link
graph, a separate relation index (cf. ZigZag many-to-many), or both (T16).
- **Query-defined / reference pages** (UC-44, UC-54): a page whose canonical form is a
span manifest (Xanadu EDL) or a saved query (Dataview/Notion linked DB) — coordinate
with T16.
- **Computed metadata** (UC-67): Trilium attributes are **inherited (down the tree) +
templated**, so effective metadata = own + inherited + templated. Represent
**effective-vs-own with per-attribute provenance** (own / inherited-from / template);
decide materialize (snapshot) vs compute-live.
- **Multi-placement / DAG identity** (UC-66): Trilium **note (identity) vs branch
(placement)** — a page may occupy several locations at once. Separate **page identity
from placement** (one entity, N placements/paths/shards); no single canonical path —
coordinate with T16 (the namespace-level clone/reference primitive).
**Inputs:** `xwiki` §2.3; `twiki` §2.3; `foswiki` §4; `notion` §2§3; `obsidian` §3;
`trilium` §2§3; `localfirst-workspaces` §1§3; `shard-spectrum-synthesis` §3 (v2).
**UCs:** UC-34, UC-39, UC-55, UC-58, UC-54, UC-44, UC-66, UC-67.
**Tradeoffs:** Lossless fidelity vs a uniform queryable model; diff/search over
structured fields vs prose; one coherent model vs many content shapes; effective-vs-own
metadata snapshot vs live computation.
---
## History portability: supplement vs import
```task
id: SHARD-WP-0002-T13
status: todo
priority: high
state_hub_task_id: "6837862a-8f57-410d-9200-a6a5dcf1a7b9"
```
Define how the **coordination journal** relates to an engine's native history (aligns
with and refines T4):
History is a spectrum (synthesis v2 §2): `none → internal-only / CRDT-log → open-file →
git-native`.
- **Adopt** — already git-native (Git folder/repo, Obsidian-with-Git, Logseq files): use
as-is.
- **Supplement** — engine history is non-portable: DB-internal (Confluence, MediaWiki,
XWiki `xwikircs`, **Notion**, **Joplin/Trilium** revisions) or a **CRDT update log**
(Anytype/AFFiNE/AppFlowy): the journal begins now / mirrors forward / snapshots the
replica (UC-36).
- **Import** — engine history is an open file format (TWiki/yawex RCS `.txt,v`,
Foswiki PlainFile timestamped copies): backfill into Git preserving author/timestamp
(UC-41).
- Authoritative journal vs mirror-reconciled-back; one-time vs continuous.
**Inputs:** `xwiki` §2.4; `twiki` §2.1; `foswiki` §2.2; `notion` §4; `joplin` §1;
`trilium` §1; `localfirst-workspaces` §4. **UCs:** UC-36, UC-41.
**Tradeoffs:** Import fidelity vs effort; duplicated history vs single source of truth.
---
## Adapter binding: attach path, hosting, backend-swap
```task
id: SHARD-WP-0002-T14
status: todo
priority: medium
state_hub_task_id: "f8835969-d118-4738-952a-5e67e5209f3d"
```
Decide **how and where an adapter binds to a backend**:
**Full attachment-mode taxonomy** (synthesis v2 §2, §3), with a backend possibly
offering more than one — so attach mode is a **per-binding, capability-gated choice**,
not a fixed property:
- **File-store direct** — read the on-disk store as a folder shard, in two sub-kinds:
- *native store* — Obsidian vault, **Logseq** `pages/`+`journals/` (with a format
profile parsing `id::`/`key::`), TWiki `data/`, Git repo: offline, git-native, but
risks inconsistent reads under a running engine (UC-40, UC-53, UC-62).
- *interchange / sync mirror* — a tool's documented sync representation on a third-party
target (**Joplin** items on WebDAV/Nextcloud/S3): app-independent, read/projection/
overlay-mostly (the tool owns the format; never re-sync) (UC-60).
- **In-engine hosted adapter** — adapter runs *inside* the app via its extension API
(XWiki components; TWiki/Foswiki handlers; **Roam Depot** over `roamAlphaAPI`;
**Obsidian plugin** over `App.vault`; **Logseq** plugin; **Trilium** scripting code
notes): high fidelity, needs deploy access (UC-38, UC-50).
- **Local-REST** — a localhost API served by the running app (**Joplin** Data API;
**Trilium** ETAPI): app-must-run, token auth (UC-38, links UC-57).
- **External-API only** — attach from outside via a remote REST API, no in-engine
hosting (**Notion**): full write-through without deploy access, but bounded by the
**operational envelope** (rate limit, eventual consistency, payload caps) and a
**scoped, revocable access grant** that enforces no-silent-mutation (UC-57).
- **CRDT replica** — hold a local CRDT replica (**Anytype/AFFiNE/AppFlowy**: any-sync/
Yjs/Yrs): the backend merges natively — respect CRDT semantics, don't git-merge; or a
self-host sync endpoint (AFFiNE/AppFlowy Cloud) (UC-64).
- **P2P / no-central-endpoint** — bind a replica or a named peer/node, not a URL
(**Anytype** any-sync), content possibly E2EE (UC-65).
- **Dual / multi attach** — a backend offering several modes (Obsidian/Logseq: file *or*
plugin; TWiki: file *or* API; Joplin: mirror *or* Data API): pick per binding; declare
which is authoritative (UC-53).
- **Backend-swap / substrate-migration tolerance** — shard identity/provenance survives a
storage change (Foswiki RCS↔PlainFile; folder→Git; **Logseq file→SQLite DB-graph**) —
bind to capabilities, not to "it's files" (UC-43).
**Inputs:** `twiki` §5§6; `xwiki` §3; `foswiki` §2; `roam` §5; `obsidian` §4;
`notion` §4, §6; `joplin` §2, §4; `logseq` §4§5; `localfirst-workspaces` §4; `trilium`
§5; `shard-spectrum-synthesis` §3 (v2). **UCs:** UC-38, UC-40, UC-43, UC-50, UC-53,
UC-57, UC-60, UC-62, UC-64, UC-65.
**Tradeoffs:** Fidelity vs deploy access; consistency vs offline capability; external
write-through vs rate-limit/eventual-consistency ceiling; CRDT-replica liveness vs
snapshot simplicity.
---
## Syntax translation & content fidelity
```task
id: SHARD-WP-0002-T15
status: todo
priority: medium
state_hub_task_id: "22b57b3a-b06b-4ff0-a34a-667a0386bf25"
```
Specify how **non-Markdown shards** participate in the Markdown-first model:
Translation is a spectrum (synthesis §2): `native → lossless → lossy-with-fidelity-report`.
- Read native markup (TWiki/Foswiki TML, XWiki syntax) into the page model and accept
Markdown overlays back via **bidirectional, lossless translation** (UC-42).
- Feasibility proof: Foswiki **WysiwygPlugin** (TML→HTML for editing, HTML→TML
losslessly on save).
- **Lossy-with-fidelity-report** (UC-59) — for models that do *not* round-trip: **Notion**
blocks/rich-text/databases (export is lossy); **Trilium** **HTML** (CKEditor — more
tractable than blocks but still lossy); CRDT/object models. Translate lossily but **make
fidelity loss visible** — a per-shard/per-page report of what projects cleanly vs.
degrades, with non-mappable elements preserved as provenance/sidecar. Fidelity becomes
data (union without erasure). Distinct from the lossless case (UC-42).
- **HTML as a source model** (Trilium) joins TML/Notion-blocks/CRDT in the translation
capability — HTML↔Markdown, lossy-aware.
- **Graceful degradation:** when neither lossless nor acceptable lossy translation is
available, the shard is a read-only/projection participant (UC-03), never silently
corrupted.
- Open: may overlays be stored in Markdown, or must they round-trip in native syntax?
**Inputs:** `foswiki` §5; `twiki` §2.4; `xwiki` §2.5; `notion` §3; `trilium` §4.
**UCs:** UC-42, UC-59, UC-03.
**Tradeoffs:** Translation coverage vs read-only floor; Markdown overlays (portable)
vs native-syntax overlays (safe round-trip); lossy-but-usable vs read-only-but-faithful.
---
## Addressing, content identity, and dimensional / query navigation
```task
id: SHARD-WP-0002-T16
status: todo
priority: medium
state_hub_task_id: "b00ca669-59d6-454a-8d6e-f34694e35192"
```
New thread from the conceptual (Xanadu, ZigZag) + modern-tool (Roam, Notion, Obsidian/
Dataview) dives and the synthesis (`260614-shard-spectrum-synthesis` §4). No existing
task owns the addressing/identity/navigation layer that transclusion, overlay,
equivalence, and dimensional views depend on. Refines T8 (transclusion/projection depth)
and T5 (union composition); consumes T11 capabilities.
- **Span addressing** — a portable sub-page address. Adopt **native span IDs** where the
backend mints them (Roam `:block/uid`, Notion/CRDT UUID, Joplin/Trilium page-level id)
or carries them in-file (Obsidian `^id`, **Logseq `id::` — block-level AND git-diffable,
the sweet spot**); fall back to **content fingerprint** or path+range otherwise. Open:
wrap native IDs in a shard-scoped address so they survive projection and don't collide
across shards (Xanadu tumbler is the unreached ideal). (UC-51, UC-44.)
- **Content identity** — detect that two pages are the same / derived content by
fingerprint or span-set overlap, **path-independently** — the equivalence mechanism
UC-27 left open. Enables reverse transclusion (UC-45). (UC-46.)
- **Identity vs placement** — separate **page identity from placement** (Trilium **note vs
branch**: a page cloned into many locations = a DAG). One entity, N placements (paths/
shards); no single canonical path — the namespace-level form of the clone/reference
primitive. (UC-66, UC-22.)
- **Transclusion as one reference-not-copy primitive** — unify Xanadu transclusion,
ZigZag clone, Roam/Obsidian/Logseq embed, Notion synced block, **Trilium note cloning**
over the addressable union (synthesis v2 §3). Compose-by-reference pages (UC-44) and
reverse lookup (UC-45) are views over it.
- **Dimensional / query navigation** — model the union so each relationship (namespace,
genealogy, version, shard, equivalence, links) is a navigable **dimension** (ZigZag),
and a page can be **query-defined** (Dataview/Notion linked DB, UC-54). **Delegate**
view computation to a shard's native query engine where present (Roam/Logseq Datalog,
Notion/AppFlowy DB query, XWiki XWQL); **else build a derived index over the
projection** (Logseq DataScript-over-files pattern, UC-63). (UC-47, UC-48, UC-52,
UC-54, UC-63.)
- **Boundary:** this is a **derived lens over canonical files+journal**, never a new
store (ZigZag dive §6); the many-to-many link graph stays a graph index, not a rank.
**Inputs:** `xanadu` §2§5; `zigzag` §2§6; `roam` §2§4, §7; `notion` §2; `obsidian`
§2§3; `logseq` §1§3; `trilium` §2§3; `shard-spectrum-synthesis` §3§5 (v2).
**UCs:** UC-44, UC-45, UC-46, UC-47, UC-48, UC-51, UC-52, UC-54, UC-63, UC-66.
**Tradeoffs:** Native-ID adoption (cheap, backend-coupled) vs a portable address scheme
(harder, uniform); core navigation API vs internal organizing concept; query delegation
(fast, backend-dependent) vs orchestrator-computed (uniform, costly).
---
## Acceptance criteria
- `spec/FederationArchitecture.md` exists with all ten federation topic sections
(T1T10) and an explicit **decisions / deferred / open** table per topic.
- The **adapter contract** section of `spec/TechnicalSpecificationDocument.md` exists,
populated by T11T16, with the capability vocabulary (T11, the **thirteen spectra**)
reconciled against the T10 federation-ops matrix.
- Each decision honors INTENT: mechanism over policy, union without erasure,
overlay before mutation, no silent remote mutation, shard sovereignty,
capability-aware adapters, Markdown-first / backend-neutral.
- UC-26UC-67 are traceable to architecture / adapter-contract sections
(UC-34UC-43 to T11T15; UC-44UC-67 to T11T16 per
`research/260614-shard-spectrum-synthesis/findings.md` §4, v2).
- Conflicts or dependencies on `SHARD-WP-0001` outputs are listed (e.g.
namespace model affects equivalent-page identity; page model T12 affects
resolution/overlays).
- `SHARD-WP-0001` and `SHARD-WP-0002` can proceed in parallel where topics
are independent; merge conflicts in spec are resolved before implementation
workplan starts.
## Suggested task order
**Federation architecture (T1T10):**
1. T1 positioning (frames everything)
2. T2 remix primitives + T3 equivalent identity (parallel)
3. T4 history model
4. T5 composition + T6 notification (parallel)
5. T7 lifecycle + T8 transclusion (parallel)
6. T9 policy catalog + T10 capability matrix (parallel, finalize doc)
**Adapter contract (T11T16)** — can start in parallel with T1; T11 first as it
frames the rest, and pair it with T10 (shared capability vocabulary):
7. T11 contract & the thirteen capability spectra (frames T12T16; sync with T10)
8. T12 page model + T13 history portability (parallel; T13 aligns with T4)
9. T14 binding + T15 syntax translation (parallel)
10. T16 addressing, identity & navigation (refines T8/T5; finalize adapter-contract spec)