The route has spoken sandboxes since it was written and nothing in the UI ever
named a project, so runAgent fell through to an in-memory map on every run a
person actually started — silently, with an identical happy result. This is the
missing caller (lib/agent/client.ts), the mode that uses it (Code), the loud
answer when a run is not durable (the sandbox event, first frame, always), and
the dock that shows the commands as they are issued.
currentProject is now ONE function. The commit path read the project record's
space_id and the sandbox path read the browser's __projectSlug; two derivations
of one identity is how a run edits a checkout the same session does not commit
to. lib/dev/workspace owns the answer, both callers ask it.
tests/unit/code-turn.test.ts is written to fail on the original bug rather than
to pass on the fix: deleting `project` from the request turns two of its nine
red. A test that only watched the bubble could not have gone red at all.