{{ message }}
feat(representation): canonical estate schema, manifest importer, unified estate-export + web seams#129
Merged
Merged
Conversation
…fied estate-export + web seams Make reposystem the estate cockpit by fixing the root problem: the representation was fragmented across five disagreeing sources and the real ~297-repo estate (repos.toml) was disconnected from the visualisation engine (GraphStore), so web/export.json was empty and the UI rendered nothing. Representation (Rust `types` is now the single schema of record): - Add Estate (multi-estate parameterisation; hyperpolymath = estate #1), ExternalSeam + SeamDomain (loose cross-links to aerie=network / ambientops=machine; seams are edge sinks), RelationType::RefersTo (the only relation allowed to target a seam), and estate/metadata fields on Repo. - Enforce the seam-sink invariant in EcosystemGraph::add_edge; render seams in to_dot; persist estates/seams for free via the existing split-file JSON. Bridge + interchange: - New `reposystem import manifest` (src/importers/manifest.rs) maps repos.toml into the GraphStore (289 unique repos + aerie/ambientops seams), reusing Forge::from_url and scanner::parse_owner_name. Sibling systems are matched by basename and promoted to seams. - New unified `export --format estate-json` envelope (schema reposystem/estate-export@1) serialises all stores + estates + seams. One serializer, many transports. Visualisation (begin convergence): - web/app.js consumes the envelope: renders external seams and adds an estate selector + estate filtering; styles.css/index.html add the seam node + control. Schema alignment + registry: - config/{contracts,reposystem}.ncl aligned to the Rust taxonomy (drop the competing EdgeKind; add Estate/Seam/RefersTo); config/tools.ncl "super power collection" registry added; spec/DATA-MODEL.adoc made normative; GRAPH-STRUCTURE.md marked superseded. Build/test fixes (pre-existing, surfaced once the build was unblocked): - Cargo.toml: enable gix `sha1` feature — gix-hash Kind::Sha1 was cfg'd out, failing to compile on rustc 1.94 (blocked all builds). - scan now honours --json (emits the graph JSON); logs routed to stderr so piped stdout stays clean. Fixed an unannotated verisimdb doctest fence. Verification: cargo test 113/113; `just web-refresh` yields a non-empty web/export.json (289 repos, aerie/ambientops seams) that the HUD renders. Consolidation gitlink surgery and Phases 2-6 follow in later PRs. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KhFfkfjKaB7Rg957u3uCT6
This was referenced Jun 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Why
This is Phase 1 of turning
reposysteminto the estate cockpit — the unifying representation → visualisation layer. It fixes the root problem found during exploration:types,spec/DATA-MODEL.adoc,config/*.ncl, legacygraph.toml/GRAPH-STRUCTURE.md, andrepos.toml).repos.toml) was completely disconnected from the visualisation engine (GraphStore), soweb/export.jsonwas an empty stub and the UI rendered nothing real.Per the agreed plan: strict repos-only boundary (aerie/ambientops are loose external seams, not absorbed), curated-hybrid cockpit, estate-parameterised now / multi-tenant later, and first step produces the representation and begins converging the front-ends.
What changed
Representation — Rust
typesis now the single schema of recordEstate(multi-estate parameterisation; hyperpolymath = estate chore(deps): bump the cargo group across 1 directory with 2 updates #1),ExternalSeam+SeamDomain(loose cross-links toaerie=network /ambientops=machine; seams are edge sinks),RelationType::RefersTo(the only relation allowed to target a seam), andestate/metadatafields onRepo. All new fields#[serde(default)]→ old data still loads.EcosystemGraph::add_edge; seams rendered into_dot; persisted for free via the existing split-file JSON.The missing bridge + unified interchange
reposystem import manifest(src/importers/manifest.rs) mapsrepos.toml→GraphStore(289 unique repos + aerie/ambientops seams), reusingForge::from_urlandscanner::parse_owner_name. Sibling systems matched by basename (catchessystems-ecosystem/ambientops).export --format estate-json→ the envelope (schema: reposystem/estate-export@1) serialising all stores + estates + seams. One serializer, many transports.Visualisation (begin convergence)
web/app.jsconsumes the envelope: renders external seams (distinct dashed style) and adds an estate selector + estate filtering.index.html/styles.cssadd the control + seam node style.Schema alignment + the "super power collection" registry
config/{contracts,reposystem}.nclaligned to the Rust taxonomy (dropped the competingEdgeKind; addedEstate/Seam/RefersTo).config/tools.ncl— new typed registry of the tool collection (embedded core vs extracted standalone, role in the stack).spec/DATA-MODEL.adocmade normative;GRAPH-STRUCTURE.mdmarked superseded.Pre-existing build/test fixes (surfaced once the build was unblocked)
Cargo.toml: enable gixsha1feature —gix-hash'sKind::Sha1(the#[default]) wascfg'd out, failing to compile on rustc 1.94 (this blocked all builds, independent of these changes).scannow honours--json; logs routed to stderr so piped stdout stays clean; fixed an unannotatedverisimdbdoctest fence.Verification
cargo test→ 113/113, 0 failures (fresh run; supersedes the stale 2026-04-04 baseline).just web-refresh→ non-emptyweb/export.json(289 repos,aerie/ambientopsseams, estate scoping);just web-serverenders the real estate with external seam nodes.reposystem export --format dotrenders seams (shape=note, dashed).Notes / follow-ups
web/export.jsonis regenerated with real estate data (it was an empty stub) — reproducible viajust web-refresh.avatar-fabrication-facility/claim-forge,rpa-elysiumpath conflict) and Phases 2–6 (GUI/TUI convergence, tools-as-interface, cross-forge control surface, interop).nickelisn't installed in CI here, so the.nclfiles weren't machine-validated (they're not consumed by the build); syntax follows standard Nickel.🤖 Generated with Claude Code
https://claude.ai/code/session_01KhFfkfjKaB7Rg957u3uCT6
Generated by Claude Code