Skip to content

Bring cloud sync and the web beta into main - #234

Open
SunkenInTime wants to merge 350 commits into
mainfrom
t3code/unify-cloud-main
Open

SunkenInTime wants to merge 350 commits into
mainfrom
t3code/unify-cloud-main

Conversation

@SunkenInTime

@SunkenInTime SunkenInTime commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

This merges icarus-cloud into main, so main becomes the only branch. It brings accounts, Convex sync, sharing, presence, page trash and the web beta, plus every fix found while getting it ready. Signed-out desktop users keep local mode exactly as 4.6.3 has it.

Merge with a merge commit, not a squash, so icarus-cloud's history stays intact. Merging deploys. Deploy Web now runs from main: production Convex first, then the web beta.

Old web tabs reload after this deploy (decided)

Protocol 4 refuses web tabs opened before the deploy (cbbdadf, 75b58e1). Cloud Paranoias are now stored at payload version 2. A protocol-3 tab would read one at the old size and, on its next edit to that page, write it back so new clients correct it a second time. Protocol 4 stops old tabs reading or writing until they reload. Their unsent edits stay on the device and send after the reload. A reload during the few minutes between the server deploy and the web deploy still gets the old build.

This breaks AGENTS.md's rule that a server change keeps working with the live web build. Dara approved it on 2026-10-01: an update means a reload, as in other apps. From this build on, a refusal says so on screen (6104d28): a reload prompt on web, an update prompt on desktop, and nothing discarded.

What changed beyond the merge

Bringing main across

  • Main's 7 commits. Paranoia's v104 migration now runs in StrategyMigrator. The folder grid and empty-state changes are ported to the cloud library. Defense resize was already on cloud.
  • Cloud Paranoias are corrected too. Cloud strategies never run local migrations, so every Paranoia on the server would have drawn with its Omen end 3 m off. A version-1 Paranoia row is corrected as it's read; nothing is rewritten on the server.
  • pubspec is now +104 to match Settings.versionNumber. bump_version.ps1 refuses a mismatch, so Release Desktop would have failed at its first step.

Rollback to 4.6.3 keeps the library whole

  • The hand-written Hive adapters saved for a rollback to 3.2.3: a subset of each page, plus JSON mirrors 4.6.3 ignores. Rolled back to 4.6.3, a library would have opened without its ellipses, view-cone and circle agents, firearms, lineup graph, ability visibility and folder icons, and 4.6.3's next save would have dropped them for good. Pages, agents, abilities, folders and drawings now save byte for byte as 4.6.3 does. Libraries saved by earlier cloud builds still load whole.
  • Tests decode with 4.6.3's own adapters, copied from the release tag. The Windows upgrade/rollback gate now starts from the 4.6.3 installer instead of 3.2.3.

Sync integrity

  • A recovered edit landing under a held item can be overwritten by the drop #220: a recovered edit is no longer silently replaced when you drop a held item over it. Astra reviewed the fix three times; each round found a race, and the third round came back clean.
  • One account's unsent work can no longer land as another account after a switch. applyBatch carries the originating account, and the queue rechecks the account after claiming.
  • A cloud failure at startup no longer locks you out of the local library. Signed out, the app no longer opens a Convex connection.
  • Save says "Saved" only when the save actually landed.
  • Leaving a cloud strategy with work pending (Home, or the new Reload) checks again at the moment you choose "Leave anyway", and never leaves quietly while a new draft is unsaved.

Desktop

  • Double-clicking an .ica while Icarus is open opens it again.

Wiring and cleanup

  • Deploy Web, CI and the contract gate run from main. Web deploys now queue instead of cancelling each other, so a cancelled run can't leave production on a new server with the old web build.
  • The upgrade/rollback gate gives each launch 30 seconds, not 12. A cold runner's first launch of 4.6.3 once missed 12, and the same gate runs before every desktop release.
  • Removed a 13 MB music video and a bun init stub that came in with icarus-cloud.

Verification

  • Local: 1491 Flutter tests pass, Convex 229/229, the contract audit passes, codegen shows no drift, and analyze reports infos only.
  • CI on this PR: every lane, including windows-build, which installs the signed 4.6.3 release, upgrades to this build and rolls back.
  • Real library: a copy of Dara's library (2 strategies, data version 100) upgrades to 104 and reads back whole through 4.6.3's adapters.
  • Release build, isolated store: the library loads signed out; a second launch with an .ica imports into the running window; folders line up with the strategy columns at two widths; the editor opens.
  • Reviews: Astra (static) reviewed every fix; findings were fixed until clean.

Known and left

  • Changing a strategy's map re-derives the correction for its untouched old cloud Paranoias, a shift of under a meter that every client agrees on.
  • Replayed transport mutations other than applyBatch (pages:add, folder ops, media) aren't bound to an account yet.
  • Leaving a strategy doesn't wait for lineup edits live sync withholds (a lineup missing its origin or landing). They're flagged for attention already, and blocking on them would trap the user.
  • During a refusal, Settings still shows "Cloud connection needs attention" with Reconnect.
  • TODO.md at the root is July's cloud UX work list. Delete it if it's done.

🤖 Generated with Claude Code

RetriggerConfidence Score: 2/5

Not ready to merge: three outstanding issues still require fixes.

Findings

  1. P1 Start the production backfill ▶
  2. P1 Keep shipped clients connected ▶
  3. P1 Older upload replaces newer image ▶

Summary

This PR brings cloud sync and the web beta into main. The latest change stabilizes a recently deleted dialog test. No new findings were identified, but three previously reported issues remain outstanding.

Reviews (6) · Last reviewed commit: "Pin the clock in the Recently deleted li..."

SunkenInTime and others added 30 commits August 25, 2026 02:26
…tics

Add stable cloud beta automation hooks
Refresh the Icarus Online beta readiness gate
Give cloud library states an obvious next step
Refactor cloud sync around server-side page boundaries
SunkenInTime and others added 5 commits October 1, 2026 10:37
With icarus-cloud merged, main is the one branch. Deploy Web now runs on
pushes to main (and refuses any other ref), CI no longer watches
icarus-cloud, and the contract gate records its merge base with
origin/main, so it keeps working once icarus-cloud is gone.

The release doc says so, and the typed-wrapper ADR no longer reads as
if clearing an outbox were acceptable: cloud has had real users since
2026-09-27.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Live sync compares whole payloads, so this pins the property the cloud
upgrade rests on: an upgraded row and the canvas encode identically.
Without the version 2 stamp on what the client writes, opening the page
would author a rewrite of every Paranoia on it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The runner closed every new launch as soon as it found an Icarus window,
but app_links only forwards a lone URI with a scheme. Double-clicking an
.ica file while Icarus was open did nothing, and a launch with its own
--hive-store-dir could not start beside another Icarus. Only an icarus://
link is handed to the running window natively now; every other launch
reaches Dart's per-store single-instance check, as it did in 4.6.3.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
#222 moved Settings.versionNumber to 104 for the Paranoia migration and
left pubspec at 4.6.3+103. bump_version.ps1 refuses to run on a mismatch,
so Release Desktop would have stopped before building. Both read 104
now; the release bump takes them to 105 together.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 732 files, which is 632 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 6fd0d29a-1d0d-48e9-9046-a725734edd5b

📥 Commits

Reviewing files that changed from the base of the PR and between d8f2a2d and f3f3e53.

⛔ Files ignored due to path filters (73)
  • convex/_generated/api.d.ts is excluded by !**/_generated/**
  • convex/_generated/api.js is excluded by !**/_generated/**
  • convex/_generated/dataModel.d.ts is excluded by !**/_generated/**
  • convex/_generated/server.d.ts is excluded by !**/_generated/**
  • convex/_generated/server.js is excluded by !**/_generated/**
  • lib/collab/generated/convex_error_codes.dart is excluded by !**/generated/**
  • lib/collab/generated/convex_models.dart is excluded by !**/generated/**
  • lib/collab/generated/generated.dart is excluded by !**/generated/**
  • lib/collab/generated/icarus_convex_api.dart is excluded by !**/generated/**
  • macos/Podfile.lock is excluded by !**/*.lock
  • package-lock.json is excluded by !**/package-lock.json
  • presence/package-lock.json is excluded by !**/package-lock.json
  • pubspec.lock is excluded by !**/*.lock
  • third_party/convex_flutter/cargokit/build_tool/pubspec.lock is excluded by !**/*.lock
  • third_party/convex_flutter/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png is excluded by !**/*.png
  • third_party/convex_flutter/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png is excluded by !**/*.png
  • third_party/convex_flutter/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png is excluded by !**/*.png
  • third_party/convex_flutter/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png is excluded by !**/*.png
  • third_party/convex_flutter/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Podfile.lock is excluded by !**/*.lock
  • third_party/convex_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • third_party/convex_flutter/example/ios/Runner.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Podfile.lock is excluded by !**/*.lock
  • third_party/convex_flutter/example/macos/Runner.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png is excluded by !**/*.png
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png is excluded by !**/*.png
  • third_party/convex_flutter/example/screenshots/app_screenshot.png is excluded by !**/*.png
  • third_party/convex_flutter/example/screenshots/messaging_screenshot.png is excluded by !**/*.png
  • third_party/convex_flutter/example/web/favicon.png is excluded by !**/*.png
  • third_party/convex_flutter/example/web/icons/Icon-192.png is excluded by !**/*.png
  • third_party/convex_flutter/example/web/icons/Icon-512.png is excluded by !**/*.png
  • third_party/convex_flutter/example/web/icons/Icon-maskable-192.png is excluded by !**/*.png
  • third_party/convex_flutter/example/web/icons/Icon-maskable-512.png is excluded by !**/*.png
  • third_party/convex_flutter/example/windows/runner/resources/app_icon.ico is excluded by !**/*.ico
  • third_party/convex_flutter/rust/Cargo.lock is excluded by !**/*.lock
  • third_party/convex_rs/Cargo.lock is excluded by !**/*.lock
  • third_party/convex_rs/examples/quickstart/package-lock.json is excluded by !**/package-lock.json
  • tool/convex_client_gauntlet/pubspec.lock is excluded by !**/*.lock
  • tool/convex_client_gauntlet/runtime/app/macos/Podfile.lock is excluded by !**/*.lock
  • tool/convex_client_gauntlet/runtime/app/macos/Runner.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png is excluded by !**/*.png
  • tool/convex_client_gauntlet/runtime/app/pubspec.lock is excluded by !**/*.lock
  • tool/convex_client_gauntlet/runtime/pubspec.lock is excluded by !**/*.lock
  • tool/icarus_convex_codegen/pubspec.lock is excluded by !**/*.lock
📒 Files selected for processing (732)
  • .cursor/mcp.json
  • .cursor/rules/code-gen-rules.mdc
  • .cursor/skills/frontend-design/SKILL.md
  • .github/actions/setup-flutter/action.yml
  • .github/workflows/ci.yml
  • .github/workflows/deploy-convex-production.yml
  • .github/workflows/deploy-web.yml
  • .github/workflows/release-desktop.yml
  • .github/workflows/release-store.yml
  • AGENTS.md
  • CONTEXT.md
  • DESIGN.md
  • PRODUCT.md
  • README.md
  • analysis_options.yaml
  • assets/icarus-icon.webp
  • convex/accessControl.test.ts
  • convex/auth.config.ts
  • convex/cloudProtocol.test.ts
  • convex/crons.ts
  • convex/elements.ts
  • convex/error_codes.json
  • convex/folders.test.ts
  • convex/folders.ts
  • convex/function_spec.json
  • convex/health.ts
  • convex/imageAssetLifecycle.test.ts
  • convex/images.ts
  • convex/invites.ts
  • convex/lib/assetReferences.ts
  • convex/lib/auth.ts
  • convex/lib/canonicalValues.ts
  • convex/lib/cloudProtocol.ts
  • convex/lib/entities.ts
  • convex/lib/errors.ts
  • convex/lib/imageAssets.ts
  • convex/lib/opTypes.ts
  • convex/lib/opTypes.typecheck.ts
  • convex/lib/payloadValidators.ts
  • convex/lib/profile.ts
  • convex/lib/publicValidators.ts
  • convex/lib/r2.ts
  • convex/lib/snapshotSerialization.ts
  • convex/lib/strategyAgentSummary.ts
  • convex/lineupGraph.test.ts
  • convex/lineups.ts
  • convex/maintenance.ts
  • convex/mediaLimits.test.ts
  • convex/ops.ts
  • convex/page.ts
  • convex/pageTrash.test.ts
  • convex/pages.ts
  • convex/presence.test.ts
  • convex/presence.ts
  • convex/referencedAssetIds.test.ts
  • convex/schema.ts
  • convex/shareLinkViewing.test.ts
  • convex/shares.ts
  • convex/strategies.ts
  • convex/strategy.ts
  • convex/strategyDuplicate.test.ts
  • convex/syncBoundaries.test.ts
  • convex/test.setup.ts
  • convex/testContent.helpers.ts
  • convex/tsconfig.json
  • convex/users.test.ts
  • convex/users.ts
  • docs/adr/0001-icarus-owns-typed-convex-wrapper.md
  • docs/auth_flow_reference.md
  • docs/cloud_online_release_gaps.md
  • docs/cloud_sync_refactor/convex_dart_client_fair_rerun_handoff.html
  • docs/cloud_sync_refactor/convex_dart_client_fair_rerun_result.md
  • docs/cloud_sync_refactor/convex_dart_client_gauntlet_result.md
  • docs/cloud_sync_refactor/convex_sync_refactor_plan.md
  • docs/cloud_sync_refactor/server_side_sync_boundaries_blueprint.html
  • docs/cloud_sync_refactor/server_side_sync_boundaries_delivery.md
  • docs/cloud_sync_refactor/server_side_sync_boundaries_handoff.md
  • docs/cloud_sync_refactor/typed_convex_wrapper_implementation_handoff.html
  • docs/cloudflare_r2_media_storage.md
  • docs/mockups/library-nav-alternatives.html
  • docs/release_process.md
  • lib/collab/canonical_json.dart
  • lib/collab/cloud_library_models.dart
  • lib/collab/cloud_lineup_rows.dart
  • lib/collab/cloud_media_models.dart
  • lib/collab/cloud_payload_upgrade.dart
  • lib/collab/cloud_sync_error_message.dart
  • lib/collab/collab_models.dart
  • lib/collab/convex_client.dart
  • lib/collab/convex_payload_codecs.dart
  • lib/collab/convex_strategy_repository.dart
  • lib/collab/durable_cloud_media_outbox.dart
  • lib/collab/durable_strategy_outbox.dart
  • lib/collab/pending_media_bytes_store.dart
  • lib/collab/presence/presence_models.dart
  • lib/collab/presence/presence_room.dart
  • lib/collab/src/convex_client_native.dart
  • lib/collab/src/convex_client_types.dart
  • lib/collab/src/convex_client_web.dart
  • lib/collab/strategy_capabilities.dart
  • lib/collab/transport/convex_transport.dart
  • lib/collab/transport/convex_transport_adapter.dart
  • lib/collab/transport/src/convex_transport_native.dart
  • lib/collab/transport/src/convex_transport_web.dart
  • lib/collab/transport/src/normalized_convex_transport.dart
  • lib/config/cloud_build_config.dart
  • lib/config/cloud_startup.dart
  • lib/config/platform_policy.dart
  • lib/const/coordinate_system.dart
  • lib/const/hive_boxes.dart
  • lib/const/json_converters.dart
  • lib/const/line_provider.dart
  • lib/const/placed_classes.dart
  • lib/const/placed_classes.g.dart
  • lib/const/placed_media_dimensions.dart
  • lib/const/placed_media_geometry.dart
  • lib/const/settings.dart
  • lib/const/sort_index_order.dart
  • lib/const/transition_data.dart
  • lib/const/update_checker.dart
  • lib/domain/folder.dart
  • lib/hive/hive_adapters.dart
  • lib/hive/hive_adapters.g.dart
  • lib/hive/hive_adapters.g.yaml
  • lib/hive/hive_registrar.g.dart
  • lib/hive/hive_registration.dart
  • lib/interactive_map.dart
  • lib/main.dart
  • lib/migrations/paranoia_range_migration.dart
  • lib/providers/ability_provider.dart
  • lib/providers/action_history_models.dart
  • lib/providers/action_provider.dart
  • lib/providers/agent_provider.dart
  • lib/providers/auth_provider.dart
  • lib/providers/collab/active_page_live_sync_models.dart
  • lib/providers/collab/active_page_live_sync_provider.dart
  • lib/providers/collab/client_upgrade_required_provider.dart
  • lib/providers/collab/cloud_collab_provider.dart
  • lib/providers/collab/cloud_media_cache_provider.dart
  • lib/providers/collab/cloud_media_upload_queue_provider.dart
  • lib/providers/collab/cloud_migration_provider.dart
  • lib/providers/collab/cloud_sync_status_provider.dart
  • lib/providers/collab/convex_connection_provider.dart
  • lib/providers/collab/media_bytes_source.dart
  • lib/providers/collab/remote_library_provider.dart
  • lib/providers/collab/remote_strategy_snapshot_provider.dart
  • lib/providers/collab/strategy_capabilities_provider.dart
  • lib/providers/collab/strategy_conflict_provider.dart
  • lib/providers/collab/strategy_op_queue_provider.dart
  • lib/providers/collab/strategy_presence_provider.dart
  • lib/providers/collab/trashed_pages_provider.dart
  • lib/providers/drawing_provider.dart
  • lib/providers/editor_operation_provider.dart
  • lib/providers/folder_provider.dart
  • lib/providers/image_provider.dart
  • lib/providers/image_widget_size_provider.dart
  • lib/providers/library_navigation_provider.dart
  • lib/providers/library_workspace_provider.dart
  • lib/providers/map_provider.dart
  • lib/providers/marker_sizes_sync.dart
  • lib/providers/share_link_provider.dart
  • lib/providers/strategy_filter_provider.dart
  • lib/providers/strategy_image_source.dart
  • lib/providers/strategy_page_session_provider.dart
  • lib/providers/strategy_provider.dart
  • lib/providers/strategy_save_state_provider.dart
  • lib/providers/text_provider.dart
  • lib/providers/text_widget_height_provider.dart
  • lib/providers/update_status_provider.dart
  • lib/providers/user_preferences_provider.dart
  • lib/providers/utility_provider.dart
  • lib/screenshot/capture_images.dart
  • lib/screenshot/offscreen_capture.dart
  • lib/screenshot/page_screenshot.dart
  • lib/screenshot/screenshot_view.dart
  • lib/services/app_error_reporter.dart
  • lib/services/archive_manifest.dart
  • lib/services/auth_callback_uri.dart
  • lib/services/browser_url.dart
  • lib/services/browser_url_stub.dart
  • lib/services/browser_url_web.dart
  • lib/services/cloud_library_action.dart
  • lib/services/cloud_sign_out_coordinator.dart
  • lib/services/cloud_strategy_export.dart
  • lib/services/deep_link_registrar.dart
  • lib/services/deep_link_registrar_native.dart
  • lib/services/deep_link_registrar_stub.dart
  • lib/services/guarded_sign_out.dart
  • lib/services/local_image_file.dart
  • lib/services/local_image_file_native.dart
  • lib/services/local_image_file_stub.dart
  • lib/services/open_cloud_strategy_store.dart
  • lib/services/open_cloud_strategy_store_stub.dart
  • lib/services/open_cloud_strategy_store_web.dart
  • lib/services/unsaved_strategy_guard.dart
  • lib/services/video_export/browser_video_sink.dart
  • lib/services/video_export/browser_video_sink_stub.dart
  • lib/services/video_export/browser_video_sink_web.dart
  • lib/services/video_export/ffmpeg_video_encoder.dart
  • lib/services/video_export/ffmpeg_video_sink.dart
  • lib/services/video_export/mp4_muxer.dart
  • lib/services/video_export/video_export_errors.dart
  • lib/services/video_export/video_export_source.dart
  • lib/services/video_export/video_exporter.dart
  • lib/services/video_export/video_frame_sink.dart
  • lib/services/video_export/web_codecs_video_encoder.dart
  • lib/share/current_share_origin.dart
  • lib/share/pending_share_code_store.dart
  • lib/share/pending_share_code_store_stub.dart
  • lib/share/pending_share_code_store_web.dart
  • lib/share/share_link_copy.dart
  • lib/share/share_link_format.dart
  • lib/startup/cloud_bootstrap.dart
  • lib/strategy/remote_page_merge.dart
  • lib/strategy/strategy_cloud_migration.dart
  • lib/strategy/strategy_import_export.dart
  • lib/strategy/strategy_migrator.dart
  • lib/strategy/strategy_models.dart
  • lib/strategy/strategy_page_apply.dart
  • lib/strategy/strategy_page_models.dart
  • lib/strategy/strategy_page_source.dart
  • lib/strategy_view.dart
  • lib/widgets/account_avatar.dart
  • lib/widgets/client_upgrade_button.dart
  • lib/widgets/cloud_outbox_summary_banner.dart
  • lib/widgets/cloud_sync_button.dart
  • lib/widgets/custom_text_field.dart
  • lib/widgets/demo_dialog.dart
  • lib/widgets/demo_tag.dart
  • lib/widgets/dialogs/auth/auth_dialog.dart
  • lib/widgets/dialogs/confirm_alert_dialog.dart
  • lib/widgets/dialogs/create_lineup_dialog.dart
  • lib/widgets/dialogs/delete_folder_alert_dialog.dart
  • lib/widgets/dialogs/delete_page_dialog.dart
  • lib/widgets/dialogs/deleted_page_dialog.dart
  • lib/widgets/dialogs/export_video_dialog.dart
  • lib/widgets/dialogs/lineup_panel_dialog.dart
  • lib/widgets/dialogs/recently_deleted_dialog.dart
  • lib/widgets/dialogs/share_links_dialog.dart
  • lib/widgets/dialogs/strategy/delete_strategy_alert_dialog.dart
  • lib/widgets/dialogs/strategy/line_up_media_page.dart
  • lib/widgets/dialogs/strategy/rename_strategy_dialog.dart
  • lib/widgets/dialogs/upload_image_dialog.dart
  • lib/widgets/dialogs/web_beta_dialog.dart
  • lib/widgets/dot_painter.dart
  • lib/widgets/draggable_widgets/ability/ability_visibility_context_menu.dart
  • lib/widgets/draggable_widgets/ability/placed_ability_widget.dart
  • lib/widgets/draggable_widgets/ability/placed_deadlock_barrier_mesh_widget.dart
  • lib/widgets/draggable_widgets/agents/agent_widget.dart
  • lib/widgets/draggable_widgets/agents/placed_lineup_agent_widget.dart
  • lib/widgets/draggable_widgets/image/image_widget.dart
  • lib/widgets/draggable_widgets/image/placed_image_builder.dart
  • lib/widgets/draggable_widgets/placed_widget_builder.dart
  • lib/widgets/draggable_widgets/text/text_widget.dart
  • lib/widgets/draggable_widgets/utilities/placed_view_cone_widget.dart
  • lib/widgets/editor_operation_scope.dart
  • lib/widgets/editor_toolbar.dart
  • lib/widgets/folder_card.dart
  • lib/widgets/folder_content.dart
  • lib/widgets/folder_edit_dialog.dart
  • lib/widgets/folder_navigator.dart
  • lib/widgets/folder_pill.dart
  • lib/widgets/global_shortcuts.dart
  • lib/widgets/ica_drop_target.dart
  • lib/widgets/image_drop_target.dart
  • lib/widgets/library_breadcrumb.dart
  • lib/widgets/library_entries.dart
  • lib/widgets/library_title_strip.dart
  • lib/widgets/line_up_line_painter.dart
  • lib/widgets/line_up_media_carousel.dart
  • lib/widgets/line_up_widget.dart
  • lib/widgets/map_selector.dart
  • lib/widgets/map_theme_settings_section.dart
  • lib/widgets/mouse_navigation.dart
  • lib/widgets/page_transition_overlay.dart
  • lib/widgets/pages_bar.dart
  • lib/widgets/platform_feature_toast.dart
  • lib/widgets/role_badge.dart
  • lib/widgets/settings_tab.dart
  • lib/widgets/sidebar_widgets/custom_shape_tools.dart
  • lib/widgets/sidebar_widgets/tool_grid.dart
  • lib/widgets/strategy_edit_boundary.dart
  • lib/widgets/strategy_presence.dart
  • lib/widgets/strategy_quick_switcher.dart
  • lib/widgets/strategy_save_icon_button.dart
  • lib/widgets/strategy_tile/strategy_tile.dart
  • lib/widgets/strategy_tile/strategy_tile_sections.dart
  • lib/widgets/strategy_view_skeleton.dart
  • lib/widgets/strip_status_icons.dart
  • lib/widgets/web_beta_tag.dart
  • lib/widgets/youtube_view.dart
  • linux/flutter/generated_plugin_registrant.cc
  • linux/flutter/generated_plugins.cmake
  • macos/Flutter/GeneratedPluginRegistrant.swift
  • macos/Runner/Release.entitlements
  • package.json
  • packages/custom_mouse_cursor/lib/custom_mouse_cursor.dart
  • packages/custom_mouse_cursor/macos/Classes/CustomMouseCursorPlugin.swift
  • presence/.gitignore
  • presence/README.md
  • presence/package.json
  • presence/src/index.ts
  • presence/src/pass.ts
  • presence/src/room.ts
  • presence/test/env.d.ts
  • presence/test/presence.test.ts
  • presence/tsconfig.json
  • presence/vitest.config.ts
  • presence/wrangler.jsonc
  • pubspec.yaml
  • release/metadata/4.6.1+97.json
  • scripts/assert_release_preflight.ps1
  • scripts/build_desktop_release.ps1
  • scripts/build_store_release.ps1
  • scripts/common_release.ps1
  • scripts/publish_pages_branch.ps1
  • scripts/release_desktop.ps1
  • scripts/test_online_beta_windows_upgrade.ps1
  • scripts/test_release_safety.ps1
  • test/ability_anchor_scaling_test.dart
  • test/action_history_hydration_test.dart
  • test/action_provider_bulk_clear_test.dart
  • test/agent_dragable_lineup_state_test.dart
  • test/agent_weapon_test.dart
  • test/auth_callback_uri_test.dart
  • test/canonical_coordinates_test.dart
  • test/canvas_entity_hold_test.dart
  • test/capture_images_test.dart
  • test/cloud_build_config_test.dart
  • test/cloud_lineup_rows_test.dart
  • test/cloud_media_upload_queue_provider_test.dart
  • test/cloud_payload_upgrade_test.dart
  • test/cloud_sign_out_coordinator_test.dart
  • test/cloud_startup_test.dart
  • test/cloud_ui_parity_helpers_test.dart
  • test/collab/cloud_sync_error_message_test.dart
  • test/collab/convex_read_protocol_test.dart
  • test/collab/presence_room_test.dart
  • test/collab/referenced_asset_ids_test.dart
  • test/collab_sync_models_test.dart
  • test/color_persistence_test.dart
  • test/convex_architecture_test.dart
  • test/convex_connection_provider_test.dart
  • test/convex_generated_client_test.dart
  • test/custom_shape_color_test.dart
  • test/custom_shape_indicator_test.dart
  • test/delete_menu_focus_test.dart
  • test/desktop_4_6_3_adapters_test_support.dart
  • test/desktop_image_size_test.dart
  • test/discord_presence_service_test.dart
  • test/drawing_merge_path_test.dart
  • test/drawing_provider_test.dart
  • test/durable_cloud_media_outbox_version_test.dart
  • test/durable_strategy_outbox_version_test.dart
  • test/editor_operation_scope_test.dart
  • test/folder_content_empty_states_test.dart
  • test/folder_grid_alignment_test.dart
  • test/global_strategy_outbox_test.dart
  • test/hive_desktop_rollback_test.dart
  • test/hive_registry_layout_test.dart
  • test/ica_drop_target_test.dart
  • test/image_provider_cloud_durability_test.dart
  • test/interactive_map_canonical_center_test.dart
  • test/library_entries_test.dart
  • test/library_navigation_provider_test.dart
  • test/library_workspace_provider_test.dart
  • test/lineup_add_item_interaction_test.dart
  • test/lineup_graph_test.dart
  • test/lineup_group_migration_test.dart
  • test/local_library_policy_test.dart
  • test/macos_release_entitlements_test.dart
  • test/mouse_navigation_test.dart
  • test/mp4_box_test_support.dart
  • test/mp4_muxer_test.dart
  • test/page_screenshot_test.dart
  • test/paranoia_range_migration_test.dart
  • test/pending_share_code_store_test.dart
  • test/per_object_undo_test.dart
  • test/placed_box_resize_test.dart
  • test/placed_media_dimensions_test.dart
  • test/providers/auth_provider_test.dart
  • test/providers/cloud_library_action_providers_test.dart
  • test/providers/cloud_migration_provider_test.dart
  • test/providers/folder_provider_test.dart
  • test/providers/remote_library_provider_test.dart
  • test/providers/strategy_duplicate_test.dart
  • test/providers/strategy_rename_test.dart
  • test/rectangle_axis_resize_geometry_test.dart
  • test/remote_editor_snapshot_provider_test.dart
  • test/remote_page_merge_test.dart
  • test/screenshot_export_failure_test.dart
  • test/screenshot_view_test.dart
  • test/share/share_link_copy_test.dart
  • test/share_link_format_test.dart
  • test/share_redemption_mapping_test.dart
  • test/side_switch_media_test.dart
  • test/sort_index_tie_order_test.dart
  • test/strategy_cloud_migration_test.dart
  • test/strategy_edit_access_test.dart
  • test/strategy_folder_import_test.dart
  • test/strategy_image_source_test.dart
  • test/strategy_import_version_guard_test.dart
  • test/strategy_integrity_test.dart
  • test/strategy_op_queue_provider_test.dart
  • test/strategy_page_session_provider_test.dart
  • test/strategy_provider_save_queue_test.dart
  • test/strategy_switch_side_test.dart
  • test/sunset_scale_migration_test.dart
  • test/text_editing_shortcut_scope_test.dart
  • test/text_provider_test.dart
  • test/text_widget_resilience_test.dart
  • test/unsaved_strategy_guard_test.dart
  • test/update_checker_test.dart
  • test/video_export_navigation_failure_test.dart
  • test/video_export_source_test.dart
  • test/video_exporter_sink_test.dart
  • test/web/web_codecs_video_encoder_test.dart
  • test/web_editor_reload_test.dart
  • test/web_media_bytes_upload_test.dart
  • test/widgets/account_avatar_test.dart
  • test/widgets/cloud_beta_automation_semantics_test.dart
  • test/widgets/cloud_library_action_dialogs_test.dart
  • test/widgets/cloud_library_empty_states_test.dart
  • test/widgets/cloud_outbox_summary_banner_test.dart
  • test/widgets/cloud_sync_button_test.dart
  • test/widgets/confirm_alert_dialog_semantics_test.dart
  • test/widgets/delete_page_dialog_test.dart
  • test/widgets/pages_bar_recently_deleted_test.dart
  • test/widgets/pages_bar_undo_delete_test.dart
  • test/widgets/recently_deleted_dialog_test.dart
  • test/widgets/settings_sign_out_test.dart
  • test/widgets/strategy_presence_test.dart
  • test/widgets/strategy_quick_switcher_layout_test.dart
  • test/widgets/strategy_save_toast_test.dart
  • test/widgets/strategy_tile_actions_semantics_test.dart
  • test/widgets/strategy_title_rename_test.dart
  • test/widgets/web_beta_library_test.dart
  • test/windows_desktop_update_controller_test.dart
  • test/windows_online_beta_library_probe_test.dart
  • test/world_based_media_sizing_test.dart
  • third_party/convex_flutter/ARCHITECTURE.md
  • third_party/convex_flutter/CHANGELOG.md
  • third_party/convex_flutter/CONTRIBUTING.md
  • third_party/convex_flutter/ICARUS_PATCH.md
  • third_party/convex_flutter/LICENSE
  • third_party/convex_flutter/MIGRATION_v3.md
  • third_party/convex_flutter/PLATFORM_CONFIGURATION.md
  • third_party/convex_flutter/PUB_DEPLOY_GUIDE.md
  • third_party/convex_flutter/README.md
  • third_party/convex_flutter/analysis_options.yaml
  • third_party/convex_flutter/android/build.gradle
  • third_party/convex_flutter/android/settings.gradle
  • third_party/convex_flutter/android/src/main/AndroidManifest.xml
  • third_party/convex_flutter/build.yaml
  • third_party/convex_flutter/cargokit/LICENSE
  • third_party/convex_flutter/cargokit/README
  • third_party/convex_flutter/cargokit/build_pod.sh
  • third_party/convex_flutter/cargokit/build_tool/README.md
  • third_party/convex_flutter/cargokit/build_tool/analysis_options.yaml
  • third_party/convex_flutter/cargokit/build_tool/bin/build_tool.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/build_tool.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/android_environment.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/artifacts_provider.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/build_cmake.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/build_gradle.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/build_pod.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/build_tool.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/builder.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/cargo.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/crate_hash.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/environment.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/logging.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/options.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/precompile_binaries.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/rustup.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/target.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/util.dart
  • third_party/convex_flutter/cargokit/build_tool/lib/src/verify_binaries.dart
  • third_party/convex_flutter/cargokit/build_tool/pubspec.yaml
  • third_party/convex_flutter/cargokit/cmake/cargokit.cmake
  • third_party/convex_flutter/cargokit/cmake/resolve_symlinks.ps1
  • third_party/convex_flutter/cargokit/gradle/plugin.gradle
  • third_party/convex_flutter/cargokit/run_build_tool.cmd
  • third_party/convex_flutter/cargokit/run_build_tool.sh
  • third_party/convex_flutter/example/HEALTH_CHECK.md
  • third_party/convex_flutter/example/README.md
  • third_party/convex_flutter/example/analysis_options.yaml
  • third_party/convex_flutter/example/android/app/build.gradle.kts
  • third_party/convex_flutter/example/android/app/src/debug/AndroidManifest.xml
  • third_party/convex_flutter/example/android/app/src/main/AndroidManifest.xml
  • third_party/convex_flutter/example/android/app/src/main/kotlin/com/example/convex_flutter_example/MainActivity.kt
  • third_party/convex_flutter/example/android/app/src/main/res/drawable-v21/launch_background.xml
  • third_party/convex_flutter/example/android/app/src/main/res/drawable/launch_background.xml
  • third_party/convex_flutter/example/android/app/src/main/res/values-night/styles.xml
  • third_party/convex_flutter/example/android/app/src/main/res/values/styles.xml
  • third_party/convex_flutter/example/android/app/src/profile/AndroidManifest.xml
  • third_party/convex_flutter/example/android/build.gradle.kts
  • third_party/convex_flutter/example/android/gradle.properties
  • third_party/convex_flutter/example/android/gradle/wrapper/gradle-wrapper.properties
  • third_party/convex_flutter/example/android/settings.gradle.kts
  • third_party/convex_flutter/example/integration_test/simple_test.dart
  • third_party/convex_flutter/example/ios/Flutter/AppFrameworkInfo.plist
  • third_party/convex_flutter/example/ios/Flutter/Debug.xcconfig
  • third_party/convex_flutter/example/ios/Flutter/Release.xcconfig
  • third_party/convex_flutter/example/ios/Podfile
  • third_party/convex_flutter/example/ios/Runner.xcodeproj/project.pbxproj
  • third_party/convex_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • third_party/convex_flutter/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  • third_party/convex_flutter/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  • third_party/convex_flutter/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • third_party/convex_flutter/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
  • third_party/convex_flutter/example/ios/Runner/AppDelegate.swift
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
  • third_party/convex_flutter/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
  • third_party/convex_flutter/example/ios/Runner/Base.lproj/LaunchScreen.storyboard
  • third_party/convex_flutter/example/ios/Runner/Base.lproj/Main.storyboard
  • third_party/convex_flutter/example/ios/Runner/Info.plist
  • third_party/convex_flutter/example/ios/Runner/Runner-Bridging-Header.h
  • third_party/convex_flutter/example/ios/RunnerTests/RunnerTests.swift
  • third_party/convex_flutter/example/lib/main.dart
  • third_party/convex_flutter/example/lib/screens/advanced_screen.dart
  • third_party/convex_flutter/example/lib/screens/authentication_screen.dart
  • third_party/convex_flutter/example/lib/screens/connection_screen.dart
  • third_party/convex_flutter/example/lib/screens/home_screen.dart
  • third_party/convex_flutter/example/lib/screens/messaging_screen.dart
  • third_party/convex_flutter/example/lib/widgets/connection_status_indicator.dart
  • third_party/convex_flutter/example/linux/CMakeLists.txt
  • third_party/convex_flutter/example/linux/flutter/CMakeLists.txt
  • third_party/convex_flutter/example/linux/flutter/generated_plugin_registrant.cc
  • third_party/convex_flutter/example/linux/flutter/generated_plugin_registrant.h
  • third_party/convex_flutter/example/linux/flutter/generated_plugins.cmake
  • third_party/convex_flutter/example/linux/runner/CMakeLists.txt
  • third_party/convex_flutter/example/linux/runner/main.cc
  • third_party/convex_flutter/example/linux/runner/my_application.cc
  • third_party/convex_flutter/example/linux/runner/my_application.h
  • third_party/convex_flutter/example/macos/Flutter/Flutter-Debug.xcconfig
  • third_party/convex_flutter/example/macos/Flutter/Flutter-Release.xcconfig
  • third_party/convex_flutter/example/macos/Flutter/GeneratedPluginRegistrant.swift
  • third_party/convex_flutter/example/macos/Podfile
  • third_party/convex_flutter/example/macos/Runner.xcodeproj/project.pbxproj
  • third_party/convex_flutter/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • third_party/convex_flutter/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  • third_party/convex_flutter/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • third_party/convex_flutter/example/macos/Runner/AppDelegate.swift
  • third_party/convex_flutter/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  • third_party/convex_flutter/example/macos/Runner/Base.lproj/MainMenu.xib
  • third_party/convex_flutter/example/macos/Runner/Configs/AppInfo.xcconfig
  • third_party/convex_flutter/example/macos/Runner/Configs/Debug.xcconfig
  • third_party/convex_flutter/example/macos/Runner/Configs/Release.xcconfig
  • third_party/convex_flutter/example/macos/Runner/Configs/Warnings.xcconfig
  • third_party/convex_flutter/example/macos/Runner/DebugProfile.entitlements
  • third_party/convex_flutter/example/macos/Runner/Info.plist
  • third_party/convex_flutter/example/macos/Runner/MainFlutterWindow.swift
  • third_party/convex_flutter/example/macos/Runner/Release.entitlements
  • third_party/convex_flutter/example/macos/RunnerTests/RunnerTests.swift
  • third_party/convex_flutter/example/pubspec.yaml
  • third_party/convex_flutter/example/test/widget_test.dart
  • third_party/convex_flutter/example/web/index.html
  • third_party/convex_flutter/example/web/manifest.json
  • third_party/convex_flutter/example/windows/CMakeLists.txt
  • third_party/convex_flutter/example/windows/flutter/CMakeLists.txt
  • third_party/convex_flutter/example/windows/flutter/generated_plugin_registrant.cc
  • third_party/convex_flutter/example/windows/flutter/generated_plugin_registrant.h
  • third_party/convex_flutter/example/windows/flutter/generated_plugins.cmake
  • third_party/convex_flutter/example/windows/runner/CMakeLists.txt
  • third_party/convex_flutter/example/windows/runner/Runner.rc
  • third_party/convex_flutter/example/windows/runner/flutter_window.cpp
  • third_party/convex_flutter/example/windows/runner/flutter_window.h
  • third_party/convex_flutter/example/windows/runner/main.cpp
  • third_party/convex_flutter/example/windows/runner/resource.h
  • third_party/convex_flutter/example/windows/runner/runner.exe.manifest
  • third_party/convex_flutter/example/windows/runner/utils.cpp
  • third_party/convex_flutter/example/windows/runner/utils.h
  • third_party/convex_flutter/example/windows/runner/win32_window.cpp
  • third_party/convex_flutter/example/windows/runner/win32_window.h
  • third_party/convex_flutter/flutter_rust_bridge.yaml
  • third_party/convex_flutter/ios/Classes/dummy_file.c
  • third_party/convex_flutter/ios/convex_flutter.podspec
  • third_party/convex_flutter/lib/convex_flutter.dart
  • third_party/convex_flutter/lib/convex_flutter_web.dart
  • third_party/convex_flutter/lib/src/app_lifecycle_event.dart
  • third_party/convex_flutter/lib/src/app_lifecycle_observer.dart
  • third_party/convex_flutter/lib/src/connection_status.dart
  • third_party/convex_flutter/lib/src/convex_client.dart
  • third_party/convex_flutter/lib/src/convex_config.dart
  • third_party/convex_flutter/lib/src/impl/convex_client_factory.dart
  • third_party/convex_flutter/lib/src/impl/convex_client_factory_io.dart
  • third_party/convex_flutter/lib/src/impl/convex_client_factory_web.dart
  • third_party/convex_flutter/lib/src/impl/convex_client_interface.dart
  • third_party/convex_flutter/lib/src/impl/convex_client_native.dart
  • third_party/convex_flutter/lib/src/impl/convex_client_web.dart
  • third_party/convex_flutter/lib/src/rust/frb_generated.dart
  • third_party/convex_flutter/lib/src/rust/frb_generated.io.dart
  • third_party/convex_flutter/lib/src/rust/frb_generated.web.dart
  • third_party/convex_flutter/lib/src/rust/lib.dart
  • third_party/convex_flutter/lib/src/rust/lib.freezed.dart
  • third_party/convex_flutter/lib/src/utils.dart
  • third_party/convex_flutter/linux/CMakeLists.txt
  • third_party/convex_flutter/macos/Classes/dummy_file.c
  • third_party/convex_flutter/macos/convex_flutter.podspec
  • third_party/convex_flutter/pubspec.yaml
  • third_party/convex_flutter/rust/Cargo.toml
  • third_party/convex_flutter/rust/example/lib/main.dart
  • third_party/convex_flutter/rust/src/frb_generated.rs
  • third_party/convex_flutter/rust/src/lib.rs
  • third_party/convex_flutter/test_driver/integration_test.dart
  • third_party/convex_flutter/windows/CMakeLists.txt
  • third_party/convex_rs/.gitignore
  • third_party/convex_rs/.prettierrc
  • third_party/convex_rs/CHANGELOG.md
  • third_party/convex_rs/CONTRIBUTING.md
  • third_party/convex_rs/Cargo.toml
  • third_party/convex_rs/Cargo.toml.orig
  • third_party/convex_rs/ICARUS_PATCH.md
  • third_party/convex_rs/LICENSE
  • third_party/convex_rs/README.md
  • third_party/convex_rs/examples/convex_chat_client.rs
  • third_party/convex_rs/examples/quickstart/convex/tasks.ts
  • third_party/convex_rs/examples/quickstart/main.rs
  • third_party/convex_rs/examples/quickstart/package.json
  • third_party/convex_rs/examples/quickstart/sampleData.jsonl
  • third_party/convex_rs/rust-toolchain
  • third_party/convex_rs/rustfmt.toml
  • third_party/convex_rs/src/base_client/mod.rs
  • third_party/convex_rs/src/base_client/query_result.rs
  • third_party/convex_rs/src/base_client/request_manager.rs
  • third_party/convex_rs/src/client/mod.rs
  • third_party/convex_rs/src/client/subscription.rs
  • third_party/convex_rs/src/client/worker.rs
  • third_party/convex_rs/src/lib.rs
  • third_party/convex_rs/src/sync/mod.rs
  • third_party/convex_rs/src/sync/testing.rs
  • third_party/convex_rs/src/sync/web_socket_manager.rs
  • third_party/convex_rs/src/value/export/mod.rs
  • third_party/convex_rs/src/value/export/roundtrip.rs
  • third_party/convex_rs/src/value/json/bytes.rs
  • third_party/convex_rs/src/value/json/float.rs
  • third_party/convex_rs/src/value/json/integer.rs
  • third_party/convex_rs/src/value/json/mod.rs
  • third_party/convex_rs/src/value/mod.rs
  • third_party/convex_rs/src/value/sorting.rs
  • tool/audit_convex_contract.mjs
  • tool/check_convex_web_binding.mjs
  • tool/convex_client_gauntlet/.gitignore
  • tool/convex_client_gauntlet/README.md
  • tool/convex_client_gauntlet/analysis_options.yaml
  • tool/convex_client_gauntlet/bin/run.dart
  • tool/convex_client_gauntlet/fixtures/folders_argument_renamed.json
  • tool/convex_client_gauntlet/fixtures/folders_function_renamed.json
  • tool/convex_client_gauntlet/fixtures/folders_list_for_parent.json
  • tool/convex_client_gauntlet/fixtures/folders_missing_return.json
  • tool/convex_client_gauntlet/fixtures/folders_result_renamed.json
  • tool/convex_client_gauntlet/fixtures/folders_unsupported_validator.json
  • tool/convex_client_gauntlet/lib/contract_gate.dart
  • tool/convex_client_gauntlet/lib/strict_codegen.dart
  • tool/convex_client_gauntlet/pubspec.yaml
  • tool/convex_client_gauntlet/results/contract_gate.json
  • tool/convex_client_gauntlet/runtime/README.md
  • tool/convex_client_gauntlet/runtime/analysis_options.yaml
  • tool/convex_client_gauntlet/runtime/app/.gitignore
  • tool/convex_client_gauntlet/runtime/app/.metadata
  • tool/convex_client_gauntlet/runtime/app/README.md
  • tool/convex_client_gauntlet/runtime/app/analysis_options.yaml
  • tool/convex_client_gauntlet/runtime/app/lib/main.dart
  • tool/convex_client_gauntlet/runtime/app/macos/.gitignore
  • tool/convex_client_gauntlet/runtime/app/macos/Flutter/Flutter-Debug.xcconfig
  • tool/convex_client_gauntlet/runtime/app/macos/Flutter/Flutter-Release.xcconfig
  • tool/convex_client_gauntlet/runtime/app/macos/Flutter/GeneratedPluginRegistrant.swift
  • tool/convex_client_gauntlet/runtime/app/macos/Podfile
  • tool/convex_client_gauntlet/runtime/app/macos/Runner.xcodeproj/project.pbxproj
  • tool/convex_client_gauntlet/runtime/app/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • tool/convex_client_gauntlet/runtime/app/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
  • tool/convex_client_gauntlet/runtime/app/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/AppDelegate.swift
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Base.lproj/MainMenu.xib
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Configs/AppInfo.xcconfig
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Configs/Debug.xcconfig
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Configs/Release.xcconfig
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Configs/Warnings.xcconfig
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/DebugProfile.entitlements
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Info.plist
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/MainFlutterWindow.swift
  • tool/convex_client_gauntlet/runtime/app/macos/Runner/Release.entitlements
  • tool/convex_client_gauntlet/runtime/app/macos/RunnerTests/RunnerTests.swift
  • tool/convex_client_gauntlet/runtime/app/pubspec.yaml
  • tool/convex_client_gauntlet/runtime/fixtures/empty.json
  • tool/convex_client_gauntlet/runtime/lib/runner.dart
  • tool/convex_client_gauntlet/runtime/lib/transport.dart
  • tool/convex_client_gauntlet/runtime/lib/workload.dart
  • tool/convex_client_gauntlet/runtime/pubspec.yaml
  • tool/convex_client_gauntlet/runtime/results/convex_flutter_correctness.json
  • tool/convex_client_gauntlet/runtime/results/dartvex_correctness.json
  • tool/convex_client_gauntlet/runtime/results/fair_rerun_matrix.json
  • tool/convex_client_gauntlet/runtime/results/paired_profile_macos.json
  • tool/convex_client_gauntlet/runtime/test/transport_smoke_test.dart
  • tool/convex_client_gauntlet/runtime/test/workload_test.dart
  • tool/convex_client_gauntlet/runtime/tool/export_canonical_state.dart
  • tool/convex_client_gauntlet/runtime/tool/provision_test_account.dart
  • tool/convex_client_gauntlet/runtime/tool/run_paired_profile.sh
  • tool/convex_client_gauntlet/runtime/tool/summarize_paired_profile.dart
  • tool/convex_client_gauntlet/test/contract_gate_test.dart
  • tool/icarus_convex_codegen/README.md
  • tool/icarus_convex_codegen/analysis_options.yaml
  • tool/icarus_convex_codegen/bin/generate.dart
  • tool/icarus_convex_codegen/lib/icarus_convex_codegen.dart
  • tool/icarus_convex_codegen/lib/src/contract.dart
  • tool/icarus_convex_codegen/lib/src/emitter.dart
  • tool/icarus_convex_codegen/lib/src/mapper.dart
  • tool/icarus_convex_codegen/lib/src/parser.dart
  • tool/icarus_convex_codegen/lib/src/payload_bindings.dart
  • tool/icarus_convex_codegen/pubspec.yaml
  • tool/icarus_convex_codegen/test/fixtures/error_codes.json
  • tool/icarus_convex_codegen/test/fixtures/missing_return.json
  • tool/icarus_convex_codegen/test/fixtures/name_collision.json
  • tool/icarus_convex_codegen/test/fixtures/positive_all_nodes.json
  • tool/icarus_convex_codegen/test/fixtures/public_id.json
  • tool/icarus_convex_codegen/test/fixtures/unsupported_validator.json
  • tool/icarus_convex_codegen/test/generator_test.dart
  • tool/icarus_convex_codegen/test/goldens/failures.txt
  • tool/snapshot_convex_contract.mjs
  • tsconfig.json
  • vitest.config.ts
  • web/CONVEX_BROWSER_CLIENT.md
  • web/_headers
  • web/convex.browser.bundle.js
  • web/index.html
  • web/manifest.json
  • windows/flutter/generated_plugin_registrant.cc
  • windows/flutter/generated_plugins.cmake
  • windows/runner/main.cpp

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

SunkenInTime and others added 9 commits October 1, 2026 10:49
…opened

Marking ops present when the queue activated a strategy missed two
paths. A trip to a local strategy and back redraws the canvas from the
server, but the queue never switches, so work sent before the trip
landed as the canvas's own. And a successor promoted in the background
while the user opened its strategy was stored after activation looked,
so its new op ID went unmarked.

The queue now remembers the reverse: op IDs it made from the canvas's
desired ops, plus the ops it resends in their place. Live sync tells it
to forget them whenever it drops its bases and overlays (a strategy
opened or left, local ones included, or a reset), and ops asked for
before that are not counted. Every other ack is marked restored, so a
background promotion needs no bookkeeping at all. Remembered IDs are
pruned once their records are gone, inside the queue's serialized
writes.

The new regressions drive the real queue: a cloud, local, cloud round
trip through the page session with a drop over the landed edit, and a
gated store that opens the strategy mid-promotion.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Cloud bootstrap ran inline before runApp: a throwing outbox open, outbox
prepare, Convex init or Supabase init left the app unshown, so a signed-out
desktop user could not reach a healthy local library. startCloud now runs
those steps, never throws, and on the first failure leaves the cloud off for
the run: auth sees no session and every sign-in answers with the reason, the
outbox stores read and write nothing, and a toast says so once the app is up.
The release-build check for ICARUS_CLOUD_ENVIRONMENT still stops startup.

The outbox boxes now open with Hive's crash recovery off. Recovery truncates
a box at its first bad frame, silently deleting the unsent work after it; a
corrupt outbox now stays on disk byte for byte and the cloud stays off.

A signed-out startup also no longer clears Convex auth it never set, which
opened the Convex socket for users who never asked for the cloud.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The save button awaited forceSaveNow and picked its toast from media state
alone. In cloud mode a failed durable outbox write is recorded on the queue
and returned normally, so the toast said Saved for work that was not even on
this device; a local save that threw left no toast, and one that skipped a
strategy missing from the library said Saved.

The toast now reads where the work is after the save. Local: Saved only if
the library was written after the press. Cloud: not saved when an outbox
write failed, otherwise the sync button's own states and words (synced,
syncing, offline, needs attention). Failures use the destructive toast. A
failed outbox write also reads as unverified in the sync popover instead of
merely unsent.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The common bad frame in a box is the last one, torn by a crash or kill in
the middle of a write. Recovery trims only that write, which never completed
and was never reported saved. With recovery off, that ordinary crash left
cloud sync off for good with no way back, worse than the rare mid-file
corruption it guarded against. The startup test now checks that a torn final
frame is trimmed and the ops before it survive.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Unsent changes from one account could land on the server as another
account signed in on the same device. The queue checked the account
before claiming a batch, then awaited the claim's durable writes and
sent without checking again, so a sign-out and sign-in in that window
sent the first account's batch as the second. The transport also keeps
a pending request across a sign-out and resends it after the next
sign-in. Either way, if the new account could edit the strategy and
the revision still matched, the work landed as theirs.

applyBatch now takes an optional accountSubject. When it is given and
is not the signed-in identity's subject, the server refuses the whole
batch with FORBIDDEN before any op, so nothing is applied or recorded
and the same op ids land later for the right account. The queue always
sends it, taken from the outbox records' account, never from whoever
is signed in at send time. Older clients send no subject and keep
their behavior.

After the claim, the queue checks the account again. If it changed,
signed out, or has an auth incident, the claimed records go back to
their own account's queue with the same op ids and no attempt counted,
to send when that account is signed in again.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Two fakes written alongside the account binding didn't know about it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Drawings wrote a Color into field 2 for 3.2.3 and the ARGB value into a
mirror field. 4.6.3 writes the ARGB value into field 2 and reads either,
so nothing was lost, but the rollback test's byte-for-byte claim
compared this build's drawing writers against themselves. Drawings now
write 4.6.3's record too, the rollback registry swaps in 4.6.3's drawing
adapters, and the color test is the one 4.6.3 ships.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Live sync passes recovered work it keeps through the same desired-op
map as new edits. If that work landed while the page write waited its
turn, the queue found no record, wrote it again as the canvas's, and
its replayed ack moved the held item's base: a drop then replaced the
recovered edit. A desired op the queue already held when asked is now
only a request to keep it: never marked as the canvas's, and not
written again once it has landed or been replaced.

An ack is now judged when it is published rather than before its
records are stored, so a canvas drawn fresh in between gets it as
restored instead of moving its new base back.

The discard paths and attention retries prune remembered canvas op IDs
too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Comment on lines +41 to +45
export async function assetReferencesReady(ctx: AnyCtx): Promise<boolean> {
return (
(await isBackfilled(ctx, "elements")) &&
(await isBackfilled(ctx, "lineups"))
);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Start the production backfill

Existing content has no asset-reference rows, but this readiness check cannot pass until both tables are backfilled. The backfill schedules further pages only after its first invocation, and neither production deployment path starts it. Existing images can be omitted from the image list, reference queries cannot answer, and image reclaim remains paused. This violates the repository directive to backfill existing production rows when changing the schema; it must be resolved before merging.

Context Used: AGENTS.md (source)

Knowledge Base Used: Strategy persistence and integrity

Artifacts

Executed Convex persistence test source

  • This is the exact authored test source run against mock persisted rows for both conditions; it shows how the comparison was made.

Backfill scheduling and deploy-path inspection

  • The captured repository search and numbered cron and workflow excerpts show continuations but no initial backfill trigger in the inspected paths.

Persistence check without an initial backfill

  • The passing test ran maintenance and reclaim against old-style rows without seeding the backfill; markers and references stayed empty and reclaim checked nothing.

Persistence check after explicit backfill invocation

  • The passing test explicitly ran both backfill tables and reclaim; markers and references appeared, the old image became queryable, and an orphan was marked deleted.

View artifacts

T-Rex Ran code and verified through T-Rex

Comment on lines +18 to +21
export function assertSupportedCloudProtocol(clientProtocolVersion: number): void {
if (clientProtocolVersion !== CURRENT_CLOUD_PROTOCOL_VERSION) {
throw clientUpgradeRequiredError();
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Keep shipped clients connected

The previously shipped client sends protocol 3, but this check accepts only protocol 4. Deploying the backend first rejects cloud writes from the still-live web build, while installed desktop builds remain affected until updated. This violates the repository directive to keep server changes compatible with the live web build and shipped desktop builds, gating new strictness behind client opt-in; it must be resolved before merging.

Context Used: AGENTS.md (source)

Artifacts

Executed cloud service-contract test source

  • This authored Vitest source calls the real Convex handlers with v3 and v4 requests; it is the source used for both captures.

Cloud mutation results before the protocol change

  • The contract test ran against revision 6239072 and captured three successful v3 writes and three rejected v4 writes; v3 remained usable.

Cloud mutation results after the protocol change

  • The same test ran against revision 7083fe9 and captured three v3 upgrade-required errors and three successful v4 writes; v3 cloud writes are blocked.

Previous client version and production deploy order

  • Executed source-inspection commands captured the prior v3 client constant and backend-before-web workflow; an existing v3 client precedes the v4 rollout.

View artifacts

T-Rex Ran code and verified through T-Rex

Comment thread convex/images.ts
Comment on lines +596 to +610
const olderActiveAssets = await ctx.db
.query("imageAssets")
.withIndex("by_strategyId_and_publicId_and_uploadStatus", (q) =>
q
.eq("strategyId", strategy._id)
.eq("publicId", args.assetPublicId)
.eq("uploadStatus", "active"),
)
.take(20);
let replaced = 0;
for (const olderAsset of olderActiveAssets) {
if (olderAsset._id === asset._id) {
continue;
}
await markImageAssetDeleted(ctx, olderAsset, now);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Older upload replaces newer image

When two attempts share an image ID and the newer upload completes first, completing the older attempt makes its stale bytes visible and marks the newer image deleted. A later sweep removes the newer upload's stored object. Completion must recognize a superseded attempt rather than treating every other active asset as older; this image-loss path must be fixed before merging.

Knowledge Base Used: Strategy persistence and integrity

Artifacts

Executed Convex upload-order test source

  • The authored test invokes the real mutation and deletion sweep with a mock DB and mocked R2 DELETE, showing exactly how both states were exercised.

Before older completion: newer image active

  • The passing test captured DB rows and the image URL after completing the newer attempt first, showing the newer object is active.

After older completion: newer image deleted

  • The passing test captured the reversed active image and a later mocked R2 DELETE for the newer object, confirming the loss path.

View artifacts

T-Rex Ran code and verified through T-Rex

Comment thread .github/workflows/deploy-web.yml Outdated
SunkenInTime and others added 8 commits October 1, 2026 11:18
A 13 MB .mp4 and bun init's index.ts ("Hello via Bun!") and bun.lock
came in with icarus-cloud. Nothing uses them; CI and the Convex tooling
run on npm.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Protocol 4 was meant to stop protocol 3 clients from reading as well as
writing, but only the writes checked it. The page snapshot, the shell,
the full snapshot and the element and lineup lists took no protocol, so
a web tab opened before the deploy kept receiving Paranoia rows at
payload version 2, read them as the old size, and authored version 1
writes against them. Those writes were refused and kept, and after a
reload they replayed at protocol 4 and landed: the double move the bump
was for.

Each of those seven queries now requires clientProtocolVersion and
refuses anything but the current one with CLIENT_UPGRADE_REQUIRED,
before reading anything. A client that sends no protocol fails argument
validation, which is how the live web build fails these reads; it
already fails safe on a refused read and keeps its unsent edits. Folder
and strategy listings carry no payloads and are left alone. The client
sends its protocol on every one of these reads, and the contract,
generated client and gauntlet follow.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
When the server refused a build's protocol, the app showed the generic
"Retry sync", and the queue counted each refusal as the op's failure:
after eight it paused the work, and a reload did not resume it. A
refusal of the build is never the user's fault or the op's, and no
retry can fix it.

The first call refused with CLIENT_UPGRADE_REQUIRED, from the op queue,
the media queue, the editor's reads, or the account setup, now marks
the build as refused for the rest of the run. Sync shows attention, and
its popover says "Icarus was updated. Reload to keep syncing." with a
Reload button on the web, or "Icarus was updated. Install the update to
keep syncing." on desktop with the waiting update's button, the one the
strip's update icon opens. The library's cloud error says the same and
offers the same button in place of Retry.

The queue holds its work while the build is refused, sends nothing, and
counts no failure, so nothing pauses or needs attention for it. Work an
older build paused or counted for the same refusal is put back in the
queue, uncounted, when the app starts. Tests cover ten refused starts in
a row and a reload over work the protocol 3 web build paused: nothing is
paused or dropped, and the resumed work is sent.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Review of the upgrade face found it could throw work away, lie in the
library, strand desktop users, and match refusals too loosely.

Reload no longer discards work the outbox could not keep. When an
outbox write failed or a record cannot be read, that failure shows, with
its own recovery, in place of the upgrade message: it may be the only
copy. Reload itself commits drafts, saves the open strategy into the
outbox, and reloads only once both outboxes say they hold everything;
otherwise it keeps the tab and says so.

The library's status card no longer says work is syncing while the
server refuses this build. It says the work is kept on this device and
waiting for a newer Icarus, with the same way out.

A refusal now runs the update check again. On desktop with no update
yet, Icarus says so and that the work is safe, and offers Check again,
which looks for the update and asks the server, through health:ping
with the client's protocol, whether it accepts this build again. If a
rolled-back deploy does, the refusal clears: the queue sends what it
held, the editor reads again, and a refused account setup runs again.
health:ping only checks a protocol it is given, so the connection health
check and older clients are unaffected.

A refusal is recognized by its typed error code. Kept text counts only
when it is exactly what this build writes or what a refused send left
in the outbox, here and in the protocol 3 web build; text that merely
mentions the code is not a refusal and is not resumed at startup.

Disposing the auth provider now makes any setup still running stale, so
it finishes without touching other providers. Reading the refusal flag
from a disposed container was what failed two auth tests after they had
completed. Inline button icons are 16px.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The Reload button checked its own idea of "saved" before reloading, and
review found two ways it could still throw work away: changes live sync
withholds without marking the outbox unreliable, and an edit whose
outbox write starts after the check. Leaving a strategy for Home has
the same problem and its guard already solves it: it commits drafts,
saves, waits for sync, and when it can't confirm the work is kept on
this device it asks, offering Leave anyway only for work already in the
outbox. Reload now goes through that guard, and the bespoke check is
gone.

Also: a Convex setup queued behind a running one no longer runs after
the auth provider is disposed, and the desktop copy promises only that
saved work stays on this device.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The exit guard Home and Reload share decided whether "Leave anyway" was
safe before showing its dialog, and honoured that answer afterwards even
if an outbox write had failed in between. It also left without asking
once sync settled, even if a draft or edit had appeared during the wait.
Leave anyway now leaves only if the work is still all in the durable
outboxes when the choice is made, and the quiet exit requires nothing
unstaged.

Edits live sync withholds because a lineup lost its origin or landing
still don't stop an exit: they're flagged for attention already, and
blocking on them would trap the user on that strategy.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A cold Windows runner's first launch of 4.6.3 took longer than 12
seconds to show its window, failing the gate before the candidate was
even installed. The same gate runs before every desktop release, so a
flake there blocks shipping. Each launch still has to stay alive the
whole time and respond.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A newer push cancelled a running Deploy Web, possibly after it had
deployed Convex but before Pages published the matching web build. If
the replacement then failed early, production served the new server to
the old web build. Runs now wait their turn; the queued one publishes
the newest build when it runs.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
@SunkenInTime

Copy link
Copy Markdown
Owner Author

Thanks. Going through the four:

  1. Asset-reference backfill (convex/lib/assetReferences.ts). Production already ran it. completedBackfills on basic-dove-69 holds both assetReferences:elements and assetReferences:lineups, completed 2026-09-27 when the beta moved to production (read-only check today). Fresh deployments still need it started by hand; that's documented with Keep media cleanup and duplicate within Convex limits #204.
  2. Protocol 3 refused (convex/lib/cloudProtocol.ts). Deliberate, and called out in the description as the decision to make before merging. A protocol-3 tab would move a cloud Paranoia twice. No desktop build that syncs has shipped, so the only protocol-3 clients are web tabs, which recover on reload. Dropping those commits is the alternative.
  3. Older upload replacing a newer one (convex/images.ts). It can't lose an image. Each placed image gets a fresh UUID, and every upload attempt for that id sends that same file's bytes, so whichever attempt completes last leaves an identical copy active and the other copy is reclaimed.
  4. Deploy cancellation (deploy-web.yml). Real, fixed in 8c905b8: web deploys now queue instead of cancelling a running one.

@SunkenInTime
SunkenInTime marked this pull request as ready for review October 1, 2026 16:59
SunkenInTime and others added 2 commits October 1, 2026 18:19
The account row read only the auth status, so a refused build showed
"Cloud connection needs attention" with a Reconnect button that can't
help. It now says cloud sync needs a newer Icarus and offers the same
Reload, Update or Check again as the sync button.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
All 40 items landed in #88-#94.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Its fixtures were stamped when the file loaded, while the dialog reads
the clock when it builds, so a slow full run drifted across an "hours
ago" boundary and failed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

This branch has not been deployed

No deployments
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