Skip to content

fix(ios): pick upstream Xcode 27 archive fixes (NSE linker flags, pod deployment floor, C secp256k1) - #199

Merged
RossHartmann merged 5 commits into
mainfrom
fix/ios-xcode27-archive
Oct 17, 2026
Merged

RossHartmann merged 5 commits into
mainfrom
fix/ios-xcode27-archive

Conversation

@RossHartmann

@RossHartmann RossHartmann commented Oct 16, 2026 •

Copy link
Copy Markdown

This picks three upstream fixes so the first Kiingo TestFlight archive can build with Xcode 27.0, the only Xcode on the release Mac. Each was flagged in the mobile agent's upstream-sync risk analysis.

Upstream What Conflict resolution
b270437 (block#7187) NotificationService sets OTHER_LDFLAGS = "" in all three configs, so the extension stops inheriting Runner's CocoaPods plugin linker flags. Without this, the Release archive fails to link. pbxproj only. Its ci.yml change is not taken, because fork runners refuse a workflow that differs from main (public_workflow_not_current).
46159fc (block#8379) The Podfile post_install raises generated pod deployment targets below iOS 16 to 16, because Xcode 27 rejects targets below iOS 15. PODFILE CHECKSUM is recomputed as the SHA-1 of the fork's Podfile, which is how CocoaPods computes it.
7396243 (block#8398) BuzzPushKit replaces swift-secp256k1 0.21.1, which Xcode 27 can't compile (UInt256.words ambiguity), with vendored, unmodified Bitcoin Core libsecp256k1 v0.8.0 behind a small NostrSchnorr adapter. Upstream-only files are not taken: the notification cache, the avatar loader and their tests. SwiftDraw is not added. The workspace Package.resolved is removed because no remote Swift package remains.

Validation: on this Mac, swift build --build-tests for BuzzPushKit on Xcode 27.0 completes. This compiles the package and its tests but runs nothing. The full Runner and NSE link is checked at the first archive. Fork CI does not build iOS.

Fork inventory: a drop/upstream-present delta for the 139 picked paths, plus an amendment taking modified upstream files from 262 to 267. Production-source budgets are unchanged.

🤖 Generated with Claude Code

brow and others added 5 commits October 16, 2026 16:51
…block#7187)

### 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?

- A complete unsigned Release build of the Runner scheme succeeded with
Xcode and linked, embedded, and validated `NotificationService.appex`.
- The new GitHub Actions lane builds the full unsigned iOS Release app
with `flutter build ios --release --no-codesign --no-pub`.
- Pre-commit and pre-push hooks passed.

---------

Signed-off-by: Tom Brow <[email protected]>
Co-authored-by: Codex <[email protected]>
(cherry picked from commit b270437)
Signed-off-by: Ross Hartmann <[email protected]>
)

Xcode 27 rejects generated CocoaPods targets with deployment versions
below iOS 15, even though the app already requires iOS 16. Raise lower
explicit pod deployment targets to the existing iOS 16 minimum during
installation, preserving targets that require a newer version.

On main at 7852b16, the ordinary unsigned Release build with exact
Xcode 27.0 failed on pod targets set to iOS 9–13. After this change and
a normal pod install, none of the 189 generated build configurations
specifies a target below iOS 16, and the same build passes
deployment-target validation without a command-line override.

The full build remains blocked by the independent swift-secp256k1 0.21.1
`UInt256.words` compiler ambiguity. This PR does not fix or change that
dependency. Xcode pin
[buzz-releases#110](squareup/buzz-releases#110)
remains gated on a complete ordinary release build and its other
prerequisites.

Related: Wes’s [PR block#8330](block#8330)
independently includes a similar Podfile fix alongside DeviceHub
changes. This PR contains only the Podfile floor and its lockfile
checksum. Full local `just ci` passed; focused iOS validation above is
complete. The regenerated lockfile changes only the Podfile checksum;
`pod install --deployment` succeeds with CocoaPods 1.16.2.

---------

Signed-off-by: Tom Brow <[email protected]>
(cherry picked from commit 46159fc)
Signed-off-by: Ross Hartmann <[email protected]>
Replace the Swift secp256k1 wrapper with a small native adapter over
Bitcoin Core libsecp256k1. This is an alternative to the wrapper upgrade
in [block#8381](block#8381), not an additional
change to merge alongside it.

The adapter covers the three Nostr operations Buzz needs: x-only
public-key derivation, BIP-340 signing, and signature verification. It
compiles pinned, unmodified upstream C source through SwiftPM. There is
no build plugin, plugin approval script, or underscored Swift import.
The app and notification extension use an explicit C module map and
header search path.

This trades the third-party Swift wrapper for a Buzz-owned adapter and
responsibility for updating the vendored C source. Upstream v0.8.0
source, its license, and update provenance are included. The release
Xcode pin remains separate in
[buzz-releases#110](squareup/buzz-releases#110).

- Native package tests passed on Xcode 27.0 and 26.5: 96 XCTest tests
and 65 Swift Testing tests per toolchain.
- Added tests cover the official BIP-340 vectors for 32-byte Nostr
messages, invalid secret keys, and malformed input lengths.
- Full unsigned Release app and notification extension build passed on
exact Xcode 27.0.
- Vendored files were compared byte-for-byte with upstream v0.8.0.
- Full local `just ci` passed.
- [Hosted full unsigned iOS Release
build](https://github.com/block/buzz/actions/runs/38924020583/job/117051237094)
passed. [Hosted Native Swift
validation](https://github.com/block/buzz/actions/runs/38924020583/job/117051237153)
passed, including the complete simulator build and native controls/push
navigation tests.
- Codex code review and security review completed with no findings.

- [x] Tom selected the direct-C approach with vendored upstream source;
[the wrapper alternative](block#8381) is
closed.

Signed-off-by: Tom Brow <[email protected]>
(cherry picked from commit 7396243)
Signed-off-by: Ross Hartmann <[email protected]>
Inventory delta (drop/upstream-present) for the picked b270437, 46159fc
and 7396243 paths, and an amendment for five newly modified upstream files
(262 -> 267).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Ross Hartmann <[email protected]>
Fork runners refuse jobs whose workflow differs from main
(public_workflow_not_current), so the b270437 CI lane change is not taken.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Ross Hartmann <[email protected]>
@RossHartmann
RossHartmann force-pushed the fix/ios-xcode27-archive branch from 5e166f2 to 1b489cd Compare October 16, 2026 23:52
@RossHartmann
RossHartmann merged commit a55a112 into main Oct 17, 2026
RossHartmann pushed a commit that referenced this pull request Oct 17, 2026
…am-60de1db0

Conflict resolutions:
- iOS Xcode 27 picks (#199) and the block#7745 backport (#208) are upstream
  commits already in the 97e1f6a snapshot: take the sync side for every
  #199 path and drop both drop/upstream-present deltas.
- deny.toml: keep upstream's ignores and main's RUSTSEC-2026-0367/0368/0369;
  the sync tree pulls zip 8.6.0 via mesh-llm v0.76.2, re-audited: plugin
  manager and autoupdate still never call extract() and write plain files.
- Message Details (#205): desktop composes the host ref with the right-click
  root ref; mobile adds Details to upstream's grouped action sheet (the
  popover was removed upstream in block#8280) with a Tabler info-circle icon;
  retired-notice filtering passes agentPubkeys at upstream's new
  formatTimeline call sites.
- Hosted agents (#201): Lucide icons -> BuzzIcons (lucide removed upstream).
- Inventory: sync inventory plus main's new deltas (remote signer, guest
  alert Review, Message Details) and the merged hosted-agents delta paths.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
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