Commit graph

541 commits

Author SHA1 Message Date
Meta Vens
89f24a1178 Reorder the migration: codex-connector first, Ghostlight blocked
I had Ghostlight first on the strength of "actively developed". That is
the reason to keep out, not to go in: a world-elaboration and ontology
rebuild is running in it now, with commits landed 2026-09-05 across 178
branches. Adding a recipe to that tree collides with live work.

codex-connector leads instead -- one service, small blast radius, and it
already consumes the core stack from CultLib rather than forking it.
gjallar second as the cheapest end-to-end proof of the systemd-transient
workload driver: quiet repo, one unit, no compose indirection.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 23:17:36 +02:00
Meta Vens
814e08e0c4 Make the public entry point describe the binary that actually ships
The README and unit file I wrote at extraction documented the previous
generation's CLI. Running the deployed ExecStart against a build of this
repository returns `unknown Idunn command "--swarm-profile"`: commit 330e4cd
rebuilt Idunn around typed authority ports and a test now asserts that
--deploy-command, --restart-command and --swarm-profile are rejected. Anyone
following the README would have installed a unit that crashloops on exec
every 5 seconds under Restart=always.

Corrected against the binary, not against the old docs:

- deploy/idunn-yggdrasil.service now invokes `idunn serve` with the real
  flags. systemd-analyze verify passes on yggdrasil. /var/lib/gamecult/odin
  moved from ReadWritePaths to ReadOnlyPaths -- Idunn only reads Odin's
  topology correlation (pull_all_read_only_snapshot, absent store yields
  None), and it gates deployment promotion only: continuity never consults
  it, per stale_odin_provider_receipt_cannot_gate_continuity_restart.
- README documents the three declarative commands, and adds a section on the
  recipe/binding split, which is the security model: capability lives in the
  target's repo, privilege lives in the host binding, and a binding that
  omits an affordance the recipe derives fails admit().
- Corrected two inherited claims. The distinct-brake check is per-binding
  validation ("deployment and lifecycle brakes are identical"), not a
  startup check. And the "inputs: nothing else" claim was false -- the Odin
  correlation read is a real, deliberate exception and now says so.

The legacy actuator moves to deploy/legacy/ rather than being deleted: it is
what is installed and running, so it is the before-side of the migration.
Its README maps each shell mechanism to the contract that replaced it, and
preserves the eleven-target inventory read out of deployment_target_policy().
Seven of the eleven are pinned to a codex/ branch rather than main.

docs/guide.md is marked as the previous generation rather than silently
carrying dead commands, and docs/migration.md is new: per-target order,
what to fix before carrying a ref forward, and why the authority cuts over
last. Also fixes a broken cross-link in authority-map.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 23:15:46 +02:00
Meta Vens
89afe723bb Add the MIT license file the manifest already declares
Cargo.toml carries license = "MIT", but the repository had no LICENSE file. The
manifest field is metadata; the file is what GitHub detects and what a reader
actually relies on. Without it, default copyright applies to anyone who is not
reading Cargo.toml closely.

This is the last gap in the self-hosted deploy chain. Erycina is MIT and its
one-click deployment installs Idunn to bring up Odin, Heimdall, and Erycina
together. Odin, Heimdall, Eve, and CultLib now carry licenses; Idunn is the
component a creator runs first and would have been the one thing in that chain
they had no license to execute.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 22:02:45 +02:00
Meta Vens
e79ad7bc99 Make Idunn independently usable: unit files, docs, and a public entry point
Brings across everything an operator needs to run Idunn without reference to
Odin. deploy/ carries the worked systemd installation -- unit, operator
wrapper, and the narrow sudoers grant. docs/ carries the four documents that
were scattered across Odin's tree.

The README is new and is the public entry point the repo lacked: what Idunn
decides, how to build and run it, the authority model in the form doctrine
asks for, how to install it as a service, and where the deeper documents are.

Two corrections made while moving:

Requires=docker.service becomes Wants=. Deployment runners use Docker;
continuity actuation does not. A hard requirement lets a Docker outage stop
Idunn itself and take daemon survival down with it, which is precisely the
invariant Idunn exists to hold. This is live on yggdrasil today and should be
changed there too.

The guide still told operators to run from E:\Projects\Odin -- a drive that no
longer exists -- via npm wrappers that belonged to Odin. Paths generalised,
commands moved to direct cargo invocations, and a note added that the document
predates the extraction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 18:15:40 +02:00
Meta Vens
cc5ff98245 Stand Idunn up as its own repository
Extracted from Odin with full history via subtree split -- 136 commits, not a
flat copy. Idunn had lived as crates/idunn-daemon inside the repository of a
service it manages, which inverted the authority it exists to hold: doctrine
says Idunn must start, recover, observe and report while any managed target is
absent, and it was a directory inside one.

Manifest made standalone: workspace inheritance replaced with concrete edition,
license and publish; package renamed idunn; and cultmesh-rs moved off the
vendored path onto CultLib at c13b6ba, where the reconciled crate now lives.
All three substrate deps now resolve from CultLib and nothing resolves from
Odin.

The severing was small because most of it had already happened. idunn-daemon
already sourced its contracts from cultnet_rs -- brakes, service identity,
runtime activation, expected incarnation. One residual odin_core import
remained, and four of its six symbols were not odin-core's to begin with; it
merely re-exported them from cultnet_rs. drivers.rs was already importing two
of those directly, so the crate disagreed with itself about where they came
from.

Behaviour preserved exactly: 63 passed / 18 failed here, identical to the
results in the Odin tree. The 18 are Windows path semantics -- Linux
deployment paths against Path::is_absolute -- not regressions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 17:53:29 +02:00
Meta Vens
d3b237a875 Sever idunn-daemon's last import from odin-core
IdunnDaemonHealthTrustBindingRecord and its schema constant moved to
cultnet-rs (GameCult/CultLib@c13b6ba). odin-core now imports them from
cultnet_rs instead of defining them, and idunn-daemon/provisioning.rs
pulls all six provider-health symbols from cultnet_rs directly, merged
into its existing cultnet_rs use block. Dropped the odin-core path
dependency from idunn-daemon/Cargo.toml — nothing in the crate reaches
odin_core:: anymore. Bumped the CultLib git rev across all six
consuming manifests to the new commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 17:43:24 +02:00
Meta Vens
799ce1ae7b Bump CultLib to ae0ac0d and give odin-core its missing rmp-serde dev-dep
Moves all six CultLib pins from cbde940 to ae0ac0d, which carries the
reconciled cultmesh-rs. The delta is three commits and near-nothing in the
packages Odin consumes: a license line, two lines in cultnet-rs replication,
and one additive pub fn.

The dev-dependency is a real pre-existing defect, not fallout from the bump.
odin-core's tests use rmp_serde in crates/odin-core/src/idunn.rs but never
declared it, so the lib-test target has never compiled. Verified pre-existing:
9 errors at the old pin, 8 at the new. With the dep declared, odin-core tests
compile and 22 pass -- including idunn_records_round_trip_through_cultmesh,
which matters for the extraction this branch is preparing.

Note for anyone checking this on Windows: odin-daemon does not build here and
that is expected, not a regression. It imports std::os::fd and from_raw_fd,
which are Unix-only. Identical failure at both pins.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 17:35:54 +02:00
Meta Vens
391a7e2a3c Land the Idunn projection, UDP route actuation, and the Odin daemon
This had been sitting uncommitted in the worktree. It is real work rather than
stray edits: RouteBinding gains stable_socket and an NginxStreamUdp driver so a
route can be actuated over UDP, control_plane and drivers grow the Idunn-owned
projection and bounded RUDP transport, and crates/odin-daemon arrives as a new
member of the workspace.

The deployment recipe comes with it, including the required_gitlinks fix the
core-stack repoint made necessary: it named vendor/cultnet-rs, which no longer
exists now that CultNet comes from CultLib, so Idunn would have refused to admit
the target. The list is empty because Odin has no submodules left; the core
stack is pinned by revision in Cargo.lock inside the frozen source tree.

Everything except odin-daemon builds here. odin-daemon reads systemd listen
file descriptors through std::os::fd and cannot compile on Windows by design, so
Linux CI is its first real witness. muninn and sleipnir pass 162 tests; the one
failure expects an Unreliable media channel that no CultNet lineage has ever
declared, and predates this.

Committed rather than left in flight. rustfmt reports 94 files across the repo,
which predates this work, so formatting is left for its own pass instead of
being buried in a 4,000-line diff.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 15:13:38 +02:00
Meta Vens
93a30a2974 Consume CultCache and CultNet from CultLib instead of forking them
The CultNet submodule and the in-tree CultCache copy are gone. Both now come
from CultLib, and vendor/cultmesh-rs is the only fork left -- it too consumes
CultLib, so exactly one version of each crate spans the graph. That mattered:
mixing sources would have put two cultnet-rs crates in one build, and the types
would not have unified.

The in-flight CultMesh RUDP document server comes with it because it is a
prerequisite, not a coincidence. The previously committed CultMesh calls
assume_connected(), a CultNet method Odin's fork carried and CultLib does not,
so the old code cannot build against CultLib at all. The newer code no longer
calls it. Verified by reverting the file and watching it fail.

Three API differences needed adapting: CultLib's transport options carry a
reconnect_policy the fork lacked (7 sites), its create_ack builds the packet
straight from ack state and so cannot fail, and its transport profile owns each
channel's reliable expiry.

Everything but odin-daemon builds; odin-daemon is Unix-only and does not compile
on this machine either way. muninn and sleipnir pass 162 tests. The one failure,
rudp_media_transport_options_follow_low_latency_profile, expects an Unreliable
media channel while every CultNet lineage including both revisions Odin had
pinned declares it Reliable, so it failed before this change too.

The in-flight idunn-daemon work is deliberately left uncommitted; the committed
tree was verified to build without it. Also left alone: the untracked
odin-daemon crate and deployment recipe, and the root manifest, whose now-dead
vendor excludes are inert. That recipe still requires the vendor/cultnet-rs
gitlink and will refuse admission until that line is dropped -- the fix is in
the working tree, waiting on that directory being tracked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-04 14:54:58 +02:00
Meta Vens
84c25d22c2 Reject pre-OpenFile control records 2026-09-03 06:05:23 +02:00
Meta Vens
c7aefb1e5a Fence parent-only runtime signing credentials 2026-09-03 06:02:54 +02:00
Meta Vens
1fc0dadec3 Rebuild Idunn deployment transaction authority 2026-09-03 05:23:06 +02:00
Meta Vens
676f6eeb80 Freeze exact deployment source before actuation 2026-09-03 00:28:29 +02:00
Meta Vens
5b0b59049e Harden Idunn native authority drivers 2026-09-02 23:54:20 +02:00
Meta Vens
821a8d0646 Rebuild Idunn around typed authority ports 2026-09-02 23:13:36 +02:00
Meta Vens
49e8b18f78 Simplify Idunn deployment authority contracts 2026-09-02 21:02:30 +02:00
Meta Vens
d67a6b2429 Define Idunn deployment authority contract 2026-09-02 18:31:13 +02:00
Meta Vens
77ad17d588 Encode a genuinely noncanonical admission fixture 2026-09-02 14:21:04 +02:00
Meta Vens
732c44000a Keep canonical origin output alive for validation 2026-09-02 14:16:48 +02:00
Meta Vens
ba1973090c Bind Idunn deployment and runtime admission 2026-09-02 13:53:07 +02:00
Meta Vens
46699e6ada Align capstone release with package identity 2026-08-25 12:28:36 +02:00
Meta Vens
c06e107320 Rename Epiphany capstone target 2026-08-25 12:11:43 +02:00
Meta Vens
13999872f2 Add isolated Epiphany container target 2026-08-25 04:33:18 +02:00
Meta Vens
0c6cba0664 Retire Nightwing Gjallar from active state 2026-08-25 04:29:07 +02:00
Meta Vens
927b56dd41 Give Codex Connector an independent Idunn target 2026-08-24 21:19:13 +02:00
Meta Vens
2a8488f5f8 Let systemd own unsigned Gjallar continuity 2026-08-24 20:58:33 +02:00
Meta Vens
a2393d79c1 Move Gjallar supervision to Yggdrasil 2026-08-24 20:40:19 +02:00
Meta Vens
afce135731 Bound Idunn operational history 2026-08-23 00:54:06 +02:00
Meta Vens
010c359dfd Bound Idunn authenticated health history 2026-08-23 00:40:52 +02:00
Meta Vens
40e73566d6 Expose Idunn deployment brake denial causes 2026-08-22 16:09:20 +02:00
Meta Vens
3ba969155e Let Idunn lock deployment brake snapshots 2026-08-22 15:57:02 +02:00
Meta Vens
08b578db05 Authorize Epiphany unit promotion 2026-08-22 13:00:07 +02:00
Meta Vens
6659aff65c Validate generic signed health admissions 2026-08-22 09:45:55 +02:00
Meta Vens
e358a46a1d Authorize Ghostlight deployment surfaces 2026-08-22 03:00:49 +02:00
Meta Vens
da18109ec7 Admit root-authorized health signer rotation 2026-08-22 02:56:36 +02:00
Meta Vens
3d258affa4 Rotate one provider health trust signer 2026-08-22 02:37:57 +02:00
Meta Vens
055a352835 Witness Heimdall source-selected releases 2026-08-22 02:17:55 +02:00
Meta Vens
6f107e1b9d Preserve millisecond health admission time 2026-08-21 21:33:01 +02:00
Meta Vens
7a41cb54bc Select deployable source revisions 2026-08-21 21:15:58 +02:00
Meta Vens
733273d65a Admit Ghostlight to Idunn continuity 2026-08-21 21:02:20 +02:00
Meta Vens
345c3e69d1 Give Idunn Epiphany source change authority 2026-08-21 20:59:11 +02:00
Meta Vens
cb11552536 Fix signed daemon health schema admission 2026-08-21 20:14:15 +02:00
Meta Vens
d245a77af7 Remove Odin runtime from Idunn bootstrap inputs 2026-08-21 20:07:57 +02:00
Meta Vens
86058c72a9 Admit Odin as a signed Idunn target 2026-08-21 19:50:24 +02:00
Meta Vens
0577f26f05 Separate Idunn continuity from deployment state 2026-08-21 19:34:32 +02:00
Meta Vens
d2c0a4f952 Respect coarse ingress timestamp precision 2026-08-20 20:29:46 +02:00
Meta Vens
5b0163e153 Keep Idunn UDP listeners alive across interrupted receives 2026-08-20 20:19:24 +02:00
Meta Vens
73b27cf967 Decouple Idunn runtime from Epiphany 2026-08-20 19:14:45 +02:00
Meta Vens
ce6c28ac15 Make Idunn deployment brake read-only 2026-07-20 00:07:04 +01:00
Meta Vens
f5f50b2327 Gate Idunn actuation with typed deployment brake 2026-07-19 23:56:42 +01:00