The Apple CoreML Silero VAD backend resolves six @_cdecl Swift symbols
via dlsym(RTLD_DEFAULT) at runtime in the Rust audio crate. Local
flutter build paths preserved those symbols, but Xcode Archive (the
path used for TestFlight and App Store uploads) silently stripped them
through two independent mechanisms, causing Rust to fall back to
WebRTC VAD on every shipped build.
Both stripping mechanisms are now neutralised:
* ld dead-strip: OTHER_LDFLAGS now whitelists each of the six
chanora_silero_vad_* symbols via repeated `-Xlinker -exported_symbol`
pairs in ios/Flutter/{Release,Debug}.xcconfig and
macos/Flutter/Flutter-{Release,Debug}.xcconfig.
* install-time strip: STRIP_STYLE is set to `non-global` in the same
four xcconfigs so the post-link strip phase no longer drops exported
global text symbols from the Archive product. Cost: ~264 bytes per
binary; verified `xcrun strip` vs `xcrun strip -x` behaviour.
Self-test wired into both AppDelegates: at launch on a utility queue,
ChanoraSileroSelfTest resolves all six symbols through dlsym (the same
path the Rust runtime uses, not a direct call that would mask the bug
class) and exercises create → reset → process → destroy. Result is
logged via NSLog and surfaces in Console.app / idevicesyslog.
A post-link verify_silero_exports.sh build phase runs nm -gU on the
final Archive binary and fails the build if any of the six symbols are
missing. Empirically caught the original Archive regression that
flutter build --no-codesign did not.
CocoaPods bridge podspecs now emit a proper .dSYM via dsymutil so
TestFlight crash reports are symbolicated; Cargo.toml release profile
sets `debug = true` because dsymutil needs DWARF in the input dylib.
macOS chanora_bridge.podspec PATH inserts /opt/homebrew/opt/rustup/bin
ahead of /opt/homebrew/bin so rustup's cargo (which has the
x86_64-apple-darwin target installed) wins over the homebrew rust
formula that is aarch64-only.
iOS Podfile target renamed from `Runner` to `Chanora` to match the
Xcode target name shipped in the project (the workspace and scheme
already referenced Chanora; the Podfile mismatch produced lint
warnings during `pod install`).
ITSAppUsesNonExemptEncryption=false declared in both Info.plist files
so TestFlight and App Store Connect uploads skip the export-compliance
prompt; Chanora uses only platform-provided TLS.
.gitignore now covers Xcode archive bundles, IPA exports, dSYM
directories, the local macOS release zip, and agent/tooling state
directories so generated TestFlight artifacts no longer appear in
git status.
End-to-end verified by headless archive:
xcodebuild -workspace Runner.xcworkspace -scheme Runner \
-configuration Release -destination 'generic/platform=iOS' \
-archivePath /tmp/chanora.xcarchive archive CODE_SIGNING_ALLOWED=NO
nm -gU on the resulting .app/Chanora binary shows all six
chanora_silero_vad_* symbols present.
142 lines
2.6 KiB
Plaintext
142 lines
2.6 KiB
Plaintext
# OS files
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# Editors
|
|
.vscode/
|
|
.idea/
|
|
*.swp
|
|
*.swo
|
|
|
|
# Logs
|
|
*.log
|
|
logs/
|
|
|
|
# Environment / secrets
|
|
.env
|
|
.env.*
|
|
!.env.example
|
|
*.pem
|
|
*.key
|
|
*.p12
|
|
*.mobileprovision
|
|
*.keystore
|
|
*.jks
|
|
|
|
# Build output
|
|
build/
|
|
dist/
|
|
out/
|
|
target/
|
|
.dart_tool/
|
|
.flutter-plugins
|
|
.flutter-plugins-dependencies
|
|
.packages
|
|
.pub-cache/
|
|
.pub/
|
|
ios/Pods/
|
|
ios/.symlinks/
|
|
android/.gradle/
|
|
android/app/build/
|
|
|
|
# Generated reports
|
|
reports/
|
|
coverage/
|
|
|
|
# SDD-120 local bench-harness outputs (cargo run --example emit_baseline /
|
|
# compare_baseline at the workspace root). Real baseline JSON is committed
|
|
# at crates/chanora_audio/benches/baselines/x86_64-unknown-linux-gnu.json
|
|
# via the bench-baseline-update.yml workflow only.
|
|
/current.json
|
|
/report.md
|
|
|
|
# Diagnostic bundles
|
|
diagnostics/
|
|
*.diag.zip
|
|
*.diagnostic.zip
|
|
|
|
# Local databases
|
|
*.sqlite
|
|
*.sqlite3
|
|
*.db
|
|
*.db-shm
|
|
*.db-wal
|
|
|
|
# Temporary files
|
|
tmp/
|
|
temp/
|
|
.cache/
|
|
|
|
# Upstream documentation snapshots (kept as reference, not project source)
|
|
chanora-docs-repo-format-*.zip
|
|
|
|
# Cargo
|
|
**/Cargo.lock.bak
|
|
|
|
# Flutter / Dart generated (but keep pubspec.lock for the PoC apps)
|
|
**/.dart_tool/
|
|
**/.flutter-plugins
|
|
**/.flutter-plugins-dependencies
|
|
**/.packages
|
|
**/build/
|
|
**/ephemeral/
|
|
**/generated_plugin_registrant.*
|
|
**/GeneratedPluginRegistrant.*
|
|
|
|
# FRB / cargokit local build dirs
|
|
**/cargokit_build/
|
|
|
|
# Android / Gradle local state
|
|
**/.gradle/
|
|
**/local.properties
|
|
|
|
# JNI native libraries produced by cargoBuildRust / cargo-ndk
|
|
# (regenerated by the Gradle build; not project source).
|
|
**/jniLibs/**/*.so
|
|
|
|
# IntelliJ / Android Studio per-project
|
|
**/*.iml
|
|
|
|
# Eclipse / Buildship local project metadata
|
|
**/.project
|
|
**/.classpath
|
|
**/.settings/
|
|
|
|
# Flutter DevTools local preferences
|
|
**/devtools_options.yaml
|
|
|
|
# gen2/ holds the externally-provided review summary + zip baseline.
|
|
# Not part of the repo tree; do not commit.
|
|
/gen2/
|
|
|
|
# opencode agent local config
|
|
opencode.json
|
|
|
|
# Local protocol scratch file
|
|
/test_tsproto.rs
|
|
|
|
# iOS framework build artifacts produced by chanora_bridge.podspec
|
|
/apps/chanora_flutter/ios/Frameworks/
|
|
|
|
# macOS framework build artifacts produced by chanora_bridge.podspec
|
|
# (prepare_command + script_phase rm -rf and regenerate this tree on
|
|
# every pod install AND every Xcode build, so tracking it in git is
|
|
# pure waste — the committed binary was ~40 MB per commit).
|
|
/apps/chanora_flutter/macos/Frameworks/
|
|
.opencode/
|
|
AGENTS.md
|
|
Screenshot 2026-05-17 at 22.23.07.png
|
|
|
|
# Xcode archive / export bundles (generated by Product > Archive > Distribute)
|
|
**/Chanora */
|
|
**/*.xcarchive/
|
|
**/*.ipa
|
|
**/*.dSYM/
|
|
|
|
# macOS release zip bundles produced by local release scripts
|
|
/chanora-v*.zip
|
|
|
|
# Local agent / tooling state
|
|
.omo/
|
|
.playwright-mcp/
|