Consume dendrite; delete the aspect machinery from modules/aspects #27

Open
opened 2026-08-05 21:13:16 +00:00 by agent.odin · 3 comments
Collaborator

modules/aspects/ holds 1213 lines of hand-rolled Dendritic machinery. It is being extracted to lar.ad/dendrite as a self-owned library, so it can be consumed by flake-ops (which independently reimplemented a weaker version of the same thing) and published to sr.ht/~larandar/dendrite.

This ticket is the other half: flaky-mesh stops owning it and starts consuming it.

What moves

file lines destination
_resolve.nix 232 dendrite#10
checks.nix 191 dendrite#10 — synthetic catalogs, no flake needed
_registrar.nix 269 dendrite#11
registrar.nix / resolve.nix / graph.nix 94 dendrite#10–12, as flakeModules
_graph.nix 123 dendrite#12

What stays, and why

All three have transitional intent already written into their own headers, which is a good sign the seam is in the right place:

  • hosts.nix (111) — estate host records
  • parity.nix (107) — migration parity check, blocked on the owner
  • compat.nix (25) — the broad-injection bridge, with a named removal condition
  • _scans.nix (61) — guards one specific flaky-mesh architecture bug

The estate is not currently one implementation

Three exist: larandar.flake uses the flake-aspects library; this repo hand-rolled its own; flake-ops built a third on 2026-08-05 before discovering the second. The principle is sound — flake-aspects is a flawed implementation of it, not the definition — and this repo's version is the corrected one, closing four of flake-aspects' known defects (cycle detection with a full path, deduplication via reasons, diagnostics instead of silent empties, readable identity via string IDs). That is why it is the version worth extracting.

Acceptance

  • dendrite is an input; modules/aspects/{_resolve,_registrar,_graph,checks,registrar,resolve,graph}.nix deleted
  • flake.lib.aspects.resolve still resolves for every host — the public name should survive the move
  • Aspect graph output byte-identical before and after
  • just check green
  • No behaviour change for any host closure

Blocked by dendrite#13.

`modules/aspects/` holds 1213 lines of hand-rolled Dendritic machinery. It is being extracted to [`lar.ad/dendrite`](https://jo.et0.pw/lar.ad/dendrite) as a self-owned library, so it can be consumed by `flake-ops` (which independently reimplemented a weaker version of the same thing) and published to `sr.ht/~larandar/dendrite`. This ticket is the other half: flaky-mesh stops owning it and starts consuming it. ### What moves | file | lines | destination | |---|---|---| | `_resolve.nix` | 232 | dendrite#10 | | `checks.nix` | 191 | dendrite#10 — synthetic catalogs, no flake needed | | `_registrar.nix` | 269 | dendrite#11 | | `registrar.nix` / `resolve.nix` / `graph.nix` | 94 | dendrite#10–12, as flakeModules | | `_graph.nix` | 123 | dendrite#12 | ### What stays, and why All three have transitional intent already written into their own headers, which is a good sign the seam is in the right place: - `hosts.nix` (111) — estate host records - `parity.nix` (107) — migration parity check, blocked on the owner - `compat.nix` (25) — the broad-injection bridge, with a named removal condition - `_scans.nix` (61) — guards one specific flaky-mesh architecture bug ### The estate is not currently one implementation Three exist: `larandar.flake` uses the `flake-aspects` library; this repo hand-rolled its own; `flake-ops` built a third on 2026-08-05 before discovering the second. The principle is sound — flake-aspects is a *flawed implementation of it*, not the definition — and this repo's version is the corrected one, closing four of flake-aspects' known defects (cycle detection with a full path, deduplication via `reasons`, diagnostics instead of silent empties, readable identity via string IDs). That is why it is the version worth extracting. ### Acceptance - [ ] `dendrite` is an input; `modules/aspects/{_resolve,_registrar,_graph,checks,registrar,resolve,graph}.nix` deleted - [ ] `flake.lib.aspects.resolve` still resolves for every host — the public name should survive the move - [ ] Aspect graph output byte-identical before and after - [ ] `just check` green - [ ] No behaviour change for any host closure Blocked by dendrite#13.
Author
Collaborator

Priority bumped by owner direction 2026-08-07.

The system is proven. The estate direction is audit + refactor + converge on flake-ops. This ticket is the first cut — it unblocks everything downstream by making flaky-mesh consume the library it built.

Dendrite#13 shipped. This ticket is unblocked and ready. Every day the hand-rolled resolver in modules/aspects/ diverges from dendrite/lib/ is debt against the extraction.

Execute: make dendrite a flake input, delete the 7 extracted files, prove byte-identical graph output, just check green.

**Priority bumped by owner direction 2026-08-07.** The system is proven. The estate direction is audit + refactor + converge on flake-ops. This ticket is the first cut — it unblocks everything downstream by making flaky-mesh consume the library it built. Dendrite#13 shipped. This ticket is unblocked and ready. Every day the hand-rolled resolver in `modules/aspects/` diverges from `dendrite/lib/` is debt against the extraction. Execute: make dendrite a flake input, delete the 7 extracted files, prove byte-identical graph output, `just check` green.
Contributor

Implemented. Evidence against every acceptance line:

  • dendrite is an input; the 7 extracted files deletedmodules/aspects/{_resolve,_registrar,_graph,checks,registrar,resolve,graph}.nix gone, plus the five synthetic suites and their fixture (tests/aspects/{registrar,resolver,poison,providers,graph}.nix, fixtures/graph-synthetic.json) — those live in dendrite's own checks now.
  • flake.lib.aspects.resolve still resolves for every host — public name rewired to dendrite.lib.mkResolve (builtins.isFunction ✓); per-host resolution exercised by the graph and the kept aspects-selection check.
  • Aspect graph output byte-identicalcmp on nix eval --json .#aspects.graph before/after: identical (21858 bytes).
  • just check greennix flake check all checks passed.
  • No behaviour change for any host closure — all six toplevel drvPaths (bifrost, fenrisulfr, heimdallr, modron, odin, tamiel) bit-identical before/after.

New wiring: modules/aspects/dendrite.nix (consumption: registrar flakeModule, this repo's 11-prefix kinds table with singular names — the shipped taxonomy is declined, assembly switch, the public resolve name, graph + renderer app) and modules/aspects/fleet-checks.nix (the checks that need the real catalog and cannot move: shadow, foreign-enable, isolation, warning-budget, graph-errors, selection, membership-tests). Kept as slated: hosts.nix, parity.nix, compat.nix, _scans.nix.

Three facts the owner should see:

  1. Byte-identity needed a small overlay. Dendrite deliberately dropped two placeholder fields this repo pins: per-host traits = {} and the contracts/globals metrics (its satisfiable metric is the same number only while contract is the sole satisfiable kind). dendrite.nix re-adds them over mkGraph's output with a named removal condition, rather than importing flakeModules.graph. The renderer (aspects-graph.nu) keeps matching.
  2. The shadow fixture was stale before this change — HEAD's hosts.nix already added implementations/forgejo-agents to odin's roots; fixtures/shadow-hosts.json predated it, so aspects-shadow was already red. Regenerated from the byte-identical graph; no other check moved.
  3. Input pins fastlane over ssh. The repo is private (https → 401) and main holds only the bootstrap commit — it is curated at tag time and no tag exists. Input: git+ssh://[email protected]/lar.ad/dendrite.git?ref=fastlane @ c36f971, nixpkgs.follows. Two caveats recorded in the flake.nix comment: the transport dies with the mesh0 decommission (#32), and any CI builder evaluating this flake needs the forge ssh key.

Work is staged on @, not committed — VCS left to the owner.

Implemented. Evidence against every acceptance line: - **dendrite is an input; the 7 extracted files deleted** — `modules/aspects/{_resolve,_registrar,_graph,checks,registrar,resolve,graph}.nix` gone, plus the five synthetic suites and their fixture (`tests/aspects/{registrar,resolver,poison,providers,graph}.nix`, `fixtures/graph-synthetic.json`) — those live in dendrite's own checks now. - **`flake.lib.aspects.resolve` still resolves for every host** — public name rewired to `dendrite.lib.mkResolve` (`builtins.isFunction` ✓); per-host resolution exercised by the graph and the kept `aspects-selection` check. - **Aspect graph output byte-identical** — `cmp` on `nix eval --json .#aspects.graph` before/after: identical (21858 bytes). - **`just check` green** — `nix flake check` all checks passed. - **No behaviour change for any host closure** — all six toplevel drvPaths (bifrost, fenrisulfr, heimdallr, modron, odin, tamiel) bit-identical before/after. New wiring: `modules/aspects/dendrite.nix` (consumption: registrar flakeModule, this repo's 11-prefix kinds table with singular names — the shipped taxonomy is declined, `assembly` switch, the public resolve name, graph + renderer app) and `modules/aspects/fleet-checks.nix` (the checks that need the real catalog and cannot move: shadow, foreign-enable, isolation, warning-budget, graph-errors, selection, membership-tests). Kept as slated: `hosts.nix`, `parity.nix`, `compat.nix`, `_scans.nix`. Three facts the owner should see: 1. **Byte-identity needed a small overlay.** Dendrite deliberately dropped two placeholder fields this repo pins: per-host `traits = {}` and the `contracts`/`globals` metrics (its `satisfiable` metric is the same number only while contract is the sole satisfiable kind). `dendrite.nix` re-adds them over `mkGraph`'s output with a named removal condition, rather than importing `flakeModules.graph`. The renderer (`aspects-graph.nu`) keeps matching. 2. **The shadow fixture was stale before this change** — HEAD's `hosts.nix` already added `implementations/forgejo-agents` to odin's roots; `fixtures/shadow-hosts.json` predated it, so `aspects-shadow` was already red. Regenerated from the byte-identical graph; no other check moved. 3. **Input pins `fastlane` over ssh.** The repo is private (https → 401) and `main` holds only the bootstrap commit — it is curated at tag time and no tag exists. Input: `git+ssh://[email protected]/lar.ad/dendrite.git?ref=fastlane` @ c36f971, `nixpkgs.follows`. Two caveats recorded in the flake.nix comment: the transport dies with the mesh0 decommission (#32), and any CI builder evaluating this flake needs the forge ssh key. Work is staged on `@`, not committed — VCS left to the owner.
Contributor

PR open: !39tango/27-consume-dendritemain, one commit, mergeable.

Two corrections to my earlier comment, which was written against the stale local line (pre-rebase stp), not against main:

  1. The shadow fixture needed no regeneration. Main already carries FM-AUDIT-01's regenerated fixture, and the graph is byte-identical, so aspects-shadow passes untouched. The PR carries no fixture churn.
  2. The byte-identity overlay is metrics-only. Main's graph has no per-host traits = {} placeholder (FM-AUDIT-10 removed it); the overlay re-adds only the contracts/globals metrics.

Verification re-run at the PR base (4cc81493): graph byte-identical (23316 bytes), all six toplevel drvPaths identical, nix flake check green.

One housekeeping note for the owner: the default working copy (qx) still holds the earlier staged version of this work (built on the old line) — it can be dropped; the PR is the canonical version.

PR open: !39 — `tango/27-consume-dendrite` → `main`, one commit, mergeable. Two corrections to my earlier comment, which was written against the stale local line (pre-rebase `stp`), not against `main`: 1. **The shadow fixture needed no regeneration.** Main already carries FM-AUDIT-01's regenerated fixture, and the graph is byte-identical, so `aspects-shadow` passes untouched. The PR carries no fixture churn. 2. **The byte-identity overlay is metrics-only.** Main's graph has no per-host `traits = {}` placeholder (FM-AUDIT-10 removed it); the overlay re-adds only the `contracts`/`globals` metrics. Verification re-run at the PR base (`4cc81493`): graph byte-identical (23316 bytes), all six toplevel drvPaths identical, `nix flake check` green. One housekeeping note for the owner: the default working copy (`qx`) still holds the earlier staged version of this work (built on the old line) — it can be dropped; the PR is the canonical version.
Commenting is not possible because the repository is archived.
No description provided.