Commit graph

1,354 commits

Author SHA1 Message Date
Meta Vens
aef08ce3a6 Grammar tests: declare speech-carrying entries so the resolver does not refuse them as inert
Builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 07:00:01 +02:00
Meta Vens
f178684391 Bind a grammar to a world at creation and refuse what it lacks
CreateWorld gains an optional GrammarBinding (schema id, revision, content
digest derived from the kind-sorted verbs, never caller-supplied). Genesis
installs it on the empty state, so resolve_patch checks the genesis patch and
every later AdmitPatch against it: an affordance kind the grammar lacks is
AffordanceKindNotInGrammar, a differing role signature (name, referent kind,
order) is AffordanceRolesDisagreeWithGrammar, and the kernel speak entry is
held to the same check. WorldSnapshot reports the grammar's identity and each
AffordanceSnapshot derives its render path from it. Worlds with no grammar
are unchanged: the field is absent from state and command bytes, pinned by a
journal written at base 367e2eb.

Builds: not verified on Yggdrasil yet at this commit (cargo check clean locally).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 06:43:49 +02:00
Meta Vens
367e2eb50f Vault root: read through an environment lookup, pinned by a test; fix stale seed comment; README says restart
seed_vault_root_from becomes seed_vault_root_from_environment(lookup): the
only place naming GHOSTLIGHT_SEED_VAULT_ROOT. Open passes std::env::var_os.
A test pins that the root comes from that variable only. The comment at the
bridge test's no-world.seed assertion names AppState.seed_vault_root.
README notes the root is read once at startup. Builds: all.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:15:46 +02:00
Meta Vens
9f2904ffb8 Bridge fixture: re-captured from the real pinned lowering
Captured by running the drift test's own create/approve/activate/play walk
with a temporary, uncommitted patch that writes the regenerated intents
instead of comparing them (vendor/eve at 672c0c1). Only idempotencyKey and
issuedAt differ from the previous file; the drift test normalizes both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:00:03 +02:00
Meta Vens
ea8538761b Bridge test: run the first process on a blocking thread so the test runtime keeps serving
Joining the thread from the test body starved the world mailbox's owner task
and hung the test; spawn_blocking leaves the runtime free. Ignored test,
verified on Starfire.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:58:10 +02:00
Meta Vens
4f92840fe7 Bridge test: the first process is a runtime dropped after the turn opens
A second PlayTable over the same store cannot open while the first is alive
(the store takes an exclusive lock), so the first leg now runs on its own
runtime and dies with it, as a crashed process would. Does not run on the
stopgap (ignored test); verified on Starfire.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:46:43 +02:00
Meta Vens
8ca2c5556c Bridge test: take the world handle before the table closure so the fixture can move
The previous commit does not compile (E0505 in the ignored bridge test's
closure); this one fixes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:38:31 +02:00
Meta Vens
82a0c1b4f0 Play surface fixes: vault root lives in state, cleared optional labels mean none, bridge test drives typed and untouched Play
- AppState carries the seed vault root, read once at open through
  seed_vault_root_from (blank or whitespace is no configuration); tests no
  longer set or remove the environment variable.
- world.create treats a cleared persona or agent label as none, at the one
  place the payload becomes the kernel's intent.
- The real-client bridge test types text to open a turn, restarts over the
  same store, and continues the Running turn with an untouched Play box.

Builds. Bridge tests are ignored and run separately on Starfire.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:35:23 +02:00
Meta Vens
5b6796d1e6 Seed offer test: an empty vault root is no configuration
Builds when the verify job is green.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:04:18 +02:00
Meta Vens
0c0e1c73db Untouched-form walk: an empty Play opening is the table's refusal, not a route payload error
The previous commit's walk expected acceptance; with no running turn the table refuses an empty opening, which is the proof the payload arrived. Builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:04:05 +02:00
Meta Vens
c47a0785c9 Play surface: an untouched Play box submits an empty continue; seeding is offered only where a vault is configured (PA.f214, PA.f213)
world.play.text carries an authored value "" so the lowering sends text "" for a box left untouched. seed_vault_root() is the one reader of GHOSTLIGHT_SEED_VAULT_ROOT; the surface offers the seed controls, card and descriptor only when it answers, and seed_once reads its root through it. The committed bridge fixture drops its world.seed step, which the real client can no longer produce on an unconfigured server.

Not yet compiled when committed; verification follows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:02:25 +02:00
Meta Vens
d79a96ede4 Merge remote-tracking branch 'origin/main' into ghostlight-verse/play-faults 2026-10-10 00:53:47 +02:00
Meta Vens
82a500eedb play-faults fix: every faulted-turn test pins the class on the warn line
The shared faulted-turn assertion now takes the expected class and checks the
warn line carries it (Connect, Timeout, BadReply, Status(404), Status(502)),
with the endpoint and reply canaries still absent. Not yet built or tested at
this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:35:24 +02:00
Meta Vens
b64b61c345 play-faults fix: the warn line carries the fault's typed class, HTTP status included
close_with_fault now takes a TurnFault (detail plus InferenceFaultClass) and
logs the class beside the fixed detail, so a 404 and a 502 read differently
again. absorb_or_close hands the fault's class through; every non-inference
caller is Unclassified. The &'static str comment now says what it does and
does not guarantee (Box::leak defeats it; the per-port canary tests are the
backstop). Not yet built or tested at this commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:34:59 +02:00
Meta Vens
189d1d3c2b play-faults fix: the sidecar link errors carry no text
SidecarLinkError::Spawn and Codec held error text that the fault type now
refuses, leaving two never-read payloads; they are unit variants.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 23:40:12 +02:00
Meta Vens
97e39f48fd play-faults fix: bound the stalled-body test so a client that ignores its timeout fails it
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 23:36:51 +02:00
Meta Vens
3ee4ab8e88 play-faults fix: repair the malformed-reply test literal; the unroutable-model test no longer expects the model name in the fault
The previous commit (29efabe) does not build: a string literal in the new
malformed-reply test was mis-escaped.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 23:30:12 +02:00
Meta Vens
29efabe4d8 play-faults fix: a fault's detail is fixed text by type; one timeout owner; pin the malformed-body and default-timeout legs
InferenceFault.detail is a &'static str, so no inference port (local,
connector, SDK) can put an endpoint, request or reply text into a fault. The
connector and SDK details that were built from error text are now fixed per
kind or reason. LocalBinding loses its public response_timeout field; the
short timeout the PlayTable canary needs comes from open_local_port_with_timeout,
which exists only under the ghostlight test-support feature (a dungeon
dev-dependency feature), so a release has one timeout, RESPONSE_TIMEOUT.
Canary tests on the malformed-body path (port and PlayTable), on the SDK and
connector ports, and on the default timeout at both resolving sites.

Not yet built or tested at this commit.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 23:26:21 +02:00
Meta Vens
5a876bf615 play-faults fix: read the body as bytes so a cut body is a transport failure
reqwest's json() reports a body cut mid-stream as a decode error, so the
is_decode branch in send_fault misclassed it BadReply. The body is now read
with bytes() through send_fault (timeout / connect / no complete reply), and
only a whole body that fails serde_json is classed by bad_reply().

Not yet built at this commit; verified by the following job.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:35:13 +02:00
Meta Vens
6db5d0873e play-faults fix: one send classifier, timeout canary, composed retry test, honest comments
- send_fault now classifies the reply-body read too: a body-read timeout is
  Timeout, a body cut mid-stream is NoResponse (retryable), a whole body that
  does not decode stays BadReply. The response.json() map_err is gone.
- LocalBinding.response_timeout (None = RESPONSE_TIMEOUT) lets a test reach the
  timeout path through the full PlayTable path.
- Tests: stalled, cut and malformed bodies against loopback listeners; a
  timeout canary at the port and through PlayTable (stored fault, warn line,
  card row, Debug); a PlayTable turn that survives N empty replies and faults
  past ROUND_RETRY_BUDGET.
- Comments: CREATE_BINDINGS doc reattached, backoff comments state the curve,
  close_with_fault no longer claims "endpoint-free by construction".

Not yet built or tested at this commit; verified by the following job.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:31:35 +02:00
Meta Vens
1e6da32ad3 Merge origin/main into ghostlight-verse/session-refresh 2026-10-09 21:41:25 +02:00
Meta Vens
f0adcc61c5 play-faults test: read the fault-closed turn's id off the view
The table mints the turn id, so the log assertion must read it from the stored turn, not the id the caller passed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:41:38 +02:00
Meta Vens
e1c2632f03 play-faults: classify send failures, show the fault on the card, log it, lengthen the retry window
R3: every local send that fails before a status arrives is Retryable except a timeout; the fault carries a typed InferenceFaultClass (Connect, NoResponse, Timeout, Status, BadReply) and a detail without the request URL.
R1: PlayTurnView.fault and a fixed world.play.fault card row.
R2: close_with_fault logs the turn id and the (endpoint-free) detail at warn.
R4: backoff cap 20 s, shift clamp 8: the retry budget now spans about 105 s.

Not yet built or run when committed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:31:55 +02:00
Meta Vens
aa18e28925 docs: FactStanding, Eve logout and inference transports match their types
ontology:103 lists all three FactStanding variants (patch.rs:298); the Eve
table gains app.auth.logout (eve.rs operation_schema, 9 ids); mvp:466 names
the three RoutedInferencePort routes (sdk_inference.rs:700).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:18:05 +02:00
Meta Vens
26f533e8f4 Refresh tests pin the production edges: key-fetch typing, cache wiring, algorithm gate, cadence
VerificationUnavailable now carries an error class and never the fetch error,
whose text named the key-set URL. fetch_jwks returns the reqwest error so the
class is read from it, not from a string. run_refresh_loop loses its period
parameter: SESSION_REFRESH_PERIOD is decided in one place and a paused-clock
test observes it exactly and over twelve ticks.

Tests drive HeimdallClient::verify_access against a loopback issuer that
counts fetches (cache stored, read, ttl 299 s fresh and 301 s stale), a closed
port and a 503 (kept session and receipt, no URL in the error or the log line),
and nine wrong-algorithm tokens. The moved-session test also pins that the
newer claim is the one spent next.

Builds and passes under ygg-verify (28 of 28 in heimdall:: and refresh_loop_tests).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:13:25 +02:00
Meta Vens
5cb2ecbb31 ontology, consumer API, smoke note: enumerated sets match their Rust types
ComponentOp has 34 variants (table rewritten), Precondition 9, ActionMismatch
26, FactStanding 3, EdgeKind 1; CausalBoundary field shapes, PatchAnswer,
and the live state/commit/controller-work schema generations follow the
code. The consumer page lists the ops a confined consumer is refused. The
smoke note points at the Idunn acceptance step instead of the historical
play-agent page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:11:29 +02:00
Meta Vens
64071de685 mvp: enumerated sets name the Rust type that decides them
CommandBody has seven variants, WorldPhase two, EdgeKind one, WorldState
a fixed field set; the page now lists those and marks membership, contract,
archive and general relations as unbuilt. Persistence rows and WorldCommit
fields match journal.rs and lib.rs. The play-agent gate citation points at
the Idunn recipe's acceptance step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:09:50 +02:00
Meta Vens
d3f8975d3d Current-labelled pages cite only live files and state unbuilt features as unbuilt
ontology: drop the two citations of deleted pre-rebuild pages; Session Zero is
named as an unbuilt consumer. mvp: bounded co-op and the archived phase are
marked design intent, since crates/ has neither.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:02:09 +02:00
Meta Vens
424a20e64b README labels linked design pages honestly; drop dangling system-map citation
The README no longer calls unbuilt or historical pages current design records:
play-agent is historical, session-zero is unbuilt, public-architecture and
articles are unbuilt design and essays, extraction and stock-lenses are closed
records. The authority architecture page loses its citation of a deleted file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:58:09 +02:00
Meta Vens
9de9e53a5f Docs describe the machine on main: README, AGENTS, handoff pointer, live architecture pages
README and AGENTS.md state what exists (sealed kernel, Dungeon, persona
projection, sidecar, browser host) and what does not (the verse, storylets,
cast, episodes). The handoff becomes a pointer to the Eureka mind. The Eve
interface page matches eve.rs (world.create v4, Draft/Active cards, play
card). Live pages cite crates/ghostlight/src/<file> instead of world/*.rs.
The implementation plan gains a historical status line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:50:28 +02:00
Meta Vens
57b16df286 Refresh tests: pin the refresh owner's endurance and the signing-algorithm check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:32:28 +02:00
Meta Vens
72a98d8468 Refresh: keep a receipt whose keys were unavailable, and pin the loop and the branch rules
The refresh pass keeps a spent-upstream receipt when verification could not
fetch the signing keys and verifies it on the next pass instead of refreshing
again; only a positive verification failure revokes. The loop body is
run_refresh_loop, tested for calling the pass; tests pin that a moved session
is not revoked and a higher revision is applied.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:21:23 +02:00
Meta Vens
2b6e8c7826 Heimdall: type the unavailable-keys failure and cache the signing keys for a bounded time
A JWKS fetch failure is now VerificationUnavailable, distinct from a receipt that
positively fails verification. The fetched key set is cached for five minutes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:21:18 +02:00
Meta Vens
447471825b Drop the dead npm scripts and ignore lines of the parked tree
Removes state:*, prestate:*, *:validate, schema:validate, images:count and
coverage:status (they called the deleted Python tools); keeps dungeon:* and
sdk:*. Description now names the Rust kernel and Dungeon. Drops .gitignore
lines for __pycache__, *.pyc, .venv, state scratch and experiments/images.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:45 +02:00
Meta Vens
86977e51f7 Cut six pre-rebuild notes pages
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:13 +02:00
Meta Vens
1f85d1c4d7 Cut 27 pre-rebuild architecture pages and the Aetheria brainstorm
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:13 +02:00
Meta Vens
ea91b33946 Cut the Python store's state/
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:02 +02:00
Meta Vens
a7ed853fcd Cut newspaper output and woodcut assets
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:01 +02:00
Meta Vens
90ec569d53 Cut acceptance, prompts and scripts of the pre-rebuild tree
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:01 +02:00
Meta Vens
62dcc6c5b3 Cut experiments
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:01 +02:00
Meta Vens
058c070a42 Cut pre-rebuild example fixtures
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:01 +02:00
Meta Vens
26623d6d2f Cut the pre-rebuild JSON schemas
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:00 +02:00
Meta Vens
ece28506e6 Cut the Python state store, validators and newspaper typesetter (tools/ except the Eve bridge)
Parked at tag parked/ghostlight-pre-rebuild (ruling ghostlight-verse:ruling:park-pre-rebuild-tree).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:05:00 +02:00
Meta Vens
1b31bfc399 Refresh tests: pin the denied-status split and the session and account custody checks
Mutation survivors of the first cut: the status comparison inside invoke (now
refuse_denied, tested directly) and the session-or-account custody check
(a receipt for another session, or another account, revokes).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:49:22 +02:00
Meta Vens
af7e544830 Refresh: apply an equal-revision receipt, key each refresh by its claim, revoke what cannot succeed
Heimdall's access_revision is a revocation epoch, so a refresh receipt at the
session's revision is the normal case (ruling refresh-revision-is-revocation-epoch).
The loop pass moves behind a SessionRefresher port; a typed HeimdallDenied
revokes the session, a backwards receipt revokes it, every local refusal
names its clause, and the idempotency key derives from the claim being spent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:37:52 +02:00
Meta Vens
c4bc865573 Map: name the clause that refuses an executed Heimdall refresh
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:32:55 +02:00
Meta Vens
46df4070a8 Map: Ghostlight verse phase 1, body facts and model page parked/ghostlight-pre-rebuild
Why the 2026-09-30 deploy died (Odin's route), what main's build and
tests say, the play-session findings against main, the live refresh
loop, the host's retired v1 body, and where phase 2's verb sets plug in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:22:47 +02:00
Meta Vens
1e5761d9e0 Target: every event the kernel admits has exactly one render path
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:19:26 +02:00
Meta Vens
4441381987 Target: Ghostlight verse campaign (honest and running, factions and cast, the verse loaded)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:02:54 +02:00
Meta Vens
4fee97f089 Map and handoff: Ghostlight deploys from main
Operator ruling 2026-09-30: "Nope, I'd rather be on main". main was
fast-forwarded to the codex/ghostlight-dungeon-mvp tip (eeb3a68) and the
Yggdrasil ghostlight binding now admits refs/heads/main (gamecult-ops
45eb584). Historical cut records keep the branch they landed on.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 12:33:54 +02:00