Skip to content

fix(chat): ensure layout loading states are monotonic during lifecycle overlays#54

Closed
google-labs-jules[bot] wants to merge 4 commits into
mainfrom
fix/monotonic-layout-loading-states-15362945017983675042
Closed

fix(chat): ensure layout loading states are monotonic during lifecycle overlays#54
google-labs-jules[bot] wants to merge 4 commits into
mainfrom
fix/monotonic-layout-loading-states-15362945017983675042

Conversation

@google-labs-jules

Copy link
Copy Markdown
Contributor

The Observed Problem

When navigating or switching sessions, temporary blocking overlays (like the session switch or history loading overlay) cause the chat components to temporarily evaluate ShouldShowActiveConversationRoot and ShouldShowTranscriptSurface to false. Because ShouldLoad... properties were directly mirroring ShouldShow..., this caused the underlying layout items (bound to x:Load) to be completely unloaded and destroyed. When the overlay cleared, the visual tree had to be expensively reconstructed, causing UI stutter and violating the layout realization contract.

The Root Cause

In ChatConversationSurfaceProjectionCoordinator, the projection blindly mapped ShouldShow states directly to ShouldLoad states:

state.ShouldShowActiveConversationRoot, // mapped to ShouldLoadActiveConversationRoot
...

This violates the Uno Platform best practice and repository AGENTS.md rules which state: "In the Uno Platform UI lifecycle, separate layout realization (ShouldLoad... properties typically bound to x:Load) from visual state visibility (ShouldShow... properties). Layout-loading states should be monotonic and not regress (un-load) merely because a temporary blocking overlay becomes visible."

Why the Fix is Safe Architecturally

The fix simply introduces internal boolean tracking (_hasLoadedActiveConversationRoot, _hasLoadedTranscriptSurface) within the ChatConversationSurfaceProjectionCoordinator. Once the layout evaluates that it needs to be shown (and thus loaded), the ShouldLoad projection permanently returns true for the lifecycle of that coordinator instance.

  1. It does not touch ShouldShow... logic, so the UI is still correctly hidden/collapsed when overlays appear.
  2. It adheres to Uno Platform x:Load patterns: once loaded, it stays in the visual tree and visibility is controlled independently.
  3. It prevents native visual tree thrashing without moving any business logic into the view.
  4. It is fully covered by updated unit tests in ChatConversationSurfaceProjectionCoordinatorTests.

Exact Verification Commands Run

  • dotnet build SalmonEgg.sln --configuration Debug
  • dotnet test tests/SalmonEgg.Presentation.Core.Tests/SalmonEgg.Presentation.Core.Tests.csproj --configuration Debug --no-restore (Note: Tested specifically the ChatConversationSurfaceProjectionCoordinatorTests and ChatViewModelTests to ensure our changes passed)

Any Remaining Unverified GUI-only Risks

  • The fix prevents the unloading of the transcript and active conversation root. If there are any custom native behaviors in the controls that rely implicitly on being destroyed and recreated (which is an anti-pattern), they could technically behave differently now. A full GUI smoke test covering repeated rapid session switching under heavy memory load would be ideal to ensure the retained visual tree performs smoothly without leaks.

PR created automatically by Jules for task 15362945017983675042 started by @YoungSx

…e overlays

- Update ChatConversationSurfaceProjectionCoordinator to maintain true for ShouldLoadActiveConversationRoot and ShouldLoadTranscriptSurface once they evaluate to true.
- Add tests to verify load state is kept when surface is later hidden.
@google-labs-jules

Copy link
Copy Markdown
Contributor Author

👋 Jules, reporting for duty! I'm here to lend a hand with this pull request.

When you start a review, I'll add a 👀 emoji to each comment to let you know I've read it. I'll focus on feedback directed at me and will do my best to stay out of conversations between you and other bots or reviewers to keep the noise down.

I'll push a commit with your requested changes shortly after. Please note there might be a delay between these steps, but rest assured I'm on the job!

For more direct control, you can switch me to Reactive Mode. When this mode is on, I will only act on comments where you specifically mention me with @jules. You can find this option in the Pull Request section of your global Jules UI settings. You can always switch back!

New to Jules? Learn more at jules.google/docs.


For security, I will only act on instructions from the user who triggered this task.

@vercel

vercel Bot commented Jun 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
salmonegg Ready Ready Preview, Comment Jun 12, 2026 1:16am

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.

…e overlays

- Update ChatConversationSurfaceProjectionCoordinator to maintain true for ShouldLoadActiveConversationRoot and ShouldLoadTranscriptSurface once they evaluate to true.
- Add tests to verify load state is kept when surface is later hidden.
- Fix indentation and format issues in ChatViewModelTests and wasm-settings-navigation-smoke
…e overlays

- Update ChatConversationSurfaceProjectionCoordinator to maintain true for ShouldLoadActiveConversationRoot and ShouldLoadTranscriptSurface once they evaluate to true.
- Add tests to verify load state is kept when surface is later hidden.
- Fix indentation and format issues in ChatViewModelTests and wasm-settings-navigation-smoke
…e overlays

- Update ChatConversationSurfaceProjectionCoordinator to maintain true for ShouldLoadActiveConversationRoot and ShouldLoadTranscriptSurface once they evaluate to true.
- Add tests to verify load state is kept when surface is later hidden.
- Fix indentation and format issues in ChatViewModelTests and wasm-settings-navigation-smoke
- Fix AcpConnectionSettingsXamlTests assert that failed on CI
@YoungSx

YoungSx commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Closing during PR triage: this is a stale or duplicate layout-loading monotonicity attempt. #49 is the clean green candidate for this behavior; this PR is superseded, failing/conflicting, or mixed-scope and should not be merged as-is.

@YoungSx YoungSx closed this Jun 25, 2026
@google-labs-jules

Copy link
Copy Markdown
Contributor Author

Closing during PR triage: this is a stale or duplicate layout-loading monotonicity attempt. #49 is the clean green candidate for this behavior; this PR is superseded, failing/conflicting, or mixed-scope and should not be merged as-is.

Understood. Acknowledging that this work is now obsolete and stopping work on this task.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant