Problem
Concierge's optimistic reply reveal ("trickle") feels noticeably slow compared to ChatGPT and Claude. It's driven by an ease-out curve over a fixed total duration, which produces a variable rate (~13–19 chars/sec at the start decaying to ~7 chars/sec at the end, ~6.7 avg) rather than a steady typing feel.
Updated plan (flat cadence, optimistic path only)
Present the optimistic response at a flat, constant cadence — drop the ease-out curve and the fixed-total-duration knob from the optimistic reveal so it reveals at a steady rate regardless of length. Once server streaming speed improves, the "balanced timing" that these knobs provided is no longer needed.
Important constraint — do not touch the server-response trickle. DEFAULT_STREAM_DURATION_MS and easeOut are not optimistic-only. They are also consumed by the server-streamed reveal in src/pages/inbox/usePusherDraftPacing.ts (via getRevealDurationMS + easeOut, and TICK_INTERVAL_MS for its tick). So they cannot be deleted outright without changing server-response behavior. The plan scopes the flat-cadence change to the optimistic path only and leaves the shared constants and the server path exactly as they are on main.
Changes
- Revert the earlier shared-constant tweak.
DEFAULT_STREAM_DURATION_MS (15,000) and TICK_INTERVAL_MS (80) go back to their main values. The first version of this work lowered these two constants, but because the server path reads them too, that also made server-streamed replies abrupt (the behavior Shawn flagged). Reverting them fully restores server-response pacing.
- Flat cadence for the optimistic path in
src/hooks/usePendingConciergeResponse.ts: the optimistic reveal no longer uses DEFAULT_STREAM_DURATION_MS or easeOut. It now reveals at a constant rate via a new dedicated constant OPTIMISTIC_FLAT_MS_PER_TOKEN (~30 chars/sec), with linear progress instead of ease-out. Total duration scales linearly with length, so every reply reveals at the same steady rate.
easeOut, DEFAULT_STREAM_DURATION_MS, and getRevealDurationMS remain in ConciergeRevealUtils.ts because the server path still uses them.
Open question (follow-up)
Shawn noted the abruptness may partly come from the server sending a complete message mid-reveal, which trips the 1.5s ACCELERATED_REMAINING_MS hard limit (the accelerator compresses the remaining optimistic reveal into 1.5s when the canonical reply lands). That's a separate knob from the cadence and is left unchanged here — worth deciding whether to tune it once the flat cadence is validated.
Slack thread: https://expensify.slack.com/archives/C090U774ZH7/p1784303172343289
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @thesahindia
Problem
Concierge's optimistic reply reveal ("trickle") feels noticeably slow compared to ChatGPT and Claude. It's driven by an ease-out curve over a fixed total duration, which produces a variable rate (~13–19 chars/sec at the start decaying to ~7 chars/sec at the end, ~6.7 avg) rather than a steady typing feel.
Updated plan (flat cadence, optimistic path only)
Present the optimistic response at a flat, constant cadence — drop the ease-out curve and the fixed-total-duration knob from the optimistic reveal so it reveals at a steady rate regardless of length. Once server streaming speed improves, the "balanced timing" that these knobs provided is no longer needed.
Important constraint — do not touch the server-response trickle.
DEFAULT_STREAM_DURATION_MSandeaseOutare not optimistic-only. They are also consumed by the server-streamed reveal insrc/pages/inbox/usePusherDraftPacing.ts(viagetRevealDurationMS+easeOut, andTICK_INTERVAL_MSfor its tick). So they cannot be deleted outright without changing server-response behavior. The plan scopes the flat-cadence change to the optimistic path only and leaves the shared constants and the server path exactly as they are onmain.Changes
DEFAULT_STREAM_DURATION_MS(15,000) andTICK_INTERVAL_MS(80) go back to theirmainvalues. The first version of this work lowered these two constants, but because the server path reads them too, that also made server-streamed replies abrupt (the behavior Shawn flagged). Reverting them fully restores server-response pacing.src/hooks/usePendingConciergeResponse.ts: the optimistic reveal no longer usesDEFAULT_STREAM_DURATION_MSoreaseOut. It now reveals at a constant rate via a new dedicated constantOPTIMISTIC_FLAT_MS_PER_TOKEN(~30 chars/sec), with linear progress instead of ease-out. Total duration scales linearly with length, so every reply reveals at the same steady rate.easeOut,DEFAULT_STREAM_DURATION_MS, andgetRevealDurationMSremain inConciergeRevealUtils.tsbecause the server path still uses them.Open question (follow-up)
Shawn noted the abruptness may partly come from the server sending a complete message mid-reveal, which trips the 1.5s
ACCELERATED_REMAINING_MShard limit (the accelerator compresses the remaining optimistic reveal into 1.5s when the canonical reply lands). That's a separate knob from the cadence and is left unchanged here — worth deciding whether to tune it once the flat cadence is validated.Slack thread: https://expensify.slack.com/archives/C090U774ZH7/p1784303172343289
Upwork Automation - Do Not Edit
Issue Owner
Current Issue Owner: @thesahindia