fix(mobile): isolate extension linker flags; complete iOS build in CI - #7187
Conversation
Signed-off-by: Tom Brow <tomb@block.xyz> Co-authored-by: Codex <noreply@openai.com> Ai-assisted: true
|
@builderbot review |
|
@codex review |
🔐 Codex Security Review
|
|
@buzz-security-review 48089d0 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 48089d025d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Signed-off-by: Tom Brow <tomb@block.xyz> Co-authored-by: Codex <noreply@openai.com> Ai-assisted: true
|
@codex review |
|
@builderbot review |
|
@buzz-security-review f5486b4 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f5486b468e
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: Tom Brow <tomb@block.xyz> Co-authored-by: Codex <noreply@openai.com> Ai-assisted: true
|
@codex review |
|
@builderbot review |
|
@buzz-security-review f0a3c7b |
|
Codex Review: Didn't find any major issues. Nice work! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: APPROVE
Reviewed: bd73490418266f267d9bb3bdf13e64582adc8e80..f0a3c7b32503eb188d3e47c133aa0ef25ff18248 (exact head f0a3c7b32503eb188d3e47c133aa0ef25ff18248)
Risk: medium — iOS target inheritance and CI packaging coverage; a bad setting can break the app extension or strip Runner plugin linkage.
Behavior/contracts traced: NotificationService Debug/Release/Profile base configurations and target overrides; Runner versus extension framework phases; local Swift-package linkage; CocoaPods/Flutter xcconfig inheritance; extension embedding; unsigned device Release CI selection and artifact scope.
Findings: no blocking code defect.
The target-level empty OTHER_LDFLAGS assignments correctly override the shared Flutter xcconfigs only for NotificationService (mobile/ios/Runner.xcodeproj/project.pbxproj:924-997). Runner continues to inherit the configuration-specific CocoaPods linker flags, while both Runner and NotificationService retain explicit BuzzPushKit framework linkage and Runner embeds NotificationService.appex.
The new job is materially stronger than the previous standalone package checks: after Flutter dependency resolution it runs flutter build ios --release --no-codesign --no-pub (.github/workflows/ci.yml:1001-1019), exercising the production device Release graph through CocoaPods, Runner, BuzzPushKit, and the embedded extension.
Author action: none.
Verification owner: release operator for signed archive/export, entitlement reconciliation, installation, and notification-extension invocation.
Validation:
- Exact-head GitHub
Mobile Swiftpassed: https://github.com/block/buzz/actions/runs/33539643211/job/99974684957. Its log records the deviceios-releasebuild, pod install, Xcode build, andBuilt build/ios/iphoneos/Buzz.app (72.2MB). - Independent clean exact-head reproduction of the CI command passed and produced
Buzz.app/PlugIns/NotificationService.appex; binary inspection found Runner's Flutter/plugin linkage intact and no Flutter/plugin dylib dependency in NotificationService. - Causal clean mutation: removing only the Release override made the same Release build fail on undefined Flutter symbols; restoring it returned a clean exact-head tree. This establishes that the new gate catches the reported RC linker regression rather than compiling a convenient fragment.
- Local resolved Release settings after pod generation showed Runner retaining non-empty CocoaPods
OTHER_LDFLAGS; direct NotificationService settings resolved without inherited linker flags. - All exact-head PR checks are green;
git diff --checkand project plist validation passed in independent review.
Manual/native evidence: unsigned arm64 device build and embedded-binary inspection only; no signed archive, install, launch, APNs delivery, or extension-runtime invocation.
Residual risk: the build gate mutation-proves Release, not Debug/Profile. Those two target assignments are source-reviewed but not independently regression-bound. I classify this as optional hardening rather than an author-actionable defect: Release is the shipping configuration and the configuration implicated by the reported RC failure, and the PR does not claim all-configuration build coverage. A lightweight resolved-settings contract for all three configurations would reduce future Xcode-regeneration risk, but should not block this bounded release repair.
— :bot: Jude’s code review agent
…enericize * origin/main: fix(desktop): preserve keyring identity during recovery (#7203) feat(mobile): prepare `buzz-push-gateway` for deployment (#7158) ci: relax file-size ceilings by surface (#6485) fix(mobile): isolate extension linker flags; complete iOS build in CI (#7187) chore(ci): lower Codex security review effort (#7179) fix(dev-mcp): extend shell timeout cap to 20 minutes and align outer budgets (#7185) fix(dev): keep the canonical profile when launching from desktop/ (#7143) feat(buzz-auth): add production NIP-FI federated assertion runtime (#7109) Hide download action on voice notes (#7182) Signed-off-by: Hayt <9e1c23a3fd83f61da34420e4e88ff1b16e45cafcc0cd9019eb07d4ecfa8ca9b0@buzz.block.builderlab.xyz>
* origin/main: feat(buzz-agent): add DatabricksAuthCoordinator single-flight OAuth (#5545) fix(desktop): preserve keyring identity during recovery (#7203) feat(mobile): prepare `buzz-push-gateway` for deployment (#7158) ci: relax file-size ceilings by surface (#6485) fix(mobile): isolate extension linker flags; complete iOS build in CI (#7187) Signed-off-by: John Tennant <jtennant@squareup.com> # Conflicts: # crates/buzz-db/src/runtime/migration.rs
…c-agent-commit-identity * origin/main: feat(buzz-agent): add DatabricksAuthCoordinator single-flight OAuth (#5545) fix(desktop): preserve keyring identity during recovery (#7203) feat(mobile): prepare `buzz-push-gateway` for deployment (#7158) ci: relax file-size ceilings by surface (#6485) fix(mobile): isolate extension linker flags; complete iOS build in CI (#7187) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz> # Conflicts: # .github/workflows/ci.yml
* origin/main: feat(buzz-agent): add DatabricksAuthCoordinator single-flight OAuth (#5545) fix(desktop): preserve keyring identity during recovery (#7203) feat(mobile): prepare `buzz-push-gateway` for deployment (#7158) ci: relax file-size ceilings by surface (#6485) fix(mobile): isolate extension linker flags; complete iOS build in CI (#7187) chore(ci): lower Codex security review effort (#7179) fix(dev-mcp): extend shell timeout cap to 20 minutes and align outer budgets (#7185) fix(dev): keep the canonical profile when launching from desktop/ (#7143) feat(buzz-auth): add production NIP-FI federated assertion runtime (#7109) Hide download action on voice notes (#7182) ci: run PostgreSQL tests in isolated lane (#6730) Add voice notes to desktop messages (#6978) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz>
…rding-v3 * origin/main: feat(buzz-agent): add DatabricksAuthCoordinator single-flight OAuth (#5545) fix(desktop): preserve keyring identity during recovery (#7203) feat(mobile): prepare `buzz-push-gateway` for deployment (#7158) ci: relax file-size ceilings by surface (#6485) fix(mobile): isolate extension linker flags; complete iOS build in CI (#7187) chore(ci): lower Codex security review effort (#7179) fix(dev-mcp): extend shell timeout cap to 20 minutes and align outer budgets (#7185) fix(dev): keep the canonical profile when launching from desktop/ (#7143) feat(buzz-auth): add production NIP-FI federated assertion runtime (#7109) Hide download action on voice notes (#7182) ci: run PostgreSQL tests in isolated lane (#6730) Add voice notes to desktop messages (#6978) Signed-off-by: Clay Delk <clay.delk@gmail.com>
…agent-edit * origin/main: feat(buzz-agent): add DatabricksAuthCoordinator single-flight OAuth (#5545) fix(desktop): preserve keyring identity during recovery (#7203) feat(mobile): prepare `buzz-push-gateway` for deployment (#7158) ci: relax file-size ceilings by surface (#6485) fix(mobile): isolate extension linker flags; complete iOS build in CI (#7187) chore(ci): lower Codex security review effort (#7179) fix(dev-mcp): extend shell timeout cap to 20 minutes and align outer budgets (#7185) fix(dev): keep the canonical profile when launching from desktop/ (#7143) feat(buzz-auth): add production NIP-FI federated assertion runtime (#7109) Hide download action on voice notes (#7182) Signed-off-by: Duncan <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@buzz.block.builderlab.xyz> # Conflicts: # desktop/src/features/agents/AGENTS.md
What changed?
Clear inherited linker flags on the NotificationService target in Debug, Release, and Profile. The extension continues to link BuzzPushKit through its target framework phase, while Runner retains its CocoaPods plugin flags.
Extend the macOS mobile CI lane to install Flutter dependencies and build the complete unsigned iOS Release app. This exercises the production Flutter, CocoaPods, Runner, BuzzPushKit, and NotificationService build graph on every mobile change.
Why?
The iOS 0.16 RC archive exposed that NotificationService inherits Runner-only CocoaPods linker flags through the shared Flutter xcconfig. That made the extension link Flutter plugins without the Flutter engine and fail on unresolved Flutter symbols.
The previous CI coverage built only the standalone BuzzPushKit package, so it could not detect an app or extension linker regression.
How is it tested?
NotificationService.appex.flutter build ios --release --no-codesign --no-pub.