Skip to content

Bug fixes, integration tests upgraded, encrypt to changed to list, added QPC support - #87

Closed
notquiteog wants to merge 76 commits into
jerson:masterfrom
notquiteog:master
Closed

notquiteog wants to merge 76 commits into
jerson:masterfrom
notquiteog:master

Conversation

@notquiteog

@notquiteog notquiteog commented May 27, 2026 •

Copy link
Copy Markdown

Read title

Summary by CodeRabbit

  • New Features

    • Post-quantum cryptography support (ML-DSA / ML-KEM) and package bumped to 3.12.0.
    • Optional key lifetime (expiry) for generated keys.
  • Improvements

    • Faster, more reliable async bridge with persistent worker and 30s call timeouts.
    • More resilient WebAssembly worker with retry/backoff and improved error handling.
    • Expanded native library build outputs and Swift Package Manager support for iOS/macOS.
  • Documentation

    • README and CHANGELOG updated with PQC and SPM guidance.
  • Tests

    • New PQC-focused integration and unit tests.

Review Change Stack

decoder37 and others added 30 commits May 22, 2026 17:05
Signed-off-by: notquiteog <flamingmilkman@gmail.com>
Fix RSA key size minimum validation in Go

Fix keyIDHex to use fmt.Sprintf instead of BigInt

Fix freeResult to free all three C pointers

Fix WASM worker infinite recursion on load failure

Add web request timeout mechanism

Replace per-call isolate spawn with persistent isolate pool

Add keyLifetimeSecs to KeyOptions

Add docstrings to all public API methods

Deduplicate async/sync layer

Build bridge to verify Go changes compile

Signed-off-by: notquiteog <flamingmilkman@gmail.com>
- native/main.go: add //go:build !js guard so CGO entry point is
  excluded from WASM builds
- native/wasm_main.go: new WASM entry point using syscall/js;
  exposes openPGPBridgeCall matching the existing worker.js contract
- scripts/build_native.sh: rewrite to build from native/ directly
  (was broken: cloned upstream + referenced non-existent openpgp_pqc.go)
- .github/workflows/build_windows_dll.yml: build Windows DLL from
  native/ with PQC; verify ML-DSA-65+Ed25519 symbol; auto-commit
- .github/workflows/build_native_libs.yml: parallel jobs for Linux
  (x86_64+aarch64), macOS (universal), Android (4 ABIs), iOS
  (xcframework: device+simulator+maccatalyst), WASM; each job verifies
  PQC symbols and auto-commits rebuilt binary
- example/test/app_test.dart: add four PQC tests covering
  MLDSA65ED25519, MLDSA87ED448, MLKEM768X25519 key generation and
  metadata algorithm name

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
build_native_libs.yml: remove per-job commits; add single commit job
  that depends on all platform build jobs — eliminates push race
  entirely. iOS: copy .a archives directly into existing xcframework
  slots instead of using xcodebuild -create-xcframework -library (which
  produces flat layout incompatible with the podspec .framework paths).
build_windows_dll.yml: replace bare git push with 5-attempt retry loop
  to survive concurrent pushes from build_native_libs jobs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add 5-attempt retry loop with rebase to the final commit job,
matching the pattern already in build_windows_dll.yml.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
`toUint8List()` uses `asTypedList` — a zero-copy view into the C heap.
`freeResult` was freeing that memory immediately after, leaving the
returned `Uint8List` pointing at freed (and potentially re-used) C
memory. With larger PQC-enabled binaries, the allocator reused the
slot fast enough to corrupt the FlatBuffers root offset before Dart
parsed it (manifesting as RangeError with offset ~256100568).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Update flat_buffers ^23.5.26 -> ^25.9.23 and flutter_lints ^5 -> ^6
- Fix Linux integration test: arch detection used 'linux-x64' (hyphen) but
  Platform.resolvedExecutable contains 'linux/x64' (slash), causing all tests
  to fail with a wrong-path library lookup when FLUTTER_TEST is set
- Replace background Xvfb (race condition) with xvfb-run in Linux CI workflow
- Increase Generate test pumpAndSettle 5s -> 60s to handle slower CI runners
- Migrate android/build.gradle from legacy buildscript+KGP to plugins{} DSL
- Remove explicit kotlin-android from example app; flutter-gradle-plugin handles it
- Update Java source/target compatibility 8 -> 11 to fix obsolete-options warnings
- Update example/pubspec.lock to reflect new resolutions

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… handling

android/build.gradle: move group/version after plugins{} block — Gradle
requires plugins{} to be the first non-buildscript block in the file.

CI workflows (Linux, Windows, Android): flutter test -d <desktop> exits
with code 1 even when all tests pass (Flutter 3.44 protocol race where the
host counter finalises at N-1 before the last result is acknowledged).
Wrap the command to capture output and exit 1 only when ❌ appears in
output or no 🎉 success marker is found.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…exit code bug

Flutter 3.44.0 exits with code 1 even when all tests pass due to a host-side
integration-test counter race. Use output capture + text-based pass/fail checks
instead of relying on exit code, with || true to prevent bash -e from aborting
before the output is examined.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…, iOS/macOS output capture

- native/bridge/pqc.go: add V6Keys=true for AlgoMLKEM768X25519 (ML-KEM requires v6 keys;
  was missing unlike AlgoMLKEM1024X448 which already had it) — auto-triggers binary rebuild
- tests_android.yml: switch to file-based output (/tmp/flutter_out.txt) since
  android-emulator-runner runs each script line in a separate sh -c process, so shell
  variables don't persist between lines
- tests_windows.yml: add exit 0 at end of PowerShell block so $LASTEXITCODE from flutter
  (exit code 1 due to Flutter 3.44 race) doesn't propagate as the step exit code
- tests_ios.yml, tests_macos.yml: add || true output-capture pattern for same Flutter 3.44
  exit code 1 issue that was already fixed on Linux

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ML-KEM-768+X25519 and ML-KEM-1024+X448 are encryption-only KEM algorithms
that cannot be OpenPGP primary keys. Per draft-ietf-openpgp-pqc, the composite
ML-DSA-65+Ed25519 key automatically includes an ML-KEM-768+X25519 encryption
subkey, and ML-DSA-87+Ed448 includes ML-KEM-1024+X448. Map the MLKEM algorithm
constants to their corresponding MLDSA composite configs so generate() returns
a valid keypair with ML-KEM encryption capability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- binding.dart: detect integration test context via Platform.resolvedExecutable
  (.app/Contents/MacOS path) and load dylib from absolute Frameworks path;
  fall back to CWD-relative path for unit tests run under the Dart VM
- build_native_libs.yml: replace strings|grep pipelines with grep -qa directly
  on binary files to avoid SIGPIPE false-negatives under bash pipefail

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- android/build.gradle: remove org.jetbrains.kotlin.android (KGP) plugin;
  AGP 8.x built-in Kotlin handles compilation without it
- example/android/app/build.gradle: add kotlinOptions.jvmTarget="11" to
  match compileOptions Java 11 target (fixes JVM inconsistency with Java 24 CI)
- macos/openpgp.podspec: add script_phase to copy libopenpgp_bridge.dylib
  into app bundle's Contents/Frameworks/ at build time — vendored_libraries
  links the dylib but does not reliably embed it on macOS, causing dyld to
  fail finding the library at process startup
- lib/bridge/binding.dart: macOS integration test path now uses production
  DynamicLibrary.open (rpath-based) instead of a file-existence check that
  could fall through to a broken CWD-relative path
- tests_browser.yml: flutter test -d chrome integration_test/ is explicitly
  unsupported by Flutter; replace with flutter build web as the browser CI check

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- build_native_libs.yml: run install_name_tool -id @rpath/libopenpgp_bridge.dylib
  after lipo so the committed dylib has a relative rpath install name instead of
  /tmp/libopenpgp_bridge_arm64.dylib — CocoaPods passes the install name through
  to the app binary's LC_LOAD_DYLIB; an absolute /tmp path causes dyld to crash
  the process before Dart starts
- example/macos/Podfile: add post_install hook that injects a [Custom] Embed
  script phase into the Runner (app) target; runs after the app target links so
  BUILT_PRODUCTS_DIR/FRAMEWORKS_FOLDER_PATH resolves correctly to
  <AppName>.app/Contents/Frameworks — this embeds the dylib so dyld can find it
- macos/openpgp.podspec: remove the script_phase that ran in the pod target
  context (too early, wrong FRAMEWORKS_FOLDER_PATH for a static-library target)
- All workflow files: add FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true to suppress
  the Node.js 20 deprecation warning on every CI run

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/tests_macos.yml (1)

28-39: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Add timeout-minutes to the macOS integration-test steps for parity with iOS.

The iOS workflow's "Run integration tests" steps set timeout-minutes: 30, but the macOS e2e step here (and the e2e-spm step at lines 70–81) have none. Since the output is captured with $(... 2>&1) || true, a hung flutter test won't fail fast and will run until the default 6-hour job limit.

♻️ Proposed change (apply to both steps)
       - name: Run integration tests
+        timeout-minutes: 30
         run: |
           cd example
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tests_macos.yml around lines 28 - 39, Add a timeout to the
macOS integration-test steps to match iOS: update the "Run integration tests"
step (and the similar "e2e-spm" step) so the GitHub Actions step includes
timeout-minutes: 30 to prevent hung flutter test commands (captured with
output=$(... 2>&1) || true) from running until the job default timeout; modify
the step definitions named "Run integration tests" and "e2e-spm" to add
timeout-minutes: 30 directly under the step name.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/tests_macos.yml:
- Around line 28-39: Add a timeout to the macOS integration-test steps to match
iOS: update the "Run integration tests" step (and the similar "e2e-spm" step) so
the GitHub Actions step includes timeout-minutes: 30 to prevent hung flutter
test commands (captured with output=$(... 2>&1) || true) from running until the
job default timeout; modify the step definitions named "Run integration tests"
and "e2e-spm" to add timeout-minutes: 30 directly under the step name.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 62a1c7e8-8290-4ebd-95cf-ea244f0c0410

📥 Commits

Reviewing files that changed from the base of the PR and between 306ee9c and 504e715.

📒 Files selected for processing (3)
  • .github/workflows/tests_ios.yml
  • .github/workflows/tests_macos.yml
  • README.md
✅ Files skipped from review due to trivial changes (1)
  • README.md

iOS runners host more than one "iPhone 16" simulator, so flutter test -d
"iPhone 16" could target an unbooted device and hang until the 30-minute step
timeout. Pin the test to the exact UDID that simulator-action booted
(steps.sim.outputs.udid) in both the CocoaPods and SPM iOS jobs.

Also replace the capture-then-print pattern (output=$(...)) with streaming via
tee/Tee-Object in the iOS, macOS, Linux, Android and Windows test steps, so
progress is visible live and a hang produces logs instead of a blind timeout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/tests_linux.yml (1)

17-23: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Harden workflow actions supply-chain (pin SHAs + disable checkout credential persistence).

subosito/flutter-action@main / @v2 (and actions/checkout@v4) are mutable version refs; pin them to commit SHAs. Also, actions/checkout defaults to persist-credentials: true, and the checkout steps don’t set persist-credentials: false, so credentials get written to the runner’s local git config.

  • .github/workflows/tests_linux.yml (checkout + subosito/flutter-action@main)
  • .github/workflows/tests_ios.yml (checkout in both jobs)
- uses: actions/checkout@<pinned-sha>
  with:
    persist-credentials: false
- uses: subosito/flutter-action@<pinned-sha>
  with:
    flutter-version: '3.x'
    channel: 'stable'
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tests_linux.yml around lines 17 - 23, Update the workflow
steps to harden action supply-chain by replacing mutable refs with pinned commit
SHAs and disabling credential persistence: for the actions/checkout step(s) in
tests_linux.yml and tests_ios.yml set with: persist-credentials: false, and
replace actions/checkout@v4 and subosito/flutter-action@main with their
respective pinned commit SHAs (use the exact SHA for subosito/flutter-action and
actions/checkout) so both the checkout and flutter-action steps reference
immutable SHAs.
♻️ Duplicate comments (2)
.github/workflows/tests_linux.yml (1)

27-39: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add an explicit timeout to the Linux integration-test step/job.

This can still hang indefinitely if xvfb-run flutter test stalls. Please set timeout-minutes on the step (or job) to bound runtime.

Suggested fix
 jobs:
   e2e:
     runs-on: ubuntu-latest
+    timeout-minutes: 30
     steps:
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tests_linux.yml around lines 27 - 39, Add a bounded
timeout to the GitHub Actions integration test step/job to prevent indefinite
hangs: update the "Run integration tests" step (or its enclosing job) to include
a timeout-minutes value (e.g., timeout-minutes: 30) so the step running xvfb-run
flutter test -d linux integration_test/app_test.dart will be forcibly cancelled
after the configured time; ensure you add it at the step or job level in the
workflow YAML so the pipeline stops if the test command stalls.
.github/workflows/tests_ios.yml (1)

17-23: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Pin action refs to commit SHAs and disable checkout credential persistence in both iOS jobs.

This remains unresolved: mutable action refs and default credential persistence are still present. Please SHA-pin all uses: entries and set persist-credentials: false on both checkout steps.

#!/bin/bash
# Confirm mutable refs and checkout hardening status in iOS workflow.
rg -n 'uses:\s*[^@]+@(main|master|v[0-9]+(\.[0-9]+)*)\b|persist-credentials' .github/workflows/tests_ios.yml

Also applies to: 61-70

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/tests_ios.yml around lines 17 - 23, The workflow still
uses mutable action refs and leaves checkout credentials persistent; update each
`uses:` entry (e.g., `futureware-tech/simulator-action@v1`,
`actions/checkout@v4`, `subosito/flutter-action@v2`) to SHA‑pinned commit SHAs
instead of tag names, and modify every `actions/checkout` step to include
`persist-credentials: false` to disable credential persistence; ensure you
replace both occurrences referenced in the iOS jobs so the tests_ios.yml no
longer contains mutable refs or default checkout credential behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Outside diff comments:
In @.github/workflows/tests_linux.yml:
- Around line 17-23: Update the workflow steps to harden action supply-chain by
replacing mutable refs with pinned commit SHAs and disabling credential
persistence: for the actions/checkout step(s) in tests_linux.yml and
tests_ios.yml set with: persist-credentials: false, and replace
actions/checkout@v4 and subosito/flutter-action@main with their respective
pinned commit SHAs (use the exact SHA for subosito/flutter-action and
actions/checkout) so both the checkout and flutter-action steps reference
immutable SHAs.

---

Duplicate comments:
In @.github/workflows/tests_ios.yml:
- Around line 17-23: The workflow still uses mutable action refs and leaves
checkout credentials persistent; update each `uses:` entry (e.g.,
`futureware-tech/simulator-action@v1`, `actions/checkout@v4`,
`subosito/flutter-action@v2`) to SHA‑pinned commit SHAs instead of tag names,
and modify every `actions/checkout` step to include `persist-credentials: false`
to disable credential persistence; ensure you replace both occurrences
referenced in the iOS jobs so the tests_ios.yml no longer contains mutable refs
or default checkout credential behavior.

In @.github/workflows/tests_linux.yml:
- Around line 27-39: Add a bounded timeout to the GitHub Actions integration
test step/job to prevent indefinite hangs: update the "Run integration tests"
step (or its enclosing job) to include a timeout-minutes value (e.g.,
timeout-minutes: 30) so the step running xvfb-run flutter test -d linux
integration_test/app_test.dart will be forcibly cancelled after the configured
time; ensure you add it at the step or job level in the workflow YAML so the
pipeline stops if the test command stalls.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: f44efb86-cb6c-4250-a697-acc84f456a23

📥 Commits

Reviewing files that changed from the base of the PR and between 504e715 and 8644180.

📒 Files selected for processing (5)
  • .github/workflows/tests_android.yml
  • .github/workflows/tests_ios.yml
  • .github/workflows/tests_linux.yml
  • .github/workflows/tests_macos.yml
  • .github/workflows/tests_windows.yml
🚧 Files skipped from review as they are similar to previous changes (3)
  • .github/workflows/tests_windows.yml
  • .github/workflows/tests_android.yml
  • .github/workflows/tests_macos.yml

decoder37 and others added 24 commits May 28, 2026 23:31
… stall

The SPM iOS job builds and links successfully ("Xcode build done") but then
stalls at the install/launch/connect phase with no output. Run flutter test
--verbose so that phase (and any native crash) is streamed live, and shorten the
SPM job timeout to 15 minutes for faster feedback. CocoaPods iOS job unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The SPM iOS app launches but its Dart VM service never appears (flutter test
hangs at "Waiting for VM Service port to be available"). Add an always() step
that prints simulator crash reports and the Runner device syslog so we can tell
whether the app crashes at startup or the VM service announcement is just not
discovered.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The SPM-built iOS app builds, links, launches and does not crash (no Runner
crash report), but Flutter's experimental SPM integration cannot discover the
Dart VM service for integration_test on the iOS simulator, so `flutter test`
hangs at "Waiting for VM Service port to be available" until timeout. That is a
test-harness limitation, not a plugin defect.

Replace the iOS e2e-spm integration-test job with an spm-build job that runs
`flutter build ios --debug --simulator --no-codesign`, which resolves, compiles,
links and embeds the SPM plugin (including the OpenPGPBridge binaryTarget) — the
meaningful SPM guarantee for a plugin. Runtime behaviour remains covered by the
macOS SPM job and the iOS CocoaPods job.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The iOS bridge xcframework moved into ios/openpgp/ for Swift Package Manager,
but build_native_libs still copied/committed it at ios/OpenPGPBridge.xcframework,
so the iOS native-libs job failed with "No such file or directory". Point all
iOS xcframework paths at ios/openpgp/OpenPGPBridge.xcframework.

Also wrap the freshly built macOS dylib into macos/openpgp/OpenPGPBridge.xcframework
(via scripts/build_macos_xcframework.sh) and commit it, so hosted Swift Package
Manager consumers on macOS can resolve the package — previously this xcframework
was only generated ephemerally in CI and never committed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Flutter intermittently never delivers the Dart VM Service URL on the iOS
simulator and hangs at "Waiting for VM Service port" (flutter/flutter#160930);
this hit both the CocoaPods and SPM jobs, so a build-only SPM job didn't help.

Restore the SPM job to a full integration test and wrap both iOS jobs in
nick-fields/retry: kill a stalled attempt at the per-attempt timeout, reboot the
booted simulator, and retry (the documented #160930 workaround). The test is
pinned to the exact simulator-action UDID and streamed via tee.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…nds it

Under Swift Package Manager the iOS integration tests failed every OpenPGP call
with: "Failed to lookup symbol 'OpenPGPBridgeCall': dlsym(RTLD_DEFAULT, ...):
symbol not found". The bridge is a static archive resolved at runtime via
DynamicLibrary.process(); keepBridgeSymbols() pulls the symbol into the binary
but, unlike the CocoaPods -force_load path, SwiftPM did not place it in the app's
dynamic symbol table, so dlsym could not see it.

Add -export_dynamic to the iOS SwiftPM target's linker settings so linked global
symbols (including OpenPGPBridgeCall) are exported for dlsym. macOS is unaffected
(it loads a dylib whose entry point is already exported).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
BREAKING CHANGE: remove the CocoaPods podspecs (ios/openpgp.podspec,
macos/openpgp.podspec). iOS and macOS are now consumed exclusively through Swift
Package Manager. Consuming apps must run
`flutter config --enable-swift-package-manager` and use Flutter 3.41.0+.

- Trim the iOS and macOS CI to a single SPM integration-test job each (the iOS job
  keeps the simulator-reboot retry for the VM Service flake).
- macOS CI now exercises the committed macos/openpgp/OpenPGPBridge.xcframework
  (what consumers resolve) instead of regenerating it.
- Update README and Package.swift comments for the SPM-only model.

Also set the example app `version` (1.0.0+1) so iOS builds stop warning about
missing CFBundleShortVersionString / CFBundleVersion.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… failed)

-export_dynamic alone did not fix the iOS SPM "Failed to lookup symbol
'OpenPGPBridgeCall': dlsym(RTLD_DEFAULT, ...): symbol not found": the symbol was
being dead-stripped. The previous keepBridgeSymbols() took the symbol's address
and discarded it, which Swift elided, so there was no surviving reference.

Store the address in a public static (OpenpgpPlugin.bridgeEntryPoint) instead; the
optimizer cannot prove it unused, so it emits a relocation to OpenPGPBridgeCall
that survives stripping. Keep -export_dynamic for dlsym visibility. Temporarily
re-enable flutter test --verbose on the iOS job to capture the link command if the
lookup still fails.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The dlsym fix works — all 9 iOS integration tests pass under SPM — but the job
still failed because the emoji in the result check (grep '...|❌') gets mangled
when passed through nick-fields/retry's command input and matches spuriously, so
a passing run was reported as failed.

Match plain ASCII instead ("Some tests failed" / "N failed" for failure, "All
tests passed" / "N tests passed" for success) and remove the temporary --verbose.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…dd CocoaPods removal job

- Update actions/checkout v4 -> v6.0.2 across all workflows
- iOS: deterministically select the newest installed iOS runtime's iPhone
  (the runner ships several runtimes, so "iPhone 16" alone matched >1 device
  and simulator-action picked an arbitrary one); add wait_for_boot to avoid
  racing a half-booted sim
- iOS: drop nick-fields/retry and the ASCII-only result matching so the job
  mirrors the Linux/macOS workflows (tee + emoji-aware grep)
- Web: replace the build-only smoke test with real integration tests run in
  headless Chrome via chromedriver + flutter drive
- Add one-shot remove_cocoapods workflow: runs pod deintegrate on the iOS and
  macOS example projects and commits the SPM-only result (no Mac required),
  preserving the macOS [Custom] dylib embed phase

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Run pod deintegrate on the iOS and macOS example projects so they no longer carry CocoaPods integration left over from before the SPM migration. The macOS [Custom] Embed libopenpgp_bridge.dylib build phase is preserved (deintegrate strips only [CP] phases), since SPM links but does not embed the bare dylib from the xcframework. Generated by the remove_cocoapods workflow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
pod deintegrate removed the CocoaPods integration from the iOS/macOS projects
but left the Pods/Pods.xcodeproj FileRef in each Runner.xcworkspace, now
pointing at a project that no longer exists. Remove both so the workspaces only
reference Runner.xcodeproj.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
generate requests an RSA-2048 subkey, and RSA key generation in the Go WASM
build is far slower than native, exceeding the web plugin's 30s operation
timeout on CI runners (all other crypto round-trips pass on web in seconds).
Skip it on web via kIsWeb; key generation stays covered on every native
platform.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
CI/example maintenance release:
- actions/checkout v4 -> v6.0.2 across all workflows
- iOS: deterministic latest-iOS device selection + wait_for_boot; drop
  nick-fields/retry and ASCII-only matching to mirror the other platforms
- web: real headless-Chrome integration tests via chromedriver + flutter drive
  (Generate skipped on web; RSA-2048 keygen in WASM exceeds the 30s timeout)
- example: remove leftover CocoaPods integration from the iOS/macOS projects
  (SPM-only; macOS [Custom] dylib embed phase preserved)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…one-shot workflow

generate.dart was setting rsaBits=2048 alongside algorithm=EDDSA, which caused
go-crypto's NewEntity to generate an RSA-2048 encryption subkey even though the
primary key was EdDSA. That RSA subkey is what made keygen slow enough to exceed
the 30 s FFI callAsync timeout on Windows CI (and the web plugin timeout on the
WASM build). Removing rsaBits produces a proper EdDSA+ECDH(Curve25519) pair,
which is fast on every platform including WASM.

With the RSA subkey gone the web Generate test no longer needs to be skipped, so
the skip: kIsWeb guard and the now-unused kIsWeb import are both removed.

The remove_cocoapods one-shot workflow is deleted — it ran successfully and its
commit (chore(example): remove CocoaPods integration (SPM-only)) is on master.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
iOS: flutter test on the simulator hangs occasionally on the VM-Service
connection (flutter/flutter#160930). wait_for_boot: true reduced boot
races but doesn't prevent execution hangs. Add a 3-attempt retry loop with
a 15-minute per-attempt timeout: retry only when no test-output pattern is
matched (hang), exit immediately on a genuine test failure.

Web: flutter drive runs in debug mode by default; debug Go WASM keygen is
far slower than native and was hitting the plugin's 30 s ceiling. Bump
_timeout to 120 s — gives slow CI runners room without hiding real crashes.
Also add "Failure Details:" / "Failure in method:" to the browser failure
grep, since flutter drive uses those strings rather than ❌.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add timeout-minutes: 30 to all 15 jobs across 9 workflows so a hung job
is cancelled cleanly instead of burning the 6-hour GitHub Actions default.

Reduce the iOS flutter-test per-attempt shell timeout from 900 s (15 min)
to 420 s (7 min) to match the known ~5-min test duration; 3 × 7 = 21 min
fits well inside the new 30-min job cap with room for simulator boot.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Debug-mode Go WASM keygen exceeds 120 s on ubuntu-latest CI runners even
for ECC (EdDSA+ECDH) keys. flutter drive --profile builds with optimisations,
making WASM crypto operations fast enough to complete within the 120 s
web plugin timeout.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
flutter drive --profile on -d web-server strips exception details from
failures and breaks 5 tests that pass in debug mode. Debug mode is the
only reliable option for this driver/device combination.

Debug-mode Go WASM keygen exceeds the 120 s web plugin ceiling even for
EdDSA+ECDH keys on ubuntu-latest CI runners. Re-add skip: kIsWeb on the
Generate test with an explanation. All 9 other crypto operations still run
as real web coverage; Generate stays tested on 5 native platforms.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@notquiteog
notquiteog deleted the branch jerson:master May 31, 2026 20:13
@notquiteog notquiteog closed this May 31, 2026
@notquiteog
notquiteog deleted the master branch May 31, 2026 20:13
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.

2 participants