# World milestone integration gate

Milestone 09 closes on native Rust behavior, not on catalog coverage alone. The
reproducible focused suite is `python3 tools/test_milestone_09.py`; its target
list contains the world-owned library tests, the complete fake-grid lifecycle,
and the translated compatibility targets for agent, inventory, assets,
appearance, avatars, objects, land, discovery, social, estate, experience, and
marketplace behavior. Live tests remain catalogued and reviewed but skip unless
their existing credentials and the explicit `RUN_LIVE_TESTS=1` opt-in are
supplied. The offline milestone runner always clears that opt-in.

## Cross-manager fake grid

The loopback scenario logs in through injected HTTP and UDP endpoints, waits
for seed capabilities and the event queue, then performs a simulator handoff.
While authenticated it constructs every client-owned world manager, verifies
agent/session identity, reconciles an inventory marker through the shared
store, checks AIS availability, creates an asset wrapper, observes appearance
and animesh state, requests an object, and inspects parcel, grid, friend, group,
and marketplace caches. A cancelled directory query proves that caller
cancellation wins before wire work. A marketplace capability error emitted
through a second `GridClient.Marketplace` lookup proves that the manager cache
and event registry are shared.

Manager events are asserted in deterministic order: event-queue readiness,
the marketplace error, then logout. Capability downloads are bounded by the
existing HTTP and download-manager policies. Diagnostic formatting is checked
against login and capability secrets.

## Cancellation and teardown

Logout cancels the event queue, disconnects every simulator, leaves no pending
logout task, and stops the download dispatcher. Client disposal then cancels
the root token and releases every cached manager, including assets,
appearance, avatars, animesh, land, discovery, social, estate, and marketplace
state. Inventory has an empty shared store before login so offline fixtures and
programs can stage deterministic data; a successful login atomically replaces
it with the authenticated hierarchy.

## Audit and program boundary

`python3 tools/check_milestone_09.py` rejects stubs in all milestone-owned
sources, missing native type/member mappings, unreviewed related parity cases,
missing fake-grid evidence, and drift in the nine catalogued Rust program
targets. The program ports remain a later milestone, but their required world
APIs and target inventory are now auditable. Live actions remain opt-in:
uploads, marketplace changes, estate/parcel mutations, currency spending, and
operations affecting other users are never part of this offline gate.
