When a full-state op (SYNC_IMPORT/BACKUP_IMPORT) arrived from another
client, mergeRemoteOpClocks reset the local clock to a "minimal" form
but only preserved the current client's counter from the incoming op's
clock. If the current client had issued ops (e.g. GLOBAL_CONFIG) not
reflected in the incoming full-state op's clock, its counter was dropped,
causing subsequent ops to reuse the same counter value. Downstream clients
then saw these ops as EQUAL (duplicate) and skipped them silently.
Fix: take max(mergedClock[clientId], currentClock[clientId]) when
rebuilding the clock after a full-state op reset.
Also add __SP_E2E_BLOCK_WS_DOWNLOAD flag to WsTriggeredDownloadService
to allow E2E tests to block automatic WS-triggered downloads during
concurrent conflict scenarios.
Fix archive conflict test by blocking WS downloads on Client A during
the concurrent edit phase so it doesn't auto-receive B's rename via
WebSocket before archiving (restoring the intended conflict scenario).
Fix LWW singleton test to assert convergence rather than specific winner.
Fix renameTask helper to avoid Playwright/Angular re-render races.
Fix shepherd.js import paths that broke the Angular dev server build.
The previous fix (1cf7cff) added onboarding suppression via addInitScript
to test.fixture.ts, but WebDAV and SuperSync tests create their own
browser contexts via setupSyncClient() and createSimulatedClient() which
don't use that fixture. Without the suppression, onboarding overlays
interfere with sync tests causing timeouts and failures.
https://claude.ai/code/session_01AgeFLhcokw7y2tkTpeQMUz
Co-authored-by: Claude <noreply@anthropic.com>
Remove the full welcome tour (Welcome, AddTask, DeleteTask, Projects,
Sync, IssueProviders, ProductivityHelper, FinalCongrats, StartTourAgain)
and keep only the KeyboardNav tour, triggered from the Help menu.
- Delete ShepherdComponent (auto-start on load)
- Strip shepherd-steps.const.ts to KeyboardNav steps only
- Simplify ShepherdService with _initPromise guard and fresh tour on re-open
- Remove 3 tour menu items from Help menu, keep keyboard tour
- Remove waitForEl/waitForElObs$ helpers (unused by KeyboardNav)
- Delete e2e/utils/tour-helpers.ts and all tour dismissal calls
- Clean up stale tour comments across e2e tests
- Fix pre-existing build error: add isFinishDayEnabled to AppFeaturesConfig
type, defaults, form toggle, component signal, and translations
- Add closeContextsSafely helper to handle Playwright trace file race conditions
during browser context cleanup (fixes ENOENT errors on test retry)
- Fix enableEncryption method to properly handle dialog-based encryption flow
- Fix disableEncryptionForFileBased method: remove unnecessary expandAdvancedSettings,
fix selector to match actual CSS class (.e2e-disable-encryption-btn)
- Update 5 test files to use closeContextsSafely for robust cleanup
Split e2e-scheduled.yml into 3 parallel jobs (regular, webdav, supersync)
for ~3x faster nightly runs. Each job only starts the Docker services it
needs. Also reduced fixed wait times in sync-helpers.ts and waits.ts to
improve test execution speed while maintaining reliability.
Adds explicit waits after archive operations to ensure IndexedDB writes
complete before proceeding with sync operations. This prevents race
conditions where sync attempts to read state before archive persistence
finishes.
Changes:
- Add waitForArchivePersistence() helper to sync-helpers.ts
- Waits 1000ms for IndexedDB operations to complete
- Additional 100ms for pending micro-tasks/animations
- Add 500ms waits in waitForSyncComplete() after detecting sync success
- Ensures IndexedDB writes fully settle before returning
- Apply waitForArchivePersistence() in webdav-sync-archive.spec.ts
- After Client A archives Task1
- After Client B archives Task3
- Apply waitForArchivePersistence() in webdav-sync-delete-cascade.spec.ts
- After Client A archives task (tag deletion test)
- After Client B archives Task1 (concurrent archive test)
These changes address flakiness in CI environments where async IndexedDB
operations may not complete before the next test assertion.
Related to: Bug #5995, Bug #6044 (focus-mode test fixes)
- Add message validation to E2E dialog auto-accept handlers to prevent
false positives when unexpected confirm dialogs appear
- Change afterAll to afterEach in check-key-combo.spec.ts to prevent
navigator override from polluting other tests
The E2E tests were failing because dismissTourIfVisible only handled
the Shepherd tour steps, not the Welcome intro mat-dialog that appears
first. This dialog blocks UI interactions causing test timeouts.
Updated tour-helpers.ts to:
- Add dismissWelcomeDialog() for the intro dialog
- Add dismissShepherdTour() for the tour steps
- Update dismissTourIfVisible() to handle both in sequence
- Wait for form fields to appear after selecting WebDAV provider
instead of fixed timeout (fixes flaky .e2e-baseUrl input timeout)
- Dismiss overlays before clicking sync button in triggerSync()
- Improve waitForSyncComplete with fallback detection when icon
selector fails (checks consecutive non-spinning states)
- Remove unnecessary page.reload() in tag removal test
- Handle Material conflict dialog explicitly in multi-local-ops test
(browser confirm handler only works for window.confirm())