Record pass 10 and close step 6 of the plan

The consumer-api doc is the live contract for the landed ingress; the
ontology's Current mechanism runs through pass 10 and its follow-ups;
the mvp doc names the live authority answer; the plan's step 6 is
complete with the outbound consumer response as the next seam; the map
and handoff carry the series-complete state, the world-v3 generation,
and the decisions the operator owns; one evidence record distils the
ten passes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Meta Vens 2026-09-05 04:31:40 +02:00
commit 842b5af4ee
10 changed files with 336 additions and 232 deletions

View file

@ -78,10 +78,15 @@ The only mutation input is a `CommandEnvelope` containing:
- one closed command body;
- exact evidence references where the command depends on source material.
The caller supplies identity evidence, not an authority verdict. The kernel
derives a `MutationAuthorityEnvelope` from canonical membership, lifecycle,
subject authority, external-owner grants, and the command kind. Callers cannot
grant themselves scope by serializing a persuasive envelope.
The caller supplies identity evidence, not an authority verdict. For a patch
command the kernel derives the caller's authority itself:
`require_patch_author` reads the caller and committed state to decide who may
submit `AdmitPatch` and what ground it holds (the world owner unconfined, an
elaborator confined to a jurisdiction, or a consumer confined to the subjects
it controls), and `confine_to_ground` checks every declaration and operation
in the candidate patch against that ground before it is admitted. Callers
cannot grant themselves scope by serializing a persuasive envelope; the
kernel derives it from state it already committed.
Interpreters and operational agents submit the same typed commands through
narrower schemas. Narrative Personas never see those schemas or tools. No
@ -189,8 +194,13 @@ A subject is a stable identity with a declared kind:
- person;
- institution;
- autonomous population;
- external subject mirror.
- autonomous population.
An externally controlled mirror is not a fourth kind. It is an ordinary
subject of one of these three whose `ControllerAssignment` is
`ExternallyControlled { consumer }`: no controller ID, no controller mode, no
decision opportunity, and no affordance, mutable only through its own
consumer and the world owner.
Demographic descriptors and statistical aggregates are not automatically
subjects. A canonical action owner is derived structurally from an active
@ -250,7 +260,8 @@ The reducer validates only structural promises:
- knowledge additions cite an existing accessible fact or a newly admitted
evidenced fact;
- population slices are disjoint beneath their declared parent;
- external-owned components can change only through their admitted owner;
- an externally controlled subject's components can change only through its
own consumer, confined by `PatchGround::Consumer`;
- a batch either reduces completely or not at all.
Interestingness, novelty, ideological distribution, prose style, and counts do

View file

@ -1,123 +1,189 @@
# Ghostlight World Consumer API
Status: drift. Names `CampaignRegistry`, `WorldSeed`, and `publish_session_zero`,
which do not exist in the sealed kernel. Pending rewrite against
`docs/architecture/ghostlight-world-ontology.md`; read for consumer-boundary
intent only. Pass 10 owns the rewrite and carries four debts the ingress must
settle before a consumer patch can reach `AdmitPatch`: caller authority (which
`CallerId` a consumer lowers to), decode-time size bounds on the patch,
phase (Draft seed versus Active elaboration), and boundary answering (an
Active consumer patch that declares must answer a derived boundary like any
other author). The transport is one typed inbound document over a second loopback route
beside `POST /cultnet/snapshot`, carrying the patch as a nested
canonical-msgpack byte frame bounded before any item deserializes; it is
not a fifth `execute_world` operation literal and not an organ of the
outbound mesh publisher.
Status: this describes the landed pass-10 consumer ingress — a world's third
patch author, reaching `AdmitPatch` through one loopback-bound typed document.
## Objective
Let a consumer supply and observe one persistent Ghostlight world without
becoming part of Ghostlight's runtime. Session Zero compilation and external
world authoring are two producers of the same admitted seed. Delvehold is the
first demanding consumer; no Delvehold identifier, schema, or policy is core
authority.
Let an external consumer author and observe the exact subjects a Ghostlight
world has admitted as its mirrors, without becoming part of Ghostlight's
runtime and without the world learning the consumer's vocabulary. A
consumer-authored seed and a compiled seed are the same `AdmitPatch`; there is
no separate seed type, registry, or publication handoff. Delvehold is the
first consumer; no Delvehold identifier, schema, or policy is core authority
(`docs/architecture/delvehold-forced-ontology-integration.md` names the
profile-side binding).
## Authority map
- **Seed admission owner:** `CampaignRegistry` validates one `WorldSeed` and
commits it with one `WorldSeedAdmission` and receipt. Producer-specific
documents may join that transaction but cannot create another publication
path.
- **World owner:** `WorldKernel` owns every admitted campaign revision and all
simulation state.
- **External-subject owner:** `ExternalSubjectAuthority` binds one exact
consumer owner to one exact subject. The subject remains a visible target but
receives no Ghostlight Persona turn and cannot act through a strategic cell.
- **Consumer owner:** the consumer decides whether a Ghostlight proposal changes
its own domain. Its acknowledgement records admission or refusal but cannot
rewrite Ghostlight state.
- **Inputs:** a consumer-neutral seed, producer and payload digests, exact
authority descriptors, normalized external-institution snapshots, and
proposal acknowledgements.
- **Outputs:** seed-admission receipts, revisioned snapshot receipts, attributed
external proposals, and immutable proposal acknowledgements.
- **Derived state:** Session Zero publication documents, consumer bindings,
network messages, schema catalogs, and UI projections own no canonical world
state.
- **Forbidden writers:** seed producers, adapters, models, arenas, transport,
and acknowledgements cannot write a campaign row directly.
- **Shared paths:** compiler and consumer seeds lower to one registry/store
transaction. Strategic waves continue through the existing WorldKernel
command and atomic commit path.
- **Cut line:** `publish_session_zero` no longer owns campaign creation. It is a
producer-specific wrapper around generic seed admission. Ghostlight never
switches on `greathold` or a `delvehold.*` schema.
- **Admission owner:** `require_patch_author` (`world/mod.rs`) decides which
caller may submit `AdmitPatch` and returns that caller's `PatchGround`;
`confine_to_ground` decides what a confined ground may write. Both run in
`reduce`'s `AdmitPatch` arm and again in `apply_effect`'s `PatchAdmitted`
arm — there is no second confinement function and no way for a patch to
commit without being re-decided.
- **Consumer ground:** `PatchGround::Consumer(ConsumerId)` is derived, never
carried. The set of subjects a consumer may write is
`{ s | controller_assignments[s] == ExternallyControlled { consumer } }`,
read from committed state at decision time. A consumer cannot name its own
scope on the wire, and revoking a binding in a later commit shrinks its
authority with no ingress change.
- **Caller minting:** `WorldMailbox::submit_consumer` (`world/mailbox.rs`) is
the only constructor of `AuthenticatedCaller::verified_system(SystemCapability::Consumer { consumer })`.
- **Ingress owner:** `world/consumer.rs` owns decoding a document, bounding
it, authenticating the consumer, one port call, and one receipt
projection. It owns no world truth, holds no opinion about a patch's
content, and does not pre-validate — a second reducer here could disagree
with the kernel's, so structure is decided once, by `resolve_patch`.
- **Port:** `ConsumerPort` (`world/mailbox.rs`) has one method,
`submit_consumer`. It cannot read the world: it does not select an answer,
does not pre-validate, and returns a receipt rather than state.
## Typed flow
```text
producer seed
-> WorldSeed + WorldSeedAdmission
-> CampaignRegistry validation
-> one empty-store CultCache transaction
-> WorldKernel runtime
consumer-owned state
-> consumer adapter
-> ExternalSubjectSnapshot (institution or Gestalt projection)
-> authority, digest, revision, and idempotency validation
-> WorldKernel atomic campaign commit
-> ExternalSnapshotReceipt
strategic action directed at an external subject
-> WorldKernel strategic-wave validation
-> attributed ExternalWorldProposal persisted with the wave
-> consumer reads proposal and decides locally
-> ExternalProposalReceipt records accept, partial accept, or reject
-> any realized consumer change returns later as a fresh snapshot
ConsumerPatchDocument (canonical MessagePack)
-> ConsumerRegistry: name -> ConsumerId, secret verified against a
stored SHA-256 digest in constant time
-> patch::decode_patch, bounded by MAX_PATCH_BYTES / _DECLARATIONS /
_OPERATIONS / _EVIDENCE
-> WorldMailbox::submit_consumer(world_id, expected_revision, command_id,
consumer, answers, patch)
-> reduce / apply_effect: require_patch_author, the answer rule,
confine_to_ground
-> ConsumerReceiptDocument: one atomic verdict — a commit reference or
the complete mismatch set
```
`command_id` and `world_id` on the receipt are `Option`: a frame that fails to
decode or names an unregistered consumer never derives a command key or reads
a world, so the receipt has none to report. The outbound half of this
contract — a consumer reading its own projection, or receiving an
attributed proposal — is not part of this pass; see "Not in this pass" below.
## Transport
The API uses typed CultNet operation requests over Ghostlight's existing RUDP
server. Seed admission, external snapshots, proposal reads, and proposal
acknowledgements use MessagePack payloads and typed receipts. The service is
loopback-only until CultMesh authority leases and secure remote admission are
implemented. HTTP and Eve remain player/product projections, not the world
consumer boundary.
`POST /cultnet/world-patch`, declared beside `/cultnet/snapshot` in
`api_router` (`runtime.rs`). The handler gates loopback and content type
(`application/msgpack`) exactly as the snapshot route does, then hands the
body to `world::consumer::admit_document`; everything past those two gates is
`world/consumer.rs`'s to decide. The body limit is
`CONSUMER_BODY_LIMIT = patch::MAX_PATCH_BYTES + CONSUMER_ENVELOPE_SLACK` (an
8 KiB envelope allowance over the 256 KiB patch cap), so the transport guard
cannot become a second opinion about how big a patch may be.
## Invariants
The document and receipt are Ghostlight-owned typed records in canonical
MessagePack, not CultNet control messages, pinned to two schema constants:
- The public seed shape excludes runtime revision, transcript, pending work,
cover state, and other already-authoritative campaign fields.
- The seed digest binds the exact normalized seed. A campaign ID cannot be
republished from another digest.
- An external authority names one existing institution or Gestalt subject and
one owner. Its secret is persisted only as SHA-256.
- External subjects are active graph targets but never simulation-eligible.
- A snapshot replaces only the exact externally owned institution or Gestalt projection.
It cannot create subjects, routes, actors, Gestalts, relations, or private
knowledge.
- Source revisions increase monotonically. Exact idempotent replay returns the
original receipt; conflicting replay changes nothing.
- Outbound proposals remain attributed to an exact Ghostlight subject and exact
target. An arena never becomes the proposer.
- Proposal acknowledgement is not a Ghostlight world mutation. Realized effects
return through a later snapshot.
- Dungeon campaigns keep their player actor, membership, contract, and Session
Zero documents. Their adversarial play path does not depend on a consumer.
```text
CONSUMER_PATCH_SCHEMA = "ghostlight.consumer_patch.v0"
CONSUMER_RECEIPT_SCHEMA = "ghostlight.consumer_receipt.v0"
```
## First acceptance
`ConsumerPatchDocument` carries `schema`, `world_id`, `consumer` (a
configured name, lowered to a `ConsumerId` by the registry and never carried
further), `secret`, `idempotency_key`, `expected_revision`, `answers:
Option<PatchAnswer>`, and `patch: Vec<u8>` — the encoded `WorldPatch` as a
nested canonical-MessagePack byte frame rather than an inline value, so
`MAX_PATCH_BYTES` is checked against the patch itself before any of its items
deserializes. The outer document is decoded first, is tiny, and is bounded by
the route's derived limit.
1. Session Zero and a consumer-authored fixture persist the same generic seed
admission and receipt types.
2. A configured external institution never receives a strategic cell or
Persona action.
3. Wrong owner, wrong secret, stale source revision, digest conflict, and stale
world revision leave campaign state unchanged.
4. A valid snapshot advances the campaign once and returns an idempotent typed
receipt.
5. A strategic action aimed at the external institution emits one attributed
proposal in the same atomic wave commit.
6. Consumer acknowledgement cannot mutate the campaign and can be replayed
idempotently.
`mesh.rs`'s advertisement gains the two schema constants and nothing else:
this door is loopback-bound, so it is not a remotely reachable surface and
advertising it as one would claim availability the binary does not have.
## Idempotency and staleness
`expected_revision` is required; the port submits through
`submit_authenticated`, not the stamped path, because a caller that cannot
name the revision it built against cannot be told its batch is stale. The
idempotency ledger is checked before the revision, so an exact resubmission
still returns the original receipt (`AlreadyApplied`) even after the world has
moved; a stale document is `RevisionMismatch { expected, actual }`, and the
receipt carries the live revision so the consumer knows what to build against
next. `CommandId::derived` computes the command key from `(world, consumer,
idempotency_key)`; the same key with a different body is
`CommandIdConflict`, and nothing commits.
There is no receipt-probe request and no separate mailbox `Request` variant
for it. A consumer's document is byte-identical on retry and its `CommandId`
is derived, so resubmission is the probe and the ledger answers it directly.
## The externally controlled subject
A subject declared `NewController::External { consumer }` receives
`ControllerAssignment::ExternallyControlled { consumer }`. It mints no
controller ID and no controller mode — both accessors return `Option` for it,
and every reader fails closed rather than assuming a default. Concretely:
- it derives no decision opportunity and mints no turn;
- it is excluded from `agency_graph` and so from the cover;
- it is visible in the snapshot as an ordinary subject, related to, targeted,
and counted like any other, with `controller_id: None` and
`controller_mode: None`;
- it may hold no affordance — declaring it with a non-empty affordance grant
set is `Mismatch::ControllerGrantMismatch`, and the pairing is checked both
ways (an ordinary subject with an empty grant set is the same mismatch);
- its components change through exactly two callers: its own consumer, and
the world owner, who is unconfined and always could write it — that is the
owner's standing authority, not a leak in the consumer boundary.
## Confinement
A consumer writes only the subjects bound to it and operations grounded on
those subjects (`confine_to_ground`, the `PatchGround::Consumer` arm):
- a declared subject is admitted only if its controller names the same
consumer; position is unconfined;
- a declared place, a declared route, `Relocate`, `OpenRoute`, `CloseRoute`,
and `AlterCost` are always refused — they carry a place or a route, and a
consumer's ground names no place;
- a `Claimed { by }` fact must name a bound subject; a `Canonical` fact
declaration is refused outright — a consumer's evidence buys an `Admit`
into its own custody and a `Claimed` fact, never a canonization;
- a channel's reach and controller must all be bound subjects;
- every operation's ground subjects must be bound, and its place and route
lists must be empty — `Transfer` therefore requires both endpoints bound,
so a consumer cannot push custody into a Ghostlight subject; `Admit` and
`Consume` work inside its own custody.
In Active phase a consumer patch that declares answers nothing except a
`CausalBoundary::MissingStructure { subject }` derived on one of its own
mirrors — the world noticing that a subject it can see has structure it
cannot account for. Every other Active declaration is refused by the answer
rule plus this confinement, not by a separate phase gate: a consumer cannot
answer a boundary on a foreign subject (not covered), cannot answer a
`Deficit` row (deficits are jurisdictional; a consumer holds no
jurisdiction), and cannot declare without an answer. A component-only batch —
the overwhelming majority of consumer traffic — answers nothing and commits
through the same `require_answer` path as any other author.
## Operator configuration
`ConsumerRegistry` is loaded once at startup from the file named by
`GHOSTLIGHT_CONSUMER_CREDENTIALS`: one `name = <64 hex digits>` line per
consumer (the SHA-256 of that consumer's shared secret), blank lines and `#`
comments ignored. A missing file means no consumers, and every document is
`Unauthenticated`, the fail-closed default that lets this route exist before
an operator configures anything. A file that exists but does not parse is
fatal at startup, so a mistyped credential can never read as "no consumers". The registry holds only digests; the
plaintext secret never enters the process image beyond the hash and never
enters a log, a receipt, or the journal.
## Deployment
The consumer capability's tag is part of the commit digest and the
externally controlled assignment is part of the state shape, so both bump the
schema: state schema `ghostlight.world_state.consumer.v1` (state-schema
generation `world-v3`), commit schema `ghostlight.world_commit.consumer.v1`.
A store written under an earlier schema is refused, not migrated.
## Not in this pass
- The outbound consumer response — a consumer reading its own projection, or
receiving an attributed proposal about a Ghostlight subject acting toward
its mirror. This is the next seam; building it prematurely would grow a
second projection owner ahead of its use.
- A CultMesh authority lease for a non-loopback consumer. Until that exists,
this route is loopback-only and offers a consumer no remote door.

View file

@ -35,9 +35,9 @@ not from a model agreeing that the world is deep.
## Current mechanism
Passes 1 through 9 of the widening are landed (`5e53beb`, `e99af63`,
Passes 1 through 10 of the widening are landed (`5e53beb`, `e99af63`,
`d2805fe`, `0f21a49`, `dbe176d`, `cb6a126`, `1852ddd`, `3ed3868`,
`8aebfb6`). The sealed kernel holds subjects with a label and a
`8aebfb6`, `b4d1943`). The sealed kernel holds subjects with a label and a
kind (`Person | Institution | Population`); a `positions` partition with
`Position`; entities with `container` under containment acyclicity; `Route`
as an `EdgeRecord` variant carrying `AccessKind { Public, Restricted }`, a
@ -172,7 +172,7 @@ head, rotates the remaining subjects through singleton cells by debt, and
packs the rest into grouped cells by connected component of the agency graph
(scheduler-only; reachable from no prompt builder). `Cell`, `Cover`,
`CellId`, `Resolution`, `TickIndex`, and `AgencyGraph` are derived and
disposable; the only durable trace of a tick is the `controller_work.v8` row
disposable; the only durable trace of a tick is the `controller_work.v9` row
(`ControllerWork::Grouped`), custody-separate from world custody. A grouped
cell is one inference over partitioned per-constituent views returning zero
or one attributed proposal per constituent; declines are submitted first and
@ -183,16 +183,44 @@ Cell and constituent command ids are sha256-derived. The runtime's
the bounded concurrency permit pool, the quarantine flag, and the clock,
which advances after the cells so every cell in a tick shares one `now`.
`AdmitPatch` has a third author: `CallerId::System(SystemCapability::Consumer
{ consumer })`, minted only by `WorldMailbox::submit_consumer` after the
consumer ingress (`world/consumer.rs`) has authenticated a document against a
configured secret digest. `require_patch_author` and `confine_to_ground`
widen from jurisdiction-only to `PatchGround { Jurisdiction(JurisdictionKey),
Consumer(ConsumerId) }`; a consumer's ground is derived from
`controller_assignments` at decision time, never carried on the wire, and
confines it to the subjects it controls, with no place, route, or `Canonical`
fact ever inside that ground. A subject declared
`NewController::External { consumer }` receives
`ControllerAssignment::ExternallyControlled { consumer }`: it mints no
controller ID or mode (both accessors are `Option`), derives no opportunity,
is excluded from `agency_graph` and the cover, and may hold no affordance
(`admit_resolved`'s controller-shaped pairing rejects a non-empty grant set as
`Mismatch::ControllerGrantMismatch`). It remains an ordinary subject in the
snapshot, related to and targeted like any other, mutable only through its
own consumer and the always-unconfined world owner. `patch::decode_patch` is
the one decode bound for both the elaboration lane and the consumer lane,
under four caps — `MAX_PATCH_BYTES`, `MAX_PATCH_DECLARATIONS`,
`MAX_PATCH_OPERATIONS`, `MAX_PATCH_EVIDENCE` — and the consumer document
travels over two wire schema constants, `CONSUMER_PATCH_SCHEMA` and
`CONSUMER_RECEIPT_SCHEMA`, both `.v0`. The state and commit schemas bump to
`ghostlight.world_state.consumer.v1` and `ghostlight.world_commit.consumer.v1`
(state-schema generation `world-v3`); a store written under an earlier schema
is refused, not migrated.
Opportunities bind to a `ScopeDigest` over one `scope_components` owner
(controller assignment, grants, delegated grants, own authority, position,
incident routes, own holdings, own dependencies, known fact ids, controlled
channels, own commitments; never `now`, occupancy, forum state, or another
subject's knowledge); a proposal commits at any later revision with unchanged scope and is
rejected with `KernelError::ScopeChanged` otherwise. State schema is
`world_state.elaboration.v1`, commit schema `world_commit.elaboration.v1`,
controller work `controller_work.v8`; earlier stores are refused. Ghostlight owns a conserved narrative ledger;
`ghostlight.world_state.consumer.v1`, commit schema
`ghostlight.world_commit.consumer.v1`, controller work `controller_work.v9`;
earlier stores are refused. Ghostlight owns a conserved narrative ledger;
Delvehold owns the economy (`delvehold-forced-ontology-integration.md`).
Pass 10 adds the consumer ingress.
Step 6 of the plan is complete; the outbound consumer response is the next
seam.
## The failure this vocabulary is designed against
@ -265,12 +293,15 @@ resolver, or reconciler is needed.
Three namespaces, three newtypes, issued only by the reducer.
```text
SubjectId person, institution, population, external mirror — can decide
SubjectId person, institution, population — can decide
EntityId place, resource, fact, channel — cannot decide
EdgeId route, relation, commitment, pressure — connects the above
```
Display names are labels. They never resolve a reference or bind structure.
An externally controlled mirror is an ordinary subject of one of these three
kinds; what is external is its `ControllerAssignment`
(`ExternallyControlled { consumer }`), not a fourth `SubjectKind`.
## Components
@ -373,7 +404,8 @@ The reducer checks only these:
- knowledge additions cite an accessible or newly evidenced fact;
- communication reaches only subjects inside the channel's reach set;
- population slices are disjoint beneath their declared parent;
- externally owned components change only through their admitted owner;
- an externally controlled subject's components change only through its own
consumer, confined by `PatchGround::Consumer`;
- the patch produces at least one canonical change.
Interestingness, novelty, political diversity, name quality, prose quality, and

View file

@ -225,98 +225,79 @@ outcome bands, four derived `CausalBoundary` kinds, scope-digest binding, one
are teardown evidence. Plan step 6 is nine implementation passes; pass 1 is
landed, passes 2 through 9 are not.
1. Passes 1 through 9 are integrated; the ontology widening machine is
complete and only pass 10 (consumer ingress) remains in step 6.
`codex/ghostlight-dungeon-mvp` tip is `8aebfb6` (Soul) over `f013c1d`
and `71d8c53` (Hands, pass 9), on `7dbbc81` (pass-8 docs and handoff) and
`b5443d5` (pass-8 follow-ups). Earlier passes: `5e53beb`, `e99af63`,
`d2805fe`, `0f21a49`, `dbe176d`, `cb6a126`, `1852ddd`, `3ed3868`. The
push follows a background crate test and the branch read `ahead 3` at
the time of writing; `git status -sb` is the witness.
1. Plan step 6, the ontology widening, is complete: all ten passes are
integrated on `codex/ghostlight-dungeon-mvp`. Tip is `a1fd645` (Soul)
over `b4d1943` (pass 10 machine) and `e0c6f9c` (patch author widened to
a confined external consumer), on `1203aa3` (pass-9 docs and handoff) and
`962f711` (intra-tick quarantine race closed). Pass tips in order:
`5e53beb`, `e99af63`, `d2805fe`, `0f21a49`, `dbe176d`, `cb6a126`,
`1852ddd`, `3ed3868`, `8aebfb6`, `a1fd645`. The push follows a
background crate test and the branch read `ahead 3` at the time of
writing; `git status -sb` is the witness. The series is distilled as one
evidence record dated 2026-09-05 in `state/evidence.jsonl`.
Pass 9 facts: new module `world/cover.rs` (`TickIndex`, `Resolution`,
`CellId`, `Cell`, `Cover`, `CoverBudget`, `AgencyGraph`, `derive_cover`);
`ControllerWork::Grouped` with `GroupedCheckpoint`;
`InferencePurpose::GroupedAgent`; owner-only `Request::AgencyGraph`,
port-narrowed rather than principal-authenticated; the runtime task
`drive_cover_tick` (`runtime.rs`) is the single owner of tick cadence,
cover derivation, and the clock, and advances the clock after the cells
(the pass-7 `advance_world_clock` task is gone, verified absent from
source); a `Semaphore` plus `AtomicBool` quarantine replaced the
controller mutex; environment `GHOSTLIGHT_COVER_CELL_BUDGET`,
`GHOSTLIGHT_COVER_CONSTITUENT_CAP`, `GHOSTLIGHT_COVER_URGENCY_SLOTS`,
`GHOSTLIGHT_CONTROLLER_MAX_CONCURRENT`, `GHOSTLIGHT_TICK_INTERVAL_SECONDS`;
`controller_work.v8`; world state and commit schemas stay at
`elaboration.v1`; no `Cargo.toml` change and no `uuid/v5`, verified.
Rulings adopted: fairness is ceil(N/R) with R = cells minus urgency
slots, verified at the 2,400/240 profile to close in 22 ticks, not 21;
the constituent cap yields for two reasons, capacity and packing, while
the cell budget never yields and oversubscribed is the signal; the cover
is pure and the attention order is a real input; coupled constituents in
a grouped cell contend and the second act is honestly refused with
`ScopeChanged`, and the grouping heuristic stays; the open operator
decision is whether to allow a bounded in-tick re-submission for a
refused constituent, to be taken with the submitted-versus-committed
number in hand. The owner-only Eve `world.run_tick` command is not built;
its authority decision is pending. Baseline at `8aebfb6`: 283 test
functions in `world/*.rs`, 323 crate source, plus one integration test
(the focused `world::` run reports 282 / 318; different counting rules,
compare like with like).
What the kernel is now: twelve decision-constraining component kinds
over twenty-seven named operations under one `WorldPatch`, one reducer,
one CAS commit, one decode bound for both authoring lanes
(`patch::decode_patch` with `MAX_PATCH_BYTES`, `MAX_PATCH_DECLARATIONS`,
`MAX_PATCH_OPERATIONS`, `MAX_PATCH_EVIDENCE`; the `MAX_DRAFT_*` bounds
are deleted), and three confined `SystemCapability` arms: `Clock`,
`Elaborator { jurisdiction }`, `Consumer { consumer }`. Pass 10 added
`world/consumer.rs`; `PatchGround { Jurisdiction, Consumer }` with
`confine_to_ground` as the one confinement function (renamed from
`confine_to_jurisdiction`); `ControllerAssignment::ExternallyControlled
{ consumer }`, with `id()` and `mode()` now `Option` and every reader
failing closed; `Mismatch::ControllerGrantMismatch` replacing
`NoAffordances`; `CommandId::derived` shared by `session_command_id`;
`ConsumerPort` (one method) in `world/mailbox.rs` and
`WorldMailbox::submit_consumer`; route `POST /cultnet/world-patch`,
loopback, msgpack, `CONSUMER_BODY_LIMIT`; `ConsumerRegistry` loaded from
the file named by `GHOSTLIGHT_CONSUMER_CREDENTIALS`, digests only.
Schemas are `world_state.consumer.v1` / `world_commit.consumer.v1`;
`controller_work.v9`; `STATE_SCHEMA_GENERATION` in
`idunn_health.rs` is now `world-v3`, so the Idunn expectation and every
"world-v2" phrase in the deployment gate below now mean world-v3.
Baseline at `a1fd645`: 313 test functions in `world/*.rs`, 357 crate
source, plus one integration test (the focused `world::` run reports
312 / 352; different counting rules, compare like with like).
In flight, not landed:
- `hands/pass9-followups` in the worktree `F:\Projects\Ghostlight-pass9fu`,
branched from `8aebfb6` with no commits yet: `with_test_ports`,
`InferencePort`, and `ControllerWorkStore` to `pub(crate)` with spec
test 13.12 for concurrency plus quarantine; `drive_cover_tick` behind
narrow ports with an ordering test; `merges_are_deterministic_in_subject_order`
retired.
- Pass 10 design: `modeling-pass10.md` is on disk in the session
scratchpad; `imagination-pass10.md` is being written under ten rulings,
the load-bearing ones being: the consumer is a third `SystemCapability`
arm confined to one externally controlled subject; externally
controlled subjects get no opportunity and are skipped by the cover;
one atomic verdict per document, no partial acceptance; one kernel-side
decode bound for both lanes; transport follows the `POST
/cultnet/snapshot` precedent, not an `execute_world` literal; a
`ConsumerPort` as narrow as `ElaborationPort`; no Delvehold names in
core. No pass-10 worktree exists yet.
Main carries uncommitted coordinator edits to
`docs/architecture/ghostlight-world-ontology.md` (pass-9 scale paragraph,
the contention finding, and two stale claims Modeling caught: `AdmitPatch`
has no phase gate of its own, and `EvidenceRef::new` is `pub(super)`
bounded by `filter_evidence`, not `#[cfg(test)]`),
`docs/architecture/ghostlight-dungeon-mvp.md` (derived state, membrane,
tick driver and environment values), and the plan's step-6 pass-10 line.
Witness for pass 10: main-branch `git log` past `8aebfb6`, and
`git worktree list`.
Rulings adopted in pass 10: no migration for the moved
`session_command_id` derivation; `controller_work` is v9 so the refusal
is structural; a malformed credentials file is fatal at startup
(`open_consumer_registry` in `runtime.rs` returns the registry's error;
a missing file still means no consumers); the outbound consumer response
batch and a non-loopback CultMesh lease are the next seams, not this
pass. Soul's series judgment: the eleven plan invariants hold
structurally at the end of ten passes; the pairing invariant is
re-decided at three gates by doctrine, not by a repair loop.
Pipeline for pass 10: specs `imagination-pass1.md` through
`imagination-pass9.md` and maps `modeling-pass1.md` through
`modeling-pass9.md` are on disk in the session scratchpad
`C:\Users\Meta\AppData\Local\Temp\claude\F--Projects-Ghostlight\2fd50f5e-f7ba-4e5d-82bc-c7033e6074d2\scratchpad`,
not in `state/`; if that directory is gone, regenerate the specs from
`docs/architecture/ghostlight-world-ontology.md`. Each pass: Hands in an
isolation worktree whose first line is `git reset --hard
codex/ghostlight-dungeon-mvp`, then Soul in that tree, then the coordinator
integrates with `git -C <wt> rebase -q codex/ghostlight-dungeon-mvp && git
merge --ff-only <wt-branch> && cargo test -q -p ghostlight-dungeon --bin
ghostlight-dungeon world:: && git push -q && git worktree remove --force
<wt> && git branch -D <wt-branch>`, then a steward pass and the doc
proposal. Rulings that bind Hands: pass 7 keeps `check_ledger` single-site;
pass 8 adds no HTTP `AdmitPatch` ingress (that is pass 10, consumer
ingress, in the plan); pass 9 must not enable `uuid/v5` and derives each
`CommandId` via sha256 into `Uuid::from_bytes` like `derive_id`.
The pass-10 follow-ups are landed (`8173c9c`): `controller_work.v9`;
fatal malformed credentials; redacting `Debug` on the consumer document;
the elaboration lane calls `check_patch_caps` so `MAX_PATCH_EVIDENCE`
binds on both lanes; distinct item-cap refusals in the receipt; one
duplicate test deleted. Nothing is in flight and no worktree exists.
Docs landed with them: `ghostlight-world-consumer-api.md` rewritten
as a live contract (no longer drift); the ontology "Current mechanism"
through pass 10 closing with "Step 6 of the plan is complete; the
outbound consumer response is the next seam."; the mvp doc's
`MutationAuthorityEnvelope` and external-mirror-as-subject-kind
corrected; the plan's step-6 pass-10 line in past tense. Queued doc
edits: none.
Still deferred by design: `PolityInCausalRange`, `IndividuationRequired`,
and Verification 13 wait for relations and population slices. Pass 10
(consumer ingress) carries four named debts: authority, decode-time size
bounds, phase, and boundary answering, plus the `mesh.rs` inbound ruling.
and Verification 13 wait for relations and population slices.
Decisions the operator owns, recorded nowhere else durable than here and
the series evidence record: (a) whether a refused coupled constituent may
re-submit once inside the same tick, to be taken with the
submitted-versus-committed number in hand; (b) the authority for an
owner-only Eve `world.run_tick` command, which is not built; (c) whether
the outbound consumer response batch and the non-loopback CultMesh lease
are cut next or the deployment gate below resumes first. The ten specs
and maps (`imagination-pass1..10.md`, `modeling-pass1..10.md`) remain in
the session scratchpad only and are now history, not steering; the docs
own the design.
Queued doc edits, coordinator-owned: the pass-9 "Current mechanism"
paragraph, written with the follow-ups; and a config note for
`GHOSTLIGHT_CONTROLLER_ELABORATOR_MODEL`, which no doc names yet. The
pass-9 environment variables are in the uncommitted mvp edit (line 449)
and the ceil(N/R) wording in the uncommitted ontology edit (line 601).
2. First-generation world fixtures are banked and pushed, one per world, each
with Ink, training sidecar, visual plan, lore grounding, and BFL manifest,
reviewer-accepted except visual replay, which waits on a scene-set
@ -374,7 +355,7 @@ continuity, route preservation, split-brain fencing, signed health, Odin-outage
freeze, and negative legacy-authority checks must all agree before purge.
Deploy the Connector and then Ghostlight through that contract. Runtime restart,
route continuity, signed health, exact receipts, exclusive world-v2 state, and
route continuity, signed health, exact receipts, exclusive world-v3 state, and
negative checks must agree before deleting old services, releases, state,
acceptance roots, and local run scaffolding.
@ -405,7 +386,7 @@ otes aculty-workflow-lessons-2026-09-04.md`
- Do not invoke the current bounded Connector or Ghostlight redeploy helpers;
they fail at the root/Idunn Git boundary and still embody duplicate target
deployment authority.
- Do not prove world-v2 purity with a short deny list. Archive the complete old
- Do not prove world-v3 purity with a short deny list. Archive the complete old
state root or validate a complete allowed-path contract.
- Keep this handoff compact. Move chronology to Git, evidence, or the frozen
system map.

View file

@ -76,7 +76,7 @@ source cutover is not deployment evidence.
are wired to that mailbox boundary in the committed source.
- **Cut line:** source subtraction is complete. Production cutover now belongs
to Idunn's typed deployment path: admit the replacement release and exclusive
world-v2 state without a dual-write or compatibility bridge, prove restart
world-v3 state without a dual-write or compatibility bridge, prove restart
and negative legacy authority, then remove the old hosted body and state.
- **Verification layer:** the reducer checks exact authentication, world,
revision, lifecycle, approver, controller, opportunity, scope, affordance,

View file

@ -233,7 +233,7 @@ promote without the exact frozen Odin Ready receipt for that runtime instance
and presence digest. Idunn never manufactures Ready locally.
Deploy CodexConnector first, then Ghostlight. Ghostlight's live cut archives the
entire legacy state root, creates a clean world-v2 root, and validates a complete
entire legacy state root, creates a clean world-v3 root, and validates a complete
allowed live layout. After route, health, process, write lease, restart, and
negative legacy checks agree, delete the old units, releases, state roots,
acceptance debris, gamecult-ops target deploy programs, and local run
@ -278,11 +278,23 @@ Implementation order, each pass landing tests before the next begins:
singleton detail focus, grouped coarse cells with partitioned views and
per-constituent attribution, debt rotation. Scheduler-owned; the kernel
never sees a cell.
10. Consumer ingress: the typed CultNet ingress through which an external
consumer submits a `WorldPatch` or proposal to the sealed kernel. Until
this lands the elaborator lane is the only production author of a
`WorldPatch`, and the kernel has no decode-time bound of its own; pass 10
gives it one owner for both lanes.
10. Consumer ingress: landed in pass 10. `SystemCapability::Consumer` is the
world's third `AdmitPatch` author, minted only by
`WorldMailbox::submit_consumer` after `world/consumer.rs` authenticates a
`ConsumerPatchDocument` against a `ConsumerRegistry` secret digest.
`require_patch_author`/`confine_to_ground` widen to `PatchGround::Consumer`,
confining a consumer to the subjects declared
`NewController::External { consumer }` (`ControllerAssignment::ExternallyControlled`,
no controller ID, no mode, no opportunity, no affordance). `patch::decode_patch`
is the one decode bound, shared by the elaborator lane and the consumer
lane, under `MAX_PATCH_BYTES`/`_DECLARATIONS`/`_OPERATIONS`/`_EVIDENCE`. The
transport is `POST /cultnet/world-patch`, loopback-only, canonical
MessagePack, schemas `ghostlight.consumer_patch.v0` and
`ghostlight.consumer_receipt.v0`; the state/commit schemas bumped to
`ghostlight.world_state.consumer.v1` / `ghostlight.world_commit.consumer.v1`
(`world-v3`). The outbound consumer response — a consumer reading its own
projection or an attributed proposal — is the next seam, not part of this
pass.
The deployment cutover (step 5) is deferred behind this stage, not cancelled. No
world acceptance run may start while Yggdrasil serves the legacy body.

View file

@ -36,4 +36,5 @@
{"note": "Ontology v2 unifies elaboration and character action under one WorldPatch and one deterministic verifier. Three decisions change future belief: (1) affordances are world-authored data (preconditions, effect slots, weighted outcome bands) over a closed 29-operation kernel set, so genre lives in the seed and the kernel never learns one; (2) uncertainty is resolved by kernel entropy seeded from world/revision/command, so no model ever chooses success, which deletes the legacy wave-level outcome resolver; (3) proposals bind to a scope digest of the components their verification reads rather than the whole state digest, so eight elaborator loops and many subjects do not serialize on one revision, replacing the stale-means-discard rule. Elaborator tools are a derived projection of the operation set and cannot drift. ghostlight-multiresolution-agency.md is demoted to teardown evidence keeping only resumable sessions, compact drafts, and the complete mismatch set.", "status": "ok", "ts": "2026-09-04T14:01:12+00:00", "type": "research"}
{"note": "Operator correction, 2026-09-04: the 2,400-subject / 240-cell / 10% cover profile is a design target, not a load fixture. A world feels alive only when actors at every level pursue their own goals; that requires generating that detail first and then choking multiresolution simulation so attention is scarce and selection is forced. The mvp doc sentence calling the profile \"test data, not a production elaboration target\" was teardown-era text, not operator design, and is amended. Ontology v2 now carries: an authored WorldScaleIntent with a structurally counted deficit (qualified subject = active, one controller, one Goal commitment, one affordance) that elaborators pursue after boundaries; a budgeted connected cover every tick with singleton detail cells and grouped coarse cells; per-constituent attribution and partitioned knowledge in grouped cells; debt rotation. Still deleted: gestalt as canonical identity, arena knowledge union, semantic qualification and verification models, fission quotas as mutation, string identifiers.", "status": "ok", "ts": "2026-09-04T14:14:10+00:00", "type": "research"}
{"note": "Codex CLI fan-out that must commit cannot run in a linked git worktree. A linked worktree's .git is a file pointing into the parent repo's .git/worktrees/, which is outside the Codex sandbox's writable roots, so every git commit fails with index.lock Permission denied; the default sandbox also blocks outbound push. All four world workers died on this on 2026-09-04. Fix: full clones at the same paths (F:/Projects/Ghostlight-worlds/<world>, F:/Projects/<Lore>-worktrees/ghostlight-worlds; .git is a directory despite the directory name) and launch with -c sandbox_workspace_write.network_access=true. Uncommitted worker output was banked by hand to codex/world-<world> and codex/ghostlight-worlds before the worktrees were removed. Rule for any future Codex fan-out that writes: give each worker a clone whose entire .git lives under its own writable root, and grant network if it must push.", "status": "ok", "ts": "2026-09-04T14:18:47+00:00", "type": "verification"}
{"ts": "2026-09-04T15:04:24+00:00", "type": "verification", "status": "ok", "note": "Supersedes the 2026-09-04T14:18 clone-plus-network record, which was necessary but not sufficient. The Codex workspace-write sandbox keeps .git read-only even when the whole clone sits under the writable root, so a Codex worker can never commit or push regardless of clone layout or network grant. Rule for any Codex fan-out that must produce committed work: the worker writes files only; a supervisor outside the sandbox commits and pushes the clone after the worker exits. The world elaborator scheduler (C:/Users/Meta/.claude/worlds/Invoke-Elaborators.ps1) does this per slot to slot/<world>/<title>/<stamp> branches in both the Ghostlight world clone and the lore clone, recording completions in logs/elab-done.csv; integration into codex/world-<world> and codex/ghostlight-worlds is a separate deliberate pass. First banked fixture: Delvehold cistern-house-nine-breaker-test, codex/world-delvehold 9374fd0."}
{"note": "Supersedes the 2026-09-04T14:18 clone-plus-network record, which was necessary but not sufficient. The Codex workspace-write sandbox keeps .git read-only even when the whole clone sits under the writable root, so a Codex worker can never commit or push regardless of clone layout or network grant. Rule for any Codex fan-out that must produce committed work: the worker writes files only; a supervisor outside the sandbox commits and pushes the clone after the worker exits. The world elaborator scheduler (C:/Users/Meta/.claude/worlds/Invoke-Elaborators.ps1) does this per slot to slot/<world>/<title>/<stamp> branches in both the Ghostlight world clone and the lore clone, recording completions in logs/elab-done.csv; integration into codex/world-<world> and codex/ghostlight-worlds is a separate deliberate pass. First banked fixture: Delvehold cistern-house-nine-breaker-test, codex/world-delvehold 9374fd0.", "status": "ok", "ts": "2026-09-04T15:04:24+00:00", "type": "verification"}
{"ts": "2026-09-05T02:13:22+00:00", "type": "implementation", "status": "ok", "note": "Plan step 6, the ontology widening, is complete: ten passes landed on codex/ghostlight-dungeon-mvp between 2026-09-04 and 2026-09-05, each as a Hands cut in an isolation worktree, a Soul falsification in the same tree, and a fast-forward integration. Pass tips: 1 typed ID namespaces and closed patch resolution 5e53beb; 2 Position/Route/containment and scope-digest binding e99af63; 3 Custody/Dependency/conservation d2805fe; 4 world-authored affordance catalog with kernel-entropy bands 0f21a49; 5 Authority/Selection/Redress dbe176d; 6 Knowledge/Channel/Fact standing cb6a126; 7 clock, Commitment, Pressure, derived CausalBoundary and the structural answer rule 1852ddd; 8 confined elaborator lane and derived tool catalog 3ed3868; 9 budgeted connected cover with tick-driven fairness ceil(N/R), R = cells minus urgency slots, verified 22 ticks at the 2,400/240 profile 8aebfb6; 10 confined external consumer ingress over POST /cultnet/world-patch a1fd645. The kernel now holds 12 decision-constraining component kinds over 27 named operations under one WorldPatch, one reducer, one CAS commit, one decode bound for both authoring lanes, and three confined SystemCapability arms (Clock, Elaborator, Consumer); the action vocabulary is data in the seed and the kernel never learns a genre. The eleven plan invariants hold structurally at the end of the series per Soul: one deterministic reducer and atomic commit; kernel-derived authority; one controller per scope with no fallback or double action; total interpretation with exact gaps; deterministic structural rejection without a model verifier; scoped knowledge until explicit communication; external-consumer sovereignty; sparse causal sufficiency with counts as evidence only; restart reconstructs the exact world; IDs allocated only inside an admitted reduction; opportunities bound to a scope digest rather than a revision. The pairing invariant is re-decided at three gates by doctrine, not by a repair loop. Test surface grew from 43 world / 83 crate at the series start to 313 world / 357 crate source functions at a1fd645 (focused world:: run 312 / 352). Two design decisions remain with the operator and are recorded nowhere else durable: whether a refused coupled constituent may re-submit once inside the same tick, to be decided with the submitted-versus-committed number in hand; and the authority for an owner-only Eve world.run_tick command. The next seam after the series is the outbound consumer response batch and a non-loopback CultMesh lease."}

View file

@ -38,3 +38,4 @@
{"key": "2026-09-04T141410Z0000-0036-a61849b93cf5", "payload": "eyJub3RlIjogIk9wZXJhdG9yIGNvcnJlY3Rpb24sIDIwMjYtMDktMDQ6IHRoZSAyLDQwMC1zdWJqZWN0IC8gMjQwLWNlbGwgLyAxMCUgY292ZXIgcHJvZmlsZSBpcyBhIGRlc2lnbiB0YXJnZXQsIG5vdCBhIGxvYWQgZml4dHVyZS4gQSB3b3JsZCBmZWVscyBhbGl2ZSBvbmx5IHdoZW4gYWN0b3JzIGF0IGV2ZXJ5IGxldmVsIHB1cnN1ZSB0aGVpciBvd24gZ29hbHM7IHRoYXQgcmVxdWlyZXMgZ2VuZXJhdGluZyB0aGF0IGRldGFpbCBmaXJzdCBhbmQgdGhlbiBjaG9raW5nIG11bHRpcmVzb2x1dGlvbiBzaW11bGF0aW9uIHNvIGF0dGVudGlvbiBpcyBzY2FyY2UgYW5kIHNlbGVjdGlvbiBpcyBmb3JjZWQuIFRoZSBtdnAgZG9jIHNlbnRlbmNlIGNhbGxpbmcgdGhlIHByb2ZpbGUgXCJ0ZXN0IGRhdGEsIG5vdCBhIHByb2R1Y3Rpb24gZWxhYm9yYXRpb24gdGFyZ2V0XCIgd2FzIHRlYXJkb3duLWVyYSB0ZXh0LCBub3Qgb3BlcmF0b3IgZGVzaWduLCBhbmQgaXMgYW1lbmRlZC4gT250b2xvZ3kgdjIgbm93IGNhcnJpZXM6IGFuIGF1dGhvcmVkIFdvcmxkU2NhbGVJbnRlbnQgd2l0aCBhIHN0cnVjdHVyYWxseSBjb3VudGVkIGRlZmljaXQgKHF1YWxpZmllZCBzdWJqZWN0ID0gYWN0aXZlLCBvbmUgY29udHJvbGxlciwgb25lIEdvYWwgY29tbWl0bWVudCwgb25lIGFmZm9yZGFuY2UpIHRoYXQgZWxhYm9yYXRvcnMgcHVyc3VlIGFmdGVyIGJvdW5kYXJpZXM7IGEgYnVkZ2V0ZWQgY29ubmVjdGVkIGNvdmVyIGV2ZXJ5IHRpY2sgd2l0aCBzaW5nbGV0b24gZGV0YWlsIGNlbGxzIGFuZCBncm91cGVkIGNvYXJzZSBjZWxsczsgcGVyLWNvbnN0aXR1ZW50IGF0dHJpYnV0aW9uIGFuZCBwYXJ0aXRpb25lZCBrbm93bGVkZ2UgaW4gZ3JvdXBlZCBjZWxsczsgZGVidCByb3RhdGlvbi4gU3RpbGwgZGVsZXRlZDogZ2VzdGFsdCBhcyBjYW5vbmljYWwgaWRlbnRpdHksIGFyZW5hIGtub3dsZWRnZSB1bmlvbiwgc2VtYW50aWMgcXVhbGlmaWNhdGlvbiBhbmQgdmVyaWZpY2F0aW9uIG1vZGVscywgZmlzc2lvbiBxdW90YXMgYXMgbXV0YXRpb24sIHN0cmluZyBpZGVudGlmaWVycy4iLCAic3RhdHVzIjogIm9rIiwgInRzIjogIjIwMjYtMDktMDRUMTQ6MTQ6MTArMDA6MDAiLCAidHlwZSI6ICJyZXNlYXJjaCJ9", "stored_at": "2026-09-04T14:14:10.337953+00:00", "type": "ghostlight.evidence_record.v0"}
{"key": "2026-09-04T141847Z0000-0037-edecdf5c6e4b", "payload": "eyJub3RlIjogIkNvZGV4IENMSSBmYW4tb3V0IHRoYXQgbXVzdCBjb21taXQgY2Fubm90IHJ1biBpbiBhIGxpbmtlZCBnaXQgd29ya3RyZWUuIEEgbGlua2VkIHdvcmt0cmVlJ3MgLmdpdCBpcyBhIGZpbGUgcG9pbnRpbmcgaW50byB0aGUgcGFyZW50IHJlcG8ncyAuZ2l0L3dvcmt0cmVlcy8sIHdoaWNoIGlzIG91dHNpZGUgdGhlIENvZGV4IHNhbmRib3gncyB3cml0YWJsZSByb290cywgc28gZXZlcnkgZ2l0IGNvbW1pdCBmYWlscyB3aXRoIGluZGV4LmxvY2sgUGVybWlzc2lvbiBkZW5pZWQ7IHRoZSBkZWZhdWx0IHNhbmRib3ggYWxzbyBibG9ja3Mgb3V0Ym91bmQgcHVzaC4gQWxsIGZvdXIgd29ybGQgd29ya2VycyBkaWVkIG9uIHRoaXMgb24gMjAyNi0wOS0wNC4gRml4OiBmdWxsIGNsb25lcyBhdCB0aGUgc2FtZSBwYXRocyAoRjovUHJvamVjdHMvR2hvc3RsaWdodC13b3JsZHMvPHdvcmxkPiwgRjovUHJvamVjdHMvPExvcmU+LXdvcmt0cmVlcy9naG9zdGxpZ2h0LXdvcmxkczsgLmdpdCBpcyBhIGRpcmVjdG9yeSBkZXNwaXRlIHRoZSBkaXJlY3RvcnkgbmFtZSkgYW5kIGxhdW5jaCB3aXRoIC1jIHNhbmRib3hfd29ya3NwYWNlX3dyaXRlLm5ldHdvcmtfYWNjZXNzPXRydWUuIFVuY29tbWl0dGVkIHdvcmtlciBvdXRwdXQgd2FzIGJhbmtlZCBieSBoYW5kIHRvIGNvZGV4L3dvcmxkLTx3b3JsZD4gYW5kIGNvZGV4L2dob3N0bGlnaHQtd29ybGRzIGJlZm9yZSB0aGUgd29ya3RyZWVzIHdlcmUgcmVtb3ZlZC4gUnVsZSBmb3IgYW55IGZ1dHVyZSBDb2RleCBmYW4tb3V0IHRoYXQgd3JpdGVzOiBnaXZlIGVhY2ggd29ya2VyIGEgY2xvbmUgd2hvc2UgZW50aXJlIC5naXQgbGl2ZXMgdW5kZXIgaXRzIG93biB3cml0YWJsZSByb290LCBhbmQgZ3JhbnQgbmV0d29yayBpZiBpdCBtdXN0IHB1c2guIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA5LTA0VDE0OjE4OjQ3KzAwOjAwIiwgInR5cGUiOiAidmVyaWZpY2F0aW9uIn0=", "stored_at": "2026-09-04T14:18:47.920625+00:00", "type": "ghostlight.evidence_record.v0"}
{"key": "2026-09-04T150424Z0000-0038-a237611b3305", "payload": "eyJub3RlIjogIlN1cGVyc2VkZXMgdGhlIDIwMjYtMDktMDRUMTQ6MTggY2xvbmUtcGx1cy1uZXR3b3JrIHJlY29yZCwgd2hpY2ggd2FzIG5lY2Vzc2FyeSBidXQgbm90IHN1ZmZpY2llbnQuIFRoZSBDb2RleCB3b3Jrc3BhY2Utd3JpdGUgc2FuZGJveCBrZWVwcyAuZ2l0IHJlYWQtb25seSBldmVuIHdoZW4gdGhlIHdob2xlIGNsb25lIHNpdHMgdW5kZXIgdGhlIHdyaXRhYmxlIHJvb3QsIHNvIGEgQ29kZXggd29ya2VyIGNhbiBuZXZlciBjb21taXQgb3IgcHVzaCByZWdhcmRsZXNzIG9mIGNsb25lIGxheW91dCBvciBuZXR3b3JrIGdyYW50LiBSdWxlIGZvciBhbnkgQ29kZXggZmFuLW91dCB0aGF0IG11c3QgcHJvZHVjZSBjb21taXR0ZWQgd29yazogdGhlIHdvcmtlciB3cml0ZXMgZmlsZXMgb25seTsgYSBzdXBlcnZpc29yIG91dHNpZGUgdGhlIHNhbmRib3ggY29tbWl0cyBhbmQgcHVzaGVzIHRoZSBjbG9uZSBhZnRlciB0aGUgd29ya2VyIGV4aXRzLiBUaGUgd29ybGQgZWxhYm9yYXRvciBzY2hlZHVsZXIgKEM6L1VzZXJzL01ldGEvLmNsYXVkZS93b3JsZHMvSW52b2tlLUVsYWJvcmF0b3JzLnBzMSkgZG9lcyB0aGlzIHBlciBzbG90IHRvIHNsb3QvPHdvcmxkPi88dGl0bGU+LzxzdGFtcD4gYnJhbmNoZXMgaW4gYm90aCB0aGUgR2hvc3RsaWdodCB3b3JsZCBjbG9uZSBhbmQgdGhlIGxvcmUgY2xvbmUsIHJlY29yZGluZyBjb21wbGV0aW9ucyBpbiBsb2dzL2VsYWItZG9uZS5jc3Y7IGludGVncmF0aW9uIGludG8gY29kZXgvd29ybGQtPHdvcmxkPiBhbmQgY29kZXgvZ2hvc3RsaWdodC13b3JsZHMgaXMgYSBzZXBhcmF0ZSBkZWxpYmVyYXRlIHBhc3MuIEZpcnN0IGJhbmtlZCBmaXh0dXJlOiBEZWx2ZWhvbGQgY2lzdGVybi1ob3VzZS1uaW5lLWJyZWFrZXItdGVzdCwgY29kZXgvd29ybGQtZGVsdmVob2xkIDkzNzRmZDAuIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA5LTA0VDE1OjA0OjI0KzAwOjAwIiwgInR5cGUiOiAidmVyaWZpY2F0aW9uIn0=", "stored_at": "2026-09-04T15:04:24.134358+00:00", "type": "ghostlight.evidence_record.v0"}
{"key": "2026-09-05T021322Z0000-0039-8fe6fe49acb8", "payload": "eyJub3RlIjogIlBsYW4gc3RlcCA2LCB0aGUgb250b2xvZ3kgd2lkZW5pbmcsIGlzIGNvbXBsZXRlOiB0ZW4gcGFzc2VzIGxhbmRlZCBvbiBjb2RleC9naG9zdGxpZ2h0LWR1bmdlb24tbXZwIGJldHdlZW4gMjAyNi0wOS0wNCBhbmQgMjAyNi0wOS0wNSwgZWFjaCBhcyBhIEhhbmRzIGN1dCBpbiBhbiBpc29sYXRpb24gd29ya3RyZWUsIGEgU291bCBmYWxzaWZpY2F0aW9uIGluIHRoZSBzYW1lIHRyZWUsIGFuZCBhIGZhc3QtZm9yd2FyZCBpbnRlZ3JhdGlvbi4gUGFzcyB0aXBzOiAxIHR5cGVkIElEIG5hbWVzcGFjZXMgYW5kIGNsb3NlZCBwYXRjaCByZXNvbHV0aW9uIDVlNTNiZWI7IDIgUG9zaXRpb24vUm91dGUvY29udGFpbm1lbnQgYW5kIHNjb3BlLWRpZ2VzdCBiaW5kaW5nIGU5OWFmNjM7IDMgQ3VzdG9keS9EZXBlbmRlbmN5L2NvbnNlcnZhdGlvbiBkMjgwNWZlOyA0IHdvcmxkLWF1dGhvcmVkIGFmZm9yZGFuY2UgY2F0YWxvZyB3aXRoIGtlcm5lbC1lbnRyb3B5IGJhbmRzIDBmMjFhNDk7IDUgQXV0aG9yaXR5L1NlbGVjdGlvbi9SZWRyZXNzIGRiZTE3NmQ7IDYgS25vd2xlZGdlL0NoYW5uZWwvRmFjdCBzdGFuZGluZyBjYjZhMTI2OyA3IGNsb2NrLCBDb21taXRtZW50LCBQcmVzc3VyZSwgZGVyaXZlZCBDYXVzYWxCb3VuZGFyeSBhbmQgdGhlIHN0cnVjdHVyYWwgYW5zd2VyIHJ1bGUgMTg1MmRkZDsgOCBjb25maW5lZCBlbGFib3JhdG9yIGxhbmUgYW5kIGRlcml2ZWQgdG9vbCBjYXRhbG9nIDNlZDM4Njg7IDkgYnVkZ2V0ZWQgY29ubmVjdGVkIGNvdmVyIHdpdGggdGljay1kcml2ZW4gZmFpcm5lc3MgY2VpbChOL1IpLCBSID0gY2VsbHMgbWludXMgdXJnZW5jeSBzbG90cywgdmVyaWZpZWQgMjIgdGlja3MgYXQgdGhlIDIsNDAwLzI0MCBwcm9maWxlIDhhZWJmYjY7IDEwIGNvbmZpbmVkIGV4dGVybmFsIGNvbnN1bWVyIGluZ3Jlc3Mgb3ZlciBQT1NUIC9jdWx0bmV0L3dvcmxkLXBhdGNoIGExZmQ2NDUuIFRoZSBrZXJuZWwgbm93IGhvbGRzIDEyIGRlY2lzaW9uLWNvbnN0cmFpbmluZyBjb21wb25lbnQga2luZHMgb3ZlciAyNyBuYW1lZCBvcGVyYXRpb25zIHVuZGVyIG9uZSBXb3JsZFBhdGNoLCBvbmUgcmVkdWNlciwgb25lIENBUyBjb21taXQsIG9uZSBkZWNvZGUgYm91bmQgZm9yIGJvdGggYXV0aG9yaW5nIGxhbmVzLCBhbmQgdGhyZWUgY29uZmluZWQgU3lzdGVtQ2FwYWJpbGl0eSBhcm1zIChDbG9jaywgRWxhYm9yYXRvciwgQ29uc3VtZXIpOyB0aGUgYWN0aW9uIHZvY2FidWxhcnkgaXMgZGF0YSBpbiB0aGUgc2VlZCBhbmQgdGhlIGtlcm5lbCBuZXZlciBsZWFybnMgYSBnZW5yZS4gVGhlIGVsZXZlbiBwbGFuIGludmFyaWFudHMgaG9sZCBzdHJ1Y3R1cmFsbHkgYXQgdGhlIGVuZCBvZiB0aGUgc2VyaWVzIHBlciBTb3VsOiBvbmUgZGV0ZXJtaW5pc3RpYyByZWR1Y2VyIGFuZCBhdG9taWMgY29tbWl0OyBrZXJuZWwtZGVyaXZlZCBhdXRob3JpdHk7IG9uZSBjb250cm9sbGVyIHBlciBzY29wZSB3aXRoIG5vIGZhbGxiYWNrIG9yIGRvdWJsZSBhY3Rpb247IHRvdGFsIGludGVycHJldGF0aW9uIHdpdGggZXhhY3QgZ2FwczsgZGV0ZXJtaW5pc3RpYyBzdHJ1Y3R1cmFsIHJlamVjdGlvbiB3aXRob3V0IGEgbW9kZWwgdmVyaWZpZXI7IHNjb3BlZCBrbm93bGVkZ2UgdW50aWwgZXhwbGljaXQgY29tbXVuaWNhdGlvbjsgZXh0ZXJuYWwtY29uc3VtZXIgc292ZXJlaWdudHk7IHNwYXJzZSBjYXVzYWwgc3VmZmljaWVuY3kgd2l0aCBjb3VudHMgYXMgZXZpZGVuY2Ugb25seTsgcmVzdGFydCByZWNvbnN0cnVjdHMgdGhlIGV4YWN0IHdvcmxkOyBJRHMgYWxsb2NhdGVkIG9ubHkgaW5zaWRlIGFuIGFkbWl0dGVkIHJlZHVjdGlvbjsgb3Bwb3J0dW5pdGllcyBib3VuZCB0byBhIHNjb3BlIGRpZ2VzdCByYXRoZXIgdGhhbiBhIHJldmlzaW9uLiBUaGUgcGFpcmluZyBpbnZhcmlhbnQgaXMgcmUtZGVjaWRlZCBhdCB0aHJlZSBnYXRlcyBieSBkb2N0cmluZSwgbm90IGJ5IGEgcmVwYWlyIGxvb3AuIFRlc3Qgc3VyZmFjZSBncmV3IGZyb20gNDMgd29ybGQgLyA4MyBjcmF0ZSBhdCB0aGUgc2VyaWVzIHN0YXJ0IHRvIDMxMyB3b3JsZCAvIDM1NyBjcmF0ZSBzb3VyY2UgZnVuY3Rpb25zIGF0IGExZmQ2NDUgKGZvY3VzZWQgd29ybGQ6OiBydW4gMzEyIC8gMzUyKS4gVHdvIGRlc2lnbiBkZWNpc2lvbnMgcmVtYWluIHdpdGggdGhlIG9wZXJhdG9yIGFuZCBhcmUgcmVjb3JkZWQgbm93aGVyZSBlbHNlIGR1cmFibGU6IHdoZXRoZXIgYSByZWZ1c2VkIGNvdXBsZWQgY29uc3RpdHVlbnQgbWF5IHJlLXN1Ym1pdCBvbmNlIGluc2lkZSB0aGUgc2FtZSB0aWNrLCB0byBiZSBkZWNpZGVkIHdpdGggdGhlIHN1Ym1pdHRlZC12ZXJzdXMtY29tbWl0dGVkIG51bWJlciBpbiBoYW5kOyBhbmQgdGhlIGF1dGhvcml0eSBmb3IgYW4gb3duZXItb25seSBFdmUgd29ybGQucnVuX3RpY2sgY29tbWFuZC4gVGhlIG5leHQgc2VhbSBhZnRlciB0aGUgc2VyaWVzIGlzIHRoZSBvdXRib3VuZCBjb25zdW1lciByZXNwb25zZSBiYXRjaCBhbmQgYSBub24tbG9vcGJhY2sgQ3VsdE1lc2ggbGVhc2UuIiwgInN0YXR1cyI6ICJvayIsICJ0cyI6ICIyMDI2LTA5LTA1VDAyOjEzOjIyKzAwOjAwIiwgInR5cGUiOiAiaW1wbGVtZW50YXRpb24ifQ==", "stored_at": "2026-09-05T02:13:22.785718+00:00", "type": "ghostlight.evidence_record.v0"}

File diff suppressed because one or more lines are too long

View file

@ -2,12 +2,13 @@
## Current Subgoal
Pass-9 follow-ups with Hands in `F:\Projects\Ghostlight-pass9fu` on
`hands/pass9-followups` from `8aebfb6`, and pass 10 (consumer ingress) design:
`modeling-pass10.md` on disk, `imagination-pass10.md` in progress under the
ten rulings. Main tip `8aebfb6`, passes 1-9 integrated. Open operator
decisions: bounded in-tick re-submission for a refused constituent; Eve
`world.run_tick` authority.
Pass-10 follow-ups with Hands in `F:\Projects\Ghostlight-pass10fu` on
`hands/pass10-followups` from `a1fd645` (`controller_work.v9`, fatal malformed
credentials, redacting `Debug`, `check_patch_caps` in the elaboration lane),
then series close-out: commit the docs-worker edits, integrate, remove the
worktree. Main tip `a1fd645`; step 6 complete. Then the operator decides:
in-tick re-submission, Eve `world.run_tick` authority, outbound consumer
response versus the deployment gate.
## Working Notes