Wires the controller to the connection. Reports arrive on the bidi stream the client already holds, one a second; the worst of them across attached clients drives the decision, because one encoder serves them all and the client that cannot decode is the one that matters -- averaging its trouble away leaves it never recovering while the numbers look fine. Reports are *taken* rather than read, so a client that stops reporting stops looking healthy. A report describes the second that just passed, and acting on it again the next second is acting on evidence that has expired. The fallback path view comes from the selected path rather than the connection as a whole: a connection typically holds one route through a relay and one direct, and only the selected one says anything about where the media is going. A client setting the bitrate by hand stands the controller down, and setting a mode brings it back. Overriding a person's setting a second later would remove the only tool that finds this class of bug -- it is how the original report was shown to be wrong about the bitrate having been lowered. The controller's own commands carry no codec and no bit depth, which matters more than it reads: the far end rebuilds its video session for anything that might be either, and a rebuild costs a keyframe. Saying nothing it does not mean is what keeps a per-second adjustment free. And the counter is split. One video byte count could not distinguish an encoder ignoring its target from a stream that is mostly keyframes, and those have opposite fixes -- a session overshooting tenfold looked identical either way, which is why the cause stayed ambiguous for weeks. Keyframe bits, delta bits and keyframes per second now travel separately, alongside what the controller is asking for, the ceiling it is working within, and why. Appended to the stats packet, so an older reader keeps working on the part it understands. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.