25 KiB
Ghostlight Implementation Plan
Current Phase
GhostlightDungeon is now the active implementation program. Its authoritative
architecture and ownership map is
docs/architecture/ghostlight-dungeon-mvp.md. The existing data-generation
pipeline and fixtures remain regression evidence; they do not become hosted
runtime authorities.
The Epiphany Projector → Persona → Interpreter extraction and handback are
complete. Ghostlight owns the generalized projection membrane in the
ghostlight-persona-projection crate. Epiphany consumes an exact Ghostlight Git
revision and now gives Persona only one lived narrative stream; Epiphany keeps
her canonical Persona mind, receipts, effect admission, brakes, and external
consequence authority.
The hosted runtime owns persistent DM-led Session Zero, exact VoidBot evidence,
campaign mailboxes, fiction-first d20 resolution, parallel Persona appraisal,
exact committed story projection, reversible gestalt materialization, actor-bound membership,
CultMesh/Eve publication, and away-time scheduling. One to eight authenticated
players negotiate one shared contract and private character states before the
host can atomically publish an unanimously approved seed. Strategic ticks now project six-axis
pressure, select a connected budgeted cover over the global agency skeleton,
and run one private Ghostlight Persona membrane per cohesive or arena cell. The
WorldKernel admits the whole cell wave atomically and forbids player puppeting,
synthetic arena actors, borrowed secrets, invented IDs, unreachable movement,
and unbounded information or population-pressure edits. The laboratory exposes
a pooled 1–128 campaign cell budget supplied by a player entitlement port,
persistent pins, approval-gated gestalt fission, graph and cover receipts, and
a separate operator provider-concurrency limit. The
specific authority map is
docs/architecture/ghostlight-multiresolution-agency.md.
Session Zero model custody is split by purpose: every committed invocation is
retained in the audit for cost and failure analysis, while only the exact
compiler transaction behind the current preview is eligible for campaign
publication. Superseded previews and ordinary DM turns cannot contaminate the
seed proof set. Ordinary DM turns bind the current player message verbatim
outside the lossy Projector summary, retain only six prior channel turns and
four shared continuity turns, and give the Interpreter only its channel's typed
authority lane. This keeps exact player intent available while reducing the
prompt space in which already-settled questions can become salient again.
Vault transport unavailability is a typed provider cause, not a lore answer.
SessionZeroKernel retains the exact negotiated draft, returns to drafting,
records one stable resolved material blocker, and publishes no preview, branch
assumption, world digest, or campaign. After retrieval recovers, a retry uses
the same compilation path; the browser and model cannot supply substitute lore.
Strict model output schemas now use explicit record arrays for generated routes,
relationships, agency facets, expansion edges, fission assignments, and demand
weights, then lower them locally into canonical maps. This closes a provider-
dialect fault that had silently converted every open dynamic map into an empty
closed object while the prompt asked for non-empty topology or agency state.
The current interface cut makes that Eve publication the browser's actual
product boundary. ghostlight.play is one stable actor-filtered surface across
anonymous entry, Session Zero, Contract Review, and play. The browser embeds
Eve's canonical provider host and lowering package; text, numeric, and choice
input uses typed Eve bindings and renderer-local drafts, and operations capture
named bindings into canonical command invocations. There is no Eve form
ontology or generic payload.fields dialect. Heimdall supplies the required
gamecult.heimdall.access plugin and owns authentication attempts, Discord
callbacks, claims, entitlements, and completion redemption through its private
loopback CultNet command plane. Ghostlight owns hashed local sessions and
derives campaign authority only from canonical membership. The exact cut is
docs/architecture/ghostlight-eve-native-interface.md.
The same provider now admits an installed native CultMesh client on Yggdrasil
loopback. It performs Heimdall begin/completion once, persists only the opaque
Ghostlight app-session bearer in CultCache, retrieves the actor-filtered Eve
surface, and invokes the canonical Eve command boundary. Browser and native
transports have exact route bindings but no separate domain operations or
kernel paths. Odin publishes only the redacted native endpoint and operation
set; sensitive authentication and player state remain outside discovery.
The accepted implementation is hosted natively on Yggdrasil as an immutable
Idunn release. Exact checkout, embedded commit, release manifest, binary hash,
systemd process, typed health, CultMesh store, local VoidBot retrieval, public
Heimdall path, restart recovery, and unauthenticated rejection must agree. The
fresh-workspace handoff and state map record the current release witness; this
plan does not duplicate volatile infrastructure revisions. Idunn owns continuity
and Odin owns discovery; neither owns campaign mutation. Model work is
inspectable and provider-switchable:
provider attempts expose prompt/completion/cache usage and exact local failures;
stable prefixes precede dynamic context; world and agency compilation are
separate stages; Projectors receive situation state while Interpreters receive
exact permissions; deterministic cell bindings are attached by the runtime.
Remote agency compilation is a separate non-causal Flash pipeline: extraction
proposes exact institution-specific claims, local code binds them to witnesses,
and only grounded candidates receive synthesized strategic doctrine. Exact
claims constrain canon; they do not have to exhaustively specify playable
policy. A separate semantic verifier accepts compatible branch elaboration and
rejects contradiction, canon erasure, identity conflation, story borrowing,
current branch events, or unanchored setting-breaking power. Structurally
malformed verification still aborts after one correction. A semantic rejection
receives one synthesis retry; a second rejection aborts the compile without
omitting the anchored institution. Compatible doctrine becomes a coarse goal
and an approval-visible branch assumption.
Deterministic remote profiles keep unknown facets unknown. The Pro
agency stage no longer spends output tokens restating remote profiles.
Kalsa is the next fantasy compilation target. Its Obsidian-compatible repository
already separates player-safe Public lore from GM-only Spoilers, but it is
not a live Ghostlight entitlement or VoidBot index yet. The next Vault cut must
make Vault selection, import/sync provenance, authority lanes, spoiler policy,
and exact receipt filtering one typed provider path. Do not bolt Kalsa onto the
read-only Aetheria recovery index or create a second Ghostlight semantic index.
Current Idunn, Odin, Heimdall, and Epiphany release identity is operational
truth owned by gamecult-ops; rehydrate there before touching the host.
Heimdall publishes its redacted provider, command boundary, plugin, and
transport records into Odin. Ghostlight resolves the private auth route from
that typed catalog; its systemd unit has no direct Heimdall endpoint authority.
Idunn's release selector admits
the newest executable/build-affecting commit reachable from a configured ref,
so later documentation and state-only commits do not churn the deployed body.
Ghostlight does not wait on Epiphany's adjacent compiler/swarm capacity. The
separate-account co-op privacy and unanimity acceptance remains unproven; no
human test group is currently waiting on the forge, so controlled account
fixtures or a later tester cohort must close it without weakening the gate.
Strategic activity outcomes now have their own authority between attempt selection and commit. One batched Flash resolver receives only selected digest-bound attempts plus exact legal consequence handles. It emits one bounded typed result per activity; local validation rejects invented custody, relations, facts, pressure resolutions, member owners, and player mutation. WorldKernel requires the action-set-bound stage receipt and applies every outcome with the rest of the wave on one private campaign copy. Accepted outcomes are stored in CultCache and shown through the operator Eve surface. The shared strategic-tick function also owns the derived CultMesh refresh after commit. Scheduler, return catch-up, and explicit horizon waits cannot leave canonical state ahead of the operator projection merely because a caller returns early. Publication remains notification-only and cannot roll a commit back.
The current browser/compiler hardening adds three ownership cuts before the next isolated acceptance run: compiler evidence is triaged into direct, background, and excluded lanes before generation, with only direct source text admitted to the causal world seed; informational action effects must name the exact finding they commit, which the runtime binds into the player-visible stake before validation; and player HTTP command responses are spoiler-safe projections rather than serialized campaigns. The browser renders these projections as labeled, escaped human-readable controls, and the player story lowers exact committed transcript turns without a generative rewrite.
Foreground speech now carries explicit response ownership. A private bounded
address stage selects only exact co-present Persona IDs; WorldKernel commits
that set with the speech turn and projects direct-addressee versus observer
roles into parallel Persona appraisal. Direct addressees must speak or choose
typed deliberate silence, which the kernel lowers deterministically. This
closes the live failure where every present actor perceived a direct question
but all Interpreters returned speech: null, without forcing observers to seize
conversational focus or admitting a free-text reaction-effect lane.
Foreground speech returns after the committed directly addressed response.
NPC action proposals emitted by that reaction remain exact-revision canonical
state and resolve through WorldKernel::ResolveNpcAction at the first idle
boundary. Live turns cancel background assessment before commit, daemon startup
and the scheduler recover an unresolved current reaction window, and no stale
proposal is rebased. Provider concurrency and strategic scheduling remain
separate from this response-delivery boundary.
World transition authority is now a closed semantic mutation algebra rather
than four empirical effect universes. Foreground attempts, NPC initiative,
reaction appraisal, strategic actor/institution/Gestalt outcomes, waits,
unanimous group travel, approval-gated population fission, and bounded region
expansion lower through one revision-bound batch reducer and persist its
authority, batch, and receipt with the aggregate campaign projection. Fission
inherits non-scarce population baseline through typed lineage while
partitioning every exact resource and named member once; the resolution organ
only changes profiles and cover epoch. Region expansion admits exact place and
proposition profiles and a reciprocal origin/destination topology before
reconstructing compatibility rows. Initial compiler publication is now
explicitly bounded as an empty-store creation transaction owned by the
CampaignRegistry, not a runtime mutation. Named-person presence is a resolution
transaction: it preserves the member delta, invalidates the prior cover and
epoch, and has no authority to rewrite Gestalt-wide knowledge, custody, or
pressure. Removal of remaining legacy model effect schemas and the 300-case
reviewed agency corpus remain the migration frontier. See
docs/architecture/ghostlight-transition-algebra.md.
Idunn's locked Linux package gate owns Ghostlight tests, release builds,
immutable publication, and exact-source provenance. The current release witness
lives in the state map and fresh-workspace handoff rather than this plan. CultLib
75c180782aeba7cfd22d6412877397708a4ed28f owns the five-runtime RUDP repair:
32-packet admission, session-owned FIFO pressure, cumulative ACKs inside the
horizon, exact ACKs for older retransmits, and explicit flush completion.
Ghostlight publishes discovery-critical records before bulk state and limits
its rendezvous schema catalog to advertised boundary types. Odin
ba76a7239a7bb40aa1774df7d93b9388dc27b222, on that same CultLib commit,
serializes provider persistence and returns the exact Ghostlight source witness
plus the two-schema public catalog through a typed RUDP snapshot.
Live local evidence now covers grounded VoidBot compilation, a four-actor wave, impossible and receipted d20 actions, grounded narration, strategic cells, and a 24-faction budget-4 wave. The first scale baseline used 37,327 prompt tokens and 17.81 seconds. After the authority/context cuts, the same complete four-cell cover used 20,760 prompt tokens and 14.38 seconds, with 13 of 13 stages valid on their first attempt, two material institutional consequences, exact constituent authority, and no player mutation. Authenticated surface and lifecycle acceptance now cover spoiler-safe literal HTTP responses, Heimdall-account campaign isolation, fork/reset/export, four persisted campaigns, and exact-commit restart. Live priority announces pressure before waiting for an already-admitted scheduler commit, cancels in-flight scheduler inference, and excludes new background commits. The queued guard is cancellation-safe, and Session Zero emits revision-bound queued/started diagnostics so provider delay cannot masquerade as scheduler contention.
The revised provider-backed Gestalt golden now passes across four waves and
budget changes 1 -> 4 -> 8 -> 4. It committed ten durable consequences,
including seven typed material activity outcomes, while preserving exact
member binding, the absent player, and Mira's persistent identity. All four
pulses committed without retry. The run used 126,826 prompt tokens with a
58.34% cache-hit ratio and 14,477 completion tokens. The harness now requires a
typed material outcome; unrelated direct consequences can no longer hide an
inert outcome resolver.
Release truth, authenticated compiler/player HTTP journeys, restart continuity, and the strict multiresolution refugee-return golden now pass against immutable builds. Visual browser inspection and a real Heimdall KLTST Discord admission now pass. The live eight-cell campaign additionally committed one complete return-catch-up wave with exact actor/member attribution, a non-acting rival arena, byte-stable player/Reed state, five bounded outcomes, and no remote-news leak. It used 90,030 tokens at a 76.3% prompt-cache-hit ratio; the retained invalid receipts expose one repeated institution posture and one repeated pressure without letting either mutate the world.
The grounded Mars/Zhestokost compile now retains an approval preview with four
strongly connected locations and no First Exodus borrowing. The next gate is an
explicit host decision on its material branch assumptions; after publication,
inspect the canonical agency profiles and first cover directly. Then grow the
agency corpus beyond its 36 candidate
cases without cosmetic reskins and remove the remaining legacy model effect
schemas. Resume the 20-plus-power live Aetheria skeleton across budgets
1, 4, 8, and 32, including nested refugee dispersal and later
rematerialization. The large-document RUDP workstream is closed by the green
five-runtime unit/interop/impairment run, Ghostlight's locked Linux build, and
Odin's typed persisted source/catalog witness. Keep the transport and durable
snapshot regression probes; do not reintroduce fixed sleeps or unbounded
provider-store writes.
Separate-account two-player and eight-player Session Zero and shared-scene
pressure remains an independent unproven gate; no human cohort is currently
waiting. The browser never
receives the Heimdall access token; it adopts a server-verified login attempt
into an HttpOnly Ghostlight session. Treat player confusion, dramatic flatness, composite consequences,
and token-heavy low-consequence stages as evidence about missing context or
misplaced authority. Keep the independent semantic outcome verifier selective:
it checks custody transfers, relation shifts, and named-member private deltas,
while deterministic local validation owns ordinary bounded preparations and
pressure changes.
The selective verifier now has a forced live custody witness. An exact
population-owned resource moved to one exact colocated recipient only after a
separate Flash verdict accepted the causal match; the source campaign snapshot
remained unchanged during resolution. The witness also removed one avoidable
provider retry by making the resource_recipient_ids input to
other_subject_id output mapping explicit. The remaining rollout gate is
multi-account co-op pressure; one browser cannot prove cross-account privacy
or unanimity.
The live scheduler audit also removed an empty-agency failure loop. A campaign with clocks but no simulatable NPC, institution, or population now advances through a deterministic kernel tick without a model call or fabricated Persona cell. A regression proves two missed ticks advance time and the clock while leaving the player byte-identical.
The compiler approval boundary no longer publishes branch-local or provisional fact statements. Those are knowledge-gated world state, including facts that may later be discovered at a visible location; showing them under an operator- spoiler disclosure let the player bypass discovery before approving the seed. The approval surface retains topology, cast, institutions, populations, clocks, role capabilities, evidence coverage, gaps, and branch assumptions.
Bounded cooperative multiplayer is now part of the current forge gate. It uses
campaign membership rather than a room model: distinct authenticated humans
control exact canonical actors through the existing mailbox, perception gates,
and atomic commit path. The implemented boundary is one shared scene,
sequential public actions, actor-specific surfaces, no PvP, and unanimous
time/travel/cell-budget changes. Split parties, private in-play actions,
delegation, simultaneous declarations, late joining, and group lifecycle
operations remain outside the gate. The authority map and remaining social
governance live in
docs/architecture/ghostlight-dungeon-multiplayer-intention.md.
Session Zero replaces direct compiler forms as campaign-creation authority.
Grounded openings and roles are inline typed DM decisions; custom premises use
the same draft. The compiler consumes only approved_campaign_brief.v1, and
publication batches campaign, membership, contract, persistent DM Persona,
approvals, evidence, and seed digest before discovery. Post-launch Contract
Review reuses the same negotiation machinery against an exact world revision;
it can amend forward-looking contract and actor ledger fields but cannot rewrite
membership custody, locations, topology, knowledge, memories, or history.
Prior research-program phase
Build a reliable data-generation loop for socially persistent Aetheria agents. The immediate target is not a full simulation. It is a clean, reviewed, sandboxed training-data pipeline for branching scenes and state consequences. The output should preserve Aetheria's tonal range: wit with stakes, ordinary life before interruption, quiet ritual, domestic warmth, weirdness, dread, and systems pressure as needed.
Planning belongs in this file and the handoff/map state surfaces. Architecture docs should describe durable contracts, boundaries, and data shapes; they should not carry live next-action lists.
Near-Term Sequence
-
Stabilize canonical state and projection seams.
- Keep
schemas/agent-state.schema.jsonand required vectors coherent. - Keep canonical state separate from perceived overlays.
- Keep voice, presentation, relationship, memory, and situational pressure explainable.
- Add or preserve tonal-mode and ordinary-life cues where they affect prose.
- Do not leak raw numeric state internals into responder prompt text.
- Keep
-
Stabilize responder packet and output seams.
- Use
schemas/responder-packet.schema.jsonandschemas/responder-output.schema.json. - Build packets from coordinator artifacts plus projected local context.
- Preserve exact responder-visible input, hidden-context audit, allowed actions, source excerpts, output contract, and lore-access mode.
- Preserve raw output, parsed output, review labels, consulted refs, research summary, leakage audit, and coordinator interventions.
- Require
runner_capturedresearch trace status for accepted research-enabled gold data; coordinator-reconstructed trace is useful draft audit, not proof of the responder's actual research path.
- Use
-
Stabilize scene-loop receipt bundles.
- Use
schemas/event-record.schema.json,schemas/participant-appraisal.schema.json,schemas/reviewed-mutation.schema.json, andschemas/scene-loop-bundle.schema.json. - Validate with
npm run training-loop:validate, included innpm run schema:validate. - A training-ready scene loop preserves scene-local digest, initial state, coordinator artifacts, projected contexts, responder packets, raw responder outputs, event records, participant-local appraisals, reviewed mutations, and bundle-level training-usability labels.
- Training readiness is per organ. A receipt-complete scene loop does not automatically count as branch compiler, IF reviewer, visual artifact, or accepted full-fixture coverage.
- Adopt VoidBot's heartbeat routine as the cast initiative substrate: characters take scene turns through heartbeat initiative, cooldown starts after turn completion, and offstage agents use slower rumination/sleep turns for memory consolidation instead of generating fake scene motion.
- Use
-
Keep the Pallas fixture as the current scaffold reference.
- Current fixture set:
examples/lore-grounding/pallas-species-strikes.awakened-labor.v0.json,examples/agent-state.pallas-species-strikes.v0.json,examples/coordinator/pallas-species-strikes.branch-and-fold.v0.json,examples/ink/pallas-species-strikes.branch-and-fold.v0.ink,examples/ink/pallas-species-strikes.branch-and-fold.v0.training.json,examples/visual/pallas-species-strikes.branch-and-fold.v0.visual.json, andexperiments/pallas-species-strikes/receipts. - Treat it as reference-only story-shape and grounding material, not training-ready data for any soft organ.
- Preserve the lessons it established: ordinary-life onboarding, branch-and-fold discipline, material state variables, source-backed lore elaboration, visual segmentation, scene-set need for illustrated replay, and review before acceptance.
pallas-training-loop-v0is the first separate training-shaped derivative: it rebuilds the Kappa refusal / Ilya arrival threshold beat through three exact no-fork responder turns plus event, appraisal, mutation, and bundle receipts. Keep it separate from the immutable reference fixture.
- Current fixture set:
-
Generalize the loop.
- Use the corpus coverage ledger so future fixtures can be tracked by faction, movement, flashpoint, tonal mode, training target, review status, and cultural collisions.
- Select the next Aetheria fixture from the 100-150 broad coverage target.
- Add more historical grounded fixtures from AetheriaLore.
- Add future-branch Elysium fixtures with branch lineage and constraint labels.
- Track coverage across every major faction, minor faction, movement, and major flashpoint; major factions require both founding-era and day-in-the-life stories.
- Require cultural collision in coverage stories so training data captures inter-faction dynamics, mutual misreads, and movement pressure.
- Vary tonal modes across fixtures so the corpus does not train one flattened Aetheria voice.
- Emit technology/item manifest deltas when scenes discover or stress gear, assemblies, supply chains, or faction tech bases.
- Keep artifacts database-shaped enough for future game-engine integration.
-
Train only after schemas stop sliding.
- Pilot samples are schema shakedown, not robust corpus scale.
- Specialized future models include coordinator, retriever, projector, responder, appraiser, mutator, relationship/perception updater, branch compiler, IF artifact reviewer, evaluator, and institution/faction/consumer decision models.
- Deterministic gates remain code: visibility, action legality, object custody, resource accounting, schema validation, source provenance, mutation authority, prompt leakage checks, and Ink compilation.
Deferred from the earlier fixture program
- Full world simulation loop
- Economy simulation loop
- Long-horizon plot generation without author scaffolding
- Fine-tuning before artifact schemas, review criteria, and evaluators stabilize
Discipline
- Work one bounded organ at a time.
- Prefer explicit maps and contracts over implicit context.
- If the diff grows while understanding shrinks, stop and simplify.
- Keep history in git and distilled evidence; keep the live workspace focused on the mission.