ANTIGRAVITY LABJP
Articles/App Development
App Development/2026-08-29Advanced

A Green Build Is Not Proof That Your pbxproj Edit Was Correct

When an agent edits project.pbxproj, the build stays green while resources and script phases quietly fall out. Four structural checks and an audit script that finishes in 0.1 seconds on a 1,200-file project, drawn from running iOS apps in production.

antigravity448xcode5ios37agent-design10build

Premium Article

One of my Android wallpaper apps once shipped a release where the build succeeded, the rollout succeeded, and a subset of devices showed a blank white background. Nothing in the code was broken. Play Store density splitting had dropped the images from one density bucket.

The build result had never said anything about whether the resources actually reached the device.

The same shape of gap exists on iOS, inside project.pbxproj — and it widens as soon as you let an agent edit that file. I run six apps as an indie developer and keep Antigravity agents running through most of my day, but pbxproj is the one file I treat differently. Here is why, and what I put in place instead.

A green build only proves that compilation succeeded

xcodebuild returns success when sources compile, linking resolves, and a product is produced. Almost every pbxproj editing accident lives outside that set.

EditBuild resultWhat actually happens
An image or JSON file drops out of the target's resourcesSuccessA lookup returns nil at runtime and one screen renders empty
A Run Script phase loses its declared output pathsSuccessIt reruns on every incremental build, or gets skipped on CI
An SPM package is added but never linked to the targetSuccess (while unused)It fails somewhere unrelated the day someone imports it
A localization file belongs to no target at allSuccessThat language shows raw key names on screen

Every one of them has the same shape: the reference exists, but it never reaches a build phase. The compiler does not look at this, and it has no reason to.

In the sense of a configuration change that is silently ignored, this is the same root problem I wrote about in How silently ignored config keys slip through CI, and how to close the gap. Wherever a layer accepts an invalid instruction without complaining, that layer becomes a blind spot in your verification.

Why pbxproj diffs slip past review

Build phases in pbxproj are lists of 24-character hexadecimal UUIDs. I took a 1,200-file project, removed the single line for one image, and looked at the diff.

@@ -2508,7 +2508,6 @@
 				3B000000000000000000003F /* img63.png in Resources */,
 				3B0000000000000000000040 /* img64.png in Resources */,
 				3B0000000000000000000041 /* img65.png in Resources */,
-				3B0000000000000000000042 /* img66.png in Resources */,
 				3B0000000000000000000043 /* img67.png in Resources */,
 				3B0000000000000000000044 /* img68.png in Resources */,

One changed line. It looks exactly like its neighbors, and the diff gives you nothing to decide whether the removal was intentional. If an agent had touched thirty files in one pass and this line sat somewhere in the middle, I would not trust myself to catch it.

Git shows you added and removed lines. What matters in a pbxproj is where a reference ends up. The granularity a human reviews at and the granularity the file is structured at simply do not line up.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
Draw your own line between the pbxproj edits an agent may make and the ones Xcode should generate, based on how recoverable each one is
Catch missing resources at commit time instead of hearing about them after release, when only some devices show a blank screen
Take home a structural audit that finishes in 0.1 seconds on a 1,200-file pbxproj, so your verification no longer depends on a green build
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Antigravity Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

Related Articles

App Dev2026-06-27
Why Antigravity Agents Build Your Xcode Project Fine One Day and Break It the Next on a Synced Folder
Put an Xcode project inside a Dropbox-synced folder, hand it to an Antigravity agent, and builds start passing and failing at random. Here is the real cause — sync daemon versus build — and how to fix it with xattr exclusion and a conflict-copy preflight.
App Dev2026-05-04
Swift Testing × Antigravity — Beyond XCTest to AI-Driven Test Design
A comprehensive guide to transforming iOS test quality using Swift Testing and Antigravity together. Covers @Test and #expect macros in practice, parameterized testing, async patterns, XCTest migration strategy, and AI-powered test generation.
App Dev2026-04-16
Where Antigravity Actually Helps in SwiftUI Development — and Where It Doesn't
Practical patterns for integrating Antigravity into SwiftUI development — UI prototyping, SwiftData model design, and test generation. Actionable techniques for indie iOS developers.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →