Skip to content

fix(#5367): suppress transparent stream live row animation - #5454

Merged
2 commits merged into
nesquena:masterfrom
rodboev:pr/5367-transparent-stream-animation-guard
Jul 3, 2026
Merged

2 commits merged into
nesquena:masterfrom
rodboev:pr/5367-transparent-stream-animation-guard

Conversation

@rodboev

@rodboev rodboev commented Jul 3, 2026 •

Copy link
Copy Markdown
Contributor

Thinking Path

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-enter block.
  • 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-fade opacity rules stay intact because this avoids forcing opacity:1.

Verification

  • pytest tests/test_issue3820_chat_activity_display_mode.py -v --timeout=60
  • pytest tests/test_smooth_text_fade.py -v --timeout=60
  • npx 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

@greptile-apps

greptile-apps Bot commented Jul 3, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR removes the transparent-event-enter keyframe animation and the #liveAssistantTurn-scoped animation rule to suppress Transparent Stream flicker in live turns. The change is clean and low-risk with two minor P2 observations: (1) the PR description promised an animation:none!important replacement guard on #liveAssistantTurn .transparent-event-row but it was not added in the diff, and (2) the test function name test_transparent_entrance_animation_is_live_turn_only no longer matches its updated assertion.

Confidence Score: 5/5

Safe to merge — the change removes a small, self-contained animation rule and its keyframes; existing opacity/fade rules are untouched and the test correctly pins the new state.

The CSS change is a straightforward deletion with no risk of regressions in other rendering paths. The data-transparent-fade opacity rules the PR explicitly preserves are untouched. The test update correctly reflects the new invariant. The only gap is that a defensive animation:none!important guard the PR description mentioned was not added, which is a forward-looking robustness concern rather than a current defect.

No files require special attention; both changed files are minimal and low-risk.

Important Files Changed

Filename Overview
static/style.css Removes the #liveAssistantTurn .transparent-event-row entrance animation rule and the @keyframes transparent-event-enter block; the PR description promised an animation:none!important replacement guard but it was not added.
tests/test_issue3820_chat_activity_display_mode.py Updates the CSS invariant test to assert the old keyframe name is absent; test function name test_transparent_entrance_animation_is_live_turn_only now describes a different invariant than it actually tests.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[Transparent Stream row renders in live turn] --> B{Before PR: animation rule present?}
    B -- Yes --> C[#liveAssistantTurn .transparent-event-row applies transparent-event-enter .18s ease-out both]
    C --> D[Row animates on rebuild → flicker]
    B -- No / After PR --> E[Rule and @keyframes removed]
    E --> F[No animation fires on live-turn row]
    F --> G[No flicker during streaming updates]
    G --> H{Risk: future skin/CSS adds animation?}
    H -- Guarded by animation:none!important --> I[Safe — explicit suppression in place]
    H -- Not guarded — current state --> J[Live turn rows pick up new animation without explicit suppression]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A[Transparent Stream row renders in live turn] --> B{Before PR: animation rule present?}
    B -- Yes --> C[#liveAssistantTurn .transparent-event-row applies transparent-event-enter .18s ease-out both]
    C --> D[Row animates on rebuild → flicker]
    B -- No / After PR --> E[Rule and @keyframes removed]
    E --> F[No animation fires on live-turn row]
    F --> G[No flicker during streaming updates]
    G --> H{Risk: future skin/CSS adds animation?}
    H -- Guarded by animation:none!important --> I[Safe — explicit suppression in place]
    H -- Not guarded — current state --> J[Live turn rows pick up new animation without explicit suppression]
Loading

Reviews (2): Last reviewed commit: "Drop redundant live-row suppression afte..." | Re-trigger Greptile

@nesquena-hermes nesquena-hermes added the size:S Small PR (≤2 files, ≤30 LOC) label Jul 3, 2026
@nesquena-hermes

Copy link
Copy Markdown
Collaborator

🔬 Gate certification — GREEN ✅ · ⏸️ minor visible (motion removal) → quick glance

Certified head: sha:c7e9a776 (clean rebase, branch gate-rebase/5454-suppress-transparent-anim) · PR: #5454 · rodboev, fix(#5367): suppress transparent stream live row animation
Verdict: Full gate GREEN. The CSS-side #5367 flicker fix, done right — kills the live-row entrance-animation replay WITHOUT forcing opacity:1 (so it avoids the depth-fade clobber that sank the sibling #5406), and removes the now-unused keyframe. Codex SAFE, suite green, depth-fade preserved.

What I ran (rebased worktree /tmp/wt-rebase-5454)

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.

@nesquena-hermes nesquena-hermes added the gate-pass Full gate passed (Codex+Opus+suite+browser); queued Tier 1 for release agent label Jul 3, 2026
buaaflyaway pushed a commit to buaaflyaway/hermes-webui that referenced this pull request Jul 3, 2026
…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)
@rodboev
rodboev marked this pull request as draft July 3, 2026 17:12
@rodboev

rodboev commented Jul 3, 2026 •

Copy link
Copy Markdown
Contributor Author

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.

@rodboev

rodboev commented Jul 3, 2026

Copy link
Copy Markdown
Contributor Author

This needs just a tiny tweak to remove the animation that keeps firing. Pushing that up.

@rodboev

rodboev commented Jul 3, 2026

Copy link
Copy Markdown
Contributor Author

Good to go.

@rodboev
rodboev marked this pull request as ready for review July 3, 2026 17:49
@nesquena-hermes

Copy link
Copy Markdown
Collaborator

🔬 Re-gate — GREEN ✅ (current head, stale gate-pass superseded)

Certified head: af3eb88225a5 (current PR head, based directly on current master 312d3fab — no rebase needed) · PR: #5454

⚠️ Why re-gate: the earlier gate-pass certified head 904d741e (rebase c7e9a776), which added #liveAssistantTurn .transparent-event-row{animation:none!important;}. After that cert, the PR was moved back to draft and re-pushed to af3eb88 with a different, cleaner implementation: it removes the #liveAssistantTurn .transparent-event-row animation rule and the @keyframes transparent-event-enter block entirely, so no override is needed. That is a substantive code change the previous cert never covered, so I re-ran the full authoritative gate on the current head.

What I ran (worktree /tmp/wt-gate-5454, based on master 312d3fab)

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)

  1. Test function name test_transparent_entrance_animation_is_live_turn_only now asserts the animation is absent — name is slightly stale (would read cleaner as ..._removed). Fine as a follow-up.
  2. 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.

nesquena-hermes added a commit that referenced this pull request Jul 3, 2026
…ndant suppression)

Clean rebase of rodboev's #5454 (rebase-first).

Co-authored-by: rodboev <rodboev@users.noreply.github.com>
@nesquena-hermes

Copy link
Copy Markdown
Collaborator

🔬 Gate certification — GREEN ✅ (re-gated at new head; +redundant-suppression cleanup)

Certified head: sha:59217148 (clean rebase of PR head af3eb882, branch gate-rebase/5454-suppress-transparent-anim) · PR: #5454 · rodboev, fix(#5367): suppress transparent stream live row animation
Verdict: Re-gated after a follow-up cleanup commit. My prior GREEN (@904d741e) removed the entrance-animation keyframe; this commit removes the now-redundant animation:none!important suppression rule (nothing left to suppress). Verified safe — no animation exists to replay, no dangling keyframe ref, depth-fade intact. Codex SAFE, suite green.

What I ran (rebased worktree /tmp/wt-rebase-5454b)

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.

@nesquena-hermes nesquena-hermes closed this pull request by merging all changes into nesquena:master in d5e1274 Jul 3, 2026
@nesquena-hermes

Copy link
Copy Markdown
Collaborator

Shipped in v0.51.835 🚀 — thanks @rodboev.

This removes the #liveAssistantTurn .transparent-event-row entrance animation and its now-unused @keyframes transparent-event-enter, eliminating the entrance-animation replay on streaming rebuilds that remained after the #5400 identity-reconcile fix. The graduated [data-transparent-fade] depth-fade is fully preserved (no opacity:1 clobber).

Full gate passed on the current head (af3eb88, re-gated after your post-cert re-push):

  • Codex (reproduce): SAFE TO SHIP
  • Opus advisor: SHIP — depth-fade preserved rule-by-rule
  • CI: 15 test shards × py3.11/3.12/3.13 + browser-smoke + lint + Greptile all green
  • Activity-stream regression gate + browser matrix: 14/14 checkpoints, both display modes
  • Live reload-drive: rebuilt row order stable, no replay/flicker

Follow-up to #5367 (already closed by #5400). Released via #5470.

ruizanthony pushed a commit to ruizanthony/hermes-webui that referenced this pull request Jul 3, 2026
… 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>
ruizanthony pushed a commit to ruizanthony/hermes-webui that referenced this pull request Jul 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

gate-pass Full gate passed (Codex+Opus+suite+browser); queued Tier 1 for release agent size:S Small PR (≤2 files, ≤30 LOC)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants