From d7da79fbc3c6c4b3e8ca1bb7cd633c41beb92dfb Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 4 Jun 2026 18:40:22 +0100 Subject: [PATCH] Route swarm transport authority through Bifrost --- README.md | 8 ++++--- docs/architecture.md | 20 ++++++++++++---- docs/gjallar.md | 54 ++++++++++++++++++++++++++++++++------------ docs/idunn.md | 23 +++++++++++-------- src/Idunn/Program.cs | 2 +- 5 files changed, 75 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index fec42e8..f4ba52f 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docs/architecture.md b/docs/architecture.md index 0ad163c..3d43ce2 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -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 diff --git a/docs/gjallar.md b/docs/gjallar.md index 4965bdb..9fbc36f 100644 --- a/docs/gjallar.md +++ b/docs/gjallar.md @@ -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 diff --git a/docs/idunn.md b/docs/idunn.md index 5887f95..bd6d89f 100644 --- a/docs/idunn.md +++ b/docs/idunn.md @@ -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 diff --git a/src/Idunn/Program.cs b/src/Idunn/Program.cs index 6973255..cdcbd8a 100644 --- a/src/Idunn/Program.cs +++ b/src/Idunn/Program.cs @@ -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.");