Replaces #8200, which was tried twice before the code it extends existed: it waits for #7651 (pull #8011), which brings src/crew/conversation.ts. Once that lands, a turn whose model answers rate-limited only ends failed with "I could not answer that just now"; the run path (src/crew/runner.ts, around restSubscription) rests the account and notes the limit.
Done when:
[ ] A turn whose result is a rate limit calls noteLimit and restSubscription with resumeAt/limitOf of the result, exactly as a run does
[ ] The person sees one line: the account is resting until <time> (no raw provider text)
[ ] The next message answers resting while that account rests and no other grant can serve, and starts normally once it wakes or another grant is awake
[ ] A test with a stub claude that answers rate-limited proves the rest, the line and the refusal; it fails without the code
Replaces #8200, which was tried twice before the code it extends existed: it waits for #7651 (pull #8011), which brings
src/crew/conversation.ts. Once that lands, a turn whose model answers rate-limited only endsfailedwith "I could not answer that just now"; the run path (src/crew/runner.ts, aroundrestSubscription) rests the account and notes the limit.Done when:
noteLimitandrestSubscriptionwithresumeAt/limitOfof the result, exactly as a run doesrestingwhile that account rests and no other grant can serve, and starts normally once it wakes or another grant is awakeclaudethat answers rate-limited proves the rest, the line and the refusal; it fails without the codeFiles: src/crew/conversation.ts, test/conversation-turn.test.ts