generated from coulomb/repo-seed
feat(space): InformationSpace orchestrator + integration; foundation slice complete (WP-0007 T7)
InformationSpace ties the slice together: conformance-gated attach → resolve → read, with alias() recording coordination decisions in the log. Exposed from the package root. End-to-end integration test (two folder shards → union read with layered provenance + chorus + alias redirect + red-link + nonconformant-rejected). pyflakes clean, 39 tests green. Flips WP-0007 done. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
42
src/shard_wiki/space.py
Normal file
42
src/shard_wiki/space.py
Normal file
@@ -0,0 +1,42 @@
|
||||
"""InformationSpace — the thin orchestrator entry tying the slice together (blueprint §3 L6).
|
||||
|
||||
A root entity / information space: shards attach to it (conformance-gated, TSD §A.2), a
|
||||
coordination decision log records its canonical decisions, and a derived union resolves names to
|
||||
pages. This is the L6 consumer surface for the foundation slice (attach → resolve → read);
|
||||
a network API is a later workplan.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from shard_wiki.adapters import ShardAdapter, assert_conformant
|
||||
from shard_wiki.coordination import DecisionLog, EventType
|
||||
from shard_wiki.model import Page
|
||||
from shard_wiki.policy import DEFAULT_POLICY, Policy
|
||||
from shard_wiki.union import Resolution, UnionGraph
|
||||
|
||||
__all__ = ["InformationSpace"]
|
||||
|
||||
|
||||
class InformationSpace:
|
||||
def __init__(self, space_id: str, policy: Policy = DEFAULT_POLICY) -> None:
|
||||
self.space_id = space_id
|
||||
self.log = DecisionLog()
|
||||
self.union = UnionGraph(space_id, log=self.log, policy=policy)
|
||||
|
||||
def attach(self, adapter: ShardAdapter) -> None:
|
||||
"""Attach a shard — only if it passes conformance (verified profile, I-3/§6.6)."""
|
||||
assert_conformant(adapter)
|
||||
self.union.attach(adapter)
|
||||
|
||||
def alias(self, name: str, target: str, actor: str | None = None) -> None:
|
||||
"""Record a coordination-canonical alias (``name`` → ``"shard:key"``) in the log."""
|
||||
self.log.append(
|
||||
self.space_id, EventType.ALIAS_SET, {"alias": name, "target": target}, actor=actor
|
||||
)
|
||||
|
||||
def resolve(self, name: str) -> Resolution:
|
||||
return self.union.resolve(name)
|
||||
|
||||
def read(self, name: str) -> Page:
|
||||
"""Resolve and return the page (or the canonical pick of a chorus). KeyError if red-link."""
|
||||
return self.union.resolve(name).single()
|
||||
Reference in New Issue
Block a user