Ghostlight/notes/fresh-workspace-handoff.md
Meta Vens 4406008b3c Record run 12: every cited span lands
Runbook row 12, evidence record, schema pins in map and handoff moved to
controller_work.v15.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-11 14:34:20 +02:00

20 KiB

Ghostlight Fresh Workspace Handoff

Updated: 2026-09-11

This is the compact re-entry packet. It carries current authority and the next gate. Git owns chronology, the system map owns teardown detail, and evidence records own durable findings.

Immediate Re-entry Instruction

  1. Work from F:\Projects\Ghostlight.
  2. Run git status --short, git log -1 --oneline, and npm run state:status.
  3. Read state/map.yaml (current_status first), this handoff, and docs/architecture/ghostlight-dungeon-mvp.md.
  4. Read notes/ghostlight-current-system-map.md only when exact pre-rebuild ownership or deletion evidence is needed.
  5. For deployment, SSH, Idunn, Odin, Heimdall, or host work, consult F:\Projects\gamecult-ops before acting.

If the operator asks only to rehydrate, report the current gate and stop. A persisted next action is not permission to begin edits.

Do not continue implementation automatically from a rehydrate-only request. Do not trust this file for the exact live HEAD. Git and live runtime witnesses own volatile identity.

Current authority

The operator stopped Run 115 and ordered a whole-machine authority rebuild. The adopted target is docs/architecture/ghostlight-dungeon-mvp.md.

One per-world WorldKernel owns one revisioned WorldState across Draft and Active phases. It alone derives authority, applies the typed ontology reducer, and commits an atomic CultCache revision. World creation, autonomous turns, player commands, elaboration, consumer patches, time advance, and administrative changes all enter through the same CommandEnvelope path; there is no Session Zero.

The replacement owner is sealed. Its runtime boundary remains create/open, immutable snapshot, submit, and typed receipts. Mutable aggregate state, canonical ID issuance, the reducer, and the CultCache journal writer stay private to the kernel. Controller assignment and affordance grants are canonical; current executability and decision opportunities are derived and revalidated by the kernel. The landed foundation.v0 loop binds opportunities to a revision; ontology v2 replaces that with scope-digest binding, so a proposal whose scope digest is unchanged commits at a later revision and one whose digest changed is rejected. Revision binding is current source, not the adopted rule.

Autonomous cognition has two explicit modes under disjoint controller scopes:

  • NarrativePersona receives narrative projection and replies only in prose. The runner records that prose as receipt-bound noncanonical source evidence; a total Interpreter emits every faithful typed proposal it can lower with an exact source capture and records exact translation gaps for the rest.
  • OperationalAgent receives a permissioned typed view and tools when operator-shaped cognition benefits from direct state work.
  • Mode changes representation, never authority. A decision opportunity cannot fall through between modes or act twice.

The Interpreter cannot fail semantically. Missing referents, ambiguous intent, missing affordances, and missing command primitives become translation gaps. Malformed capture spans, raw tool decode failure, and normal step exhaustion fall back to an exact whole-source gap rather than losing meaning. An infrastructure interruption discards partial captures and returns the immutable source pending for a fresh attempt. Source prose is not speech: only actually spoken words may become a typed speech proposal. Only the world kernel may accept or reject a proposed mutation. Translation gaps remain non-fictional inference/evaluation evidence outside WorldState; recording one cannot itself request elaboration or advance a world revision.

World validity and world liveness are two different claims, and both are true. Structural validity is sparse and causal: it never waits on a count, and no count, cover ratio, interestingness, diversity, or prose-quality judgment can admit ontology, reject a structurally valid mutation, or declare a world complete. Liveness is authored: the seed carries a WorldScaleIntent, the elaborators pursue its derived per-jurisdiction scale deficit as a work queue, and the cover budget is the deliberate choke that makes attention scarce.

Operator directive, 2026-09-04, preserve verbatim in intent: the 2,400-subject / 240-cell / 10% cover profile is deliberate design, not a load fixture. A world feels alive only when actors at every level pursue their own goals; that detail is generated first, then multiresolution simulation is choked so attention is scarce and selection is forced. The mvp doc's teardown-era sentence calling it "test data, not a production elaboration target" was wrong and is amended. Do not re-cut the scale target as fixture noise.

Landed

Git owns the commit chronology; git log on codex/ghostlight-dungeon-mvp is the witness. What is true of the tree now:

  • The replacement mailbox/kernel is the crate and executable runtime identity; no legacy Session Zero, kernel, scheduler, assessor, verifier/reconciliation, or transition module path survives, and no compatibility writer was kept.
  • One CultCache implementation, consumed from CultLib 85f7024, owns app sessions, the world journal, and controller custody.
  • The Persona interpretation contract is structurally total and live in the single ControllerRunner in crates/ghostlight-dungeon/src/world/controllers.rs.
  • The Idunn provider side is complete: the runtime validates Expected and activation, publishes signed Warming until the write lease arrives, and exposes managed route presence. Production has not cut over.
  • Plan steps 6 and 8 through 14 are landed with their follow-ups: the ten ontology passes, the seed producer, interruption, witness, and the Claude SDK inference port. notes/ghostlight-implementation-plan.md carries each step's landed state; the ontology doc carries the mechanism.

Do not start another world acceptance run while Yggdrasil still serves the legacy executable and state layout.

Immutable failure evidence

Run 115 is terminal failed at /var/lib/gamecult/ghostlight-dungeon/acceptance/full-world-delvehold-0a83034-115: semantic revision 2, regions 2/8, waves 0/1. Resume2 ended on provider SSE timeout. Resume3 exhausted four reconciliation steps after inst:kharad-road-keepers referenced unknown loc:kharad-rhythm-road. Invocation d9254cd9b77946aebcf7a7fdae821402 is terminal. Preserve the root and receipts unchanged; its status.json is stale derived telemetry.

Runs 108 through 115 are evidence about load and failure properties of the old body. Those runs were load fixtures; the 2,400-subject / 240-cell profile they exercised is the authored design target, not fixture noise (see the operator directive under Current authority). The 1,200-actor fixture remains a load measure only.

Operational boundary

Yggdrasil still serves legacy Ghostlight release a4080d4 from an enabled Restart=always unit with health v1, campaign/Session Zero state, and no world.cc or app-sessions-v2.cc witness. The Connector is also still on its legacy enabled body. CultNet through CultLib 85f7024 owns generation-bound activation, separate lifecycle brakes, process-write leases, observed capabilities, explicit disagreement, and routed RUDP incarnations. Odin through pushed 65cf2b2 owns deterministic recipe and binding admission, exact source freezing, sealed releases, durable deployment transactions, and the narrow native actuator ports. Current uncommitted Odin integration moves Idunn-owned projection and multi-session RUDP transport into those live paths.

Ghostlight pushed 6a79cb0 with the provider side of this cut. Its recipe requests Idunn's runtime bundle, candidate bind, protected activation and provider credentials, process-write-lease path, and admitted state-root binding. The runtime validates Expected and activation, publishes signed Warming, waits for the exact process lease before opening state, keeps that lease current through bind, Active publication, and serving, republishes Warming until the lease arrives, and exposes its managed route presence. CodexConnector pushed ede3c30 with the corresponding stateless provider contract. Neither service has been admitted through rebuilt Idunn yet.

The adopted cut puts a visible recipe with a constrained launch declaration in each target repo; raw unit or container-runtime templates are rejected. The operator binding selects the workload driver, which alone lowers that launch declaration into process-manager configuration. Idunn operator bindings own the admitted ref, runner/container image and affordances, host paths, secrets, routing endpoint, rollout, retention, and desired replica placement. A sealed plan and release publish only Expected. A service owns its signed runtime presence and health claim. Odin alone authenticates that observation into Present and derives Ready from exact Expected/Present agreement; the three states and any disagreement remain distinct. For writable state, Idunn grants the process-bound lease before state opens. Stable route membership moves only after Ready. Deployment and continuity remain separate authorities; a deployment brake cannot suspend restart of the already-admitted body.

The current Nginx driver observes rendered configuration and nginx -T visibility, not live-worker adoption or packet delivery. A route is not acceptance-complete, and the incumbent may not be drained, until an independent data-plane probe binds the exact candidate runtime and membership digest.

Idunn is the GameCult-wide deployment, admission, continuity, and future swarm-scaling control plane. Systemd, container runtimes, and existing proxies remain its replaceable actuators; it does not reimplement generic scheduling, networking, container, service-mesh, cryptographic, or consensus machinery. Odin owns the discoverable semantic topology; services own their actual signed capability, health, capacity, and runtime claims.

Idunn starts and recovers from its own durable admitted state; Odin is its first managed daemon and the semantic graph root, not an Idunn bootstrap dependency. First-Odin admission still publishes Expected and requires signed Present and Ready; only its evidence transport is bootstrapped by querying that exact candidate directly. Idunn publishes desired topology before dependent promotion. During an Odin outage, it may authenticate private physical evidence to replace only the process incarnation inside an existing admitted generation and preserve the current route. It freezes graph-changing deployment, promotion, scaling, and provider selection; historical Ready cannot authorize the replacement process, and Idunn never emits Present or Ready.

Heimdall owns account identity. Eve owns command invocation and lowering. VoidBot owns Vault retrieval and evidence. Idunn owns deployment and daemon continuity. Odin owns discovery. None owns world mutation. External consumers, including Delvehold and Epiphany, own their state; Ghostlight may publish views and proposals but cannot commit on their behalf.

Next gate

The adopted vocabulary is docs/architecture/ghostlight-world-ontology.md; its "Current mechanism" section describes the kernel as it stands. ghostlight-transition-algebra.md and ghostlight-multiresolution-agency.md are teardown evidence.

The kernel now

Thirteen decision-constraining component kinds over a pinned operation catalog under one WorldPatch, one reducer, one CAS commit, one decode bound for both authoring lanes, and three confined SystemCapability arms: Clock, Elaborator { jurisdiction }, Consumer { consumer }. Proposals bind to a scope digest, and the kernel is the sole ScopeChanged detector: a bound narrative turn whose scope moved is re-lowered once by the Interpreter with the typed delta, never lost and never checked lane-side. Witness fans a fact out over a place subtree through the one reach owner. External consumers enter through POST /cultnet/world-patch under PatchGround::Consumer; the live contract is docs/architecture/ghostlight-world-consumer-api.md. The seed lane admits a Draft-only owner patch from a local Vault and pursues the derived scale deficit. Inference runs through one InferencePort::prepare with two transports: the CodexConnector and, per claude-prefixed lane model, the Node sidecar on the Claude Agent SDK. The Rust decoder is the one validator on both; the sidecar hands arguments through unvalidated. The sidecar and its receipt shape are a named stopgap, deleted whole when a Messages-API port has budget. The SDK transport is proven on the road: seeded runs on claude-sonnet-5 committed ticks end to end (notes/local-live-smoke.md, "SDK runs, 2026-09-10"). A kernel refusal continues the authoring conversation (Refusal rows, controller_work.v15); the Interpreter cites prose by quote (source_quote), and a quote not in the prose is a gap. Plan step 12 is landed: PersonaMaterial is the thirteenth component, a promise carries its statement, the Projector sees who else stands in the room, and on the road (run 8) six seeded people speak in six voices about a debt with words in it. Plan step 14 is landed (commit 0582321): a visible act is quoted by the Interpreter as the visible clause alone and lands as Seen { by } knowledge on the co-located; the actor's intent stays private. Knowledge sources are Witnessed, Told, Seen, Evidenced. Run 10 passed (18 displays) and produced the first live interrupted cell. Each interrupted cell is now logged per cell: the harness prints interrupted cell subject=<label> bound=<digest> renewed=<digest> after each tick line from CoverSummary.interrupted (commit 81a1f53); run 11 printed three, matching three re-lowerings in the trace. State and commit schemas are .consumer.v4.

Deferred by design: PolityInCausalRange, IndividuationRequired, and Verification 13 wait for relations and population slices. Stale: the pre-pass-6 ignored acceptance test real_codex_connector_cognition_modes_commit_speech in world/controllers.rs fails at NoAudience because its subjects are unplaced; retire it or place its subjects.

Constraints

  • The operator's Claude subscription, inherited by the SDK sidecar from the ambient Claude Code login, is the only live provider. Codex remains lapsed: no Codex subscription and no API budget; the Codex connector is stopped; the smoke substrate at F:\Projects\Ghostlight-smoke stays.
  • CodexConnector is a deliberately isolated Codex fork so that Epiphany stops compiling Codex; nothing goes into it. Its main at 6519289 is the line Ghostlight runs.
  • Ghostlight never reads, copies, forwards, or logs a credential. The connector's Codex home is the operator's real ~/.codex; the SDK sidecar inherits the operator's Claude Code login from the ambient environment.

In order

  1. The outbound half of the consumer contract: the response batch with a non-loopback CultMesh lease.
  2. The deployment gate below.
  3. Integration of the elaborator swarm's ideas (see "World fixtures and the elaborator swarm" below).

Decisions the operator owns

  • Whether a refused coupled constituent may re-submit once inside the same tick, decided with the submitted-versus-committed number in hand.
  • The authority for an owner-only Eve world.run_tick command, not built.
  • Routed to the Eve owner: whether the command-result vocabulary needs a fourth state for an overtaken turn instead of rendering an interruption as denied.

World fixtures and the elaborator swarm

First-generation world fixtures are banked and pushed, one per world, each with Ink, training sidecar, visual plan, lore grounding, and BFL manifest, reviewer-accepted except visual replay, which waits on a scene-set blockout: Delvehold cistern-house-nine-breaker-test on codex/world-delvehold; Aetheria navigator-berth-hearing-v0 on codex/world-aetheria; Zyphos eclipse-nursery-handover on codex/world-zyphos; Kalsa stormshield-handoff-v0 on codex/world-kalsa; lore on each vault's codex/ghostlight-worlds branch.

The elaborator swarm is drained and handed off; a Ghostlight kernel session does not own it. The successor handoff is C:\Users\Meta\.claude\worlds\README.md (98 finished passes). Owed and deliberately deferred: integration of the slot/<world>/<title>/<stamp> branches into the lore vaults on codex/ghostlight-worlds and into codex/world-<world>; the idea index is the four ledger directories experiments/elaboration/<world>/ledger/ on those world branches. Clones: F:\Projects\Ghostlight-worlds\<world> and F:\Projects\<Lore>-worktrees\ghostlight-worlds (full clones despite the name). The retired first-generation loop under C:\Users\Meta\.claude\worlds\retired must not be launched. Image rendering is deferred: workers emit imagegen-ready prompts only, and scripts/generate_bfl_images.py has no working default key path.

Deployment gate

Deferred behind the orders above, not cancelled:

Review and subtract the uncommitted Idunn-owned Expected/activation/anchor/lease projection and bounded multi-session RUDP document transport. Repoint Odin off its vendored CultNet fork onto CultLib 85f7024 as Ghostlight did, add UDP route actuation plus an independently persisted post-reload data-plane observation through the existing proxy, and verify that focused body on Yggdrasil. Then implement the directly managed Rust Odin that alone authenticates runtime observation into Present and derives Ready, plus exact capability dependency closure frozen inside the existing deployment transaction. Do not add another scheduler, registry, inbox, or shared-file correlation owner.

Install rebuilt Idunn and admit Odin first through the same Expected/Present/Ready contract, using its exact candidate only to bootstrap the evidence transport. Then admit CodexConnector and Ghostlight. Same-generation continuity, route preservation, split-brain fencing, signed health, Odin-outage freeze, and negative legacy-authority checks must all agree before purge.

Deploy the Connector and then Ghostlight through that contract. Runtime restart, route continuity, signed health, exact receipts, exclusive world-v3 state, and negative checks must agree before deleting old services, releases, state, acceptance roots, and local run scaffolding.

Essential references

  • Target authority: docs/architecture/ghostlight-dungeon-mvp.md
  • Vocabulary and current mechanism: docs/architecture/ghostlight-world-ontology.md
  • Consumer contract: docs/architecture/ghostlight-world-consumer-api.md
  • Frozen teardown map: notes/ghostlight-current-system-map.md
  • Current implementation plan: notes/ghostlight-implementation-plan.md
  • Local live smoke runbook: notes/local-live-smoke.md
  • Human-readable state: state/map.yaml
  • Distilled evidence: state/evidence.jsonl (full history in state/evidence.archive.jsonl)
  • Machine-managed state: state/ghostlight-state.cultcache.jsonl
  • Interface authority: docs/architecture/ghostlight-eve-native-interface.md
  • Operations: F:\Projects\gamecult-ops
  • Faculty-workflow lessons: F:\Projects\Epiphany\notes\faculty-workflow-lessons-2026-09-04.md

Re-entry warnings

  • A prompt, transcript, model receipt, scheduler item, browser surface, actor count, or derived simulation cover is not canonical world state.
  • Do not preserve an old writer through a compatibility path.
  • Do not let a translation gap become invented state or an Interpreter error.
  • Do not publish mutable world types, an ID issuer, a reducer entry point, or a generic journal handle for the convenience of tests or adapters.
  • Do not append a commit when reduction produces no canonical mutation.
  • Do not resume Run 115.
  • Do not invoke the current bounded Connector or Ghostlight redeploy helpers; they fail at the root/Idunn Git boundary and still embody duplicate target deployment authority.
  • Do not prove world-v3 purity with a short deny list. Archive the complete old state root or validate a complete allowed-path contract.
  • Keep this handoff compact. Move chronology to Git, evidence, or the frozen system map.
  • docs/architecture/ghostlight-transition-algebra.md is teardown evidence, not vocabulary authority.
  • Integration gating: merge, confirm the tip by SHA, then delete the branch; never chain merge --ff-only with branch -D. Push only after reading the test result line, never on the launch.