875b2f0ed8ee9a493c13efdbef1ee7494e8f2f1a
`watch_forge` looked the dispatch key up in the `watches` table and nothing else, so a thread that arrived through an *account* watch — the daemon's own account notifications, which cover the whole instance, not one repo — failed with "no watch configured" unless the same repo also had a repo watch row. The dispatch is created by the account poll; the client it needs is the account's. Nothing could hand it over, because the payload did not name the account either. The triaged payload now carries `account_id`, the dispatch drains the inbox *before* resolving the client (the inbox is where that id lands), and `watch_forge_as` falls back to the account watch that delivered the news: its host, its credential, its login. A repo watch row still wins when there is one — a thread with its own watch keeps its own identity — and `watch_forge` keeps its signature for callers that know nothing about accounts, falling back to the kind's first account watch. The client cache is now one helper over `(forge, host, credential)`, so the dispatch's replies ride the same pool the poll built.
Languages
Rust
74.9%
Kotlin
13.8%
Vue
7.1%
TypeScript
3%
Dockerfile
0.5%
Other
0.6%