feat(representation): canonical estate schema, manifest importer, unified estate-export + web seams by hyperpolymath · Pull Request #129 · hyperpolymath/reposystem · GitHub
Skip to content

feat(representation): canonical estate schema, manifest importer, unified estate-export + web seams#129

Merged
hyperpolymath merged 1 commit into
mainfrom
claude/eager-fermi-bld0gh
Jun 20, 2026
Merged

feat(representation): canonical estate schema, manifest importer, unified estate-export + web seams#129
hyperpolymath merged 1 commit into
mainfrom
claude/eager-fermi-bld0gh

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

Why

This is Phase 1 of turning reposystem into the estate cockpit — the unifying representation → visualisation layer. It fixes the root problem found during exploration:

  • The representation was fragmented across five disagreeing sources (Rust types, spec/DATA-MODEL.adoc, config/*.ncl, legacy graph.toml/GRAPH-STRUCTURE.md, and repos.toml).
  • The real ~297-repo estate (repos.toml) was completely disconnected from the visualisation engine (GraphStore), so web/export.json was 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 types is now the single schema of record

  • Estate (multi-estate parameterisation; hyperpolymath = estate chore(deps): bump the cargo group across 1 directory with 2 updates #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. All new fields #[serde(default)] → old data still loads.
  • Seam-sink invariant enforced in EcosystemGraph::add_edge; seams rendered in to_dot; persisted for free via the existing split-file JSON.

The missing bridge + unified interchange

  • reposystem import manifest (src/importers/manifest.rs) maps repos.tomlGraphStore (289 unique repos + aerie/ambientops seams), reusing Forge::from_url and scanner::parse_owner_name. Sibling systems matched by basename (catches systems-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.js consumes the envelope: renders external seams (distinct dashed style) and adds an estate selector + estate filtering. index.html/styles.css add the control + seam node style.

Schema alignment + the "super power collection" registry

  • config/{contracts,reposystem}.ncl aligned to the Rust taxonomy (dropped the competing EdgeKind; added Estate/Seam/RefersTo).
  • config/tools.ncl — new typed registry of the tool collection (embedded core vs extracted standalone, role in the stack).
  • spec/DATA-MODEL.adoc made normative; GRAPH-STRUCTURE.md marked superseded.

Pre-existing build/test fixes (surfaced once the build was unblocked)

  • Cargo.toml: enable gix sha1 feature — gix-hash's Kind::Sha1 (the #[default]) was cfg'd out, failing to compile on rustc 1.94 (this blocked all builds, independent of these changes).
  • scan now honours --json; logs routed to stderr so piped stdout stays clean; fixed an unannotated verisimdb doctest fence.

Verification

  • cargo test113/113, 0 failures (fresh run; supersedes the stale 2026-04-04 baseline).
  • just web-refresh → non-empty web/export.json (289 repos, aerie/ambientops seams, estate scoping); just web-serve renders the real estate with external seam nodes.
  • reposystem export --format dot renders seams (shape=note, dashed).

Notes / follow-ups

  • web/export.json is regenerated with real estate data (it was an empty stub) — reproducible via just web-refresh.
  • Deferred to follow-up PRs (per plan): consolidation gitlink surgery (orphan avatar-fabrication-facility/claim-forge, rpa-elysium path conflict) and Phases 2–6 (GUI/TUI convergence, tools-as-interface, cross-forge control surface, interop).
  • nickel isn't installed in CI here, so the .ncl files 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

…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
@hyperpolymath hyperpolymath marked this pull request as ready for review June 20, 2026 12:59
@hyperpolymath hyperpolymath merged commit f3079e2 into main Jun 20, 2026
16 of 17 checks passed
@hyperpolymath hyperpolymath deleted the claude/eager-fermi-bld0gh branch June 20, 2026 12:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants