Skip to content

fix(ios): retain native ABI in TestFlight archives - #132

Merged
torlando-tech merged 8 commits into
mainfrom
fix/ios-release-native-abi
Aug 1, 2026
Merged

fix(ios): retain native ABI in TestFlight archives#132
torlando-tech merged 8 commits into
mainfrom
fix/ios-release-native-abi

Conversation

@torlando-tech

Copy link
Copy Markdown
Owner

Summary

  • preserve every embedded-Python @_cdecl entry point in archived Release executables
  • make the export manifest cover BLE, RNode, and stamp-generation bridges rather than one subsystem
  • build a post-processed Release artifact in CI and verify the final Mach-O contains every declared export
  • add source/configuration contracts and mutation coverage so future bridge additions or stripping regressions fail closed

Root cause

A normal Release build retained the native C ABI, but Xcode's Archive post-processing stripped it. Native CoreBluetooth therefore continued to populate the BLE UI while embedded Python could not resolve columba_ble_start, columba_ble_connect, or columba_ble_send through ctypes.CDLL(None). The Reticulum interface stayed offline and could not exchange announces.

Verification

  • reproduced the archived baseline with 0/14 BLE ABI symbols
  • corrected signed Release archive contains 29/29 Python-facing native ABI symbols
  • codesign verification passed
  • CI-equivalent post-processed Release simulator artifact passed the shipping artifact checker with 29/29 exports
  • focused CI and bridge contracts: 54/54
  • complete static suite: 201/201
  • physical Release install preserved app data
  • Android received 20 complete packets with zero observed send failures
  • physical BLE/announce behavior confirmed restored

Risk and rollback

The Release executable keeps only the explicitly listed global entry points through archive stripping. The static contract requires the export manifest to exactly match every Swift @_cdecl, and the artifact checker validates exact defined symbols after post-processing. Rollback is the two commits in this PR, but that would restore the TestFlight failure.

@greptile-apps

greptile-apps Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

The PR preserves the complete embedded-Python C ABI in post-processed Release artifacts and verifies the resulting Mach-O in CI.

  • Adds an export manifest covering BLE, RNode, and stamp-generation entry points.
  • Scopes export and stripping settings to the shipping Release configuration while removing them from Model B.
  • Extends artifact, reconciler, and source-contract tests and separates shipping, Model B, and UI CI lanes.
  • Uses stable accessibility identifiers for screenshot-flow tab navigation.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains; the previously reported target-scope issue is addressed by deleting the native archive settings from all Model B configurations and assigning them only to shipping Release, with stale-input and idempotency coverage.

Important Files Changed

Filename Overview
Columba.xcodeproj/project.pbxproj Configures the shipping Release target to retain only the declared native exports during archive stripping.
support/isolate-modelb-targets.rb Reconciles native export settings onto shipping Release only and removes stale copies from Model B and non-Release configurations.
Sources/ColumbaApp/Resources/ColumbaApp.exports Declares the complete embedded-Python-facing C ABI retained in shipping archives.
support/verify-flavor-artifact.py Loads the export manifest and requires every declared symbol to be defined in the shipping executable.
.github/workflows/tests.yml Adds post-processed Release artifact verification and separates shipping, Model B, and UI validation lanes.
Tests/static/test_modelb_target_isolation.rb Verifies stale native settings are removed from Model B, restored only to shipping Release, and remain idempotent.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  Manifest["Native export manifest"] --> ShippingRelease["ColumbaApp Release"]
  ShippingRelease --> PostProcess["Archive post-processing"]
  PostProcess --> Verify["Mach-O export verification"]
  Reconciler["Target reconciler"] --> ShippingRelease
  Reconciler --> ModelB["ColumbaModelBApp"]
  ModelB --> Isolated["Export and strip settings removed"]
Loading

Reviews (7): Last reviewed commit: "test(ios): tolerate native tab identifie..." | Re-trigger Greptile

Comment thread Columba.xcodeproj/project.pbxproj
@torlando-tech
torlando-tech merged commit 4dea984 into main Aug 1, 2026
4 checks passed
@torlando-tech
torlando-tech deleted the fix/ios-release-native-abi branch August 1, 2026 19:53
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