Skip to content

Emit the app catalog's connector symbol at SF Symbols 6 too - #344

Merged
Ryanmello07 merged 1 commit into
urnetwork:mainfrom
Ryanmello07:fix/app-catalog-sf-symbols-6
Sep 9, 2026
Merged

Emit the app catalog's connector symbol at SF Symbols 6 too#344
Ryanmello07 merged 1 commit into
urnetwork:mainfrom
Ryanmello07:fix/app-catalog-sf-symbols-6

Conversation

@Ryanmello07

Copy link
Copy Markdown
Contributor

CI has been red on main since 2026-09-03

Every run fails in the same place, before any artwork is read:

error: Template format 7.0 is newer than the version that this software supports (6.0)
app/network/Assets.xcassets:./ur.symbols.connector.fill.symbolset/[universal][][][]: error:
  The SVG file provided for the symbol image set 'ur.symbols.connector.fill' is not suitable
** BUILD FAILED **  exit 65

It hides more than one red check

The build dies in the first of four post-SDK steps, so three never execute on any run: Check the network extension size budget, Build for macOS (unsigned) — the entire macOS half of a check named "iOS + macOS" — and Run unit tests on the iOS Simulator. The recurring No files were found with the provided path: apple/app/build/networkTests.xcresult warning is a symptom of that, not a second defect.

And inside the iOS step, the app target is never compiled. Ld …/URnetwork.app/URnetwork appears zero times in the logs, and SwiftCompile … URnetwork is announced 30–350 ms before exit 65 — scheduled, then cancelled by the actool failure. A whole-module compile of 238 files does not happen in 30 ms; the much smaller widgets module takes 5–16 s. URnetworkWidgets and URnetworkVPN do compile and link, so the failure is narrowly the app target plus everything downstream of it.

So main has had no compile coverage of the app target and no test coverage at all for six days and roughly 25,000 lines.

This is a regression of a fix that already landed

#338 downgraded these symbols to Template v.6.0 and added app/widgets/Assets.xcassets/gen_connector_symbols.py, whose docstring already states the constraint — CI pins Xcode 16.4 at build-and-test.yml:93 and its actool rejects a newer template outright.

That fix generated only the widgets catalog. A later SF Symbols 7 export landed a fresh copy of the same symbol in app/network, which nothing owned, so the constraint silently did not apply to it. Two catalogs carry this symbol; one was protected.

The change

Regenerate the app/network copy from that same script. The diff is the version stamp and the SF Symbols 7 style attributes — -sfsymbols-motion-group, -sfsymbols-layer-tags, -sfsymbols-draw-reverses-motion-groups — which the pinned toolchain cannot read anyway. Not one <path> element changes, and Contents.json is untouched.

I verified the script is a faithful source rather than trusting it: generating into a temp directory reproduces the committed widgets catalog byte for byte, so its output is exactly what has been building in CI all along. Only the .fill symbolset is copied across — app/network does not carry the outline variant and this does not add one.

The docstring now records that two catalogs carry these symbols and both are subject to the 6.0 rule, with the command for each. Generating only one of them is precisely how the constraint was lost.

Trade-off

The SF Symbols 7 motion-group and layer-tag metadata is dropped from this copy. It is unreadable on Xcode 16.4 and inert on every shipping OS. If symbol motion animation is wanted later, those attributes come back together with moving the Xcode pin — which is a deliberate, documented pin matching objectVersion 77 / LastUpgradeVersion 1620, and not something to change for a one-file problem.

Verification

Builds clean for iOS locally, and that build gets past the asset catalog and compiles the full app target.

Being straight about the limit: my local Xcode is 27, which reads v7.0 happily, so a green local build does not by itself prove the fix. The evidence that it does is that this file is now byte-identical in form to the widgets copy that CI has been compiling successfully for weeks. This PR's own run is the actual proof — and it should be the first run since 2026-09-03 to reach the app-target compile, the macOS build, the size gate and the test suite. Expect it to take noticeably longer than the current ~7 minutes, and do not be surprised if something further back in that 25k-line window surfaces once the build can finally get there.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AWV4MaF9JBcQppSX9UxATa

CI has been red on main since 2026-09-03. Every run fails in the same
place, before any artwork is read:

    error: Template format 7.0 is newer than the version that this
    software supports (6.0)
    app/network/Assets.xcassets:./ur.symbols.connector.fill.symbolset:
    The SVG file provided for the symbol image set is not suitable

The build dies there, so three steps never run at all: the extension size
budget, the whole macOS leg of a check named "iOS + macOS", and the unit
tests. Inside the iOS step the app target is never compiled either -- its
Swift task is scheduled and cancelled milliseconds later -- so main has
had no compile coverage of the app, and no test coverage at all, for six
days and roughly 25k lines.

This is a regression of a fix that already landed. urnetwork#338 downgraded the
symbols to Template v.6.0 and added gen_connector_symbols.py, whose
docstring states the constraint: CI pins Xcode 16.4 and its actool
rejects a newer template outright. That fix generated only the widgets
catalog. A later SF Symbols 7 export landed a fresh copy of the same
symbol in app/network, which nothing here owned, so the constraint
silently did not apply to it.

Regenerate that copy from the same script. The diff is the version stamp
and the SF Symbols 7 style attributes -- motion groups and layer tags,
which the pinned toolchain cannot read anyway; not one path element
changes. Verified by generating into a temp directory and diffing: the
script reproduces the committed widgets catalog byte for byte, so its
output is exactly what has been building in CI all along.

Also record in the docstring that TWO catalogs carry these symbols and
that both are subject to the 6.0 rule, with the commands for each.
Generating only one of them is precisely how the constraint was lost.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AWV4MaF9JBcQppSX9UxATa
@Ryanmello07
Ryanmello07 merged commit 6cd3886 into urnetwork:main Sep 9, 2026
1 check failed
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