--- id: SHARD-WP-0007 type: workplan title: "foundation implementation — model, contract, decision log, union read" domain: whynot repo: shard-wiki status: active owner: tegwick topic_slug: whynot created: "2026-06-15" updated: "2026-06-15" depends_on: - SHARD-WP-0002 state_hub_workstream_id: "d551fba1-9c48-4841-a9a5-a9f190f73a60" --- # SHARD-WP-0007 — Foundation implementation ## Goal Begin implementation: a **first vertical slice** of the architecture in `src/shard_wiki/`, faithful to `spec/CoreArchitectureBlueprint.md` (esp. §11 module layout, §6 contract, §7 page model, §8.1 keystone) and `spec/TechnicalSpecificationDocument.md §A`. Target capability: **attach folder shard(s) → resolve a page through the union → read it with layered provenance**, plus the **event-sourced decision log keystone**. All code typed, tested (pytest), linted (ruff), pure-stdlib (no new deps). **Non-goal (this slice):** write-through, federation transports, derivation/computational projection, authz beyond the null provider, a network API. Those are later workplans. ## Guiding rules - Honour the blueprint **dependency rule** (§11): `provenance/` and `policy/` are dependency-free leaves; `model/`/`adapters/` import only leaves; `union/`/`projection/` are the derived tier and may import down but nothing imports them. - **Identity ≠ placement ≠ equivalence** (§7.2). **Provenance is layered** (§7.3). - Mechanism over policy; capability-as-data; union without erasure. --- ## provenance/ leaf — layered ProvenanceEnvelope + ⊕ ```task id: SHARD-WP-0007-T1 status: done priority: high state_hub_task_id: "be8f9efe-cfba-46d0-be91-f9b6e87bc0d2" ``` `src/shard_wiki/provenance/`: the `ProvenanceEnvelope` value type (source_shard, source_rev?, observed_at, liveness, staleness_state, authz_context, overlay_state, divergence, lineage) and the **effective composition `⊕`** (page envelope ⊕ span delta → effective; uniform span = zero delta). Frozen dataclasses, no tree deps. Tests: ⊕ identity (no delta), override, partial delta. ## model/ — Identity, Placement, Span, Page, CapabilityProfile ```task id: SHARD-WP-0007-T2 status: done priority: high state_hub_task_id: "780ad01f-c3e1-4b49-9ae9-60e0324178a7" ``` `src/shard_wiki/model/`: `Identity` (shard-scoped stable handle, value-equal, survives edits), `Placement` (path + shard), `Span`, `Page` (identity, body, spans, page-level envelope), page-shape enum; `CapabilityProfile` with the **orthogonal core axes** + a `validate()` applying implication rules that **reject impossible profiles** (§6.5). Imports only `provenance/`. Tests: identity stability vs content change; profile validation accepts/rejects. ## adapters/ — versioned AdapterContract + FolderAdapter (read) ```task id: SHARD-WP-0007-T3 status: done priority: high state_hub_task_id: "f6e35ddb-ab1e-406a-82f8-563244455f6b" ``` `src/shard_wiki/adapters/`: `AdapterContract` (a `Protocol`/ABC with the operation verbs; `profile()` + `read()` mandatory, others optional/`NotSupported`), `contract_version`; a `FolderAdapter` (file-store attachment) that reads a directory of Markdown into `Page`s with a provenance envelope, declaring a verified-shape profile (read-only, file-store, path addressing, git-or-none history). Imports `model/`, `provenance/`. Tests: read a temp folder → pages. ## adapters/ — conformance suite ```task id: SHARD-WP-0007-T4 status: todo priority: medium state_hub_task_id: "12d7fb8d-3842-4142-a462-9d1e6efe58bd" ``` `src/shard_wiki/adapters/conformance.py`: a battery that, given a binding, **verifies declared profile == observed behaviour** (read round-trips; unsupported verbs raise `NotSupported`; absence is honest) and returns a capability-by-capability report; `assert_conformant()` for registration. Run it against `FolderAdapter`. Tests: a conformant adapter passes; a deliberately lying stub fails with a precise diff. ## coordination/ — the event-sourced DecisionLog keystone ```task id: SHARD-WP-0007-T5 status: todo priority: high state_hub_task_id: "c87b1896-59a5-4cde-a292-1086caebd085" ``` `src/shard_wiki/coordination/`: `DecisionLog` — append-only, **totally ordered per space** (single append-authority abstraction; in-memory now, git-backed adapter later), event types (`overlay_created`, `binding_made`, `alias_set`, `merge_decided`, `page_forked`), and a **derived fold** to current coordination state (effective alias table, equivalence set). Tests: append→ordered read; fold reproduces current state; read-your-writes. ## policy/ leaf + union/ — IdentityResolver + minimal union read ```task id: SHARD-WP-0007-T6 status: todo priority: high state_hub_task_id: "fed38b60-dc0b-40cf-93e9-ab0260aa3ff9" ``` `src/shard_wiki/policy/` (leaf: presets + `resolve()` for canonical-source = chorus default); `src/shard_wiki/union/`: `IdentityResolver` + a minimal `UnionGraph` that, over ≥1 attached folder shard plus the decision-log fold (aliases), resolves a name → page(s) with provenance, returning a **chorus set** on ambiguity (ADR-01). Imports down only. Tests: two shards holding the same name → chorus; alias from the log redirects resolution. ## Orchestrator wiring + slice integration test ```task id: SHARD-WP-0007-T7 status: todo priority: medium state_hub_task_id: "86c0b255-e373-460d-859d-a39bf6ea4ffb" ``` A thin `shard_wiki` entry (attach shard, resolve, read) tying the slice together; an **integration test** for the target capability (attach two folder shards → resolve → read union page with layered provenance + chorus). Replace the smoke tests' role (keep them). Update SCOPE + spec/README; ensure `pytest` and `ruff check` are green. --- ## Acceptance criteria - `pytest` green, `ruff check` clean, no new runtime dependencies. - The vertical slice works end-to-end: attach folder shard(s) → resolve → read union page with layered provenance and chorus-on-ambiguity. - Module boundaries match blueprint §11 (leaf rails dependency-free; derived tier imported by nothing) — checkable by inspection/import. - Identity/placement/equivalence are distinct in code; provenance is layered; capability profiles are validated and conformance-checked. - Each task committed; state-hub synced. ## Suggested task order T1 provenance → T2 model → T3 folder adapter → T4 conformance → T5 decision log → T6 resolver/union → T7 wiring + integration.