fix(#5367): suppress transparent stream live row animation - #5454
2 commits merged into
Conversation
🔬 Gate certification — GREEN ✅ · ⏸️ minor visible (motion removal) → quick glanceCertified head: What I ran (rebased worktree
|
| Gate | Result |
|---|---|
| Rebase onto current master | ✅ git apply clean (merge-base == master tip, incl shipped #5400) |
| Codex (reproduce) | SAFE TO SHIP — gated the rebased worktree, 0 findings |
| Full pytest suite | 2 failed / 11829 passed — both non-defects (nous env flake + test_issue4536 isolation flake, pass isolated) |
| PR's own test | ✅ 34/34 (test_issue3820_chat_activity_display_mode.py) |
Findings
✅ Correct flicker fix + avoids the #5406 trap: #liveAssistantTurn .transparent-event-row goes from animation:transparent-event-enter .18s ease-out both → animation:none!important, and the now-unused @keyframes transparent-event-enter (opacity 0→1) is removed. Crucially it does NOT add opacity:1!important — so the graduated [data-transparent-fade="1..5"] depth-fade (0.86→0.54, transition, hover) stays intact (I confirmed those rules unchanged, no opacity:1!important on live rows). This is exactly the fix I recommended when I RED'd the sibling #5406 (kill the animation, not the opacity). Keyframe removal has no dangling references. Coexists with shipped #5400 identity-reconcile. Codex SAFE (0 findings), 34/34 tests.
Recommendation to the next agent
Ready to merge — use branch gate-rebase/5454-suppress-transparent-anim (sha:c7e9a776), NOT the PR's stale head 904d741e. The correct CSS-direction #5367 flicker fix: suppresses the entrance-animation replay on streaming rebuilds while preserving the depth-fade (avoids the #5406 opacity-clobber); Codex SAFE + 34/34 + suite green bar 2 known flakes. Visible change is motion REMOVAL (no more entrance shimmer replay on live transparent rows) — low-risk, a quick glance at a streaming turn confirms no flicker + fade still graduates. concept 4/5 (real #5367 flicker fix, and the clean version of what #5406 got wrong). Credit @rodboev (co-authored). crit=3.
Gate-certifier layer (warm-up → gate → release). I do not merge/tag/deploy. Rebased onto current master; animation:none-without-opacity:1 verified (depth-fade [data-transparent-fade] rules intact, no opacity:1!important on live rows, keyframe cleanly removed), Codex SAFE + 34/34 + suite green bar 2 known flakes. Cert valid for sha:c7e9a776.
…mation The entrance animation on #liveAssistantTurn .transparent-event-row (transparent-event-enter .18s) fires on every scene rebuild during streaming, causing visible flicker of thinking/tool/prose rows in transparent stream mode on ALL themes. Change to animation:none to suppress the entrance animation entirely in the live turn. The data-transparent-fade opacity rules for settled rows remain intact. Also remove the now-unused @Keyframes transparent-event-enter block. Upstream ref: PR nesquena#5454 direction (nesquena#5367)
|
Putting this back into draft pending E2E repro of a working fix. The two paths so far have not yielded that so I'm checking the computed styles on assistant-turn-blocks, assistant-segment, and msg-body to see what else is going on. It happens pretty quickly so it needs profiling and rAF capture. |
|
This needs just a tiny tweak to remove the animation that keeps firing. Pushing that up. |
|
Good to go. |
🔬 Re-gate — GREEN ✅ (current head, stale gate-pass superseded)Certified head:
What I ran (worktree
|
| Gate | Result |
|---|---|
| Diff vs master | ✅ only 2 files, +2/−12 (static/style.css, tests/test_issue3820_...py) |
| Dangling-ref check | ✅ transparent-event-enter appears only in the test asserting its absence — no orphaned production CSS/JS reference |
| Depth-fade preservation | ✅ [data-transparent-fade="1..5"] opacity (0.86→0.54), transition, hover rules unchanged; no opacity:1!important introduced (avoids the #5406 trap) |
| Codex (reproduce) | ✅ SAFE TO SHIP — 0 regression findings |
| Opus advisor | ✅ SHIP — "cleanest form of the #5367 fix; depth-fade fully preserved" |
| CI (15 test shards × py3.11/3.12/3.13, browser-smoke, lint, Greptile) | ✅ all pass |
| PR's own tests | ✅ test_issue3820_chat_activity_display_mode.py 34/34 · test_smooth_text_fade.py 10/10 |
| Activity-stream regression gate + browser matrix | ✅ 14/14 checkpoints, both modes (during_stream, after_done, switch-away-back, tab-hidden-visible, blur/focus, reload-after-done, reload-mid-stream) |
| Live reload-drive (transparent mode) | ✅ rebuilt row order stable across 8 polls — no entrance-animation replay / flicker |
Non-blocking nits (both cosmetic, not ship-blockers)
- Test function name
test_transparent_entrance_animation_is_live_turn_onlynow asserts the animation is absent — name is slightly stale (would read cleaner as..._removed). Fine as a follow-up. - PR description still says the rule was changed to
animation:none!important; the current head removes it entirely. Worth a one-line description edit for the record.
Recommendation
Ready to merge at af3eb88 — the correct, cleanest CSS-direction #5367 fix. Kills the entrance-animation replay on streaming rebuilds while fully preserving the graduated depth-fade. Credit @rodboev. Visible change is motion removal (a still screenshot isn't probative — verified via the browser matrix + reload-drive instead, both show no replay).
Full authoritative gate (Codex reproduce + Opus + full suite + browser matrix + live reload-drive) re-run on the current head after the substantive re-push. Cert valid for sha:af3eb88225a5.
…ndant suppression) Clean rebase of rodboev's #5454 (rebase-first). Co-authored-by: rodboev <rodboev@users.noreply.github.com>
🔬 Gate certification — GREEN ✅ (re-gated at new head; +redundant-suppression cleanup)Certified head: What I ran (rebased worktree
|
| Gate | Result |
|---|---|
| Rebase onto current master | ✅ git apply clean |
| Codex (reproduce) | SAFE TO SHIP — gated the rebased worktree, 0 findings |
| Full pytest suite | 2 failed / 11829 passed — both non-defects (nous env flake + test_issue4536 isolation flake) |
Findings
✅ Redundant-suppression removal is safe: the follow-up commit (Drop redundant live-row suppression) removes #liveAssistantTurn .transparent-event-row{animation:none!important;} + updates the test to assert it's gone. I verified this is genuinely redundant: @keyframes transparent-event-enter is gone (0 refs), and the base .transparent-event-row rule declares no animation property (only transition: background/border/opacity) — so there is no entrance animation to replay, and dropping the suppression cannot reintroduce the #5367 flicker. No dangling animation→keyframe reference. The separate transparent-progress-shimmer animation (progress ::before, different element) is unaffected. Depth-fade [data-transparent-fade=1..5] still intact (no #5406 opacity-clobber). Codex SAFE (0 findings), suite green.
Recommendation to the next agent
Ready to merge — use branch gate-rebase/5454-suppress-transparent-anim (sha:59217148), NOT the PR's stale head af3eb882. The #5367 flicker fix is complete and now minimal: the keyframe removal alone suppresses the entrance replay, and the follow-up correctly drops the redundant animation:none override (verified no animation remains to suppress, fade preserved). Codex SAFE + suite green bar 2 known flakes. Visible = motion removal (no entrance shimmer replay) — low-risk, a quick glance at a streaming turn confirms. concept 4/5. Credit @rodboev (co-authored). crit=3. (Supersedes my prior GREEN @904d741e — same feature, now simplified.)
Gate-certifier layer (warm-up → gate → release). I do not merge/tag/deploy. Re-gated at new head af3eb88; redundant-suppression removal verified safe (keyframe gone + base rule has no animation → nothing to replay; shimmer unaffected; depth-fade intact), Codex SAFE + suite green bar 2 known flakes. Cert valid for sha:59217148.
d5e1274
|
Shipped in v0.51.835 🚀 — thanks @rodboev. This removes the Full gate passed on the current head (
Follow-up to #5367 (already closed by #5400). Released via #5470. |
… row entrance animation (residual nesquena#5367) Removes the #liveAssistantTurn .transparent-event-row entrance animation rule and its now-unused @Keyframes transparent-event-enter, eliminating the entrance-animation replay on streaming rebuilds that remained after the nesquena#5400 identity-reconcile fix. Depth-fade [data-transparent-fade] rules preserved (avoids the nesquena#5406 opacity-clobber). Follow-up to already-closed nesquena#5367. Co-authored-by: Rod Boev <rodboev@users.noreply.github.com>
…rance animation (residual nesquena#5367)
Thinking Path
did this fix go out? not improved at all in WebUI: v0.51.833.transparent-event-enter.What Changed
static/style.css: remove#liveAssistantTurn .transparent-event-row, which is scoped to the live turn only.static/style.css: remove the now-unused@keyframes transparent-event-enterblock.tests/test_issue3820_chat_activity_display_mode.py: update the CSS invariant test so it pins that the rule was removed.Why It Matters
Users still seeing Transparent Stream flicker after #5400 get the animation-side guard from the original #5367 maintainer direction. Existing
data-transparent-fadeopacity rules stay intact because this avoids forcingopacity:1.Verification
pytest tests/test_issue3820_chat_activity_display_mode.py -v --timeout=60pytest tests/test_smooth_text_fade.py -v --timeout=60npx eslint --no-config-lookup -c eslint.runtime-guard.config.mjs "static/**/*.js"Upstream
Refs #5367.
Follow-up to #5400, which shipped the reconcile path but left the live-row entrance animation available for any remaining rebuild path.
Model Used
GPT 5 via Codex CLI