The projects root moved from E: to F:, but Idunn's starfire-local surfaces still named E:\Projects. Local Idunn died on 2026-08-16 with "fatal: cannot change to 'E:\Projects\Heimdall'" and every one of its 16 operator alarms also failed (0xfffd0000), because notify-idunn-operator-alarm.cmd shelled to an E: path that no longer existed. The supervisor was down for 18 days and could not say so. Rather than swap one hardcoded drive letter for another, derive the projects root the way this catalog already derives its repo root: - notify-idunn-operator-alarm.cmd invokes its sibling via %~dp0. - notify-idunn-operator-alarm.ps1 resolves Bifrost from the projects root. - idunn-deployment-targets.ps1 gains $projectsRoot and rebases 19 LocalPath values onto it. The remote /srv/build/VoidBot path is left alone. Verified: the catalog resolves 15 of 20 targets to real directories, the remote target is untouched, and the alarm chain now runs to exit 0 emitting a valid gamecult.operator_dm_request.v1 under IDUNN_OPERATOR_ALARM_DRY_RUN. Still broken, not addressed here: stonks, vili, StreamPixels and repixelizer have no directory under F:\Projects, and the Bifrost publisher's non-dry path throws "definition.schema.parse is not a function" against the current CultMesh. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
289 lines
11 KiB
PowerShell
289 lines
11 KiB
PowerShell
$repoRoot = Split-Path -Parent $PSScriptRoot
|
|
$projectsRoot = Split-Path -Parent $repoRoot
|
|
|
|
$IdunnDeploymentSharedActuators = @(
|
|
"$repoRoot\scripts\deploy-yggdrasil-source-app.ps1"
|
|
)
|
|
|
|
$IdunnDeploymentTargets = @(
|
|
[pscustomobject]@{
|
|
Id = "odin"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "starfire"
|
|
Service = "odin-coordinator"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:odin.cultnet-rudp-provider-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-odin.ps1"
|
|
Aliases = @("$repoRoot\scripts\restart-odin.cmd")
|
|
Reason = "Central Idunn keeps Odin's all-seer/rendezvous daemon alive; Odin owns Verse discovery while Idunn owns lifecycle actuation."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "idunn"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "starfire"
|
|
Service = "idunn swarm supervisor"
|
|
Status = "runtime-enforced"
|
|
Health = $null
|
|
Deploy = $null
|
|
Restart = $null
|
|
Aliases = @()
|
|
Reason = "start-idunn-local.ps1 is the bootstrap for Idunn itself; it is not a deploy/restart actuator over another daemon."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "hermodr"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "starfire"
|
|
Service = "Hermodr browser lowering"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:hermodr.cultnet-rudp-browser-lowering-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-hermodr.ps1"
|
|
Aliases = @()
|
|
Reason = "Idunn keeps Hermodr's browser lowering alive; Hermodr publishes its own RUDP health while Odin remains the CultMesh discovery authority."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "stonks"
|
|
Repo = "Stonks"
|
|
LocalPath = "$projectsRoot\Stonks"
|
|
Host = "starfire"
|
|
Service = "stonks daemon"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:stonks.cultnet-rudp-market-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-stonks.cmd"
|
|
Aliases = @()
|
|
Reason = "Stonks publishes market/provider state and daemon health through CultMesh/CultNet; local restart is an Idunn actuator only."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "weksa"
|
|
Repo = "weksa"
|
|
LocalPath = "$projectsRoot\weksa"
|
|
Host = "starfire"
|
|
Service = "weksa daemon"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:weksa.cultnet-rudp-provider-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-weksa.cmd"
|
|
Aliases = @()
|
|
Reason = "Weksa provider state and health are daemon-owned CultMesh/CultNet records; local restart is an Idunn actuator only."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "starfire-muninn"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "starfire"
|
|
Service = "muninn serve --host starfire"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:muninn.cultnet-rudp-local-telemetry-and-quest-access"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-starfire-muninn.ps1"
|
|
Aliases = @("$repoRoot\scripts\restart-starfire-muninn.cmd")
|
|
Reason = "Central Idunn keeps Starfire-local Muninn alive for Quest access and local telemetry surfaces."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "raven-muninn"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "raven"
|
|
Service = "muninn serve --host raven"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:muninn.cultnet-rudp-remote-telemetry-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-muninn.ps1"
|
|
Aliases = @("$repoRoot\scripts\restart-muninn.cmd")
|
|
Reason = "Central Idunn keeps Raven Muninn's remote telemetry posture alive without activating A/V capture as part of keepalive."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "nightwing-muninn"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "nightwing"
|
|
Service = "muninn serve --host nightwing"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:muninn.cultnet-rudp-remote-telemetry-and-move-hid"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-nightwing-muninn.ps1"
|
|
Aliases = @("$repoRoot\scripts\restart-nightwing-muninn.cmd")
|
|
Reason = "Central Idunn reaches Nightwing over SSH and keeps the host-local Muninn Move HID daemon alive."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "vili"
|
|
Repo = "Vili"
|
|
LocalPath = "$projectsRoot\Vili"
|
|
Host = "raven"
|
|
Service = "GameCult\\Vili"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:vili.cultnet-rudp-animation-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-vili.cmd"
|
|
Aliases = @("$repoRoot\scripts\restart-vili.ps1")
|
|
Reason = "Central Idunn keeps Raven Vili's typed motion daemon alive; command requests and health are CultMesh/CultNet-owned."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "raven-sleipnir"
|
|
Repo = "Odin"
|
|
LocalPath = "$projectsRoot\Odin"
|
|
Host = "raven"
|
|
Service = "sleipnir --host raven"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:sleipnir.cultnet-rudp-input-mirror-health"
|
|
Deploy = "$repoRoot\scripts\deploy-raven-sleipnir.ps1"
|
|
Restart = "$repoRoot\scripts\restart-raven-sleipnir.ps1"
|
|
Aliases = @()
|
|
Reason = "Central Idunn reaches Raven over SSH and keeps Sleipnir's hidden scheduled task alive while Sleipnir publishes daemon-owned RUDP health."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "yggdrasil-voidbot"
|
|
Repo = "VoidBot"
|
|
LocalPath = "/srv/build/VoidBot"
|
|
Host = "yggdrasil"
|
|
Service = "voidbot.service"
|
|
Status = "enforced"
|
|
Health = "daemon-published-rudp:voidbot.cultnet-rudp-stack-health"
|
|
Deploy = "sudo -n /usr/local/libexec/idunn-yggdrasil deploy voidbot"
|
|
Restart = "sudo -n /usr/local/libexec/idunn-yggdrasil restart voidbot"
|
|
Aliases = @()
|
|
UpstreamRemote = "origin"
|
|
UpstreamBranch = "main"
|
|
RolloutStrategy = "restart-after-verified-build"
|
|
StateMigration = "daemon-owned-noop"
|
|
ZeroDowntime = "restart-required"
|
|
Reason = "Yggdrasil-local Idunn deploys upstream VoidBot releases through the narrow root-owned manifest; local checkouts have no deployment authority."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "yggdrasil-bifrost"
|
|
Repo = "Bifrost"
|
|
LocalPath = "$projectsRoot\Bifrost"
|
|
Host = "yggdrasil"
|
|
Service = "bifrost.service"
|
|
Status = "blocked"
|
|
Health = $null
|
|
Deploy = $null
|
|
Restart = $null
|
|
Aliases = @()
|
|
Reason = "Committed Bifrost HEAD currently expects UserAccounts.HeimdallAccountId, but Yggdrasil's production database lacks that column and EF reports no pending migration. Idunn must not enforce Bifrost freshness until the Bifrost schema migration path is fixed."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "yggdrasil-streampixels"
|
|
Repo = "StreamPixels"
|
|
LocalPath = "$projectsRoot\StreamPixels"
|
|
Host = "yggdrasil"
|
|
Service = "streampixels-service/streampixels-web"
|
|
Status = "enforced"
|
|
Health = "daemon-published-rudp:streampixels.cultnet-rudp-service-health"
|
|
Deploy = "$repoRoot\scripts\deploy-yggdrasil-streampixels.cmd"
|
|
Restart = $null
|
|
Aliases = @("$repoRoot\scripts\deploy-yggdrasil-streampixels.ps1")
|
|
UpstreamRemote = "origin"
|
|
UpstreamBranch = "main"
|
|
RolloutStrategy = "restart-after-verified-build"
|
|
StateMigration = "daemon-owned-noop"
|
|
ZeroDowntime = "restart-required"
|
|
Reason = "Idunn packages upstream origin/main for StreamPixels, runs the existing ops deploy/check scripts, and verifies the remote manifest."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "yggdrasil-heimdall"
|
|
Repo = "Heimdall"
|
|
LocalPath = "$projectsRoot\Heimdall"
|
|
Host = "yggdrasil"
|
|
Service = "heimdall.service"
|
|
Status = "enforced"
|
|
Health = "daemon-published-rudp:heimdall.cultnet-rudp-provider-health"
|
|
Deploy = "$repoRoot\scripts\deploy-yggdrasil-heimdall.cmd"
|
|
Restart = $null
|
|
Aliases = @("$repoRoot\scripts\deploy-yggdrasil-heimdall.ps1")
|
|
UpstreamRemote = "origin"
|
|
UpstreamBranch = "main"
|
|
RolloutStrategy = "restart-after-verified-build"
|
|
StateMigration = "daemon-owned-noop"
|
|
ZeroDowntime = "restart-required"
|
|
Reason = "Idunn packages upstream origin/main for Heimdall, runs the existing ops deploy/check scripts, and verifies the remote manifest."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "yggdrasil-repixelizer"
|
|
Repo = "repixelizer"
|
|
LocalPath = "$projectsRoot\repixelizer"
|
|
Host = "yggdrasil"
|
|
Service = "repixelizer-gui.service"
|
|
Status = "enforced"
|
|
Health = "daemon-published-rudp:repixelizer.cultnet-rudp-service-health"
|
|
Deploy = "$repoRoot\scripts\deploy-yggdrasil-repixelizer.cmd"
|
|
Restart = $null
|
|
Aliases = @("$repoRoot\scripts\deploy-yggdrasil-repixelizer.ps1")
|
|
UpstreamRemote = "origin"
|
|
UpstreamBranch = "main"
|
|
RolloutStrategy = "restart-after-verified-build"
|
|
StateMigration = "daemon-owned-noop"
|
|
ZeroDowntime = "restart-required"
|
|
Reason = "Idunn packages upstream origin/main for repixelizer, runs the existing ops deploy/check scripts, and verifies the remote manifest."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "github-pages-gamecult-site"
|
|
Repo = "gamecult-site"
|
|
LocalPath = "$projectsRoot\gamecult-site"
|
|
Host = "github-pages"
|
|
Service = "gamecult.org/www"
|
|
Status = "external-owned"
|
|
Health = $null
|
|
Deploy = $null
|
|
Restart = $null
|
|
Aliases = @()
|
|
Reason = "GitHub Actions/Pages owns deployment freshness; Idunn should ingest workflow/deployment status before claiming automatic deploy authority."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "eve-ipad-evecanvas"
|
|
Repo = "Eve"
|
|
LocalPath = "$projectsRoot\Eve"
|
|
Host = "eve-ipad"
|
|
Service = "org.gamecult.evecanvas"
|
|
Status = "blocked"
|
|
Health = $null
|
|
Deploy = $null
|
|
Restart = $null
|
|
Aliases = @()
|
|
Reason = "Jailbroken iPad native app deployment exists only as an operator runbook; no safe noninteractive Idunn deploy command yet."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "periwinkle-eve-android"
|
|
Repo = "Eve"
|
|
LocalPath = "$projectsRoot\Eve"
|
|
Host = "periwinkle"
|
|
Service = "Eve Android proof APK"
|
|
Status = "blocked"
|
|
Health = $null
|
|
Deploy = $null
|
|
Restart = $null
|
|
Aliases = @()
|
|
Reason = "Android USB install requires on-device approval; Idunn must not claim automatic deploy authority until that boundary is solved."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "nightwing-eve-dashboard"
|
|
Repo = "Mimir"
|
|
LocalPath = "$projectsRoot\Mimir"
|
|
Host = "nightwing"
|
|
Service = "nightwing-eve-dashboard.service"
|
|
Status = "archived"
|
|
Health = $null
|
|
Deploy = $null
|
|
Restart = $null
|
|
Aliases = @("$repoRoot\scripts\restart-nightwing-eve-dashboard.cmd")
|
|
Reason = "Nightwing Eve dashboard's old HTTP/WebSocket broker is archived. Rebuild it only as typed CultMesh/Odin state publication plus renderer lowering before restoring Idunn lifecycle authority."
|
|
},
|
|
[pscustomobject]@{
|
|
Id = "nightwing-eve-browser-reference"
|
|
Repo = "Eve"
|
|
LocalPath = "$projectsRoot\Eve"
|
|
Host = "nightwing"
|
|
Service = "nightwing-eve-browser-reference.service"
|
|
Status = "runtime-enforced"
|
|
Health = "daemon-published-rudp:nightwing.cultnet-rudp-browser-reference-health"
|
|
Deploy = $null
|
|
Restart = "$repoRoot\scripts\restart-nightwing-eve-browser-reference.ps1"
|
|
Aliases = @("$repoRoot\scripts\restart-nightwing-eve-browser-reference.cmd")
|
|
Reason = "Nightwing Eve browser reference publishes daemon-owned boundary witnesses and RUDP health; systemd restart is an Idunn actuator only."
|
|
}
|
|
)
|