Route swarm transport authority through Bifrost

This commit is contained in:
Meta Vens 2026-06-04 18:40:22 +01:00
commit d7da79fbc3
5 changed files with 75 additions and 32 deletions

View file

@ -41,15 +41,17 @@ Idunn is Odin's keepalive organ: the daemon package that should keep the known
swarm alive after Odin has accepted where each daemon lives and what authority
path may touch it. Individual daemons publish health and command boundaries;
Idunn brings them up after reboots or crashes, watches health, and escalates
operator-needed failures through VoidBot's CultMesh owner-DM command. Odin sees
the daemons; Idunn keeps the apples from rotting.
operator-needed failures through Bifrost's CultMesh bridge. VoidBot owner-DM
delivery is a compatibility actuator until that command lives natively in
Bifrost's Verse. Odin sees the daemons; Idunn keeps the apples from rotting.
Local package surfaces:
- Organ contract: `docs/idunn.md`
- C# CultMesh organ: `src/Idunn/Idunn.csproj`
- Runtime store: `scratch/idunn/idunn.keepalive.cc`
- Operator escalation: `voidbot.operator-dm` command `owner.dm.send`
- Operator escalation: Bifrost-owned CultMesh crossing; current compatibility
delivery may call `voidbot.operator-dm` command `owner.dm.send`
## Authority Map

View file

@ -83,13 +83,25 @@ lives in `docs/idunn.md` and `src/Idunn/Idunn.csproj`. Idunn may read
Odin-owned service records and provider advertisements, then bring daemons up
after reboots or crashes, watch health, emit keepalive observations, restart
requests, denied-action records, and operator alarms. When human action is
needed, Idunn should use CultMesh to request VoidBot's provider-owned
`voidbot.operator-dm` command `owner.dm.send` with payload schema
`gamecult.operator_dm_request.v1`. It must not own Verse discovery, schema
truth, provider dashboards, identity grants, Discord delivery, or renderer
needed, Idunn should use CultMesh to request a Bifrost-owned operator
notification crossing. VoidBot's `voidbot.operator-dm` command `owner.dm.send`
is only a compatibility delivery actuator until that command lives natively in
Bifrost's Verse. Idunn must not own Verse discovery, schema truth, provider
dashboards, identity grants, Discord delivery, owner-DM delivery, or renderer
layout. Keepalive loops should move into Idunn instead of accumulating inside
Odin's coordinator or individual daemons.
Bifrost is the bridge for Persona speech and other public/owner-facing
crossings. When a Persona interpreter decides a Face should speak, the accepted
side effect should be a Bifrost CultMesh command or document that names actor,
authority, target surface, context, policy result, and receipt path. VoidBot may
observe Discord, preserve room cognition, moderate, and provide compatibility
delivery while the migration is underway, but it must not remain the owner of
swarm speech transport. VoidBot's repo search, Discord history search, archive
lookup, and source retrieval should be native CultCache/CultMesh services; MCP
is the bridge for external agentic access, not the native path for GameCult
agents that already have CultMesh affordances.
## Target Mechanism
```text

View file

@ -16,17 +16,18 @@ second Odin.
- Inputs: Odin's accepted registry, schema index, translation map, provider
interfaces, observation-stream summaries, layout hints, and provenance
metadata.
- Outputs: compact affordance packets for Codex, VoidBot, repo Faces, and other
agent consumers; optional Persona-facing memory summaries that name what Odin
can see and what can be acted on.
- Derived state: summaries, prompts, Persona projections, Discord speech, and
handoff notes are notification-only projections of Odin state.
- Outputs: compact affordance packets for Codex, native CultMesh agents, repo
Faces, Bifrost, and other agent consumers; optional Persona-facing memory
summaries that name what Odin can see and what can be acted on.
- Derived state: summaries, prompts, Persona projections, Bifrost speech
requests, Discord lowerings, and handoff notes are notification-only
projections of Odin state.
- Forbidden writers: Gjallar does not probe hosts, decide Verse truth, mutate
provider-owned dashboards, own renderer layout, or invent schema translation
routes.
- Shared paths: human dashboards, Codex context assembly, VoidBot repo-Face
heartbeats, and future agent bootstrap should consume the same Odin-owned
records before Gjallar speaks.
- Shared paths: human dashboards, Codex context assembly, native CultMesh agent
bootstrap, Bifrost-routed Persona speech, and compatibility MCP access should
consume the same Odin-owned records before Gjallar speaks.
- Deletion line: any Gjallar path that starts storing independent discovery
truth should be cut or demoted to a cache that names Odin as source.
@ -56,9 +57,9 @@ Odin. Gjallar's entrypoint should own context publication and no more.
## Persona Registration
VoidBot's current native Persona reader expects a JSON `personaStatePath`. That
is a projection boundary, not the state owner. A future VoidBot registry entry
should point at a generated projection or learn to read the CultCache record;
the canonical source remains:
is a compatibility projection boundary, not the state owner and not the future
transport owner. A future registry entry should point at a generated projection
or learn to read the CultCache record; the canonical source remains:
```text
id: gjallar
@ -72,9 +73,34 @@ personaStateKey: persona:gjallar
personaStateSchema: gamecult.persona_state.v0
```
That registration belongs in VoidBot's registry, not here. This repo owns the
Persona source record and avatar; VoidBot owns the speech transport and room
identity wiring.
That compatibility registration belongs in the current Discord adapter, not
here. This repo owns the Persona source record and avatar. Bifrost should own
the CultMesh speech crossing when a Persona interpreter decides it wants to
speak; Discord is then a Bifrost lowering/receipt path, with VoidBot acting only
as legacy room cognition and delivery machinery until the native bridge is
complete.
## Transport Boundary
Persona speech is a bridge crossing. The interpreter may decide that a Face
should speak, but the public transport request should be a Bifrost CultMesh
command or document, not a VoidBot-owned side effect.
Target shape:
```text
Persona runtime / interpreter
-> Bifrost speech request through CultMesh
-> Bifrost policy, Heimdall claims, topic/work/context linkage
-> Discord, GitHub, owner DM, or future public surface lowering
-> Bifrost receipt
```
VoidBot still owns Discord observation, room cognition, moderation judgment, and
compatibility delivery while that bridge is being moved. Its repo search,
Discord history search, and archive/source retrieval should become native
CultCache/CultMesh services. MCP remains a bridge for external agentic access,
not the native affordance path for GameCult agents that can speak CultMesh.
## CultMesh Runtime Direction

View file

@ -21,11 +21,11 @@ state.
local service manager state, and direct local service probes only when no
provider advertisement exists.
- Outputs: typed keepalive observations, restart requests, denied-action
records, operator alarms, owner-DM escalation requests through VoidBot, and an
records, operator alarms, Bifrost operator-notification requests, and an
Eve/CultUI keepalive surface.
- Derived state: dashboard cells, Discord speech, agent summaries, and Odin
service projections are notification-only views of Idunn-owned keepalive
records.
- Derived state: dashboard cells, Bifrost receipts, Discord or owner-DM
lowerings, agent summaries, and Odin service projections are
notification-only views of Idunn-owned keepalive records.
- Forbidden writers: Idunn does not decide which Verses exist, invent provider
schemas, mutate provider dashboards, own identity/session grants, or hide
restarts behind Odin refresh logic. Individual daemons should not carry
@ -59,7 +59,7 @@ idunn.keepalive_decision.v1
idunn.restart_request.v1
idunn.restart_result.v1
idunn.operator_alarm.v1
idunn.owner_dm_escalation.v1
idunn.operator_escalation.v1
```
## Invariants
@ -80,10 +80,12 @@ idunn.owner_dm_escalation.v1
- Idunn should fail closed when authority is unclear. Unknown ownership,
repeated restart failure, missing command authority, or degraded health that
needs a human becomes an operator alarm.
- Operator alarms use CultMesh to request VoidBot owner notification through
the provider-owned `voidbot.operator-dm` command `owner.dm.send` with payload
schema `gamecult.operator_dm_request.v1`. Idunn must not learn Discord token
handling or DM delivery internals.
- Operator alarms use CultMesh to request Bifrost-owned operator notification.
Bifrost is the bridge for the crossing and records the receipt. VoidBot's
`voidbot.operator-dm` command `owner.dm.send` with payload schema
`gamecult.operator_dm_request.v1` is a compatibility delivery actuator until
the owner-DM command lives natively in Bifrost's Verse. Idunn must not learn
Discord token handling, DM delivery internals, or VoidBot-specific transport.
## First Runtime Direction
@ -95,7 +97,8 @@ Idunn's C# runtime should grow in this order:
4. Emit `idunn.keepalive_decision.v1` records without acting.
5. Add restart adapters only for named authority boundaries: local systemd,
Windows service control, Docker, or provider-advertised commands.
6. Add `voidbot.operator-dm` escalation for cases that need operator action.
6. Add Bifrost operator escalation for cases that need human action, with
VoidBot owner-DM delivery only as a demoted compatibility target.
7. Publish an Eve/CultUI keepalive surface from Idunn-owned records.
No ad hoc JSON manifest should become the live state owner. Debug projections

View file

@ -25,7 +25,7 @@ Console.WriteLine("Idunn CultMesh organ initialized.");
Console.WriteLine($"Keepalive store: {cachePath}");
Console.WriteLine("Provider id: idunn.keepalive");
Console.WriteLine("Authority: daemon lifecycle, health watching, restart intent, and operator escalation for Odin-known daemons");
Console.WriteLine("Owner escalation: CultMesh command voidbot.operator-dm owner.dm.send");
Console.WriteLine("Owner escalation: Bifrost CultMesh bridge; VoidBot owner DM is compatibility delivery only");
Console.WriteLine($"CultMesh server: {(options.Serve ? "started" : "disabled")}");
Console.WriteLine("Typed keepalive records and restart adapters are the next cut.");