diff --git a/.gitea/workflows/codegen.yml b/.gitea/workflows/codegen.yml
index a44f64c..babf79a 100644
--- a/.gitea/workflows/codegen.yml
+++ b/.gitea/workflows/codegen.yml
@@ -19,6 +19,11 @@ on:
- "tools/check_milestone_09_issue_61.py"
- "tools/check_milestone_09_issue_62.py"
- "tools/check_milestone_09_issue_63.py"
+ - "tools/check_milestone_09_issue_64.py"
+ - "tools/check_milestone_09_issue_65.py"
+ - "tools/check_milestone_09_issue_66.py"
+ - "tools/check_milestone_09.py"
+ - "tools/test_milestone_09.py"
- "crates/libremetaverse/src/agent_movement.rs"
- "crates/libremetaverse/src/inventory.rs"
- "crates/libremetaverse/src/inventory_manager.rs"
@@ -61,6 +66,11 @@ on:
- "tools/check_milestone_09_issue_61.py"
- "tools/check_milestone_09_issue_62.py"
- "tools/check_milestone_09_issue_63.py"
+ - "tools/check_milestone_09_issue_64.py"
+ - "tools/check_milestone_09_issue_65.py"
+ - "tools/check_milestone_09_issue_66.py"
+ - "tools/check_milestone_09.py"
+ - "tools/test_milestone_09.py"
- "crates/libremetaverse/src/agent_movement.rs"
- "crates/libremetaverse/src/inventory.rs"
- "crates/libremetaverse/src/inventory_manager.rs"
@@ -119,7 +129,10 @@ jobs:
python3 tools/check_milestone_09_issue_61.py
python3 tools/check_milestone_09_issue_62.py
python3 tools/check_milestone_09_issue_63.py
+ python3 tools/check_milestone_09_issue_64.py
+ python3 tools/check_milestone_09_issue_65.py
python3 tools/check_milestone_09_issue_66.py
+ python3 tools/check_milestone_09.py
cargo check --manifest-path tests/api-compile/Cargo.toml --locked
- name: Test generated wire codecs and translated parity cases
run: |
diff --git a/.gitea/workflows/rust-workspace.yml b/.gitea/workflows/rust-workspace.yml
index 410fc69..151399f 100644
--- a/.gitea/workflows/rust-workspace.yml
+++ b/.gitea/workflows/rust-workspace.yml
@@ -5,6 +5,8 @@ on:
paths:
- ".gitea/workflows/rust-workspace.yml"
- "tools/install_openjpeg_2_5_4.sh"
+ - "tools/check_milestone_09.py"
+ - "tools/test_milestone_09.py"
- "**/*.rs"
- "**/Cargo.toml"
- "Cargo.lock"
@@ -12,6 +14,8 @@ on:
paths:
- ".gitea/workflows/rust-workspace.yml"
- "tools/install_openjpeg_2_5_4.sh"
+ - "tools/check_milestone_09.py"
+ - "tools/test_milestone_09.py"
- "**/*.rs"
- "**/Cargo.toml"
- "Cargo.lock"
@@ -43,5 +47,11 @@ jobs:
python3 tools/check_milestone_09_issue_61.py
python3 tools/check_milestone_09_issue_62.py
python3 tools/check_milestone_09_issue_63.py
+ python3 tools/check_milestone_09_issue_64.py
+ python3 tools/check_milestone_09_issue_65.py
+ python3 tools/check_milestone_09_issue_66.py
+ python3 tools/check_milestone_09.py
+ - name: Test the complete native world milestone
+ run: python3 tools/test_milestone_09.py
- name: Compile every workspace target with bounded memory
run: cargo check --workspace --all-targets --locked -j 1
diff --git a/README.md b/README.md
index cde26e5..d3e219f 100644
--- a/README.md
+++ b/README.md
@@ -388,6 +388,15 @@ one atomic store transaction; cancellation and malformed responses cannot
partially mutate the cache. Focused compatibility and injected-HTTP tests cover
link correction, endpoint recording, error isolation, and metadata updates.
+The milestone closes with one deterministic cross-manager fake-grid scenario
+and a reproducible owned-test runner. The scenario covers authenticated agent
+state, movement and handoff, shared inventory/AIS state, assets and appearance,
+avatar/animesh and object entry points, land and discovery caches, social,
+estate, experience and marketplace construction, ordered events, redacted
+diagnostics, clean logout, and root cancellation. The complete audit and test
+boundary is documented in
+[`docs/world-milestone-gate.md`](docs/world-milestone-gate.md).
+
Native appearance state now tracks layered wearables and attachment points,
sends the inventory-backed wearable and attachment LLUDP messages, and exposes
worn queries by slot, item, and point. The client-owned Current Outfit Folder
diff --git a/api/SHIM-COVERAGE.md b/api/SHIM-COVERAGE.md
index 7c24ffc..f3bb01e 100644
--- a/api/SHIM-COVERAGE.md
+++ b/api/SHIM-COVERAGE.md
@@ -4,7 +4,7 @@ Generated by `python3 tools/generate_api_shims.py`; do not edit by hand.
| Assembly | Types | Members | Status |
|---|---:|---:|---|
-| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 401 types / 17,023 members; remaining surface is callable failure-only shims |
+| `LibreMetaverse` | 2,711 | 27,281 | native implementation: 401 types / 17,025 members; remaining surface is callable failure-only shims |
| `LibreMetaverse.Imaging.Abstractions` | 3 | 20 | native implementation: 3 types / 20 members; no generated shims remain |
| `LibreMetaverse.Imaging.Skia` | 1 | 3 | native implementation: 1 type / 3 members; no generated shims remain |
| `LibreMetaverse.LslTools` | 164 | 768 | callable failure-only shim |
diff --git a/crates/libremetaverse/src/client_core.rs b/crates/libremetaverse/src/client_core.rs
index 8edd2d4..f5dac17 100644
--- a/crates/libremetaverse/src/client_core.rs
+++ b/crates/libremetaverse/src/client_core.rs
@@ -129,6 +129,7 @@ struct ClientRuntime {
interest_list_manager: Mutex