diff --git a/docs/architecture/ghostlight-session-zero.md b/docs/architecture/ghostlight-session-zero.md index 8896d00..f3c4a91 100644 --- a/docs/architecture/ghostlight-session-zero.md +++ b/docs/architecture/ghostlight-session-zero.md @@ -12,23 +12,22 @@ to the library: no Vault registry, player, slider, starting location, or Session Zero phase exists in the library vocabulary. The library capabilities it needs are specified, consumer-neutral, in -`ghostlight-world-ontology.md` under "Elaboration lenses and focus (target)": -consumer-supplied elaboration lenses with weights, focus-weighted elaboration -demand with a consumer-supplied detail profile, per-world evidence binding, -and elaborator sessions in Draft. Other consumers (Delvehold, Epiphany, future -narrative simulations) use the same capabilities with their own policy. +`ghostlight-world-ontology.md` under "Elaboration lenses and detail rules +(target)": the stock lens set and weights, detail rules, per-world evidence +binding, and elaborator sessions in Draft. Other consumers use the same +capabilities with their own policy; Delvehold, for one, starts from a +`Uniform` detail rule. -Source today does not match this boundary: the world kernel lives in -`crates/ghostlight-dungeon/src/world/` beside Dungeon's runtime. Plan step 15 -names the extraction question. +Source does not yet match this boundary: the world kernel lives in +`crates/ghostlight-dungeon/src/world/` beside Dungeon's runtime. Extracting it +into a library crate is the first pass of plan step 15. ## Objective A player chooses a Vault, says what kind of experience they want, and gets a world seeded from that Vault. The world is dense where they stand and sketched where they don't, and it grows detail ahead of them as they travel. The flavor -of the world comes from how often each of the eight titled elaborators works -on it. +of the world comes from how often each of the eight stock lenses works on it. ## The flow @@ -37,68 +36,49 @@ on it. read, for example Kalsa's `Public`. The payload carries a Vault id, never a path. Dungeon binds the chosen Vault as the world's evidence source. 2. **Describe the experience.** The player writes what they want. A model - reads that description and proposes weights for the eight titles. The + reads that description and proposes weights for the eight stock lenses. The proposal fills the sliders; the player adjusts them. Dungeon submits only the numbers and the description, which becomes the world brief. -3. **Create.** Dungeon creates a library world with title, brief, lens set and - weights, and Dungeon's detail profile. No player subject is declared yet. +3. **Create.** Dungeon creates a library world with title, brief, the stock + lens set and weights, and Dungeon's detail rule with no anchor yet. No + player subject is declared yet, so every place sits at the rule's floor. 4. **Sketch.** Dungeon's seed session authors a coarse world from the Vault: regions, routes with travel costs, institutions, populations. 5. **Choose a start.** The player picks a sketch place. Dungeon submits one - owner patch declaring the player's human-controlled subject there, and sets - that subject as a focus of the world. + owner patch declaring the player's human-controlled subject there, and pins + that subject as the first anchor of its detail rule. 6. **Elaborate.** The library's elaborator sessions run, pulled toward the - focus by distance. + anchors by distance. 7. **Activate** when the player chooses. Dungeon never makes activation wait on a count. 8. **Play.** As the player travels, the library's derived demand follows the - focus and detail follows the player. - -## Dungeon's lens set - -Dungeon uses the eight titles under their original names and meanings as its -lens set: - -| Title | Reaches for | -|---|---| -| Patina | ordinary objects, customs, nicknames, local jokes | -| Charter | government, law, offices, selection, succession, redress | -| Ledger | resources, labor, trade, infrastructure, scarcity, class pressure | -| Hearth | kinship, daily life, care, obligation, belonging | -| Tangle | factions, alliances, rivalries, leverage | -| Veil | secrets, rumors, misinformation, taboos, unevenly held knowledge | -| Ember | disputes, hazards, instability, escalation, urgent pressure | -| Numen | religion, magic, ritual, awe, cosmology, the genuinely strange | - -Each title is a library lens: brief text plus an emphasis over the operation -catalog. Ledger leads with custody and dependency operations, Veil with -knowledge and channels, Charter with authority and selection. Whether the -eight ship with the library as a stock set or live in Dungeon is an open -decision below. + anchor and detail follows the player. ## Dungeon policy -- **Focus:** the subjects controlled by Dungeon's players. -- **Detail profile:** near 60 minutes (persons, institutions, populations), - middle 1 day (institutions and populations), far (institutions), lookahead - 120 minutes. These are recommendations, tuned on the road. -- **Weights after creation:** the world owner may change them in Draft and - Active; later sessions use the new weights. +- **Lenses:** the library's stock set of eight, weighted by the player's + sliders. The owner may change weights in Draft and Active; later sessions use + the new weights. +- **Detail rule:** `ByDistance`, anchored on important subjects, the player + first. Recommended levels: within 60 minutes, persons, institutions, and + populations; within 1 day, institutions and populations; beyond, institutions + only; lookahead 120 minutes. Tuned on the road. Which other subjects Dungeon + pins, and when, is Dungeon policy not yet decided. - **Travel:** Dungeon's seed authors a travel affordance for persons, and the Eve surface projects one control per affordance a player's subject holds. ## Authority map (Dungeon) - **Owner:** Dungeon's runtime owns Session Zero's flow, the Vault registry, - the weight proposal, the player principal, and the Eve surface. Every world - change it makes is an ordinary library command. + the weight proposal, the player principal, anchor pinning, and the Eve + surface. Every world change it makes is an ordinary library command. - **Inputs:** the authenticated player, the admitted Vault list, the player's description and slider values, the chosen start place. -- **Outputs:** library world creation, seed and owner patches, focus changes, +- **Outputs:** library world creation, seed and owner patches, rule and weight changes, activation, and Eve projections. - **Derived state:** the slider proposal, the Session Zero step a player is on - (derived from the library snapshot's phase, focus, and structure), and every - projection. + (derived from the library snapshot's phase, rule anchors, and structure), and + every projection. - **Forbidden writers:** Dungeon writing world state other than through library commands; the proposal model submitting weights without the player's command; a Vault path in any payload; any Dungeon identifier, @@ -109,7 +89,7 @@ decision below. - `GHOSTLIGHT_SEED_VAULT_ROOT` as the only Vault: Dungeon's Vault registry replaces it. - The `world.create` payload fields for jurisdiction roots and permille, when - the library's detail profile replaces them. + the library's detail rule replaces them. - The genesis human subject: Dungeon declares its player at the chosen start. ## Verification (Dungeon) @@ -118,30 +98,19 @@ decision below. unknown id or a path is refused before anything is spent. 2. The slider proposal changes nothing until the player submits weights. 3. The start choice declares exactly one player subject, at a sketch place, - once, in Draft, and sets it as focus. + once, in Draft, and pins it as the rule's first anchor. 4. Activation succeeds with nonzero deficits. 5. Road: a seeded world on the SDK route shows persons near the start, institutions far from it, and new persons at a place after the player's subject travels toward it. -## Decisions the operator owns - -- **Where the eight titles live.** Recommend: the library ships them as a - stock lens set any consumer may use or replace, because they are - world-agnostic narrative categories; Dungeon selects them and supplies - weights. -- **Library extraction.** Whether the world kernel moves out of - `crates/ghostlight-dungeon` into its own library crate before the library - passes land, so new library capabilities are not built inside a consumer. - Recommend: extract first. - ## Pass order -Library passes are in the ontology doc's target section and plan step 15. -Dungeon passes follow them: +Library passes L0 through L4 are in plan step 15; L0 is the kernel +extraction. Dungeon passes follow them: -1. Vault registry, world creation with Vault id, brief, lens set, weights, and - detail profile. +1. Vault registry, world creation with Vault id, brief, lens weights, and + detail rule. 2. The Session Zero Eve surface: Vault choice, description, slider proposal, sliders, sketch, start choice, activation. 3. Travel affordance and per-affordance player controls. This pass closes the diff --git a/docs/architecture/ghostlight-world-ontology.md b/docs/architecture/ghostlight-world-ontology.md index 5283c36..d9e33d4 100644 --- a/docs/architecture/ghostlight-world-ontology.md +++ b/docs/architecture/ghostlight-world-ontology.md @@ -134,7 +134,7 @@ log; the story feed is `operator_log`, an owner-only projection that the controller lane cannot name because `ControllerRunner` holds a `ControllerPort`, not the mailbox. `WorldMailbox::create` declares the genesis place `commons` and stands genesis subjects there. Genesis declaration of -consumer subjects is cut ("Elaboration lenses and focus"); a consumer declares +consumer subjects is cut ("Elaboration lenses and detail rules"); a consumer declares its own subjects by owner patch. `Witness` is one speakerless event over a place subtree: a beacon, a bell, a @@ -359,7 +359,8 @@ and fixed titled quotas. They were compensators for an ontology with nowhere to put depth. The eight titles themselves (Patina, Charter, Ledger, Hearth, Tangle, Veil, Ember, Numen) were lenses, not tribunals. `6bb6869` deleted them together with their verifier and no operator decision covered them; they -return as lenses ("Elaboration lenses and focus"). +return as the library's stock lens set ("Elaboration lenses and +detail rules"). Character action had a matching defect: an attempt was an event, and a separate wave-level outcome resolver asked a model whether it worked. Resources, @@ -664,7 +665,7 @@ carried as `SystemCapability::Elaborator { jurisdiction }`. Its lens decides what kind of structure the session reaches for. A lens never enters the caller identity, never narrows or widens admission, and never fills a quota. Target: sessions draw a lens by the world's lens weights (below, "Elaboration lenses -and focus"). Shipped: the sweep runs one sequential unlensed session per +and detail rules"). Shipped: the sweep runs one sequential unlensed session per jurisdiction. The tool catalog is generated from this document's operation set and declaration kinds, plus `record_gap` and `submit`. It cannot contain an operation the reducer does not @@ -711,7 +712,7 @@ A translation gap never mints a boundary. Gaps are non-fictional inference evidence that may inform a later human decision to extend this vocabulary, and that extension is a code change, not a world patch. -### Elaboration lenses and focus (target) +### Elaboration lenses and detail rules (target) Adopted 2026-09-15, not implemented. These are library capabilities, neutral to every consumer. A consumer supplies the policy: Ghostlight Dungeon's @@ -725,26 +726,53 @@ consumer's concept enters this vocabulary. session ordinal and records it on its checkpoint and receipt as evaluation evidence. The same patch under two lenses has the same admission result. A zero weight never draws; an all-zero weight set is refused. -- **Focus.** A world carries a set of focus subjects written by its owner. - Distance is the least route cost, in travel minutes, from a focus subject's - position to a place over open routes that subject may traverse, computed by - the same route walk as `reachable`, factored to return a cost map. A place - without routes takes its nearest routed container's distance. With no focus, - every place is far. -- **Detail profile.** Supplied at creation: distance bands, each naming a - density per place for each subject kind, plus a lookahead in minutes that - measures the nearest band from where a focus could be after that much - travel. It replaces `WorldScaleIntent` jurisdiction permille; per-kind - targets survive inside it. +- **Stock lens set.** The library ships eight lenses any consumer may use or + replace: + + | Lens | Reaches for | Leads with | + |---|---|---| + | Patina | ordinary objects, customs, nicknames, local jokes | persona material, ordinary affordances | + | Charter | government, law, offices, selection, succession, redress | authority, selection, redress | + | Ledger | resources, labor, trade, infrastructure, scarcity, class pressure | custody, dependency, route cost | + | Hearth | kinship, daily life, care, obligation, belonging | commitments, reads | + | Tangle | factions, alliances, rivalries, leverage | relations, pressure, authority | + | Veil | secrets, rumors, misinformation, taboos, unevenly held knowledge | knowledge scope, channels | + | Ember | disputes, hazards, instability, escalation, urgent pressure | pressure, near-due commitments | + | Numen | religion, magic, ritual, awe, cosmology, the genuinely strange | facts, affordances, material | + +- **Detail rules.** A world carries one detail rule: a function from place to + detail level. A detail level names a target density per place for each + subject kind, and the rule carries its own level table. The rule is typed + world data, written by the world's creator and changed by its owner through + one command, never consumer code: the deficit it produces is an admission + input, and replay re-runs `reduce`, so a consumer function that changed + after admission would make committed history fail replay. Each commit is + checked against the rule in force at its revision. The library evaluates a + closed, versioned set of forms: + - `Uniform { level }`: every place at one level. + - `ByDistance { anchors, bands, floor, lookahead }`: anchors are canonical + subjects. Distance is the least route cost, in travel minutes, from any + anchor's position to a place over open routes that anchor may traverse, + reduced by `lookahead`. It uses the same route walk as `reachable`, + factored to return a cost map. A place without routes takes its nearest + routed container's distance. Bands map distance to a level; beyond the last + band, and for every place when no anchor is placed, the level is `floor`. + + A consumer whose rule no form expresses asks for a new form, and the library + adds it without consumer names. Combinators wait for a consumer that needs + one. `WorldScaleIntent` per-kind world targets remain the ceiling the rule + distributes; jurisdiction permille is replaced by the rule. - **Demand.** Derived in `snapshot`, never stored: open boundaries and - per-place deficits against the band target, ordered by distance, then by the - kernel's boundary order. A session's confinement ground is the place subtree - of the demand it answers. A focus moving changes demand without a commit. - `IndividuationRequired` derives for a population whose place enters the - nearest band. -- **Sessions.** Up to the configured concurrency run at once, in Draft once a - focus exists and in Active, each answering the head of demand. Each world - binds one evidence source, which every session and the seed lane read. + per-place deficits against each place's level, capped by the remaining world + target, ordered by level (most detailed first), then by the form's own key + (distance for `ByDistance`), then by the kernel's boundary order. A session's + confinement ground is the place subtree of the demand it answers. Under a + rule that reads positions, a subject moving changes demand without a commit. + `IndividuationRequired` derives for a population whose place's level asks + for persons. +- **Sessions.** Up to the configured concurrency run at once, in Draft and in + Active, each answering the head of demand. Each world binds one evidence + source, which every session and the seed lane read. Cut when these land: authored jurisdiction roots as confinement units, permille distribution, the `Uncovered` deficit row, the sequential @@ -753,8 +781,10 @@ per-jurisdiction sweep, `NullEvidenceSource` on the Active elaborator lane, consumer subject. Verification: the lens-invariant admission test; sampler determinism and -weight-following frequencies; zero-weight refusal; demand absent from -`WorldState` and reordered by a focus move alone; out-of-ground refusal; Active +weight-following frequencies; zero-weight refusal; `Uniform` assigning every +place one level; demand absent from `WorldState` and reordered by an anchor's +move alone under `ByDistance`; the world target capping a rule's deficits; +replay of a history spanning a rule change; out-of-ground refusal; Active patches citing only the bound evidence source; activation with nonzero deficits. @@ -878,7 +908,7 @@ Deleted before replacement behavior is added, with no compatibility path: `CivicSystem` manifest (the typed subgraph), `PopulationLineage` (individuation), `Lifecycle` and `WorldTime` (kernel-owned); - the titled semantic verifier and titled quotas (the eight titles return as - lenses; see "Elaboration lenses and focus"), elaboration demand and deficit, + the stock lens set; see "Elaboration lenses and detail rules"), elaboration demand and deficit, complexity rounds, strategic waves, fission completion counts, `detail_debt` rotation, and every `*Qualification` and `*Verification` type; diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index ed2dc58..fe1ffbd 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -277,13 +277,13 @@ chooses a Vault, describes the experience, sets title weights, sketches, chooses a start, activates, and plays by speaking, gesturing, and travelling while detail grows toward them. It proves one player; hosted play and multi-player membership are not in this gate. Plan step 15 tracks library -passes L1–L4 and Dungeon passes D1–D3; D3 closes the gate. +passes L0–L4 and Dungeon passes D1–D3; D3 closes the gate. Dungeon is a consumer of the Ghostlight library. Session Zero is Dungeon authority; the library capabilities it needs are consumer-neutral and live in -the ontology doc's "Elaboration lenses and focus (target)". The world kernel -still sits in `crates/ghostlight-dungeon`; whether to extract it first is an -open operator decision. +the ontology doc's "Elaboration lenses and detail rules (target)". The world +kernel still sits in `crates/ghostlight-dungeon`; L0, extracting it into a +library crate, is the next cut. Also owed on the way, found 2026-09-15 by reading source: diff --git a/notes/ghostlight-implementation-plan.md b/notes/ghostlight-implementation-plan.md index bb4ec41..b701b7b 100644 --- a/notes/ghostlight-implementation-plan.md +++ b/notes/ghostlight-implementation-plan.md @@ -865,19 +865,21 @@ no utterance; one carrier, one command per turn). Adopted 2026-09-15. Two owners, one ordering. Library capabilities, consumer-neutral, are specified in `docs/architecture/ghostlight-world-ontology.md` -under "Elaboration lenses and focus (target)". Ghostlight Dungeon's Session -Zero consumes them and is specified in +under "Elaboration lenses and detail rules (target)". Ghostlight Dungeon's +Session Zero consumes them and is specified in `docs/architecture/ghostlight-session-zero.md`. This entry only tracks state. -Open decisions first: whether the world kernel is extracted from -`crates/ghostlight-dungeon` into a library crate before the library passes -(recommended), and whether the eight titles ship as a library stock lens set -(recommended). +Operator decisions, 2026-09-15: the world kernel is extracted from +`crates/ghostlight-dungeon` into a library crate before any library pass, and +the eight titles ship as the library's stock lens set. -Library passes: (L1) lenses, weights, sampler, and concurrent sessions over -today's demand; (L2) per-world evidence binding on every elaborator session; -(L3) focus, detail profile, distance-weighted demand, and the permille, root, -and genesis-subject cuts; (L4) individuation in the nearest band. Dungeon +Library passes: (L0) extract the kernel into a library crate with a real +public boundary; (L1) the stock lens set, weights, sampler, and concurrent +sessions over today's demand; (L2) per-world evidence binding on every +elaborator session; (L3) typed detail rules (`Uniform`, `ByDistance`), +rule-driven demand under the world-target ceiling, and the permille, root, +and genesis-subject cuts; (L4) individuation where a place's level asks for +persons. Dungeon passes: (D1) Vault registry and world creation with lens weights and detail profile; (D2) the Session Zero Eve surface; (D3) travel affordance and per-affordance player controls, which closes the playtest gate. diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 6fc599e..72ae4da 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -18,4 +18,5 @@ {"note": "Item (a) closed 2026-09-11: the interrupted cell is exercised live and reported. Commit 81a1f53 reads the bound and renewed scope digests from the committed turn's own receipt (NarrativeDecision::re_lowering), carries them on the cover tick summary, logs one tracing line per re-lowered cell, and the smoke harness prints one 'interrupted cell subject= bound= renewed=' line per cell after the tick line. SDK run 11 passed (27 speak, 24 display, 14 gaps) with three interrupted cells, three lines, three re-lowerings in the trace, and each act once in the operator feed. Belief: the runbook's three conditions for this section hold on a live provider; the record and the receipt cannot disagree because the line is derived from the receipt.", "status": "ok", "ts": "2026-09-11T12:11:53+00:00", "type": "verification"} {"note": "Fragment fault diagnosed and cut 2026-09-11 (commit 855727f, controller_work.v15): the Interpreter was citing correctly (So, then the rest of the sentence; four visible acts as four calls) and the fold was discarding everything after the first span per kind as ambiguity gaps. A turn's utterance and display are now every span cited for them, joined in prose order; only an overlapping span is an ambiguity. SDK run 12 passed: 39 speak, 6 display, 10 gaps, zero overlap gaps, every cited span landed, two interrupted cells reported. Belief: when a capture looks fragmentary, check what the harness dropped before what the model quoted. Seed lane note: run 12 round 1 was rejected because the seed model wrote kind for type and omitted the over tag against an explicit schema, then narrated tool bugs; round 2 committed. Sampling, not a schema fault.", "status": "ok", "ts": "2026-09-11T12:34:04+00:00", "type": "verification"} {"note": "The titled elaborators were never an operator-approved cut, 2026-09-15. Patina, Charter, Ledger, Hearth, Tangle, Veil, Ember, and Numen fell in three steps: 4aebe17 (2026-09-01) listed titled elaborator quotas for deletion under the operator's whole-machine order; 6bb6869 deleted elaboration.rs and the titles with it; 9c662bd (2026-09-04) classed ElaboratorTitle as a model tribunal and reused 'eight elaborators' for per-jurisdiction loop instances without flagging the change. No record holds operator approval of the titles' removal. The tribunal was the titled semantic verifier and the fixed quotas, not the title: the Run 108 inspection called the titles excellent distinct lanes, and the 2026-09-04 elaborator swarm kept them. Operator direction: titles return as lenses over the typed ontology. A swarm of elaborators draws a title per session by player-set weights; any title may add any structure, the title shapes what kind, and the weights set the world's flavor. No title gates admission, holds authority, or fills a quota. Design: docs/architecture/ghostlight-session-zero.md. Lesson: when cutting a compensator, separate the judging machinery from the capability it judged, and put a named, operator-visible feature before the operator before deleting it.", "status": "accepted", "ts": "2026-09-15T20:31:32+00:00", "type": "correction"} -{"ts": "2026-09-15T20:46:54+00:00", "type": "architecture", "status": "accepted", "note": "Operator directive, 2026-09-15: Ghostlight Dungeon is a consumer of the Ghostlight library, which serves all GameCult narrative simulation. Session Zero is a Dungeon concept and Dungeon authority; it never shapes the library. The Session Zero design was re-cut the same day into consumer-neutral library capabilities (elaboration lenses with weights, focus-weighted demand with a consumer-supplied detail profile, per-world evidence binding, elaborator sessions in Draft; ontology doc 'Elaboration lenses and focus (target)') and Dungeon policy consuming them (docs/architecture/ghostlight-session-zero.md: Vault registry, weight proposal, sliders, start choice, player focus, Eve surface). This supersedes the earlier same-day correction record where it placed the titles and their weights in the Session Zero design. Source does not match the boundary: the world kernel lives in crates/ghostlight-dungeon beside Dungeon's runtime. Open operator decisions: extract the kernel into a library crate before the library passes (recommended), and ship the eight titles as a library stock lens set (recommended). Lesson: before designing a feature, name which owner it belongs to, library or consumer; a player-facing flow placed on the kernel quietly makes one consumer's policy library vocabulary."} +{"note": "Operator directive, 2026-09-15: Ghostlight Dungeon is a consumer of the Ghostlight library, which serves all GameCult narrative simulation. Session Zero is a Dungeon concept and Dungeon authority; it never shapes the library. The Session Zero design was re-cut the same day into consumer-neutral library capabilities (elaboration lenses with weights, focus-weighted demand with a consumer-supplied detail profile, per-world evidence binding, elaborator sessions in Draft; ontology doc 'Elaboration lenses and focus (target)') and Dungeon policy consuming them (docs/architecture/ghostlight-session-zero.md: Vault registry, weight proposal, sliders, start choice, player focus, Eve surface). This supersedes the earlier same-day correction record where it placed the titles and their weights in the Session Zero design. Source does not match the boundary: the world kernel lives in crates/ghostlight-dungeon beside Dungeon's runtime. Open operator decisions: extract the kernel into a library crate before the library passes (recommended), and ship the eight titles as a library stock lens set (recommended). Lesson: before designing a feature, name which owner it belongs to, library or consumer; a player-facing flow placed on the kernel quietly makes one consumer's policy library vocabulary.", "status": "accepted", "ts": "2026-09-15T20:46:54+00:00", "type": "architecture"} +{"ts": "2026-09-15T20:55:07+00:00", "type": "architecture", "status": "accepted", "note": "Operator decisions and design correction, 2026-09-15. (1) The world kernel is extracted from crates/ghostlight-dungeon into a library crate before any library pass (plan step 15, L0). Its only Dungeon import today is app_session::VerifiedPrincipalEvidence in mailbox.rs and controller tests; world/ touches no HTTP or Eve types; the crate is binary-only and pub(crate), so the extraction is also the first real public boundary. (2) The eight titles ship as the library's stock lens set, usable or replaceable by any consumer. (3) Focus as a set of subjects was too narrow: a detail rule is a function from place to detail level, and each consumer owns its LOD rule. Dungeon uses ByDistance anchored on important subjects, the player first; Delvehold starts from Uniform. The rule must be typed world data evaluated by the library, not consumer code, because the deficit it produces is an admission input and journal replay re-runs reduce (verify_history), so a changed consumer function would fail committed history on restart. New LOD needs become new consumer-neutral rule forms. WorldScaleIntent per-kind targets stay as the ceiling the rule distributes, so the authored scale directive survives and an unbounded Uniform rule cannot outgrow it. Supersedes the focus and detail-profile wording of the earlier same-day records."} diff --git a/state/ghostlight-state.cultcache.jsonl b/state/ghostlight-state.cultcache.jsonl index 77831fb..4649e8c 100644 --- a/state/ghostlight-state.cultcache.jsonl +++ b/state/ghostlight-state.cultcache.jsonl @@ -20,3 +20,4 @@ {"key": "2026-09-11T123404Z0000-0018-669a3d80d19b", "payload": "eyJub3RlIjogIkZyYWdtZW50IGZhdWx0IGRpYWdub3NlZCBhbmQgY3V0IDIwMjYtMDktMTEgKGNvbW1pdCA4NTU3MjdmLCBjb250cm9sbGVyX3dvcmsudjE1KTogdGhlIEludGVycHJldGVyIHdhcyBjaXRpbmcgY29ycmVjdGx5IChTbywgdGhlbiB0aGUgcmVzdCBvZiB0aGUgc2VudGVuY2U7IGZvdXIgdmlzaWJsZSBhY3RzIGFzIGZvdXIgY2FsbHMpIGFuZCB0aGUgZm9sZCB3YXMgZGlzY2FyZGluZyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBzcGFuIHBlciBraW5kIGFzIGFtYmlndWl0eSBnYXBzLiBBIHR1cm4ncyB1dHRlcmFuY2UgYW5kIGRpc3BsYXkgYXJlIG5vdyBldmVyeSBzcGFuIGNpdGVkIGZvciB0aGVtLCBqb2luZWQgaW4gcHJvc2Ugb3JkZXI7IG9ubHkgYW4gb3ZlcmxhcHBpbmcgc3BhbiBpcyBhbiBhbWJpZ3VpdHkuIFNESyBydW4gMTIgcGFzc2VkOiAzOSBzcGVhaywgNiBkaXNwbGF5LCAxMCBnYXBzLCB6ZXJvIG92ZXJsYXAgZ2FwcywgZXZlcnkgY2l0ZWQgc3BhbiBsYW5kZWQsIHR3byBpbnRlcnJ1cHRlZCBjZWxscyByZXBvcnRlZC4gQmVsaWVmOiB3aGVuIGEgY2FwdHVyZSBsb29rcyBmcmFnbWVudGFyeSwgY2hlY2sgd2hhdCB0aGUgaGFybmVzcyBkcm9wcGVkIGJlZm9yZSB3aGF0IHRoZSBtb2RlbCBxdW90ZWQuIFNlZWQgbGFuZSBub3RlOiBydW4gMTIgcm91bmQgMSB3YXMgcmVqZWN0ZWQgYmVjYXVzZSB0aGUgc2VlZCBtb2RlbCB3cm90ZSBraW5kIGZvciB0eXBlIGFuZCBvbWl0dGVkIHRoZSBvdmVyIHRhZyBhZ2FpbnN0IGFuIGV4cGxpY2l0IHNjaGVtYSwgdGhlbiBuYXJyYXRlZCB0b29sIGJ1Z3M7IHJvdW5kIDIgY29tbWl0dGVkLiBTYW1wbGluZywgbm90IGEgc2NoZW1hIGZhdWx0LiIsICJzdGF0dXMiOiAib2siLCAidHMiOiAiMjAyNi0wOS0xMVQxMjozNDowNCswMDowMCIsICJ0eXBlIjogInZlcmlmaWNhdGlvbiJ9", "stored_at": "2026-09-15T20:31:33.060540+00:00", "type": "ghostlight.evidence_record.v0"} {"key": "2026-09-15T203132Z0000-0019-60831855b0e4", "payload": "eyJub3RlIjogIlRoZSB0aXRsZWQgZWxhYm9yYXRvcnMgd2VyZSBuZXZlciBhbiBvcGVyYXRvci1hcHByb3ZlZCBjdXQsIDIwMjYtMDktMTUuIFBhdGluYSwgQ2hhcnRlciwgTGVkZ2VyLCBIZWFydGgsIFRhbmdsZSwgVmVpbCwgRW1iZXIsIGFuZCBOdW1lbiBmZWxsIGluIHRocmVlIHN0ZXBzOiA0YWViZTE3ICgyMDI2LTA5LTAxKSBsaXN0ZWQgdGl0bGVkIGVsYWJvcmF0b3IgcXVvdGFzIGZvciBkZWxldGlvbiB1bmRlciB0aGUgb3BlcmF0b3IncyB3aG9sZS1tYWNoaW5lIG9yZGVyOyA2YmI2ODY5IGRlbGV0ZWQgZWxhYm9yYXRpb24ucnMgYW5kIHRoZSB0aXRsZXMgd2l0aCBpdDsgOWM2NjJiZCAoMjAyNi0wOS0wNCkgY2xhc3NlZCBFbGFib3JhdG9yVGl0bGUgYXMgYSBtb2RlbCB0cmlidW5hbCBhbmQgcmV1c2VkICdlaWdodCBlbGFib3JhdG9ycycgZm9yIHBlci1qdXJpc2RpY3Rpb24gbG9vcCBpbnN0YW5jZXMgd2l0aG91dCBmbGFnZ2luZyB0aGUgY2hhbmdlLiBObyByZWNvcmQgaG9sZHMgb3BlcmF0b3IgYXBwcm92YWwgb2YgdGhlIHRpdGxlcycgcmVtb3ZhbC4gVGhlIHRyaWJ1bmFsIHdhcyB0aGUgdGl0bGVkIHNlbWFudGljIHZlcmlmaWVyIGFuZCB0aGUgZml4ZWQgcXVvdGFzLCBub3QgdGhlIHRpdGxlOiB0aGUgUnVuIDEwOCBpbnNwZWN0aW9uIGNhbGxlZCB0aGUgdGl0bGVzIGV4Y2VsbGVudCBkaXN0aW5jdCBsYW5lcywgYW5kIHRoZSAyMDI2LTA5LTA0IGVsYWJvcmF0b3Igc3dhcm0ga2VwdCB0aGVtLiBPcGVyYXRvciBkaXJlY3Rpb246IHRpdGxlcyByZXR1cm4gYXMgbGVuc2VzIG92ZXIgdGhlIHR5cGVkIG9udG9sb2d5LiBBIHN3YXJtIG9mIGVsYWJvcmF0b3JzIGRyYXdzIGEgdGl0bGUgcGVyIHNlc3Npb24gYnkgcGxheWVyLXNldCB3ZWlnaHRzOyBhbnkgdGl0bGUgbWF5IGFkZCBhbnkgc3RydWN0dXJlLCB0aGUgdGl0bGUgc2hhcGVzIHdoYXQga2luZCwgYW5kIHRoZSB3ZWlnaHRzIHNldCB0aGUgd29ybGQncyBmbGF2b3IuIE5vIHRpdGxlIGdhdGVzIGFkbWlzc2lvbiwgaG9sZHMgYXV0aG9yaXR5LCBvciBmaWxscyBhIHF1b3RhLiBEZXNpZ246IGRvY3MvYXJjaGl0ZWN0dXJlL2dob3N0bGlnaHQtc2Vzc2lvbi16ZXJvLm1kLiBMZXNzb246IHdoZW4gY3V0dGluZyBhIGNvbXBlbnNhdG9yLCBzZXBhcmF0ZSB0aGUganVkZ2luZyBtYWNoaW5lcnkgZnJvbSB0aGUgY2FwYWJpbGl0eSBpdCBqdWRnZWQsIGFuZCBwdXQgYSBuYW1lZCwgb3BlcmF0b3ItdmlzaWJsZSBmZWF0dXJlIGJlZm9yZSB0aGUgb3BlcmF0b3IgYmVmb3JlIGRlbGV0aW5nIGl0LiIsICJzdGF0dXMiOiAiYWNjZXB0ZWQiLCAidHMiOiAiMjAyNi0wOS0xNVQyMDozMTozMiswMDowMCIsICJ0eXBlIjogImNvcnJlY3Rpb24ifQ==", "stored_at": "2026-09-15T20:31:33.068537+00:00", "type": "ghostlight.evidence_record.v0"} {"key": "2026-09-15T204654Z0000-0020-46b305d0ea55", "payload": "eyJub3RlIjogIk9wZXJhdG9yIGRpcmVjdGl2ZSwgMjAyNi0wOS0xNTogR2hvc3RsaWdodCBEdW5nZW9uIGlzIGEgY29uc3VtZXIgb2YgdGhlIEdob3N0bGlnaHQgbGlicmFyeSwgd2hpY2ggc2VydmVzIGFsbCBHYW1lQ3VsdCBuYXJyYXRpdmUgc2ltdWxhdGlvbi4gU2Vzc2lvbiBaZXJvIGlzIGEgRHVuZ2VvbiBjb25jZXB0IGFuZCBEdW5nZW9uIGF1dGhvcml0eTsgaXQgbmV2ZXIgc2hhcGVzIHRoZSBsaWJyYXJ5LiBUaGUgU2Vzc2lvbiBaZXJvIGRlc2lnbiB3YXMgcmUtY3V0IHRoZSBzYW1lIGRheSBpbnRvIGNvbnN1bWVyLW5ldXRyYWwgbGlicmFyeSBjYXBhYmlsaXRpZXMgKGVsYWJvcmF0aW9uIGxlbnNlcyB3aXRoIHdlaWdodHMsIGZvY3VzLXdlaWdodGVkIGRlbWFuZCB3aXRoIGEgY29uc3VtZXItc3VwcGxpZWQgZGV0YWlsIHByb2ZpbGUsIHBlci13b3JsZCBldmlkZW5jZSBiaW5kaW5nLCBlbGFib3JhdG9yIHNlc3Npb25zIGluIERyYWZ0OyBvbnRvbG9neSBkb2MgJ0VsYWJvcmF0aW9uIGxlbnNlcyBhbmQgZm9jdXMgKHRhcmdldCknKSBhbmQgRHVuZ2VvbiBwb2xpY3kgY29uc3VtaW5nIHRoZW0gKGRvY3MvYXJjaGl0ZWN0dXJlL2dob3N0bGlnaHQtc2Vzc2lvbi16ZXJvLm1kOiBWYXVsdCByZWdpc3RyeSwgd2VpZ2h0IHByb3Bvc2FsLCBzbGlkZXJzLCBzdGFydCBjaG9pY2UsIHBsYXllciBmb2N1cywgRXZlIHN1cmZhY2UpLiBUaGlzIHN1cGVyc2VkZXMgdGhlIGVhcmxpZXIgc2FtZS1kYXkgY29ycmVjdGlvbiByZWNvcmQgd2hlcmUgaXQgcGxhY2VkIHRoZSB0aXRsZXMgYW5kIHRoZWlyIHdlaWdodHMgaW4gdGhlIFNlc3Npb24gWmVybyBkZXNpZ24uIFNvdXJjZSBkb2VzIG5vdCBtYXRjaCB0aGUgYm91bmRhcnk6IHRoZSB3b3JsZCBrZXJuZWwgbGl2ZXMgaW4gY3JhdGVzL2dob3N0bGlnaHQtZHVuZ2VvbiBiZXNpZGUgRHVuZ2VvbidzIHJ1bnRpbWUuIE9wZW4gb3BlcmF0b3IgZGVjaXNpb25zOiBleHRyYWN0IHRoZSBrZXJuZWwgaW50byBhIGxpYnJhcnkgY3JhdGUgYmVmb3JlIHRoZSBsaWJyYXJ5IHBhc3NlcyAocmVjb21tZW5kZWQpLCBhbmQgc2hpcCB0aGUgZWlnaHQgdGl0bGVzIGFzIGEgbGlicmFyeSBzdG9jayBsZW5zIHNldCAocmVjb21tZW5kZWQpLiBMZXNzb246IGJlZm9yZSBkZXNpZ25pbmcgYSBmZWF0dXJlLCBuYW1lIHdoaWNoIG93bmVyIGl0IGJlbG9uZ3MgdG8sIGxpYnJhcnkgb3IgY29uc3VtZXI7IGEgcGxheWVyLWZhY2luZyBmbG93IHBsYWNlZCBvbiB0aGUga2VybmVsIHF1aWV0bHkgbWFrZXMgb25lIGNvbnN1bWVyJ3MgcG9saWN5IGxpYnJhcnkgdm9jYWJ1bGFyeS4iLCAic3RhdHVzIjogImFjY2VwdGVkIiwgInRzIjogIjIwMjYtMDktMTVUMjA6NDY6NTQrMDA6MDAiLCAidHlwZSI6ICJhcmNoaXRlY3R1cmUifQ==", "stored_at": "2026-09-15T20:46:54.329258+00:00", "type": "ghostlight.evidence_record.v0"} +{"key": "2026-09-15T205507Z0000-0021-fcafe3456711", "payload": "eyJub3RlIjogIk9wZXJhdG9yIGRlY2lzaW9ucyBhbmQgZGVzaWduIGNvcnJlY3Rpb24sIDIwMjYtMDktMTUuICgxKSBUaGUgd29ybGQga2VybmVsIGlzIGV4dHJhY3RlZCBmcm9tIGNyYXRlcy9naG9zdGxpZ2h0LWR1bmdlb24gaW50byBhIGxpYnJhcnkgY3JhdGUgYmVmb3JlIGFueSBsaWJyYXJ5IHBhc3MgKHBsYW4gc3RlcCAxNSwgTDApLiBJdHMgb25seSBEdW5nZW9uIGltcG9ydCB0b2RheSBpcyBhcHBfc2Vzc2lvbjo6VmVyaWZpZWRQcmluY2lwYWxFdmlkZW5jZSBpbiBtYWlsYm94LnJzIGFuZCBjb250cm9sbGVyIHRlc3RzOyB3b3JsZC8gdG91Y2hlcyBubyBIVFRQIG9yIEV2ZSB0eXBlczsgdGhlIGNyYXRlIGlzIGJpbmFyeS1vbmx5IGFuZCBwdWIoY3JhdGUpLCBzbyB0aGUgZXh0cmFjdGlvbiBpcyBhbHNvIHRoZSBmaXJzdCByZWFsIHB1YmxpYyBib3VuZGFyeS4gKDIpIFRoZSBlaWdodCB0aXRsZXMgc2hpcCBhcyB0aGUgbGlicmFyeSdzIHN0b2NrIGxlbnMgc2V0LCB1c2FibGUgb3IgcmVwbGFjZWFibGUgYnkgYW55IGNvbnN1bWVyLiAoMykgRm9jdXMgYXMgYSBzZXQgb2Ygc3ViamVjdHMgd2FzIHRvbyBuYXJyb3c6IGEgZGV0YWlsIHJ1bGUgaXMgYSBmdW5jdGlvbiBmcm9tIHBsYWNlIHRvIGRldGFpbCBsZXZlbCwgYW5kIGVhY2ggY29uc3VtZXIgb3ducyBpdHMgTE9EIHJ1bGUuIER1bmdlb24gdXNlcyBCeURpc3RhbmNlIGFuY2hvcmVkIG9uIGltcG9ydGFudCBzdWJqZWN0cywgdGhlIHBsYXllciBmaXJzdDsgRGVsdmVob2xkIHN0YXJ0cyBmcm9tIFVuaWZvcm0uIFRoZSBydWxlIG11c3QgYmUgdHlwZWQgd29ybGQgZGF0YSBldmFsdWF0ZWQgYnkgdGhlIGxpYnJhcnksIG5vdCBjb25zdW1lciBjb2RlLCBiZWNhdXNlIHRoZSBkZWZpY2l0IGl0IHByb2R1Y2VzIGlzIGFuIGFkbWlzc2lvbiBpbnB1dCBhbmQgam91cm5hbCByZXBsYXkgcmUtcnVucyByZWR1Y2UgKHZlcmlmeV9oaXN0b3J5KSwgc28gYSBjaGFuZ2VkIGNvbnN1bWVyIGZ1bmN0aW9uIHdvdWxkIGZhaWwgY29tbWl0dGVkIGhpc3Rvcnkgb24gcmVzdGFydC4gTmV3IExPRCBuZWVkcyBiZWNvbWUgbmV3IGNvbnN1bWVyLW5ldXRyYWwgcnVsZSBmb3Jtcy4gV29ybGRTY2FsZUludGVudCBwZXIta2luZCB0YXJnZXRzIHN0YXkgYXMgdGhlIGNlaWxpbmcgdGhlIHJ1bGUgZGlzdHJpYnV0ZXMsIHNvIHRoZSBhdXRob3JlZCBzY2FsZSBkaXJlY3RpdmUgc3Vydml2ZXMgYW5kIGFuIHVuYm91bmRlZCBVbmlmb3JtIHJ1bGUgY2Fubm90IG91dGdyb3cgaXQuIFN1cGVyc2VkZXMgdGhlIGZvY3VzIGFuZCBkZXRhaWwtcHJvZmlsZSB3b3JkaW5nIG9mIHRoZSBlYXJsaWVyIHNhbWUtZGF5IHJlY29yZHMuIiwgInN0YXR1cyI6ICJhY2NlcHRlZCIsICJ0cyI6ICIyMDI2LTA5LTE1VDIwOjU1OjA3KzAwOjAwIiwgInR5cGUiOiAiYXJjaGl0ZWN0dXJlIn0=", "stored_at": "2026-09-15T20:55:07.692958+00:00", "type": "ghostlight.evidence_record.v0"} diff --git a/state/map.yaml b/state/map.yaml index 9b2d45b..b50191e 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -54,7 +54,7 @@ hard_boundaries: - Seal world authority before widening ontology. Only WorldKernel may hold mutable aggregate state, issue canonical IDs, invoke the reducer, or write the journal. The public seam is create/open, immutable snapshot, CommandEnvelope submission, and typed receipt. Empty reductions do not commit; translation gaps remain non-fictional inference/evaluation evidence outside WorldState. - Every autonomous authority scope has exactly one decision controller. NarrativePersona preserves the Projector-Persona-Interpreter prose membrane; OperationalAgent may use a permissioned typed view and tools for operator-shaped cognition. Interpretation is total: representable material becomes typed proposals and unrepresented material becomes exact translation gaps. Neither mode changes authority, falls through to the other for a gap or infrastructure fault, or exercises the same opportunity twice. - Sparse causal sufficiency, not actor count, defines a valid world horizon. Counts, cover ratios, interestingness, political diversity, and prose quality are evaluation evidence and cannot admit ontology, reject a structurally valid mutation, or declare the world complete. Liveness is a separate authored claim: the seed's WorldScaleIntent (design target 2,400 subjects / 240 cells / 10% cover) is a scale deficit the elaborators pursue, and cover budget is the deliberate choke; validity never waits on it and it never gates admission. - - Ghostlight Dungeon is a consumer of the Ghostlight library, which serves all GameCult narrative simulation. Dungeon concepts (Session Zero, Vault choice, players, sliders, starting locations) are Dungeon authority and never shape the library; the library offers consumer-neutral capabilities and each consumer supplies its own policy. Source does not yet match: the world kernel lives in `crates/ghostlight-dungeon`. + - Ghostlight Dungeon is a consumer of the Ghostlight library, which serves all GameCult narrative simulation. Dungeon concepts (Session Zero, Vault choice, players, sliders, starting locations) are Dungeon authority and never shape the library; the library offers consumer-neutral capabilities and each consumer supplies its own policy. Source does not yet match: the world kernel lives in `crates/ghostlight-dungeon`; extracting it into a library crate is ordered as the first pass of plan step 15. - Prompt text is projection, not truth storage. - A consumer-supplied ontology or fixed seed may never bypass WorldKernel validation, closed mutation authority, or atomic CultCache commit. - Delvehold retains quantitative economy authority. Ghostlight string resource handles and strategic resource effects must not impersonate quantities, prices, recipes, production capacity, inventories, orders, contracts, or conservation semantics. @@ -386,13 +386,13 @@ current_status: utterance and display are every span cited for them in prose order, commit 855727f, run 12). Next, in the operator's order (2026-09-15): - (a) the playtest gate (plan step 15): library capabilities first - (elaboration lenses and weights, focus-weighted demand, per-world evidence - binding, elaborators in Draft; ontology doc "Elaboration lenses and - focus"), then Dungeon's Session Zero consuming them - (docs/architecture/ghostlight-session-zero.md). Open operator decisions: - whether the eight titles ship as a library stock lens set, and whether the - world kernel is extracted from crates/ghostlight-dungeon first. (b) the outbound consumer + (a) the playtest gate (plan step 15): first extract the world kernel + from crates/ghostlight-dungeon into a library crate (L0), then library + capabilities (the stock lens set of eight titles with weights, typed + detail rules as a function from place to detail level, per-world evidence + binding, elaborators in Draft; ontology doc "Elaboration lenses and detail + rules"), then Dungeon's Session Zero consuming them + (docs/architecture/ghostlight-session-zero.md). (b) the outbound consumer response batch with a non-loopback CultMesh lease, shaped as Njordr's signal surface (custody, pressure and dependency, route, event deltas; spec owned by GameCult/Njordr `docs/architecture/njordr.md`, Ghostlight's