Commit graph Odin/src
Author SHA1 Message Date
Meta Vens
3f22fd1d76 Hermodr leaves Odin
Hermodr is a browser lowering, not an all-seer organ. It lived here as Node
inside a Rust repository, sharing a module directory with the coordinator, and
until this week it ran its own provider ingress and accepted publications into a
private store. The ingress went first on purpose: extracting it beforehand would
have relocated a second acceptance authority and called that progress.

Removed: the daemon, its provider subscription source and state stream, both
test files, four lifecycle scripts, the persona avatar, the hermodr:start
script, and src/odin/utils.cjs, whose only remaining consumer was Hermodr and
which it used for one of six functions.

src/odin/ falls from fourteen modules to eleven. The CommonJS surface falls from
sixteen files to twelve. What is left is the coordinator, the Rust organs, and
two adapters declaring contracts other repositories own.

The plan document stays as the record of what left and why. Phase 5, static
lowering, is Hermodr's business now.

5 tests pass, syntax check clean over twelve files.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:46:06 +02:00
Meta Vens
20bacabf7c Reduce Odin's document catalog to a CultLib adapter
defineOdinDocuments was 536 lines defining 45 CultCache document types for Eve,
Ghostlight, Heimdall, Idunn, Muninn, Sleipnir, Aetheria, VoidBot and Stonks.
The name was the only part of it that was Odin's.

The catalog is now cultcache-ts's defineSwarmDocuments, verified byte-identical
to what this file produced. What remains here is 26 lines resolving CultLib and
re-exporting under the name Odin's consumers already call, so odin-coordinator
and the two discovery tests are untouched.

This was the last shared dependency between Odin and Hermodr. utils.cjs now has
exactly one consumer, hermodr-daemon, using exactly one of its six functions, so
it leaves with Hermodr rather than staying as a library nobody here reads.

CULTLIB_ROOT is honoured with the sibling walk as fallback, matching the health
adapter and hermodr-daemon.

22 tests pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:41:28 +02:00
Meta Vens
ac3336adeb Reduce Odin's Idunn health publisher to Idunn's contract
idunn-rudp.cjs was 324 lines of which almost none were about Idunn. The
transport moved to CultLib as cultnet-ts's signed-daemon-health module, beside
the RUDP session it was already built on. What is left here is 65 lines: the
three constants naming Idunn's wire contract, and the call shapes Odin's
consumers already use.

The constants are declared, not decided. Idunn defines them in
docs/signed-daemon-health-authority.md, which until today did not state the
connection id at all -- the value describing how to reach Idunn existed only in
this consumer. Declaring two constants against a documented contract is not
duplicated authority; duplicating 311 lines of transport across Odin and a
future Hermodr repository would have been.

The module also stops resolving CultLib by walking up three directories from its
own location. It now honours CULTLIB_ROOT with that walk as a fallback, matching
what hermodr-daemon.cjs already did. The old assumption held only while Odin sat
beside CultLib, and Erycina broke on exactly that when it moved.

The signed-health test now supplies IDUNN_HEALTH_CONTRACT to the publisher it
builds by hand, and still asserts the literal wire values, so a change to the
contract constants fails loudly rather than being absorbed.

Verified: 22 tests pass across six files, including signature verification
against the relocated implementation, and the syntax check is clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:29:53 +02:00
Meta Vens
b6f3296484 Hermodr reads providers instead of accepting from them
Hermodr constructed its own OdinLivePublicationSource, opened its own
provider-session ingress on its own bind address with its own token, and served
that private store to browsers. A surface reached a browser only if its provider
bound to Hermodr specifically, which made a required ingress out of something
named a bridge, and meant a provider had to publish twice: once where the Verse
expects it, and once into Hermodr so an operator could watch their own command
land.

Providers own their state. Odin advertises where it lives. Hermodr now resolves
a provider through the catalog and reads that provider directly, which is what
the command path has always done: findProviderCommandRoute looks a route up in
the catalog and publishes intent to the provider's own endpoint. The state leg
now matches the intent leg, and the round trip closes without the provider
publishing anywhere twice.

ProviderSubscriptionSource presents the same narrow port the store did, so
HermodrStateStreamRegistry is untouched and browsers keep their sequence numbers
and stale/reconnected transitions. Its read is injected, which is what makes the
lifecycle semantics testable without a live Verse.

One invariant is worth naming because getting it wrong is silent: a failed read
is not a withdrawal. A provider restart or a dropped packet must not render as
the provider retracting state it still holds, so read errors are reported and
the previous value stands, while genuine absence withdraws. Both are tested.

Route resolution is cached for thirty seconds and the state is not cached at
all, since routes change slowly and state is the thing being watched. A wedged
peer is dropped so the next poll reconnects.

Deleted: the ingress construction, --provider-session-bind and
--provider-session-token, live-publication-source.cjs,
provider-session-ingress.cjs, their test, parseBind, and three imports left
unused. src/odin/ falls from fourteen modules to twelve. The removed options and
env vars now fail loudly through the existing rejectRemovedOptions path in both
spellings parseArgs can produce.

Polling is a first cut, not the destination. CultMesh ships
cultMeshPollingDocumentWatcher for exactly this shape, and the cadence is
--provider-poll-interval-ms. A push subscription belongs here later; it does not
change the authority, which is the point of this commit.

Verified: 22 tests pass across six files, syntax check clean over sixteen
CommonJS files. Not verified: behaviour against a live provider over RUDP, which
needs a running Verse and is an operator step.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 18:41:39 +02:00
Meta Vens
222fe03896 Move Idunn's unit files, docs and operator scripts out of Odin
Completes the extraction. Unit files and documentation went to the Idunn
repository, where a service's own deployment surface belongs. Operator scripts
went to gamecult-ops, which is where fleet tooling lives.

To Idunn: scripts/linux/idunn-yggdrasil{,.service,.sudoers}, docs/idunn.md,
docs/idunn-deployment-authority.md,
docs/idunn-signed-daemon-health-authority.md, src/Idunn/README.md.

To gamecult-ops/scripts/idunn/: the eight PowerShell and cmd operator tools --
deployment targets, startup install, swarm coverage health, operator alarm
notification, local start.

Staying in Odin, deliberately: crates/odin-core/src/idunn.rs, Odin's own
projection of Idunn state for aggregation; src/odin/idunn-rudp.cjs, its client
for talking to Idunn; test/idunn-signed-health.test.cjs, its own integration
test; and deployment/idunn/recipe.toml, which despite the path builds
odin-daemon and is Odin's recipe expressed in Idunn's format.

docs/transport-shortcut-inventory.md is a dated evidence ledger citing several
of the moved script paths. Its entries are left as written and a path note
added at the top -- rewriting a ledger to match a later reorganisation would
destroy the record it exists to keep.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-05 18:16:38 +02:00
Meta Vens
27cc8156bc 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
a8db89d961 Expose typed Eve surfaces beyond loopback 2026-08-25 03:56:53 +02:00
Meta Vens
ba76a7239a Serialize Odin provider document persistence 2026-08-23 19:41:59 +02:00
Meta Vens
ed56dab812 Persist Ghostlight public schema catalogs 2026-08-23 19:31:47 +02:00
Meta Vens
b4f9a2e95f Register Heimdall access discovery documents 2026-08-22 03:53:10 +02:00
Meta Vens
c7012a87c9 Admit Odin as a signed Idunn target 2026-08-21 19:50:24 +02:00
Meta Vens
92fab01d37 Make Idunn admission atomic and request-bound 2026-07-17 02:37:42 +01:00
Meta Vens
0495396cc2 Merge remote-tracking branch 'origin/main' into codex/hermodr-live-publications 2026-07-16 00:04:20 +01:00
Meta Vens
1860ded6e5 Deploy release drift through Idunn 2026-07-15 20:31:13 +01:00
Meta Vens
c5d71e1991 Give Idunn ownership of Yggdrasil VoidBot releases 2026-07-15 20:25:16 +01:00
Meta Vens
561e320c43 Resolve Odin CultMesh routes before dialing 2026-07-15 02:03:05 +01:00
Meta Vens
5cb819e94c Ingest live provider session state 2026-07-15 01:45:23 +01:00
Meta Vens
2796884d26 Revert "Stream typed provider state to Eve clients"
This reverts commit 0df723e4c1.
2026-07-15 01:39:24 +01:00
Meta Vens
0df723e4c1 Stream typed provider state to Eve clients 2026-07-15 01:37:58 +01:00
Meta Vens
2c31e6179f Resolve Eve surfaces by advertised record key 2026-07-14 19:38:01 +01:00
Meta Vens
dd46b92823 Wait for provider command receipts 2026-07-13 17:28:21 +01:00
Meta Vens
e7b3cfe14a Bind Hermodr remote RUDP publishers beyond loopback 2026-07-12 23:25:03 +01:00
Meta Vens
37268b4b75 Use provider-advertised command connection IDs 2026-07-12 23:15:03 +01:00
Meta Vens
47302def0c Stop Odin impersonating provider advertisements 2026-07-12 23:08:43 +01:00
Meta Vens
9050465494 Lower provider command URI through its address 2026-07-12 23:07:36 +01:00
Meta Vens
26dd4f2bd4 Merge bounded Odin discovery snapshots 2026-07-12 23:06:44 +01:00
Meta Vens
6ed3f9cadc Union duplicate provider routes in Hermodr 2026-07-12 23:02:22 +01:00
Meta Vens
83ab921493 Keep provider routes authoritative in Hermodr 2026-07-12 22:58:31 +01:00
Meta Vens
45429a6fdf Serve Eve modules with JavaScript MIME type 2026-07-12 22:47:12 +01:00
Meta Vens
188ffedadf Unwrap Rust provider advertisements 2026-07-12 20:00:19 +01:00
Meta Vens
a0b639154c Add Hermodr to Idunn keepalive 2026-07-10 21:29:50 +01:00
Meta Vens
01f296f89d Keep provider document transport schema-blind 2026-07-10 15:13:39 +01:00
Meta Vens
4d333fb68d Consume plugin-owned field schemas 2026-07-10 15:01:30 +01:00
Meta Vens
b9339fc0a3 Preserve provider surface authority in Hermodr 2026-07-10 14:42:08 +01:00
Meta Vens
a3801f6f7a Let Hermodr lower Odin provider surfaces 2026-07-05 20:05:15 +01:00
Meta Vens
c33f3baf1e Route Hermodr surfaces through provider CultMesh 2026-07-05 19:19:36 +01:00
Meta Vens
01ac93825b Preserve body icons in Hermodr gravity documents 2026-07-04 23:22:04 +01:00
Meta Vens
979d450d34 Resolve Odin RUDP endpoint in Hermodr 2026-07-04 22:55:04 +01:00
Meta Vens
4ad8bdb481 Rework Odin transport ownership and service names 2026-07-04 22:38:43 +01:00
Meta Vens
767351f721 Accept Rust provider advertisements over RUDP 2026-06-23 23:52:49 +01:00
Meta Vens
65beba9cd9 Use CultMesh RUDP document catalog in Odin 2026-06-23 22:33:05 +01:00
Meta Vens
005e83f5d3 Ingest live provider announcements over CultNet RUDP 2026-06-23 22:07:04 +01:00
Meta Vens
1754e42515 Drop remote store mirroring from Odin discovery 2026-06-23 20:11:39 +01:00
Meta Vens
e1eb4b45a7 Fix Odin health actuation and share discovery pass 2026-06-23 18:36:59 +01:00
Meta Vens
505c55311f Make Idunn witness checks use daemon-owned state 2026-06-23 17:04:07 +01:00
Meta Vens
196696532a Clarify Muninn RUDP media profile ownership 2026-06-18 23:25:10 +01:00
Meta Vens
bf55a7243c Add Muninn media frame document schemas 2026-06-18 16:33:19 +01:00
Meta Vens
a61368a711 Route Muninn capture activation over RUDP commands 2026-06-18 15:12:16 +01:00
Meta Vens
b43d2a3136 Serve Odin snapshots and retire Gjallar bridge debt 2026-06-17 01:28:55 +01:00
Meta Vens
d9b5d49988 Route agent deployments through Idunn 2026-06-17 00:16:07 +01:00