Muninn/deployment/idunn/raven-muninn.toml
Meta Vens 2260853727 Declare the Odin dependency raven-muninn publishes to
Idunn no longer infers how a target proves readiness, and a recipe with
neither a route nor an Odin dependency is refused at admission. raven-muninn
has no route and publishes to Odin over CultMesh RUDP, so its recipe declares
the odin.verse-rendezvous dependency.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 12:51:59 +02:00

107 lines
3.7 KiB
TOML

schema = "gamecult.idunn.target_declaration.v1"
target = "raven-muninn"
source_stamp_environment = "MUNINN_BUILD_COMMIT"
required_gitlinks = []
# Built on Raven itself by Idunn's host actuator: cargo on the host, no
# container. The runner's allowed programs are the whole build vocabulary.
[[steps]]
id = "build-muninn-daemon"
phase = "build"
runner = "rust-host"
required_environment = []
argv = [
"cargo",
"build",
"--locked",
"--release",
"-p",
"muninn-daemon",
"--bin",
"muninn",
]
[[artifacts]]
id = "muninn"
source_kind = "runner-output"
runner = "rust-host"
source = "target/release/muninn.exe"
destination = "muninn.exe"
executable = true
[[artifacts]]
id = "wasapi-loopback-capture"
source_kind = "worktree-tree"
source = "scripts/wasapi-loopback-capture.ps1"
destination = "wasapi-loopback-capture.ps1"
# The launch contract. Host-specific values come from the operator binding's
# argument bindings; everything Raven-independent is literal. The loopback
# script is named relative to the installed release, which is the working
# directory the actuator starts serve in.
[service]
executable_artifact = "muninn"
arguments = [
{ kind = "literal", value = "serve" },
{ kind = "literal", value = "--store" },
{ kind = "binding", name = "store_path" },
{ kind = "literal", value = "--activate-store" },
{ kind = "binding", name = "activate_store_path" },
{ kind = "literal", value = "--log-root" },
{ kind = "binding", name = "log_root" },
{ kind = "literal", value = "--host" },
{ kind = "literal", value = "raven" },
{ kind = "literal", value = "--stream" },
{ kind = "literal", value = "muninn.raven.av.rudp" },
{ kind = "literal", value = "--target-host" },
{ kind = "binding", name = "media_target_uri" },
{ kind = "literal", value = "--media-transport" },
{ kind = "literal", value = "rudp" },
{ kind = "literal", value = "--odin-cultmesh-uri" },
{ kind = "literal", value = "cultmesh://odin/rendezvous/provider-catalog" },
{ kind = "literal", value = "--hid-controller-rudp-bind" },
{ kind = "literal", value = "0.0.0.0:17887" },
{ kind = "literal", value = "--hid-controller-rudp-advertise" },
{ kind = "binding", name = "hid_controller_rudp_advertise" },
{ kind = "literal", value = "--media-rudp-bind" },
{ kind = "literal", value = "0.0.0.0:5220" },
{ kind = "literal", value = "--media-rudp-advertise" },
{ kind = "binding", name = "media_rudp_advertise" },
{ kind = "literal", value = "--move-state" },
{ kind = "literal", value = "xbox-raven=xinput://0" },
{ kind = "literal", value = "--audio-device" },
{ kind = "literal", value = "Realtek" },
{ kind = "literal", value = "--ffmpeg" },
{ kind = "binding", name = "ffmpeg_path" },
{ kind = "literal", value = "--loopback-script" },
{ kind = "literal", value = "wasapi-loopback-capture.ps1" },
{ kind = "literal", value = "--interval-seconds" },
{ kind = "literal", value = "15" },
]
transport = "rudp"
route_required = false
required_environment = [
"CULTMESH_URI_ODIN_RUDP",
"GAMECULT_IDUNN_ACTIVATION_CREDENTIAL",
"GAMECULT_IDUNN_RUNTIME_BUNDLE",
"GAMECULT_RUNTIME_PRESENCE_IDENTITY",
]
[service.health]
contract = "muninn.runtime-health.v1"
[[provides]]
capability = "muninn.media-producer"
schema = "gamecult.media_stream_advertisement.v1"
compatibility = "v1"
# raven-muninn publishes to Odin over CultMesh RUDP (--odin-cultmesh-uri), and
# it has no route, so it declares the Odin dependency: Idunn admits it as Ready
# on Odin's correlation. A recipe that declares neither a route nor this is
# refused at admission.
[[dependencies]]
kind = "shared-infrastructure"
capability = "odin.verse-rendezvous"
schema = "odin.verse-topology.v1"
compatibility = "v1"
startup = "before-promotion"