36 KiB
Ghostlight Current System Map
GhostlightDungeon is the active hosted runtime. Its authority map is
docs/architecture/ghostlight-dungeon-mvp.md. The implemented Rust daemon,
CultCache campaign stores, CultMesh/Eve surfaces, browser lowerer, and Starfire
process/release scripts are the live machine; the older validated artifact
seams remain regression evidence only.
GhostlightDungeon target flow
Vault evidence receipts + typed campaign snapshot
-> permissioned projection
-> Persona receives private lived narrative only
-> Interpreter emits typed deltas and action proposals
-> deterministic gates + expected revision
-> one WorldCommand enters the campaign mailbox
-> atomic CultCache commit + receipt
-> parallel affected-participant appraisal
-> CultMesh/Eve projection
Ghostlight owns the generalized projection organ. Epiphany and other consumers own their canonical Persona state and consequence commits.
The current player surface assigns one human session to one single-player
campaign. That is product scope, not kernel identity. The intended multiplayer
extension maps authenticated campaign members to distinct canonical actors and
routes every human command through this same mailbox and WorldKernel. Each
player receives an actor-permitted narrative projection; no party prompt or
shared client state becomes a second world authority. The bounded intention is
mapped in docs/architecture/ghostlight-dungeon-multiplayer-intention.md.
Build provenance has one owner: crates/ghostlight-dungeon/build.rs binds the
exact source commit into the binary. Its inputs are either the release tool's
explicit clean-tree commit or Git HEAD; it watches the actual symbolic ref,
HEAD reflog, and packed refs so an ordinary commit invalidates Cargo's cached
value. Health derives its commit from that embedded value. Release manifests,
launch scripts, and CultCache deployment receipts are verifiers and records,
not alternate writers. Local runs and immutable releases use this same binding,
and the regression test compares it to the checkout's live git rev-parse HEAD. A mismatch blocks activation rather than being repaired after launch.
Away-time agency follows a separate proposal/commit seam:
exact campaign revision
-> flash-model six-axis resolution demand
-> connected agency graph + budget/pins/leases/detail debt
-> cohesive or arena simulation-cell cover
-> one private Projector/Persona/Interpreter membrane per cell
-> model proposes exact constituent-attributed actions or explicit inaction
-> runtime selects compatible attempts and content-addresses each activity
-> one batched outcome resolver chooses bounded typed consequences
-> runtime binds complete cell membership + world/resolution revisions
-> WorldKernel validates cover, stage/outcome receipts, knowledge, scope, custody, topology, and bounds
-> AdvanceStrategicTick through the campaign mailbox
-> one atomic campaign/event/news/cover/appraisal commit
The model owns no tick mutation. A provider failure or invalid proposal leaves the campaign revision and world time untouched. Background inference checks live-turn pressure before launch and again before commit; return catch-up uses the same command path with player-turn priority.
A live request also interrupts an in-flight scheduler wave. Dropping that wave aborts its parallel cell tasks before they can launch later Persona stages, and a shared/exclusive commit gate makes scheduler commit impossible while any live request is active. Return catch-up is intentionally exempt because it is part of the live request and must finish before the requested player action.
Resolution-demand focal IDs are salience hints, not partition commands. They cannot create mandatory singleton cells or exceed the configured budget. Cell Projectors receive decision-relevant situation state; cell Interpreters receive exact permissions and the narrative products. Membership and revision bindings are derived by the runtime, so a model is never asked to copy an invariant that the planner already owns. Stable prompt prefixes are deliberately placed before dynamic state, and provider receipts expose per-attempt token/cache usage plus bounded local validation failures.
Arena projection preserves spatial partitions as well as identity partitions. Each remote view carries its actual location; a relation grants potential reach, not co-presence. Persona turns cannot stage direct sight, speech, or response across locations unless the lived stream establishes a shared place or communication channel. Interpreter activity labels then describe the narrow attempted act, while hoped-for success remains outside the effect. Ghostlight deterministically prepends the exact name/location partition to the learned Projector's narrative, so model omission cannot erase those boundaries. Only supplied cell constituents and selected member exceptions may own a perspective. Event mentions do not transfer a person into another cell, and an unnamed or unsupplied entity cannot become an activity target merely because a Persona found it plausible.
Institution slices carry committed current_posture separately from unresolved
pressure. Projectors present the posture as existing state; Interpreters and
validators compare any new commitment directly against it. The old overloaded
pressures[0] convention is not an authority path.
Model-facing actions contain one owner, subject_id. Nested effect owner IDs
are runtime-derived during binding and exist only in the canonical downstream
proposal. The model cannot disagree with itself about member:mira-venn versus
raw mira-venn, and the prompt/output contract spends fewer tokens copying
invariants Ghostlight already owns.
Canonical constituent references have one owner:
resolution::subject_state_references. Scheduler slices consume that set
directly, including active reachable migration destinations, and wave
validation recomputes the same set. Prompt construction cannot append
references the resolver does not recognize.
Cell perspective attribution is runtime-bound too. The schema admits only exact constituents and selected member exceptions. Ghostlight rejects duplicates and requires both the debt-selected focus and every selected named member exception to receive their own perspective segment; an actionable individual can no longer disappear inside the aggregate before the Persona turn. The perspective count may exceed the action limit only by the number of mandatory owners; action consequences remain separately capped. Segments are sorted and lowered to natural name/location headings before the Persona sees prose only. An invented Markdown section cannot turn a mentioned outsider into a decision-making perspective.
Gestalt background choices use three distinct typed paths. Pressure transitions
change exact unresolved markers. gestalt_activity records an attributed
preparation, coordination, investigation, recruitment, obstruction, trade, or
communication attempt against subjects connected by an explicit agency
relation or exact shared location without claiming the outcome. After
selection, one wave-level Flash resolver receives only those attempts and
precomputed legal consequence handles. It must return one digest-bound
strategic_activity_outcome.v1 per activity; missing, duplicate, stale,
player-mutating, or invented effects reject the entire wave. Accepted outcomes
may change exact resources, population pressures, incident agency relations,
named-member deltas, or discoverable canonical knowledge, or explicitly record
that no durable material change occurred. A selected
dormant member can be addressed by their durable ID; this does not union them
into the source population. The kernel derives the event text and exact
participant IDs; the arena and model prose own neither.
The outcome resolver does not repair or reinterpret Persona intent. The Interpreter owns the attempt; the resolver owns opposition and result; WorldKernel alone owns mutation. Its stage receipt binds the sorted set of MessagePack proposal digests, and every outcome is stored independently in CultCache and projected on the operator Eve surface. All effects apply to the same private campaign copy as the rest of the strategic wave, so a late invalid outcome cannot leave an earlier action, clock, detail debt, or event committed.
Deterministic admissible-effect handles constrain every resolver decision. Ordinary bounded preparation, pressure, and knowledge effects stop at local validation. Resource consumption/transfers, agency-relation shifts, and named member private deltas additionally receive an independent same-snapshot semantic verdict because those effects can be structurally valid while charging the wrong inventory or person. The verifier proposes no state and cannot commit. The latest provider-backed four-wave golden produced seven typed material activity outcomes, ten durable consequences, and zero rejected pulses while leaving the player unchanged and returning the same Mira.
The service-owned CultMesh store remains the canonical projection body when Odin rendezvous is temporarily unavailable. RUDP publication is outbound replication, not daemon-liveness authority: a failed publish is logged with its key and target while the complete local snapshot persists and HTTP serves that same typed health and Eve state.
Opening retrieval deliberately covers early, transitional, and late historical frames. Suggestions receive one same-evidence semantic correction with exact collided values when the local distinctness invariant rejects the first typed set; roles use the same bounded correction for duplicate names or premises. Both rejected and accepted receipts remain private while the browser receives only public suggestions. Invite rotation is owned by the deployment boundary: it replaces the protected token set and clears the persisted auth authority together while the daemon is stopped. Campaign stores survive; old sessions deliberately do not.
Away time does not require invented agency. When a campaign has no active,
simulation-eligible agency profiles, the scheduler enters the same
AdvanceStrategicTick kernel command with no model plan or resolution wave.
World time, clocks, pending-tick accounting, and deterministic obligations
advance atomically while the player remains untouched. The scheduler does not
call the partitioner merely to discover an empty graph, and it retains the same
live-turn commit exclusion as model-backed waves.
Compiler approval is a player decision surface, not an operator spoiler surface. It exposes topology, public cast, institutions, populations, clocks, player-role capabilities, evidence coverage, gaps, and branch assumptions. It does not project branch-local or provisional fact statements—even when they are discoverable later. Those facts remain canonical inputs to knowledge-gated play and operator inspection; the browser cannot reveal them before discovery.
Current acceptance body
Starfire currently serves immutable release
b76bb5a8936624513fd0cd5e46d4d9ab11c3a517, executable SHA-256
41928dbe73bb3e4a75e3a468d8a2c7ce725254621d17faa8a565ea526b2a3296,
with rollback 12a704a508f2be1f4eee96acd46fe0dd9369b81c.
Local CultMesh publication and HTTP readiness do not wait for Odin. Remote
replication is coalesced into one asynchronous RUDP batch. On 2026-08-18 the
canonical Yggdrasil endpoint 10.77.0.1:17871 had no listener; the live daemon
became healthy in 2.803 seconds and then emitted one acknowledged-failure
warning for its 19-document batch without losing local state or liveness.
Authenticated acceptance against the exact release has proved generated
opening/role/approval compilation, a nonliteral canonical player actor ID,
private assessment, confirmed server roll, wait, daemon restart continuity,
fork isolation, original re-selection, reset, and a MessagePack-backed .cc
export. The multiresolution matrix covered 24 factions exactly once at budgets
1, 4, 8, and 32. The strict nested refugee golden placed all 24 subjects in one
rival arena, preserved Mira Venn as a named decision owner, migrated her into a
different depth-two population lineage, produced material activity across six
other background subjects, preserved her delta and the player, and later
promoted the same Mira for a return encounter. Witnesses live under
F:\GameCult\GhostlightDungeon\acceptance\player-journey-a92fb7a-20260818,
gestalt-scale-a92fb7a-b{1,4,8,32}, and
gestalt-dynamics-7916ab0-strict.
Cell budget and physical provider parallelism are independent controls. The
scale executable accepts GHOSTLIGHT_SCALE_PROVIDER_PARALLELISM, defaults it
to the runtime default of eight, and records it in every witness. The corrected
24-subject budget-8 / parallelism-8 wave completed in 18.35 seconds, covered all
subjects exactly once, committed ten material actions plus one attributed
inaction, did not move the player, and required no model retry. Its witness is
F:\GameCult\GhostlightDungeon\acceptance\gestalt-scale-shakedown-b8-p8.
The earlier 25.64-second budget-8 witness used four provider slots and must not
be cited as an eight-concurrency performance result.
gestalt_migration records a collective decision by one exact active leaf to
move along an explicit migration relation and reachable route. WorldKernel
changes the leaf's home location and agency-profile location together. The
destination population remains a separate canonical subject, and named member
deltas are not carried by implication. Approval-gated fission creates
destination/stayer cohorts; the same migration primitive moves any resulting
leaf regardless of lineage depth. A local investigate activity may omit a
target when it examines the exact current environment. A local communicate
may likewise omit a target when its exact source speaks, offers, requests
permission, or notifies an unnamed ordinary role. Both admit ordinary texture
without inventing a listener, response, acceptance, discovered fact, or target
agency.
Activity effects operate at canonical-location granularity. Incidental motion around unnamed local features remains part of the source-attributed attempt and does not create topology or assert arrival. A different supplied canonical location or population destination still requires the exact movement path.
Salient dormant members have their own member_activity path for ordinary
local attempts. It uses the same bounded verbs, the member's exact location,
their current leaf plus explicitly related or exactly co-located targets, and
their own state/channel permissions. Only the capped salient member exceptions
selected for the cell enter any prompt or can be named there. Migration and
activity conflict on one member key. A destination population cannot inherit
the person's offer, speech, or decision merely because the cover placed them
in the same arena.
A named member's explicit commitment to board, depart, travel, or join a
supplied destination maps to member_migration, even when the first narrated
motion is only entering a queue. member_activity: prepare is valid only while
departure remains unchosen. The Interpreter and semantic verifier share this
distinction.
The semantic verifier emits one ordered verdict per candidate action. Ghostlight owns exact verdict coverage and derives the aggregate rejected set; the model cannot reject one arena constituent merely because another constituent's mapping failed, omit a candidate, duplicate an index, or publish a global decision that contradicts its per-action rationale. Rejected actions receive one same-snapshot Interpreter correction and may not be returned unchanged.
Population scale uses reversible individuation:
gestalt baseline + existing member delta, or a first-relevance identity proposal
-> WorldKernel validates gestalt/member/revision/location
-> atomic durable member delta + temporary ActorState
-> ordinary Persona appraisal and world commands
-> expired relevance lease outside player perception
-> atomic fold into the member delta; active slot removed
-> gestalt receives strategic ticks without erasing the individual
The temporary actor slot is derived. It never owns identity, relationship, memory, equipment, injury, or obligation state.
Automatic presence planning projects only active leaves at the player's location, dormant members whose exact location matches, and materialized members eligible for folding. The kernel rejects inactive hierarchy nodes and location mismatches. Nested fission and migration therefore change which baseline a durable delta composes with, never who the person is. The projection also names the player actor's reciprocal relationship to each nearby dormant member. The planner owns reversible scene casting and may surface an earned callback without a player prompt; it cannot move a remote person or commit the cast. Failed live casts retain a private presence-preflight artifact.
Institution already_committed_posture is projected as durable state, distinct
from unresolved pressure and fresh choice. Maintaining it is inaction. A model
may propose only a materially different posture; repeated posture remains a
locally rejected no-op and cannot enter an atomic wave.
Cell appraisals carry exact actions[] and exact inactions[]. Inactions name
the constituent or selected dormant member who holds and a bounded reason. They
cannot duplicate, cross cell authority, or coexist with an action from the same
subject. They are non-mutating audit/fairness evidence. The former global
inaction string is no longer an owner or runtime path.
Strategic plan application reads authority and permissions from one immutable command snapshot. All writes land in a private working campaign which replaces the command-local campaign only after every action validates. Sequential loop order is no longer a fictional owner: a migration earlier in the apply loop cannot invalidate another subject's same-snapshot communication, and a late invalid action cannot leave earlier in-memory mutations behind.
The active cell budget, operator-owned pins, and provider concurrency limit are
separate controls. Budget and pins increment resolution_epoch without
advancing world revision or fictional time. Provider concurrency increments only
provider_configuration_epoch; it batches the same cover and cannot repartition
the world. See docs/architecture/ghostlight-multiresolution-agency.md.
The browser command boundary is deliberately smaller than WorldCommand.
Authenticated HTTP admits only player-owned Speak, unfilled Assess, Attempt,
Wait, and active-cell-budget requests. Actor identity must match the campaign player. Compiler
approval has its own route. Strategic ticks, region commits, gestalt presence,
reaction waves, NPC initiative, and campaign creation are internal mailbox
commands and cannot be invoked through /api/command.
Authentication owns entry to the complete /api router before request-body
extraction. Axum's protected-route middleware reads only headers and durable
session authority; an invalid session receives 401 before JSON parsing,
schema rejection, campaign lookup, inference, or mutation. Handlers repeat the
session lookup where they need the session identity, so revocation between the
perimeter check and a handler cannot leave stale authority alive. Public
/health, single-use /invite/{token}, and static browser assets remain
outside this middleware. Regressions prove malformed anonymous JSON is refused
at the perimeter while the same malformed body under a valid session reaches
the ordinary 400 extractor response.
That boundary also projects less state outward than the kernel returns inward. Player HTTP responses contain only assessment, public commit/roll receipts, and narration. Canonical campaign state and spoiler-bearing actor or institution state are operator-only. Informational rolls add only their exact previewed finding to the acting character and a provisional branch fact. The assessor deterministically binds typed findings into visible stakes before validation, so formatting is not delegated to a correction attempt. The compiler classifies each retrieved source as direct seed, setting background, or excluded before generation. Only direct-seed source text enters causal world compilation; background and excluded sources remain coverage provenance and cannot donate story incidents or cast.
The player Eve surface follows the same membrane. It renders the player-owned
ledger—including that actor's own relationships—and already filtered news, but
does not enumerate canonical institution postures or raw world clocks. Those
remain operator state until narration or an exact information channel makes a
development available to the character. A negative regression plants a remote
coup posture and sealed investigation clock, proves all three secret strings
absent from the player surface, and proves an admitted public headline remains.
It likewise exposes only the number of operator pins and local active
population leaves eligible for a fission preview. Pin bodies, remote population
names, and ReplaceResolutionPins remain outside the player boundary.
HTTP operator inspection and provider-parallelism mutation require both an
authenticated campaign session and an actual loopback TCP peer. The daemon uses
Axum connection metadata from its direct listener; forwarded address headers do
not grant authority. LAN and WireGuard peers receive 403 before spoiler state
or controls are read. The browser operator panel is present only when loaded
from 127.0.0.1, localhost, or ::1; this mirrors the server boundary and is
not itself treated as security.
Global strategic context has a separate non-causal lane. Two stable broad Vault queries run alongside local retrieval, and a Flash extraction stage proposes at most 32 remote institution names with one short durable mandate each. Local code binds each mandate string to an exact witness that also names the institution. Unsupported entries become summarized approval gaps and private receipt detail; they do not become canonical institutions or canon-candidate records. Admitted remote institutions receive deterministic coarse profiles with distinct authority and explicit unknown facets. The Pro agency stage profiles only local actors, populations, and institutions where semantic subdivision is useful.
Compiler, expansion, fission, fork, and reset routes follow the same projection
rule. Approval previews expose the public decision surface—topology, cast,
pressures, player role, source-use coverage, gaps, and assumptions—without raw
campaign, evidence, model receipts, private goals, memories, or relationships.
The browser composer preserves the assessment contract's distinction between
the character's described act or speech and the effect the player wants it to
cause. The receipt panel is the sole owner of the current assessment,
destination, or fission approval control; rendering a newer receipt removes the
older snapshot-bound control instead of accumulating stale confirmations in
persistent forms. World-seed approval renders expandable public sections for
the player role, initial topology, present cast, institutions, populations,
world clocks, and exact evidence-use rationales instead of asking for approval
from summary counts. A browser-local interaction lock prevents duplicate paid
requests while preserving the kernel mailbox and revision checks as the only
world-mutation authority.
The player surface also projects the canonical current location ID. The
destination compiler binds that value into a read-only origin field and shows
the proposed locations, containment, routes, persistent features, and material
gaps before approval. Population fission approval similarly shows each named
child leaf, partition value (including other/unknown), and home location.
The browser interaction lock covers a canonical mutation and the subsequent
surface refresh as one user interaction. Campaign selection, world approval,
destination approval, fission approval, fork, and reset cannot re-enable stale
controls between the commit response and the refreshed revision. Compiler
preview requests remain non-mutating and release the lock with their returned
preview. Received non-success HTTP responses are rendered as server refusals;
only missing or undecodable responses receive the ambiguous-transport warning
that a commit may have preceded the lost response. The production web build
runs strict TypeScript checking before Vite emits assets.
Relationship documents in the schema catalog are revision-bound projections of actor-owned relationship maps; they are not a second relationship writer. Vault manifests summarize the exact provider/source/authority/temporal lanes covered by evidence receipts and do not own Vault content. Strategic tick and gestalt materialization receipts are different: they are atomic commit companions binding the generic world commit to the causal model output or baseline/member presence transition.
Control Flow
- Rehydrate from
state/map.yaml,notes/fresh-workspace-handoff.md, this file, andnotes/ghostlight-implementation-plan.md. - Run
npm run state:status. - Work one bounded organ.
- Validate the seam that matters.
- Persist only belief-changing evidence.
- Commit and push completed work.
Model acceptance also measures useful work per token. Stable contracts precede revision-bound context for cache reuse; each stage receives only the state it can legitimately judge; provider receipts expose cache, prompt, completion, and validation cost per attempt.
Core Surfaces
state/map.yaml: canonical mission, boundaries, live architecture, next action.state/evidence.jsonl: distilled belief-changing evidence only.state/evidence.archive.jsonl: older evidence preserved for archaeology.state/corpus-coverage.json: accepted/planned fixture coverage ledger.notes/fresh-workspace-handoff.md: compact re-entry packet.notes/ghostlight-implementation-plan.md: near-term implementation sequence.docs/architecture/: detailed contracts and rationale.
Active Artifact Pipeline
Aetheria lore/source context
-> lore grounding digest / source notes
-> canonical agent and scene state
-> projected local context
-> responder packet
-> sandboxed responder output
-> review and leakage audit
-> observable event record
-> participant-local appraisal receipts
-> mutation receipt
-> updated scene/world/social state
-> initiative schedule updates readiness, reaction windows, and next actor
-> sandboxed coordinator continuity and next-beat plan
-> meta-coordinator review, wiring, and labeled interventions
-> branch compiler materializes Ink + sidecar + visual plan + compiler notes
-> IF artifact reviewer audits consequence, fold, and visual continuity
-> narrative/lore/spatial/visual reviewers audit player-facing quality
-> accepted fixture / future training corpus + optional illustrated replay collateral
Responder packets are one seam, not the whole project. The branching scene path also requires coordinator receipts, branch compiler artifacts, and independent review before a fixture is accepted.
Tone is a live seam. The system should preserve Aetheria's range instead of defaulting to dry technical crisis prose: comic warmth, domestic routine, ritual memory, weird bureaucracy, noir suspicion, wonder, horror, poetic dread, and procedural systems pressure are all valid when source-grounded and character-local. Adams/Pratchett-style wit-with-stakes is a useful default touchstone for counterbalancing bleakness without dissolving consequence.
Visual replay is a presentation seam, not a core social-model training seam.
Illustrated IF fixtures need click-through sections with stable
visual_scene_id anchors, stable visual character refs for recurring named
characters, a global style cue when the visual language matters, imagegen-ready
base prompts, character visibility and stance controls, and branch/state
modifiers. This data belongs in a separate .visual.json artifact referenced
by the training sidecar, not inside the training annotation itself.
Generated images are not geometry authority. They can establish visual mood,
materials, and concept direction, but multi-angle illustrated IF needs a durable
scene_set source such as a hand-built 3D blockout, procedural scene file, or
layout asset with named cameras and staging slots. For those scenes, imagegen is
the painter/render pass over a camera-specific blockout, not the architect of
the room.
Important Contracts
- Agent state:
schemas/agent-state.schema.json - Projection examples:
schemas/projection-example.schema.json - Lore grounding:
schemas/lore-grounding-digest.schema.json - Projected local context:
schemas/projected-local-context.schema.json - Coordinator artifacts:
schemas/coordinator-artifact.schema.json - Responder packets:
schemas/responder-packet.schema.json - Responder outputs:
schemas/responder-output.schema.json - Event records:
schemas/event-record.schema.json - Participant appraisals:
schemas/participant-appraisal.schema.json - Reviewed mutations:
schemas/reviewed-mutation.schema.json - Scene-loop bundles:
schemas/scene-loop-bundle.schema.json - Initiative schedules:
schemas/initiative-schedule.schema.json - Ink branch contract:
docs/architecture/ink-branching-scenes.md - Illustrated IF visual pipeline:
docs/architecture/illustrated-if-visual-pipeline.md - Training stages and corpus gates:
docs/architecture/training-plan.md - Corpus coverage ledger:
docs/architecture/corpus-coverage-ledger.md
Current Live Examples
Pallas Species Strikes is the active reference-only story fixture:
examples/lore-grounding/pallas-species-strikes.awakened-labor.v0.jsonexamples/agent-state.pallas-species-strikes.v0.jsonexamples/coordinator/pallas-species-strikes.branch-and-fold.v0.jsonexamples/ink/pallas-species-strikes.branch-and-fold.v0.inkexamples/ink/pallas-species-strikes.branch-and-fold.v0.training.jsonexamples/visual/pallas-species-strikes.branch-and-fold.v0.visual.jsonexperiments/pallas-species-strikes/pallas-species-strikes.branch-and-fold-clean-run.v0.mdexperiments/pallas-species-strikes/pallas-species-strikes.visual-scene-review.v1.json
The fixture is not training-ready data for Ghostlight's model stages. It was coordinator-authored without the exact projected-context, sandboxed responder, appraisal, mutation, relationship-update, and true branch-compiler receipts those stages require. Keep it as a reference for story shape, grounding, branch-and-fold presentation, visual planning, and future fixture expectations.
pallas-training-loop-v0 is the first separate training-shaped derivative. It
rebuilds only the Kappa threshold beat through actual receipts:
- scene digest and initial state under
examples/training-loops/pallas-training-loop-v0/ - projected contexts under
examples/projected-contexts/ - responder packets under
examples/responder-packets/ - raw no-fork subagent captures under
experiments/responder-packets/ - event, appraisal, mutation, review, and bundle receipts under
examples/training-loops/pallas-training-loop-v0/ - clean readable transcript under
experiments/pallas-training-loop-v0/
It is training-shaped for projector, responder, event resolver, participant appraiser, mutator, relationship/perception updater, and coordinator/story runtime. It is not branch compiler, IF reviewer, visual, or accepted full-fixture coverage data.
lucent-hostage-feed-v0 is the current open-ended training-loop draft. It
tests the same receipt-chain organs in a less reference-bound scene: a Lucent
Media hostage-feed negotiation inside the media-eye counterweight of a tethered
station staring down at a metropolis bubble.
The Lucent bundle includes:
- scene digest, initial state, and branch surface under
examples/training-loops/lucent-hostage-feed-v0/ - projected contexts under
examples/projected-contexts/ - responder packets under
examples/responder-packets/ - raw no-fork subagent captures under
experiments/responder-packets/ - event, appraisal, mutation, review, and bundle receipts under
examples/training-loops/lucent-hostage-feed-v0/ - clean readable transcript under
experiments/lucent-hostage-feed-v0/ - fixture materializer at
scripts/materialize_lucent_loop.py - initiative schedule example at
examples/initiative/lucent-hostage-feed-v0.turn-20.initiative.json
Only the fifteen post-restart turns from turn-06 through turn-20 are counted
as training-clean responder receipts. The earlier exploratory opening turns are
setup/rehearsal context. The loop demonstrates state carryover: feed evidence
externalization creates breathing room, breathing room creates a bench-edge
substitution, the substitution enables a process-note admission, the admission
enables direct hostage leverage to end, and release folds into safe-line
confirmation plus non-contact protective handoff.
The current coordinator lesson is explicit: nudge through game-ergonomic state levers rather than forcing plot. Safe lines, evidence locks, security holds, handling categories, posture constraints, route access, clocks, public proof objects, and resource pressure are the elastic strings. Actors pull against those strings from local state; the coordinator records observed action and folds consequences through reviewed mutation.
The coordinator must now be treated as a sandboxable organ in future training-shaped loops. Codex remains the meta-coordinator: it prepares visible input, launches the coordinator worker, reviews the output, labels repairs, and wires structured state between organs. Raw coordinator training data should come from sandboxed coordinator prompts, not from omniscient chat steering.
The initiative scheduler is now an explicit mechanical seam. It decides when an actor is eligible to act from initiative speed, recovery, load, status, and reaction windows; it does not decide what the actor wants or how other participants appraise the event. Every affected participant still appraises and mutates before the scheduler selects the next projected actor.
VoidBot's newer heartbeat routine is the reference shape for turning that seam
into a living swarm routine. For Ghostlight, the swarm is the cast: the same
heartbeat initiative law selects characters taking turns within a scene, while
offstage or maintenance heartbeats handle rumination, sleep consolidation,
memory resonance, and reviewed upkeep. See
docs/architecture/voidbot-routine-adoption-plan.md.
Pruned Receipts
Old prototype fixture receipts and model-runner files have been removed from the live workspace. Their useful lessons belong in the architecture docs, state map, evidence ledger, and git history. Do not reintroduce deleted receipt paths as active state surfaces.
Missing Or Incomplete Organs
- World compiler browser flow, selected-opening/role path, live provider acceptance, material-gap approval, on-demand destination expansion, and canon-candidate persistence
- Deterministic speaker-local input slicer
- Full prompt renderer
- Classifier/appraiser pipeline
- Relationship/perception updater
- State mutator model
- Student projector
- Runtime integration for initiative scheduling beyond validated artifacts
- Branch compiler implementation beyond coordinator-authored fixtures
- IF artifact reviewer implementation beyond manual/frontier review
- Visual scene continuity reviewer implementation beyond prompted specialist review
- Full scene/event loop implementation
- Culture prior engine
- Automatic promotion of branch outcomes into canonical state
- Corpus coverage ledger expansion beyond the current draft Pallas and Lucent receipt-chain rows
Current North Star
Generate high-quality, sandboxed, source-grounded branching-scene samples that can later train specialized Ghostlight models while staying usable by a game engine: exact inputs, exact outputs, provenance, review labels, state mutation receipts, branch compiler artifacts, IF review findings, visual scene plans, and clear branch consequences. The samples should also train tonal control: a fixture needs an intentional prose mode and enough ordinary life for consequence to matter.
Use npm run coverage:status before choosing new fixtures so the corpus grows
by coverage need instead of proximity to the nearest interesting disaster.