Conversation
`settled()` has no visibility into a sign-in. The sign-in button performs an ember-concurrency task, ember-concurrency carries no `@ember/test-waiters` integration, and the boot that task awaits is a plain promise chain until its closing router refresh — so a test that clicks Sign In can resume on an app that is still logged out and assert against the login form. MatrixService now holds a waiter across the credential exchange and across the whole boot, so `settled()` spans a sign-in from the click through to the render that follows the route refresh. `buildWaiter` compiles to a no-op outside a debug build. The profile deep-link test reports the session's readiness, whether the request was acted on, and whether the URL still carries it, so a failure names the stage rather than the symptom. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
The sign-in waiter covered the password exchange and the boot but not `loginWithSsoToken` — the credential exchange for the token hand-off, which the login component performs from an ember-concurrency task on exactly the same terms. It is held now, so what the comment says about the credential exchange is true of both. Two tests make the waiter's absence visible: a render settles only once the token exchange has finished, and a boot in flight leaves the waiter pending. Each one fails when its acquisition is removed. The waiter's comment described the boot as a plain promise chain. It is not: the app's own requests carry the `fetcher` waiter and realm session mints carry `realm:session-login`. What goes unheld is the matrix client's own traffic, which bypasses both because the client is built without a `fetchFn`. The deep-link diagnostic no longer throws out of the failure it explains, and keeps qunit-dom's element name in the headline. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Contributor
jurgenwerk
approved these changes
Sep 16, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Acceptance | operator mode tests > account popover: a deep link arriving logged out waits for login, then opens the modalfails in host CI withElement [data-test-settings-modal] does not exist, on branches whose diff cannot reach it.What the test waits on
The test signs out, arrives on
/?openProfileSettings=subscription, fills the login form and clicks Sign In, then asserts the profile settings modal is open.await click('[data-test-login-btn]')is the entire wait.settled()cannot span that sign-in. Two things leave it uncovered:@ember/test-waitersintegration, so the task itself is invisible.MatrixService.start(), is held only in stretches. The app's own requests carry thefetcherwaiter and each realm session mint carriesrealm:session-login— but the matrix client is built without afetchFn, so its traffic (getDevice, thegetAccountDataFromServercalls,initSlidingSync,startClient,setSystemCard) bypasses both, as do the seams between adjacent held segments.So
click()returns as soon as a poll lands in one of those gaps and the assertions run against an app still rendering<Auth />. That shape explains why the failure reads as deterministic on a given runner rather than as a coin flip: whether the poller wins is decided by how long the boot takes there.The deep link itself is fine. The route consumes the request at fixed points in the transition, and the failing job's browser log shows it doing so — the
[start-phase] …sequence ending inpostLoginCompleted=trueand then[profile-deep-link] opening settings on subscription, both landing after the assertion and immediately before the teardownresetState(). The modal opens; the test just read the DOM first.The change
MatrixServiceholds a@ember/test-waiterswaiter across the credential exchange — password and token hand-off alike — and across the whole boot.settled()then spans a sign-in from the click through to the render that follows the route refresh, for every caller: the login form, the SSO hand-off, registration, and the boot from persisted auth.buildWaitercompiles to a no-op outside a debug build, so production behavior is unchanged.Two tests make the waiter's absence visible, since the acceptance test alone only goes red when a runner happens to be slow enough:
Integration | Component | matrix/login: a render settles only once the token exchange has finishedIntegration | matrix-service | re-login after logout: a boot in flight holds settled() openThe deep-link test's modal assertion carries the session's readiness, whether the request was acted on, and whether the URL still holds it, so a future failure names which of the three stages is missing instead of restating the symptom. The snapshot is guarded, so a diagnostic that cannot be read reports that rather than throwing out of the failure it exists to explain.
Verification
Local stack,
ember test --path dist.Reproduction control — one build carrying a 400ms untracked delay inside the boot, which is the shape of the gap:
Element [data-test-settings-modal] does not exist, the same assertion and stack frame the CI job reports. The next test fails too, on the previous test's boot leaking into itPositive control for the two new tests — one build with all three waiter acquisitions removed: both go red and nothing else in their modules moves. Restored, both pass.
Without any injection:
account popovermodule: 12/12, three runs.Acceptance | operator mode testsfile: 26/26, three runs.Integration | matrix-service | *37/37,Integration | Component | matrix/login10/10,Integration | ai-assistant-panel | re-login,Integration | workspace-chooser | unreachable realm server notice— all pass.eslintandember-tsc --noEmitclean forpackages/host.🤖 Generated with Claude Code