Skip to content

[Due for payment 2026-08-21] [$250] Concierge optimistic reveal: switch to a flat cadence #96507

Description

@MelvinBot

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

  1. 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.
  2. 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.
  3. 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 OwnerCurrent Issue Owner: @thesahindia

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions