Protocol for several windows in one box, each its own stream, ref(d-0085). Design in `crates/nesprotocol/src/window.rs` module docs. - Video: window 0 is byte-identical to today (DGRAM_VIDEO / MSG_DATA). Other windows use DGRAM_VIDEO_WINDOW (4, 17-byte header with u16 window id after sent_us) and MSG_WINDOW_DATA (0x01, u16 window id after seq). - Lifecycle (hub -> client, new uni STREAM_WINDOWS = 8, length-prefixed frames): OPENED 0x20, TITLE 0x21, ICON 0x22 (RGBA), SIZE 0x23, CLOSED 0x24. - MSG_WINDOW_SUBSCRIBE 0x17 on the control stream; never sent means window 0. Old hubs log it as unknown and continue. - Box-internal input: INPUT_WINDOW_OUTPUT_SIZE (5) and INPUT_WINDOW_FOCUS (6) tag resize and input with a window; client INPUT_OUTPUT_SIZE unchanged. - Cursor unchanged: per subscription. nescope gains a no-op match arm for the two new DecodedInput variants. Tests: cargo test -p nesprotocol --all-features, 140 passed. cargo check --workspace (excluding nespyro/nescapture, slangc missing on the build box) clean.
crates/
Shared Rust: a library another crate in this repo depends on. A binary someone
runs goes in apps/; shared JS/TS goes in
packages/. The split is by what a thing is, not by what
language it is written in — same rule on both sides of the repo.
Empty today. Components move here one at a time as they are opened.
Two rules
Every version is pinned in the root Cargo.toml. A member writes
tokio.workspace = true and never a version, so two crates in this tree cannot
disagree about a dependency.
Nothing here may depend on anything closed, or name it. This repo is public. A crate that needs a private component is in the wrong repo, and a comment explaining who calls this wants a category noun — "the caller", "a supervising agent" — rather than a name. The requirement is the interesting part; who currently satisfies it is not.