No description
This repository has been archived on 2026-10-29. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
  • JavaScript 95.1%
  • PowerShell 4.9%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Meta 43d4590c27 Extract Hermodr from Odin
Hermodr is the Eve browser lowering. It was an organ of Odin: Node inside a Rust
repository, sharing a common module directory with Odin's coordinator, and until
recently running its own provider-session ingress and accepting publications
into a private store.

The ingress was removed first, deliberately. An extraction that carried it would
have moved a second acceptance authority into a repository of its own and called
that progress. What moved here is a bridge: it resolves providers through Odin's
catalog, reads those providers directly, and relays operator intent to
provider-advertised command routes.

Contents: the daemon, the provider subscription source and its lifecycle tests,
the state stream registry, the browser catalog tests, the four lifecycle
scripts, and the persona avatar.

Three dependencies on Odin were resolved rather than carried. The swarm document
catalog now comes from CultLib's cultcache-ts alongside defineDocumentType.
Idunn's health contract is declared locally in idunn-health.cjs, over the generic
transport that also moved to CultLib, with sourceRuntimeId "hermodr" rather than
Odin's. parseArgs is seventeen lines in args.cjs, because Hermodr used one of
that utility module's six functions and carrying the other five would have been
carrying a library nobody here reads.

MIT, matching CultLib, Odin, Idunn, Eve and Erycina, so the deployment chain is
one a creator may lawfully run end to end.

Verified: 17 tests pass, every module loads with CultLib resolving from the new
location, and no import references Odin. Not verified: behaviour against a live
provider over RUDP, which needs a running Verse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-06 19:44:53 +02:00
assets Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
scripts Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
src Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
test Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
.gitignore Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
LICENSE Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
package.json Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00
README.md Extract Hermodr from Odin 2026-09-06 19:44:53 +02:00

Hermodr

Hermodr is the Eve browser lowering. It resolves providers through Odin's catalog, reads those providers for their state, renders their surfaces to browsers, and relays operator intent back as typed CultMesh command documents.

It owns the browser edge. It does not own truth.

Authority

  • Providers own their state and serve it. Hermodr reads; it never accepts.
  • Odin owns discovery: what exists, what schema speaks it, where to reach it. Odin is not in the data path, and nothing here reads state from Odin.
  • Hermodr owns session, transport, lowering, and the relay of intent. Everything it holds about provider state is a projection carrying a sequence number. Its staleness marks are display facts, not withdrawal decisions.

A lowering runtime cannot make something true by rendering it.

The round trip

Intent leaves by POST /hermodr/commands/eve, which resolves a cultmesh:// target from the request or the provider catalog, wraps the body as gamecult.eve.command.v1, stamps publishedBy: "hermodr-browser-lowering", and publishes to the provider's own advertised route. The provider decides whether to act. Eve's client refuses any response that is not a correlated gamecult.eve.command_receipt.v1 in state reconciled.

Consequence returns as newly published provider state, by the same subscription as every other change. That is the whole point of the split: intent and consequence travel the same road in opposite directions, and neither passes through a store Hermodr owns.

Running it

npm start -- --host 127.0.0.1 --port 8798

Needs a reachable Odin catalog and CULTLIB_ROOT pointing at a CultLib checkout. Provider read cadence is --provider-poll-interval-ms, default 2000.

npm test     # unit tests, no live Verse required
npm run check

Known shape

Provider state is read by polling, wrapped in lifecycle semantics that emit snapshot, update, and withdrawn events with sequence numbers. Polling is a first cut: CultMesh ships cultMeshPollingDocumentWatcher for exactly this shape, and a push subscription belongs here eventually. It does not change the authority, which is why the swap was made before the move.

One invariant is easy to get wrong and quiet when you do: 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. Read errors are reported and the previous value stands; only genuine absence withdraws. Both paths are tested.

History

Hermodr was an organ of Odin, and until recently it ran its own provider-session ingress and accepted publications into a private store. A surface reached a browser only if its provider bound to Hermodr specifically, so a provider had to publish twice: once where the Verse expected it, and once into Hermodr so an operator could watch their own command land.

That ingress is gone. The extraction happened after it was removed, so what moved here was a bridge rather than a second acceptance authority wearing one's name.

GameCult/Odin holds the coordinator and the Rust organs. GameCult/CultLib holds the swarm document catalog and the CultNet transports this depends on.