Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
844e75d
Cloud Sync V2 work in progress, build fixes, and host build runbook
Xare123 Aug 6, 2026
274ee27
Fix CI: provision ObjectBox C on Linux, request a native ARM64 Flutte…
Xare123 Aug 6, 2026
10d9b42
Fix the ARM64 Dart SDK bootstrap path instead of the SDK architecture
Xare123 Aug 6, 2026
ea65307
Pin the Linux runner image and keep the PowerShell gate installable
Xare123 Aug 6, 2026
a20d8cf
Install the pinned Gradle in CI and assert the engine precache actual…
Xare123 Aug 6, 2026
6d6ce00
Recompile the Flutter tool snapshot after swapping to the ARM64 Dart VM
Xare123 Aug 6, 2026
6385fde
Stop the operation interlock fence from blocking its own operation
Xare123 Aug 6, 2026
cde29ff
Build and verify the Cloud Sync sampler beta APK in CI
Xare123 Aug 6, 2026
557ffed
Build the sampler APK in its own job
Xare123 Aug 6, 2026
6a8b110
Add a dependency-ordered path-to-production roadmap
Xare123 Aug 6, 2026
e37a5c4
Accept Apple's partless reaction parent and agree on the part spelling
Xare123 Aug 6, 2026
8a32e21
Preserve the EMPTY_LIST wire type as presence evidence
Xare123 Aug 6, 2026
f5c7843
Stop inferring a clear instruction from an empty summary collection
Xare123 Aug 6, 2026
c3b57b9
Stop calling FlushFileBuffers on a directory handle on Windows
Xare123 Aug 6, 2026
92e8d2a
Record the provenance ledger and the ObjectBox dependency decision
Xare123 Aug 6, 2026
8b743f1
Parse the reaction parent in the live CloudKit download path
Xare123 Aug 6, 2026
87aae46
Specify field ownership and record the stalled-checkpoint decision
Xare123 Aug 6, 2026
635613b
Accept the bp: parent spelling and make the test suites actually gate CI
Xare123 Aug 6, 2026
7f3821b
Close the remaining audit findings
Xare123 Aug 6, 2026
9e9794c
CI: move off two deprecated GitHub Actions in the APK workflow
Xare123 Aug 6, 2026
4898b96
Make the message unique-constraint swallow observable
Xare123 Aug 7, 2026
6f13002
Correct and record the upload conversion-failure finding
Xare123 Aug 7, 2026
de18c0d
Stop logging the composer's full text on every keystroke
Xare123 Aug 7, 2026
731a415
Fix the CargoKit hang introduced by the plugin-detection fix
Xare123 Aug 7, 2026
4d960df
Build the vendored CargoKit plugins so the app can start
Xare123 Aug 7, 2026
4fe4da9
Assert the complete set of CargoKit libraries, not the last one to crash
Xare123 Aug 7, 2026
2e557c2
Make the CargoKit patch step runnable in CI
Xare123 Aug 7, 2026
30daab6
Give each link in a message its own preview
Xare123 Aug 7, 2026
52ee9e5
Let a bare image link produce a preview
Xare123 Aug 7, 2026
169171e
Make legacy CloudKit restore fail closed
Xare123 Aug 8, 2026
6d5526a
Stabilize alpha and close legacy CloudKit gaps
Xare123 Aug 8, 2026
a4b0d9a
Stabilize alpha attachments previews and FaceTime diagnostics
Xare123 Aug 11, 2026
bfaffe6
Repair FaceTime join and teardown races
Xare123 Aug 11, 2026
9f5eee0
Preserve drafts until messages are queued
Xare123 Aug 11, 2026
63601ac
Keep complete URLs clickable
Xare123 Aug 11, 2026
d55e55a
Avoid stale reply gesture context
Xare123 Aug 12, 2026
2106454
Retry Android CI
Xare123 Aug 12, 2026
1c52330
Add opt-in FaceTime diagnostics
Xare123 Aug 12, 2026
925a1e1
Add Find My Play Sound for Apple devices
Xare123 Aug 12, 2026
80674e3
Add nearby Find My tracker sound support
Xare123 Aug 12, 2026
6bf9520
Make Find My usable when relay is offline
Xare123 Aug 12, 2026
80d42fc
Keep Find My retry enabled after relay failure
Xare123 Aug 12, 2026
4c2dcf6
Recover relay registration and composer annotations
Xare123 Aug 12, 2026
715bcff
Enable cloud sound for AirPods
Xare123 Aug 14, 2026
9721412
Refresh replayed reactions on parent messages
Xare123 Aug 14, 2026
4c5faec
Guard stale Find My map state
Xare123 Aug 14, 2026
344d548
Import safe collection lookups for Find My
Xare123 Aug 14, 2026
96d3922
Distinguish nearby Find My sound targets
Xare123 Aug 15, 2026
7981eb5
Link Find My panel to its scroll controller
Xare123 Aug 15, 2026
693b149
Close CloudKit V2 recovery and sampling gaps
Xare123 Aug 22, 2026
eb62944
Correlate FaceTime admission with verified media state
Xare123 Aug 22, 2026
f59082f
Match rustpush CI features to production
Xare123 Aug 22, 2026
ee609aa
Make FaceTime media admission fail safe
Xare123 Aug 22, 2026
d88f438
Keep FaceTime media parsing host independent
Xare123 Aug 22, 2026
7cc9975
Bound persistent CloudKit dependency failures
Xare123 Aug 22, 2026
a2f24a0
Add fail-closed Rust semantic decoder boundary
Xare123 Aug 22, 2026
d0a898f
Remove relay credentials from application source
Xare123 Aug 22, 2026
6eb55a2
Fix CloudKit response fixture compilation
Xare123 Aug 22, 2026
7ac4e98
Widen transient CloudKit identity boundary [skip ci]
Xare123 Aug 22, 2026
a422e92
Require advancing inbound FaceTime media evidence
Xare123 Aug 22, 2026
68a232c
Commit generated CloudKit identity bindings
Xare123 Aug 22, 2026
25583ee
Enforce canonical CloudKit identity bindings [skip ci]
Xare123 Aug 22, 2026
44aebd9
Harden FaceTime WebView name injection and DOM diagnostics
Xare123 Aug 22, 2026
b73f59e
Commit regenerated CloudKit alias bindings
Xare123 Aug 22, 2026
f5c712a
Expand FaceTime WebRTC replay coverage
Xare123 Aug 22, 2026
3926d8e
Add FaceTime media admission replay test
Xare123 Aug 22, 2026
e7cdb03
Add CloudKit native identity tamper tests
Xare123 Aug 22, 2026
f369e19
Upgrade GitHub artifact actions to Node 24
Xare123 Aug 22, 2026
d1fbc66
Fail closed on rejected FaceTime admissions
Xare123 Aug 22, 2026
a3bff3c
Upgrade remaining GitHub actions to Node 24
Xare123 Aug 22, 2026
2b20799
Enforce contiguous CloudKit semantic replay
Xare123 Aug 22, 2026
a2fa09f
Expose rich CloudKit semantic records
Xare123 Aug 22, 2026
d0eda3c
Project CloudKit semantic records into ObjectBox
Xare123 Aug 22, 2026
710be21
Reconcile semantic inbox around CloudKit fetch
Xare123 Aug 22, 2026
9542d64
Gate a read-only CloudKit semantic canary
Xare123 Aug 22, 2026
75e779b
Refresh CloudKit validation evidence
Xare123 Aug 22, 2026
9f12dda
Fence CloudKit outbox generations
Xare123 Aug 22, 2026
bf75e6b
Gate CloudKit mutations behind one writer
Xare123 Aug 22, 2026
8fb5009
Record CloudKit validation evidence
Xare123 Aug 22, 2026
a8e45b9
Enforce single-writer CloudKit reconciliation
Xare123 Aug 22, 2026
474265e
Bound ambiguous CloudKit write lifetimes
Xare123 Aug 22, 2026
2ce2f57
Scope legacy deletes and bind reset proofs
Xare123 Aug 22, 2026
cd51866
Advance protected CloudKit writer primitive
Xare123 Aug 22, 2026
81d58ae
Document CloudKit transport evidence and write gates
Xare123 Aug 22, 2026
3a03d09
Persist CloudKit submission identities atomically
Xare123 Aug 22, 2026
e7bdb47
Add fail-closed CloudKit write preflight contract
Xare123 Aug 22, 2026
db0b3e5
Stage read-only CloudKit evidence beta
Xare123 Aug 23, 2026
aa9eba6
Refresh reproducible Rust bridge metadata
Xare123 Aug 23, 2026
84eeab5
Reject non-plain outbound canary payloads
Xare123 Aug 23, 2026
cb1e32f
Fix CloudKit shadow fence identity
Xare123 Aug 23, 2026
20db70d
Stabilize CloudKit canary signing
Xare123 Aug 23, 2026
7b7dc7d
Locate Android signer from SDK
Xare123 Aug 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
99 changes: 97 additions & 2 deletions .github/workflows/bridge-bindings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,56 @@ name: Rust bridge validation

on:
workflow_dispatch:
inputs:
allow_generated_drift:
description: Upload regenerated bindings without failing the manual run
required: false
default: false
type: boolean
push:
paths:
- ".github/workflows/bridge-bindings.yml"
- ".gitmodules"
- "rust/Cargo.toml"
- "rust/Cargo.lock"
- "rust/src/**"
- "rustpush"
- "rust/src/api/**"
- "flutter_rust_bridge.yaml"
- "lib/src/rust/**"
- "rust/src/frb_generated*"
pull_request:
paths:
- ".github/workflows/bridge-bindings.yml"
- ".gitmodules"
- "rust/Cargo.toml"
- "rust/Cargo.lock"
- "rust/src/**"
- "rustpush"
- "rust/src/api/**"
- "flutter_rust_bridge.yaml"
- "lib/src/rust/**"
- "rust/src/frb_generated*"

jobs:
bindings:
runs-on: ubuntu-latest
# Generated bindings must be reproducible, so pin the image instead of
# letting ubuntu-latest drift the toolchain under the drift check.
runs-on: ubuntu-24.04
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v7
with:
submodules: recursive

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable

- name: Set up Flutter for bridge generation
uses: subosito/flutter-action@v2
with:
flutter-version: "3.44.8"
channel: stable

- name: Install native build tools
run: |
sudo apt-get update
Expand All @@ -54,5 +78,76 @@ jobs:
cp rustpush/certs/legacy-fairplay/fairplay.crt "$destination/$name.crt"
done

- name: Install pinned Flutter Rust Bridge generator
shell: bash
run: |
archive="${RUNNER_TEMP}/flutter_rust_bridge_codegen.tgz"
url="https://github.com/fzyzcjy/flutter_rust_bridge/releases/download/v2.3.0/flutter_rust_bridge_codegen-x86_64-unknown-linux-gnu-v2.3.0.tgz"
curl --fail --location --silent --show-error "$url" --output "$archive"
echo "bb3a5e3d1f17a543e73f8dfff886e883928b95e3a9d19ca5268da40952d80cee $archive" | sha256sum --check --strict
mkdir -p "${RUNNER_TEMP}/frb-codegen"
tar -xzf "$archive" -C "${RUNNER_TEMP}/frb-codegen"
echo "${RUNNER_TEMP}/frb-codegen" >> "$GITHUB_PATH"

- name: Regenerate committed bridge bindings
shell: bash
run: flutter_rust_bridge_codegen generate --config-file flutter_rust_bridge.yaml

- name: Normalize generated SSE implementations
shell: pwsh
run: |
./tooling/frb/guard_generated_sse_impls.ps1 -Mode Deduplicate -ExpectedRemovalCount 6
./tooling/frb/guard_generated_sse_impls.ps1 -Mode Verify

- name: Upload regenerated bridge bindings
if: always()
uses: actions/upload-artifact@v7
with:
name: regenerated-rust-bridge-bindings
if-no-files-found: error
retention-days: 7
path: |
lib/src/rust/api/api.dart
lib/src/rust/frb_generated.dart
lib/src/rust/frb_generated.io.dart
lib/src/rust/frb_generated.web.dart
rust/src/frb_generated.rs
rust/src/frb_generated.io.rs
rust/src/frb_generated.web.rs

- name: Verify committed bridge bindings are reproducible
if: github.event_name != 'workflow_dispatch' || inputs.allow_generated_drift != true
shell: bash
run: |
git diff --exit-code -- \
lib/src/rust/api/api.dart \
lib/src/rust/frb_generated.dart \
lib/src/rust/frb_generated.io.dart \
lib/src/rust/frb_generated.web.dart \
rust/src/frb_generated.rs \
rust/src/frb_generated.io.rs \
rust/src/frb_generated.web.rs

- name: Compile committed Rust bridge
run: cargo check --manifest-path rust/Cargo.toml --lib --message-format short

# cargo check --lib does not even compile #[cfg(test)] code, so until now
# no Rust test in this repository could fail a build. That covered the
# canonical converter, the DTO parsers, the protected store, and the
# keyed identity hasher. A suite that cannot fail a build is not a gate.
- name: Run Rust tests
run: cargo test --manifest-path rust/Cargo.toml --lib

# Tests inside the rustpush submodule are not executed when rustpush is
# compiled only as a dependency of the bridge crate. Keep its protocol,
# concurrency, and log-redaction tests as an independent gate. Match the
# production bridge's non-macOS Anisette provider feature so icloud_auth
# exposes the same provider types that the application compiles against.
- name: Run rustpush tests
run: cargo test --manifest-path rustpush/Cargo.toml --lib --features remote-anisette-v3

# The protector harness is a separate crate and is deliberately
# dependency-light so these security invariants can run on hosts where the
# full application crate cannot build.
- name: Run the Cloud Sync protector harness
run: cargo test --manifest-path rust/cloud_sync_protector_harness/Cargo.toml
Loading
Loading