Odin (96a55ec) now computes Ready with an external-operator-binding dependency not ready, but CultLib's shared contract (runtime_authority_contracts.rs:797-805) refuses any correlation claiming Ready while a non-optional dependency is not ready, so Odin rejected every Ghostlight Active presence (30/30 in the last deploy). The external kind existed only because Heimdall isn't v2-managed; that reason doesn't survive contact with Odin's own Ready computation. Ghostlight's deploy stops declaring Heimdall as an Idunn dependency. The daemon discovers it through Odin at use instead: HeimdallClient already took Option<HeimdallDependencyBinding> with None as the non-managed path, so runtime.rs now passes None directly rather than computing it from a dependency_bindings field that no longer exists, and the loopback-only, non-secret-bearing, app-bound HMAC+AES envelope enforcement is unchanged. When Heimdall becomes a v2 target the dependency returns as `required` managed. - deployment/idunn/recipe.toml: deleted the heimdall.command-boundary [[dependencies]] block. Ghostlight's own required_environment for GHOSTLIGHT_HEIMDALL_APP_SECRET_FILE/GHOSTLIGHT_HEIMDALL_BASE_URL is unrelated (Heimdall's HTTP app integration, not the Idunn dependency) and stays. - idunn_health.rs: runtime_dependency_bindings now requires exactly the Odin dependency (one, not two). Deleted HEIMDALL_CAPABILITY, required_external_dependency and its doc comment, the `heimdall` field on RuntimeDependencyBindings, the fixture's external_dependency helper and its Heimdall entry, and the recipe-drift test's Heimdall block/assertion (now asserts exactly one [[dependencies]] block and fails if a Heimdall dependency reappears without the daemon changing to expect it again). HeimdallDependencyBinding itself moved to heimdall.rs (see below) rather than being deleted outright: it's still the shape require_expected_heimdall_boundary checks a discovered boundary against when Idunn does supply one, which stays true the moment Heimdall returns as a managed dependency. - heimdall.rs: now owns HeimdallDependencyBinding (moved from idunn_health.rs, which no longer has any use for it). No behavior change: HeimdallBoundaryLocator::Odin's `expected: Option<HeimdallDependencyBinding>` and its None-tolerant checking logic were already exactly the "discover through Odin, verify against a managed binding when one exists" shape this ruling asks for. - runtime.rs: expected_heimdall is gone; `HeimdallClient::from_env` now takes `None` directly instead of a value computed from a dependency_bindings field that no longer exists, with a comment on why. Mutation: re-added the heimdall.command-boundary [[dependencies]] block to the recipe -> recipe_matches_the_daemon_it_deploys fails (asserts exactly one dependency block). Restored; deployment/idunn/recipe.toml is git-diff-clean after, one clean 7-line deletion. Verification: cargo test -p ghostlight-dungeon --bin ghostlight-dungeon -> 192 passed, 0 failed, 4 ignored (unchanged count: removed a test helper, not a test). Structural delta: 4 files changed, 42 insertions(+), 138 deletions(-) in Ghostlight (net -96 lines) — a genuine subtraction, not a relocation with padding; the only addition of substance is the doc comment on the relocated HeimdallDependencyBinding explaining why it still exists. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
188 lines
4.8 KiB
TOML
188 lines
4.8 KiB
TOML
schema = "gamecult.idunn.target_declaration.v1"
|
|
target = "ghostlight"
|
|
source_stamp_environment = "GHOSTLIGHT_BUILD_COMMIT"
|
|
required_gitlinks = ["vendor/eve"]
|
|
|
|
[[steps]]
|
|
id = "test-persona-boundary"
|
|
phase = "test"
|
|
runner = "rust-build"
|
|
required_environment = ["CARGO_HOME", "HOME"]
|
|
argv = ["cargo", "test", "--locked", "-p", "ghostlight-persona-projection"]
|
|
|
|
[[steps]]
|
|
id = "test-world-library"
|
|
phase = "test"
|
|
runner = "rust-build"
|
|
required_environment = ["CARGO_HOME", "HOME"]
|
|
argv = ["cargo", "test", "--locked", "-p", "ghostlight"]
|
|
|
|
[[steps]]
|
|
id = "test-dungeon"
|
|
phase = "test"
|
|
runner = "rust-build"
|
|
required_environment = ["CARGO_HOME", "HOME"]
|
|
argv = ["cargo", "test", "--locked", "-p", "ghostlight-dungeon", "--bin", "ghostlight-dungeon"]
|
|
|
|
[[steps]]
|
|
id = "build-daemon"
|
|
phase = "build"
|
|
runner = "rust-build"
|
|
required_environment = ["CARGO_HOME", "HOME"]
|
|
argv = ["cargo", "build", "--locked", "--release", "-p", "ghostlight-dungeon", "--bin", "ghostlight-dungeon"]
|
|
|
|
[[steps]]
|
|
id = "install-web-dependencies"
|
|
phase = "prepare"
|
|
runner = "web-build"
|
|
required_environment = ["HOME", "NPM_CONFIG_CACHE"]
|
|
argv = ["npm", "--prefix", "web", "ci"]
|
|
|
|
[[steps]]
|
|
id = "test-web"
|
|
phase = "test"
|
|
runner = "web-build"
|
|
required_environment = ["HOME", "NPM_CONFIG_CACHE"]
|
|
argv = ["npm", "--prefix", "web", "test"]
|
|
|
|
[[steps]]
|
|
id = "build-web"
|
|
phase = "build"
|
|
runner = "web-build"
|
|
required_environment = ["HOME", "NPM_CONFIG_CACHE"]
|
|
argv = ["npm", "--prefix", "web", "run", "build"]
|
|
|
|
[[steps]]
|
|
id = "accept-real-persona-membrane"
|
|
phase = "acceptance"
|
|
runner = "rust-acceptance"
|
|
argv = [
|
|
"cargo",
|
|
"test",
|
|
"--locked",
|
|
"-p",
|
|
"ghostlight",
|
|
"--lib",
|
|
"controllers::tests::real_local_model_cognition_modes_commit_speech",
|
|
"--",
|
|
"--ignored",
|
|
"--exact",
|
|
]
|
|
required_environment = [
|
|
"CARGO_HOME",
|
|
"GHOSTLIGHT_ACCEPTANCE_PERSONA_PROSE_LOG",
|
|
"GHOSTLIGHT_ACCEPTANCE_RUNTIME_ID",
|
|
"GHOSTLIGHT_CONTROLLER_ELABORATOR_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_INTERPRETER_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_OPERATIONAL_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_PERSONA_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_PROJECTOR_MODEL",
|
|
"HOME",
|
|
"GHOSTLIGHT_LOCAL_ENDPOINT",
|
|
]
|
|
|
|
[[artifacts]]
|
|
id = "ghostlight-dungeon"
|
|
source_kind = "runner-output"
|
|
runner = "rust-build"
|
|
source = "target/release/ghostlight-dungeon"
|
|
destination = "ghostlight-dungeon"
|
|
executable = true
|
|
|
|
[[artifacts]]
|
|
id = "web"
|
|
source_kind = "runner-output"
|
|
runner = "web-build"
|
|
source = "web/dist"
|
|
destination = "web"
|
|
|
|
[service]
|
|
executable_artifact = "ghostlight-dungeon"
|
|
required_adjacent_artifacts = ["web"]
|
|
arguments = [
|
|
{ kind = "literal", value = "--state-root" },
|
|
{ kind = "binding", name = "state_root" },
|
|
]
|
|
transport = "http"
|
|
route_required = true
|
|
required_environment = [
|
|
"GAMECULT_IDUNN_CANDIDATE_BIND",
|
|
"GAMECULT_IDUNN_PROCESS_WRITE_LEASE",
|
|
"GAMECULT_IDUNN_RUNTIME_BUNDLE",
|
|
"GHOSTLIGHT_CONTROLLER_ELABORATOR_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_INTERPRETER_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_OPERATIONAL_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_PERSONA_MODEL",
|
|
"GHOSTLIGHT_CONTROLLER_PROJECTOR_MODEL",
|
|
"GHOSTLIGHT_DISCORD_GUILD_ID",
|
|
"GHOSTLIGHT_DISCORD_ROLE_ID",
|
|
"GHOSTLIGHT_HEIMDALL_APP_SECRET_FILE",
|
|
"GHOSTLIGHT_HEIMDALL_BASE_URL",
|
|
"GHOSTLIGHT_LOCAL_ENDPOINT",
|
|
"GHOSTLIGHT_LOCATED_SERVICE",
|
|
"GHOSTLIGHT_ODIN_RUDP",
|
|
"GHOSTLIGHT_PLAY_MODEL",
|
|
"GHOSTLIGHT_PUBLIC_APP_URL",
|
|
"GHOSTLIGHT_SERVICE_ID",
|
|
"GHOSTLIGHT_SESSION_WRAPPING_KEY_FILE",
|
|
]
|
|
optional_environment = ["RUST_LOG"]
|
|
|
|
[service.health]
|
|
contract = "ghostlight.cultnet-rudp-service-health"
|
|
|
|
[state]
|
|
schema_generation = "world-v3"
|
|
|
|
[[state.slots]]
|
|
id = "world"
|
|
relative_path = "world.cc"
|
|
kind = "cultcache-file"
|
|
schema = "ghostlight.world_state.consumer.v6"
|
|
writer = "process-bound-single-writer"
|
|
recovery = "preserve"
|
|
startup = "create-or-open-after-write-lease"
|
|
|
|
[[state.slots]]
|
|
id = "app-sessions"
|
|
relative_path = "service/app-sessions-v2.cc"
|
|
kind = "cultcache-file"
|
|
schema = "ghostlight.app_session_store.v2"
|
|
writer = "process-bound-single-writer"
|
|
recovery = "preserve"
|
|
startup = "create-or-open-after-write-lease"
|
|
|
|
[[state.slots]]
|
|
id = "controller-work"
|
|
relative_path = "service/controller-work.cc"
|
|
kind = "cultcache-file"
|
|
schema = "ghostlight.controller_work.v17"
|
|
writer = "process-bound-single-writer"
|
|
recovery = "preserve"
|
|
startup = "create-or-open-after-write-lease"
|
|
|
|
[[state.slots]]
|
|
id = "mesh-projection"
|
|
relative_path = "service/mesh-v2.cc"
|
|
kind = "cultcache-file"
|
|
schema = "gamecult.eve.surface.v1"
|
|
writer = "process-bound-single-writer"
|
|
recovery = "rebuildable"
|
|
startup = "create-or-open-after-write-lease"
|
|
|
|
[[provides]]
|
|
capability = "ghostlight.world-service"
|
|
schema = "ghostlight.world_state.consumer.v6"
|
|
compatibility = "consumer-v6"
|
|
|
|
[[provides]]
|
|
capability = "gamecult.eve.surface-provider"
|
|
schema = "gamecult.eve.surface.v1"
|
|
compatibility = "v1"
|
|
|
|
[[dependencies]]
|
|
kind = "shared-infrastructure"
|
|
capability = "odin.verse-rendezvous"
|
|
schema = "odin.verse-topology.v1"
|
|
compatibility = "v1"
|
|
startup = "before-promotion"
|