Summary
When several inbound PR reviews land at roughly the same time, the Crow UI locks up and stops responding to input. Recovery requires waiting it out or restarting the app.
Repro
- Have multiple sessions in `inReview` state with open PRs.
- Reviewers approve / leave comments on those PRs in close succession (or a webhook burst arrives — e.g. CI finishing on several PRs at once).
- Observe the Crow window: clicks/keystrokes stop registering, session list does not scroll, terminal does not echo.
Expected
UI stays responsive; review/state updates apply incrementally without blocking the main thread.
Likely area
Probably review-ingest / status-refresh work running on the main actor — concurrent inbound updates serialize behind `@MainActor` AppState mutations and starve the UI. Worth checking:
- Whether GitHub review-event handlers do JSON parsing or network calls inside `MainActor.run { ... }`.
- Whether each inbound event triggers a full session-list re-render rather than a diff.
- Whether the JSONStore lock (`NSLock`) is held across long writes when many sessions update at once.
Asks
- Capture a sample / spindump from a reproducer to confirm where the main thread is stuck.
- Move parsing and network IO off the main actor; only the final state mutation should hop back.
- Coalesce rapid review-state updates so N concurrent events don't trigger N full re-renders.
Summary
When several inbound PR reviews land at roughly the same time, the Crow UI locks up and stops responding to input. Recovery requires waiting it out or restarting the app.
Repro
Expected
UI stays responsive; review/state updates apply incrementally without blocking the main thread.
Likely area
Probably review-ingest / status-refresh work running on the main actor — concurrent inbound updates serialize behind `@MainActor` AppState mutations and starve the UI. Worth checking:
Asks