Skip to main content

Resident gym

The resident gym is a controlled place for testing participants against real WorldWeaver rules. It is not a second, simpler game engine. Movement, local speech, session entry, and speech delivery call the same services used by a running shard.

Run the first episode from the repository root:

python dev.py gym

Run the delayed-correspondence episode:

python dev.py gym --episode waiting-letter

Run the first mixed-time episode:

python dev.py gym --episode quiet-interval

Run the separate-process scheduled-return rehearsal:

python dev.py gym --episode resident-return

Run the first compressed multi-activation resident week:

python dev.py gym --episode willow-week

Fork one stopped model resident and synthetic world into a matched pair:

python dev.py gym --episode willow-fork --transport-mode loopback

Run the constructive material-life conformance episode:

python dev.py gym --episode material-day --transport-mode loopback
python dev.py gym --container --episode material-day --transport-mode loopback

Overlap two independently hosted model residents in one synthetic shard:

python dev.py gym --episode resident-duet --transport-mode loopback

Crash and recover one resident across a disposable federation directory and two city nodes:

python dev.py gym --episode federated-journey --transport-mode loopback
python dev.py gym --container --episode federated-journey

Run one real model-backed activation inside the isolated gym:

export WW_INFERENCE_KEY=... WW_INFERENCE_MODEL=google/gemini-3.5-flash
python dev.py gym --episode resident-model

Repeat that path inside a freshly built disposable image, with the resident still crossing a real loopback HTTP socket:

python dev.py gym --container --episode resident-model

The image contains the production engine and agent packages. Local .env files, resident homes, databases, and prior reports are excluded from its build context. Selected inference settings enter only as runtime environment variables, and only the finished report directory is mounted back to the host.

Run independent copies concurrently and produce one structural aggregate:

python dev.py gym-batch --runs-per-model 20 --concurrency 4
python dev.py gym-batch --container --runs-per-model 20 --concurrency 4

Add --episode willow-week to batch the compressed week, and repeat --model MODEL_ID to compare model families. Every member gets its own process, temporary resident home, synthetic database, controlled clock, and ordinary episode report. The aggregate records only model ID, model-attempt, inference-failure, and token counts, choice kind, attachment and final location, retirement and HTTP counts, off-clock rows, duration, infrastructure, transport, and report filename. HTTP non-successes are split into expected 4xx refusals and 5xx server errors. Failed members contribute only run ID, model ID, duration, return code, and bounded failure and exception classes from a runner-authored envelope. Prompts, completions, exception messages, read queries and results, private activity prose, stderr, and resident artifacts are not copied into the aggregate.

The model episode creates a disposable synthetic hearth under a temporary directory and exports portable checkpoints before and after activation. It does not admit, clone, or wake a resident in Alderbank or any other live town.

The Commons Worktable

The Commons Worktable publishes the production constructive-game declaration on a disposable shard and lets one normally hosted resident discover its actual capability registry. Mara electively reads the objects, making, exchanges, access, and stoops sources, then uses the ordinary reference-core effectors and signed WorldWeaverClient routes. Ivo is a transparent scripted counterpart; simultaneous model-backed participation is exercised separately by Two Voices at the Worktable.

The deterministic conformance path makes a clay cup and wooden token, gives the cup, offers and completes one exact object swap, voluntarily leaves the received token on a bounded stoop, and lets the other actor take it. It also requests entry to a requestable studio, records the controller's denial, and attempts the ordinary movement route. That route returns a signed 403 space_access_required and leaves the resident at the worktable. These changes exist only through canonical objects, custody fields, revisions, events, and ten unique consequence, exchange, access, and stoop receipts; scenario prose cannot mutate them.

The city object handoff and the private hearth gift are deliberately different. Giving changes shard-local custody through the atomic object route. A hearth gift is a resident-owned file plus private delivery notice. After the signed city retirement, a zero-model-call restart proves that the five city material sources are gone and the explicitly granted gifts source is present on the real LocalWorld attachment. The scenario does not claim that a city object crossed the hearth boundary.

The episode's structural audit requires exactly one completed exchange, one denied request, one taken stoop entry, one access refusal, no duplicate receipt, and exactly one attachment per durable object. Its chronology audit also covers object creation/update, material pools, exchanges, access requests, stoop entries, every receipt, world events, sessions, and retirement. A repeated command at one controlled instant exposed and closed a production SQLAlchemy onupdate fallback that had substituted wall time for an explicitly injected object timestamp.

Two Voices at the Worktable

resident-duet gives Mara and Ivo separate synthetic hearths, host-sealed keys, resident identities, runtime certificates, process checkpoints, child processes, and ephemeral loopback servers. Both are normal reference_resident_model participants in the same exact place and synthetic database; neither is a scripted world-side counterpart. The coordinator prepares each due activation on its own database session, then the two resident hosts rendezvous after both processes have started. Production FastAPI requests continue to use one request-scoped session each, and the structural recorder never reaches into the coordinator session from a server thread.

The first simultaneous wave makes one ordinary signed speech action per resident. After one controlled minute, the second simultaneous wave lets both residents receive the two persisted exact-place messages and electively read the normal measure source. The proof requires both host-start records to precede either host-finish record in each wave, exactly two city sessions and two speech rows, one suspended city checkpoint per resident, and no off-clock persistent row. This is a deterministic concurrency conformance test, not evidence about how two external models converse. Federated travel is exercised separately by The Coast Starlight.

The Coast Starlight

federated-journey starts three independently configured production engine processes on loopback: a federation directory, a San Francisco source shard, and a Portland destination shard. Each has its own file-backed SQLite database; each city has its own node signing key and public directory registration. Mara begins through her normal resident host at San Francisco's real city-pack departure hub and chooses one explicit trip using the ordinary travel source and typed move effector.

The source calls the signed federation start and departure routes, commits its local traveling handoff, persists one departure event, and retires Mara's source session. The gym then kills the resident child at the first durable traveling-attachment checkpoint, before the destination server exists. A fresh child restores the private ledger, reissues destination-audience resident proof from the same host-sealed identity, calls the signed Portland arrival route, and suspends at one new city attachment in Pearl District. Recovery performs zero model calls; the whole journey performs exactly one.

The acceptance record requires one source handoff at traveling, one destination handoff and one directory traveler at arrived, zero source sessions, exactly one destination session, one departure event, one arrival event, and matching active directory projections at Portland. A content-safe audit separately proves resident signatures on both city routes and node signatures on directory start, depart, and arrive, with no 5xx response. Federation timestamps and signature expiry remain real operational time; the scenario narrative and resident decision use controlled time.

Willow Week

Willow Week keeps one disposable model-backed resident and one scripted neighbor in the same synthetic city for up to six legitimate host intervals over seven controlled days. Each interval reopens the same stopped home through the normal Resident host and carries the exact private process checkpoint forward. The week combines exact-place speech, two private letters, city movement, one exact private scheduled return, an elective recall, one deliberately out-of-place utterance followed by a co-located utterance, multi-day quiet jumps, a signed city retirement, and a zero-model-call restart at the real LocalWorld attachment.

The deterministic conformance policy makes seven model calls and chooses move, speak, wait, wait, recall then move, and finally travel home. That policy is a transparent fixture, not a desired personality. A live model may choose differently, including returning home early; the scenario preserves that attachment and records later city-only offers as skipped instead of reattaching the resident or forcing the authored sequence. After every bounded interval, the resident publishes only its current content-free return descriptor. The engine keeps an identical appointment, replaces a changed one, or cancels a withdrawn one. It never offers a stale appointment merely because that event existed at the start of the week.

All six deterministic activations cross the same signed loopback HTTP and production service boundaries as the model appointment. Correspondence send and acknowledgement times now join the persistent controlled-time audit. The completed conformance run proves two sent and acknowledged letters, seven elapsed virtual days, one public retirement receipt, no remaining city presence, one suspended hearth process, and no off-clock persistent row.

One real google/gemini-3.5-flash Willow Week completed inside the disposable image on July 21, 2026. Its first interval chose finish and withdrew the initial private return; the engine cancelled that exact queued appointment before its deadline. The resident later moved to Footbridge and validly finished the week with one suspended city attachment rather than being forced home. Two inference attempts failed before returning a consumable decision and were handled as inference_failed; subsequent intervals still ran. The structural observer now closes every model attempt with either resident_inference_finished or content-free resident_inference_failed, and aggregate reports count attempts and failures separately.

Counterfactual fork

The Forked Invitation stops immediately before the model resident's due private return. It seals the complete synthetic engine state and refers to one portable private hearth artifact, then restores both twice into independent file-backed databases and independent resident homes. The invitation branch receives exactly one additional exact-place public utterance through the production speech service; the quiet branch does not. Both branches then run the same model ID through the normal Resident, signed WorldWeaverClient, real loopback FastAPI server, controlled clock, scheduled-return receipt, and clean suspension path.

The structural result names the one source checkpoint and private artifact, preserves the identical pre-fork record prefix in both branches, and reports choices, attachments, locations, calls, failures, HTTP counts, and off-clock rows without model completions. It also records only the number of bounded exact-place speech records returned to the resident client. The deterministic conformance policy made two calls in each branch, moved to Footbridge in both, and observed two speech records per call in the invitation branch versus one in the quiet branch, with 12 HTTP requests and zero off-clock rows per branch.

Portable hearth packages intentionally omit city-local attachment files, host activation, and the host-sealed resident signing key. Counterfactual execution does not weaken that contract. A narrowly named agent-side synthetic-fork restore verifies the same public identity and process binding, then installs those three pieces from the still-present disposable source home into each disposable branch. This is authorized only for synthetic gym fixtures; it is not a portable resident export and cannot be used to clone a live resident.

File-backed WAL databases also need a truly portable checkpoint. Capture now backs the committed source into a temporary DELETE-journal snapshot before sealing it. Restore backs that validated snapshot into the target's still-file-attached connection, so later coordinator writes and request-scoped FastAPI sessions see the same branch. The conformance test verifies both cross-connection visibility and the exact speech-count difference. A single live-model pair is an apparatus proof, not causal evidence by itself; sampling effects require repeated matched pairs or a provider-supported deterministic seed.

The first external google/gemini-3.5-flash pair completed on July 21, 2026. Both branches restored the same 16-record checkpoint and private artifact and retained one city attachment at Willow Court with no refusal, server error, or off-clock row. The invitation branch exposed two speech records, made two attempts with one content-free inference failure, and ended with no consumable choice. The quiet branch exposed one speech record on each of two successful calls and chose finish. This confirms that the external model can traverse both branches and receive the controlled difference; it does not establish that the utterance caused the different outcome.

Each command prints a compact timeline and writes a self-contained visual report under .runs/gym/ (footbridge-hello.html, waiting-letter.html, long-afternoon.html, kept-appointment.html, model-appointment.html, willow-week.html, commons-worktable.html, or resident-duet.html). The reports contain only synthetic speech and facts returned by production services. Their icons and layout do not add a narrator's interpretation.

The terminal timeline streams by default: each line is printed and flushed when its production-boundary record arrives. It is not an animation replayed after the episode. The current scripted model finishes quickly; a model-backed resident will leave real wall-clock gaps visible around inference, waits, retries, and service calls. The stream may show public observations, choice kinds, action receipts, scheduling metadata, and model-call start/finish boundaries. It must not print private reasoning or private hearth prose.

Use --no-stream to print the older complete terminal report only after the run, or --json for the complete structural result:

python dev.py gym --episode quiet-interval --no-stream
python dev.py gym --episode quiet-interval --json

What the first episode proves

The Footbridge Hello uses a scripted participant and a small mechanical listener. They begin together in Willow Court. One speaks, the other receives the exact-place signal and replies. The listener then walks to the Footbridge and does not receive speech left behind in Willow Court. When the first participant follows and speaks at the Footbridge, delivery resumes.

This proves a narrow software path:

scenario choice
-> production session, movement, or speech service
-> canonical database/event write
-> production exact-place signal cursor
-> structural gym record
-> terminal and browser views

It does not prove that a model can converse well, remember a relationship, manage a long plan, or behave like a person. The mechanical listener is a transparent test fixture, not a resident model and not a desired personality.

HTTP conformance

An automated conformance test repeats the episode through FastAPI with two separately registered human actors. It proves that anonymous access is refused, supplies each actor's bearer token, and compares the resulting chat rows, world events, and final locations with the fast service-level episode. They match. This is an in-process HTTP proof, not a container or public-network test.

What the correspondence episode proves

The Waiting Letter sends private mail through the production correspondence service. Ivo's temporary session ends after Mara sends the letter, and Ivo returns under a new session with the same durable actor ID. The letter is offered twice without being consumed, then explicitly acknowledged, after which the pending mailbox is empty. The browser report shows this as a small animated post trail. The envelope animation is only a key for the recorded states.

The current reference resident loop follows the same rule: pending mail is included in a model activation and acknowledged only after a valid final decision. A failed inference leaves the message pending. Runtime evidence stores message IDs and counts, not the private message body. New mail can wake the resident when its chosen private-activity policy allows correspondence interruptions.

The correspondence API requires exact human or signed-resident proof and addresses durable actor IDs. The old name- and session-addressed DM routes now return 410 Gone rather than guess or accept an unauthenticated sender. This slice is local to one shard. Federated delivery, a public human correspondence interface, controlled-time correspondence and training data remain later work.

What the mixed-time episode proves

The Long Afternoon starts with ordinary exact-place speech. Mara then creates a real ephemeral sublocation, the willow bench, with a two-day lifetime. A controlled UTC clock jumps forward 47 hours and the production lifetime rule still reports the bench active. It jumps two more hours and the same rule reports the bench expired. The terminal and browser views show exact timestamps and mark those jumps with a sun-and-moon trail.

This is an explicit world-clock seam, not a global replacement for time. Live routes receive a SystemClock that reports real UTC, while tests and gym episodes may override the same FastAPI dependency with a controlled clock that cannot move backward. Security expiry, request nonces, process timing, and model latency remain on real or monotonic time. The episode does not patch datetime globally or sleep.

The clock now has a checkpointable scheduled-event queue. Events have stable IDs and deterministic ordering by deadline and insertion. Reading a due event does not consume it: the handler must explicitly acknowledge success. A stopped process therefore re-offers the same ID after restoring the JSON-safe checkpoint. This is an honest at-least-once contract, not an exactly-once claim; state-changing handlers must use the event ID as an idempotency key. The Long Afternoon now schedules both inspections through that queue.

The reference resident also exposes its next chosen private return as content-free scheduling data: stable event ID, private activity ID, and UTC deadline. That schedule survives a runtime restart because it is derived from the resident's private ledger, and it contains none of the private activity description. An automated test restarts the runtime, advances to the two-day deadline, and proves the return is consumed once.

The gym now has its first combined restart envelope. It binds the scenario and seed, controlled clock and pending events, participant identities and adapters, signal cursors, structural timeline, and a complete synthetic SQLite database under one integrity hash. A test stops The Long Afternoon before either scheduled inspection, passes the envelope through JSON, restores it into a fresh database, and gets exactly the same final result as an uninterrupted run. Damaged envelopes, substituted actor identities, and non-empty restore targets fail before replacement.

This is a narrow synthetic proof. The envelope records only an ID, digest, format, and size for externally held resident or model state; it does not copy private hearth prose into the engine checkpoint. A separate agent process verifies a portable hearth package's exact bytes, imports into staging, rebuilds the derived checkpoint from the append-only ledger, checks actor, hearth generation, attachment, session, adapter, and model, and only then installs the restored synthetic home. The engine never imports the agent package and neither its descriptor nor its restore report contains private activity prose.

The Kept Appointment connects that restored artifact to the engine queue. The live HTTP route and the gym use one factual scene builder, and the HTTP client and transport-free agent adapter use one scene parser. At the two-day deadline the separate agent process runs the real reference core with a fixture model that always chooses wait. The engine then simulates losing its acknowledgement and restarts. It offers the same stable event again; the resident returns already_processed with zero model calls, after which the queue acknowledges the event. Streamed records show scene counts and process boundaries, never the private activity or prompt.

This mechanical rehearsal proved restart, custody, scene delivery, and at-least-once handling. It does not measure judgment, conversation, planning, or personality.

Model-backed gym adapter

The Model Appointment replaces the rehearsal's fixture model with an OpenAI-compatible model client while keeping the resident and world synthetic. The engine and agent remain separate processes. Over a versioned stdio byte transport, the child runs the ordinary WorldWeaverClient. That client discovers the shard audience, signs its normal HTTP requests with a short-lived resident runtime certificate, and sends the exact method, encoded target, headers, and body across the process boundary. The parent validates the participant/session binding and dispatches those bytes through the actual FastAPI application with its database dependency pointed at the isolated gym database. There is no gym-maintained vocabulary of scene, speech, mail, or movement operations. The child never receives the database and cannot write authoritative state directly.

The child now starts the normal Resident host rather than constructing a core or CityWorld itself. The synthetic home has the ordinary active hearth-generation record and runtime lease, and the host resumes the already-authorized synthetic city session. It reads /api/shard/experience and /api/shard/city-pack/preview, then builds the same city information registry used by a normally hosted resident. This synthetic node publishes an ordinary commons with no optional game capabilities, so the resulting registry contains the resident-owned measure and recall sources plus the normal places and travel city sources. It does not invent objects, making, exchange, access, or stoop sources.

For an engine-scheduled appointment, Resident.run_scheduled_return owns one bounded host interval: exact event validation, reference-core construction, attachment handling, lifecycle records, and release of the exclusive hearth lease. A deterministic conformance test makes two model calls—one elective read and one request to return home—and proves that unsigned readiness discovery and signed profile, scene, and /api/session/leave requests crossed the production HTTP routes successfully. CityWorld recognizes the ordinary move choice as hearth travel, and the normal host refuses to construct LocalWorld until that signed route confirms public-session retirement. The live command uses the selected external model and records model ID, aggregate token counts, choice kind, and inference boundaries. It does not record prompts, completions, queries, source results, or private activity prose. The stopped process is then restarted from its hearth-bound checkpoint. It performs one controlled-time LocalWorld observation with zero additional model calls, proves that city sources were replaced by the hearth registry, and releases the same exclusive lease before the updated hearth is exported again.

The departure edge now has explicit crash coverage. Before sending /api/session/leave, the resident durably records one transition ID. The route commits session deletion and an actor-and-generation-bound retirement receipt in one transaction. A retry from the same signed generation with the same session and transition gets the original receipt; a different actor, generation, session, or transition is refused.

The isolated adapter injects four failures: before the request, before the retirement commit, after commit but before the response reaches the resident, and immediately after the resident checkpoints the hearth attachment but before constructing LocalWorld. Each case restarts the real resident process. The proof requires one retirement row, one hearth checkpoint, one LocalWorld observation, zero retry model calls, no live city session, and a suspended hearth-bound process. In the response-loss case, both successful HTTP deliveries carry the same stored receipt. Operational certificate and nonce checks continue to use real time.

The transport boundary now has its own fail-closed matrix. Tests stop the child without a result, send invalid JSON, send an unknown message type, replay one already-dispatched request ID, and return a malformed parent response. Every case refuses the episode, writes no report, and reaps the child. Request IDs are single-use for the lifetime of one adapter process.

The same scripted city-to-hearth transition also runs through an ephemeral Uvicorn server bound to 127.0.0.1. In that mode the ordinary WorldWeaverClient uses a real HTTP connection rather than carrying HTTP bytes over stdio. The isolated database, controlled clock, host-sealed identity, runtime certificate, resident host, core, and hearth remain unchanged. The structural record does not include the chosen port.

One external google/gemini-3-flash-preview activation was then run against that loopback episode on July 21, 2026. It made one call, chose the valid finish outcome, and remained in Willow Court. The runner preserved that result as one suspended city attachment with no retirement receipt instead of treating every city outcome as a failed hearth transition. Prompts, completions, and private source content were not recorded. This was a disposable synthetic resident, not a live-town run.

The earlier Tansy run in Alderbank was a bounded live-town smoke run caused by interpreting the next step too broadly. It is not resident-gym evidence, did not exercise this adapter, and must not be repeated as part of Major 142. No further live-town resident runs are needed before the isolated model path has its intended scenario and fault coverage.

Current fidelity claim

Every episode result now carries a machine-readable fidelity object. This prevents a service-level proof from being reported as a full temporary shard. For the current model episode it says exactly:

BoundaryCurrent model episode
Engine rulesActual FastAPI routes and production service functions
InfrastructureHost processes or a freshly built disposable combined image; the federation episode adds three independently configured loopback engine processes inside that boundary
World stateSynthetic SQLite database; the federation episode uses one isolated database per directory/source/destination node
Resident compositionNormal Resident host and its shared production reference core
Participant transportOrdinary WorldWeaverClient HTTP carried over generic stdio bytes, or a real ephemeral IPv4 loopback connection
Resident authorizationHost-sealed identity, signed runtime certificate, bound generation/session, and normal request verification
Information sourcesCity registry is built from the node-published identity and capabilities; it is replaced by the actual LocalWorld registry only after confirmed departure
World timeOne controlled instant governs ordinary single-shard scenarios; federation coordination, proof expiry, and process operation deliberately retain real time
HearthReports either the proven LocalWorld transition/restart or the model's retained suspended city attachment
Federationfederated-journey exercises signed discovery, source retirement, crash recovery, destination arrival, and directory projection updates

The model gym now enters through the same Resident owner as an ordinary host. Identity loading, hearth activation and exclusive custody, session resume, public city-profile discovery, source construction, process binding, core composition, and clean suspension are production host paths. The HTTP API and resident authorization path are production paths too. The generic stdio hop remains process transport rather than a second world API. The loopback mode serves the same app through a real local socket. An episode may enter the real LocalWorld after confirmed departure, remain suspended at its valid city attachment, or recover a pending city-to-city handoff against isolated federation nodes.

Real loopback requests use one request-scoped SQLAlchemy session each, while the scenario coordinator keeps a separate session over the same temporary file-backed SQLite database. The disposable database enables the same WAL and busy-timeout settings as a local production SQLite shard. This matters under concurrent batches: one session is not shared among the scenario thread, Uvicorn middleware, and FastAPI workers.

The model episode now builds its direct activation scene and its signed HTTP scene at the same controlled instant. Their content-safe place, route, presence, and trace counts must match; at the two-day deadline the expired willow bench is absent from both. The same dependency governs sublocation listing, creation, and movement, and an API acceptance test proves that an expired child place is simultaneously absent from scene and listing and cannot be entered.

Episode schema version 8 closed the engine and resident application-time gap exercised here. Session arrival, location chat, world events, derived fact validity, and projection updates now persist the same explicit world instant used by the route and scene. The model episode performs a structural chronology audit over those rows; it fails if a timestamp is missing, comes from wall time, or is not one of the episode's recorded controlled instants. The resident host passes that same injected instant to normal ticks and LocalWorld; grounding, whisper freshness, hearth scene events, private reads, and voice records no longer consult wall time in a controlled run.

Repeated writes at one controlled instant explicitly mark both session and world-projection timestamps as changed. They therefore cannot fall through SQLAlchemy's column onupdate default to real wall time merely because the assigned virtual timestamp equals the previous value. The gym session adds a pre-flush guard that turns any remaining implicit session timestamp into a failed episode before it can contaminate a result.

The same FastAPI dependency is threaded through correspondence, physical traces, doula polls, grounding, objects, making, exchanges, stoops, and access commands. Those capabilities still need their own behavioral gym scenarios, but they no longer require a separate clock architecture. Federation handoff chronology uses operational wall time and is explicitly labeled separately from the controlled scenario chronology. Authorization expiry, request nonces, rate limits, cache TTLs, process locks, model duration, and runtime metrics intentionally stay on real or monotonic operational time.

Episode schema version 9 added the loopback transport record and made city-versus-hearth fidelity conditional on the attachment the model actually checkpointed. Version 10 records whether the episode ran as host processes or inside the disposable combined image.

The container repeat uses the same synthetic database, controlled clock, normal resident host, separate agent child, host-sealed identity, runtime certificate, and real loopback FastAPI route. A deterministic acceptance run reaches LocalWorld through the ordinary retirement transition. A real google/gemini-3.5-flash run also completed inside the image on July 21, 2026: it made two model calls, selected an elective read and then continue, and retired its synthetic city session back to its disposable hearth. No live-town resident ran.

Batch execution and structural aggregation are now available on the host and in the disposable image. The runner bounds batches to 100 episodes per model and concurrency to 16, isolates every member in its own process and database, and writes aggregate.json, aggregate.html, and one ordinary report per successful member. A two-member container acceptance run completed with four model calls, two retirement receipts, 26 successful signed/public HTTP requests, and zero failed or off-clock rows.

The first 20-member Willow Week launch was retained as diagnostic evidence rather than reported as a successful cohort: 12 completed and eight failed. It exposed shared-session SQLite misuse and then the two same-instant timestamp fallbacks above. After those repairs, an eight-member host-process confirmation completed eight of eight runs with 77 model calls, 25 content-free inference failures, 405 HTTP requests, no off-clock rows, and one valid 422 client refusal from an elective places read. There were no 5xx server errors, and every resident retained exactly one suspended city attachment.

The clean 20-member disposable-container confirmation then completed all 20 runs with no process failures. It made 195 external-model calls across 20 isolated hearths and synthetic databases, spanning 1,080 real loopback HTTP requests and 176,986 tokens. Fifty-three inference attempts failed before producing a consumable decision; the later scheduled intervals still ran. The aggregate found zero off-clock rows, zero 5xx server errors, one valid 422 refusal, no failure classes, and exactly one suspended city attachment per resident. Final locations were Footbridge once, Market Hall 13 times, and Willow Court six times. No model chose to leave the synthetic city in this cohort, so the aggregate correctly contains no retirement receipt rather than forcing a hearth ending.

Counterfactual forks, constructive-game capabilities, concurrent model residents, and recoverable federation now have explicit scenarios. Multi-resident cross-shard overlap and independently containerized nodes remain later distributed-system extensions.

The database snapshot supports SQLite only and may restore only into an empty synthetic database. Its hash detects damage and internal mismatches; it is not a signature and does not make an envelope from an untrusted source safe. The plaintext local artifact proof also does not authorize cloning or waking an existing resident. A future portable checkpoint needs an authenticated issuer and must verify each external artifact's bytes against its recorded digest.

Scenario coverage plan

The gym has two different jobs. We track them separately so reliable plumbing is not mistaken for a capable resident.

Trustworthiness coverage

These scenarios should stay small, deterministic where possible, and easy to inspect. They test whether the apparatus tells the truth about what happened.

BoundaryCurrent proofRemaining proof
Production-rule parityFootbridge episode matches an authenticated in-process HTTP replay; model direct and signed-HTTP scenes agree at one controlled instant; the full transition also passes through a real loopback Uvicorn server inside host processes and a disposable combined image; two independent resident hosts overlap against request-scoped production routes on one shard; three independently configured node processes exercise federation routesSplit nodes into independently managed containers or hosts
Identity and authorizationModel resident uses its host-sealed identity and normal signed runtime certificate for protected scene and session-retirement routes; anonymous signal access is refused; correspondence uses durable actor IDsCover every gym action and other proof/failure types
Exact-place perceptionSpeech follows location and a durable cursor; two simultaneous resident hosts persist separate utterances and both receive the pair on their next controlled activationReconnect, cursor gaps, and concurrent arrival/movement ordering
Delayed workStable scheduled IDs, controlled UTC across exercised routes and persistent chronology, explicit acknowledgement, expired-place movement refusal, and idempotent private-return retryAdd other state-changing scenario handlers and prove failed-handler retry
Stop and resumeA separate reference core refuses a second model call after lost acknowledgement; the model adapter retries pending departure after restart with zero model calls, reaches LocalWorld once, and refreshes its artifactLive scheduled-return wiring and authenticated portable checkpoints
CorrespondenceMail survives a session change and remains pending until acknowledgementInterruption policy, cross-shard delivery, and failure recovery
Access and custodyThe material-day episode covers refusal, making, atomic giving, witnessed exchange, and bounded stoop leave/take through signed production routes and unique durable receiptsCross-process failure injection around material mutations
TravelSigned city retirement uses a stable transition and durable actor/generation receipt; the normal city-to-hearth transition survives request, commit, response, and post-checkpoint failures; a signed source-directory-destination trip survives child death after source retirement and reaches exactly one Portland attachment without another model callHearth-to-city return and simultaneous multi-resident cross-shard travel
Stale informationStructural version fence exists in the reference residentChange the world during a gym decision and prove safe reconsideration
Fault recoveryModel episodes inject failure before request, before commit, after committed response loss, after the hearth checkpoint, and after federated source retirement; malformed, replayed, and dead-child transports fail closed; both hearth and federation transitions repeat in a disposable imageBroader action faults and cross-container process loss

The command-line runner exposes these records as a live, flushed stream while retaining the final HTML and JSON reports. The separate-process return and model episodes emit content-safe observation and activation boundaries, making wall-clock stalls visible without printing prompts, completions, or private hearth prose.

Adding a trustworthiness scenario requires naming the production boundary, the expected invariant, the failure case, and the evidence that the gym did not use a shortcut.

Capability and training coverage

This later map asks what a resident can handle, not whether the harness restarts correctly. A few authored stories cannot cover it. Each family needs generated variations, repeated trials, more than one participant implementation, and held-out cities, names, wording, event order, and seeds.

FamilyWhat must varyWhat to measure without rewarding visibility
Attention and timingQuiet rooms, direct speech, crowded rooms, urgent and non-urgent eventsRelevant notice, chosen delay, interruption handling
ConversationPartners, group size, topic, pace, disagreement, silenceGrounding, turn relevance, uncertainty, no forced reply
Solitude and learningReading choices, inaccessible sources, long quiet periodsSource use, retention, revision, legitimate continued reading
Plans and projectsDuration, dependencies, setbacks, competing goalsResumption, revision, abandonment when warranted, later consequences
RelationshipsFamiliarity, trust, conflict, repair, exchangeIdentity continuity, consent, reciprocity, boundary handling
Material lifeMaking, possession, scarcity, gifts, stoops, lossCustody correctness, provenance, deliberate public sharing
Place and travelUnfamiliar layouts, access rules, hearths, cities, failuresRoute and permission grounding, recovery, no duplication
Knowledge limitsMissing, stale, conflicting, or misleading informationCalibrated uncertainty, checking, correction
Long-term changeWeeks or years of compressed events and uneventful timeContinuity without frozen personality or indiscriminate forgetting
Mind diversityDifferent model families, adapters, scripted automata, and culturesDistinct viable behavior without one engagement score

Training scenarios and held-out evaluation scenarios must be versioned separately. No family is complete because one resident produced an appealing transcript. Valid quiet, refusal, reading, waiting, and abandoned plans must remain possible outcomes.

Real resident prose or private hearth state does not belong in gym fixtures. Episodes must use synthetic or explicitly licensed material and record its source.