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: @mallenexpensify

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions