feat(sidecar): forward the cliloc table, and stop reading refusals for meaning (Phase 2) #42

Merged
whitlocktech merged 1 commits from feat/asset-bridge-p2 into edge 2026-09-10 16:20:02 +00:00
Member

Phase 2 of the Asset Bridge (docs/link/v8.md §9), sidecar half. Pairs with servuo-plugins#29 and the module-uo / website / docs PRs.

GET /cliloc

The first protocol-8 family that carries content rather than a manifest. The shard decompresses its own client's table and cuts it into pages; this forwards them and keeps none of it — which matters more here than usual, since the payload is five megabytes of EA's strings out of the operator's own client, and the one copy that should exist is the one the website imports.

Paging is the caller's, deliberately. ?cursor= echoes the previous reply's cursor back until one says more: false. A sidecar that helpfully assembled the pages would be holding the whole table in memory to do it. ?lang= selects the file and defaults on the shard.

asset_error_status

Phase 1 chose 403 or 400 by testing whether the reason string contained the word "disabled" — so rewording an operator-facing sentence would silently turn a refusal into a bad request. The overlay now sends a code:

code status means
DISABLED 403 the operator switched the asset plane off
NOT_FOUND 404 the client does not carry that file — an operator fact, not a bug
UNREADABLE 422 it has the file and cannot decode it; repeating will not help
UNAVAILABLE 503 the shard cannot do this right now
BAD_REQUEST 400 the caller's mistake

The substring check survives, with a test, because an overlay and a sidecar are deployed separately: a phase-1 shard paired with a phase-2 sidecar still sends the codeless frame and must keep its 403.

No PROTOCOL_VERSION change — 8 already covers this family (v8.md §14).

Verified live

Against a real shard: 12 pages, 67,496 rows, every page inside the 512 KiB budget (max 524,086 of 524,288) and well under the 1 MiB line cap, the whole table in 1.4 s. Concurrent callers get 425 while one is served — the flow control working, not an error. cargo test (64), fmt and clippy -D warnings all clean.

AI disclosure

Written with Claude Code (Opus 5); commits carry the Co-Authored-By trailer.

🤖 Generated with Claude Code

https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4

Phase 2 of the **Asset Bridge** (`docs/link/v8.md` §9), sidecar half. Pairs with servuo-plugins#29 and the module-uo / website / docs PRs. ## `GET /cliloc` The first protocol-8 family that carries **content** rather than a manifest. The shard decompresses its own client's table and cuts it into pages; this forwards them and keeps none of it — which matters more here than usual, since the payload is five megabytes of EA's strings out of the operator's own client, and the one copy that should exist is the one the website imports. **Paging is the caller's, deliberately.** `?cursor=` echoes the previous reply's cursor back until one says `more: false`. A sidecar that helpfully assembled the pages would be holding the whole table in memory to do it. `?lang=` selects the file and defaults on the shard. ## `asset_error_status` Phase 1 chose 403 or 400 by testing whether the reason string contained the word "disabled" — so rewording an operator-facing sentence would silently turn a refusal into a bad request. The overlay now sends a `code`: | code | status | means | |---|---|---| | `DISABLED` | 403 | the operator switched the asset plane off | | `NOT_FOUND` | 404 | the client does not carry that file — an operator fact, not a bug | | `UNREADABLE` | 422 | it has the file and cannot decode it; repeating will not help | | `UNAVAILABLE` | 503 | the shard cannot do this right now | | `BAD_REQUEST` | 400 | the caller's mistake | The substring check **survives, with a test**, because an overlay and a sidecar are deployed separately: a phase-1 shard paired with a phase-2 sidecar still sends the codeless frame and must keep its 403. No `PROTOCOL_VERSION` change — 8 already covers this family (v8.md §14). ## Verified live Against a real shard: 12 pages, 67,496 rows, every page inside the 512 KiB budget (max **524,086** of 524,288) and well under the 1 MiB line cap, the whole table in **1.4 s**. Concurrent callers get 425 while one is served — the flow control working, not an error. `cargo test` (64), `fmt` and `clippy -D warnings` all clean. ## AI disclosure Written with Claude Code (Opus 5); commits carry the `Co-Authored-By` trailer. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
wtclaude added 1 commit 2026-09-10 16:15:05 +00:00
feat(sidecar): forward the cliloc table, and stop reading refusals for meaning (Phase 2)
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 3m2s
b92393d224
`GET /cliloc` — the first protocol-8 family that carries content rather than a
manifest. The shard decompresses its own client's table and cuts it into pages;
this forwards them and keeps none of it, which matters more here than usual: the
payload is five megabytes of EA's strings out of the operator's own client, and
the one copy that should exist is the one the website imports.

Paging is the caller's, deliberately. `?cursor=` echoes back the previous reply's
cursor until one says `more: false`; a sidecar that helpfully assembled the pages
would be holding the whole table in memory to do it. `?lang=` selects the file
and defaults on the shard.

`asset_error_status` replaces phase 1's substring test. That test chose 403 or
400 by looking for the word "disabled" in an operator-facing sentence, so
rewording the message would silently turn a refusal into a bad request. The
overlay now sends a `code`: DISABLED 403, NOT_FOUND 404 (a client without the
file — an operator fact, not a bug), UNREADABLE 422 (a file it has and cannot
decode, where repeating the request cannot help), UNAVAILABLE 503, BAD_REQUEST
400. The substring check survives as a fallback, with a test, because an overlay
and a sidecar are deployed separately and a phase-1 shard must keep its 403.

No `PROTOCOL_VERSION` change: 8 already covers this family (v8.md §14).

Verified against a live shard: 12 pages, 67,496 rows, every page inside the
512 KiB budget (max 524,086 of 524,288) and well under the 1 MiB line cap, the
whole table in 1.4 s. Concurrent callers get 425 while one is served, which is
the flow control working rather than an error.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016wDDVXWMDz82WqE1i969r4
whitlocktech merged commit 60e6de55f3 into edge 2026-09-10 16:20:02 +00:00
whitlocktech deleted branch feat/asset-bridge-p2 2026-09-10 16:20:03 +00:00
Sign in to join this conversation.
No description provided.