Individual/Hobbyist (Best Team/Solo Build)
ShipGaurd
From iOS App TestFlight Crash feedback to xcode Validated pull requests.
Core trick
Pulls TestFlight crash reports via the App Store Connect API, has an agent search and read the repo, and opens a PR only after Xcode build validation passes.
Built with
google-cloud
Description
Category: The Taskmaster
ShipGuard is built for the
Taskmaster
track. It turns a real TestFlight report into an independently completed engineering workflow.
Inspiration
Building iOS apps is one of the things I enjoy most. But after I distribute a TestFlight build, turning beta-tester feedback into a reliable fix is still highly manual.
A tester reports a crash or broken screen. I need to find the report, understand the issue, search the repository, inspect recent changes, form a hypothesis, write a fix, create a branch, run Xcode, and prepare a pull request.
For small bugs, this coordination work can take longer than the actual code change.
That led to a simple question:
What if TestFlight feedback could start the debugging process itself?
I did not want another coding assistant that waits for a developer to describe the problem. I wanted an autonomous first responder that can take the report, gather evidence, validate a safe fix, and hand the developer a reviewable pull request.
That is ShipGuard.
What it does
ShipGuard turns TestFlight screenshot feedback and crash submissions into evidence-based, Xcode-validated GitHub pull requests.
When new feedback arrives, ShipGuard automatically:
Retrieves and deduplicates feedback from the App Store Connect API
Maps the iOS app to its connected GitHub repository
Uses Google ADK and Gemini to investigate the real codebase
Searches relevant code, reads source files, and examines recent commits
Separates facts from hypotheses and assigns a confidence score
Proposes the smallest supported code change
Applies deterministic patch and risk checks
Validates that exact patch with a real
xcodebuild
on a hosted macOS runner
Stops safely when evidence is weak, validation fails, or risk is too high
Creates a GitHub pull request only after validation succeeds
ShipGuard never merges its own pull requests. The developer always makes the final engineering decision.
How I built it
ShipGuard is an event-driven autonomous pipeline running on Google Cloud.
Cloud Scheduler checks App Store Connect for new TestFlight feedback. The sync service normalizes and deduplicates each report, stores it in Firestore, and publishes one event per new item to the
shipguard-feedback
Pub/Sub topic.
The
shipguard-feedback-sub
subscription delivers that event to a Cloud Run worker. This worker uses Google ADK with Gemini 3.5 Flash through Vertex AI to investigate the repository and propose a minimal fix.
The agents have read-only GitHub tools. They can inspect the repository tree, search code, read files, and inspect recent commits, but they cannot write to GitHub. All branch and pull-request creation is handled later by deterministic backend code.
Before validation, ShipGuard records the exact base commit and calculates a SHA-256 fingerprint for the proposed patch.
Cloud Run runs Linux, while Xcode requires macOS. ShipGuard creates an isolated validation branch and triggers
shipguard-validation.yml
on a hosted GitHub Actions macOS runner. That runner performs a real Xcode build.
Cloud Scheduler then checks the GitHub Actions result asynchronously. When validation reaches a terminal state, ShipGuard publishes a
shipguard-validation-complete
event. The
shipguard-validation-complete-sub
subscription triggers the final publication worker.
Before creating a pull request, ShipGuard re-checks:
The base branch has not advanced
The patch fingerprint still matches
The resulting changed-file hashes still match
The patch meets the project risk policy
The real Xcode validation passed
Only then does it create a deterministic
shipguard/fix-*
branch and open a pull request.
A separate, read-only Next.js dashboard subscribes to Firestore and shows the workflow live:
Detected → Investigating → Fix Generated → Validating → Pull Request Ready
Engineering and safety
ShipGuard is intentionally designed as a production-minded system, not a long-running prompt.
Decoupled workflow
TestFlight syncing, AI investigation, Xcode validation, and PR publication are separate stages connected through Pub/Sub. A slow build, retry, or failed issue does not block new feedback from being collected.
Durable state, not chat memory
Each Gemini step uses a fresh, structured ADK session. Durable state lives in Firestore: projects, feedback, runs, validation jobs, event state, and processing locks. This makes progress observable, resumable, and independent of a chat session.
Idempotency
Pub/Sub is at-least-once, so workers use transactional Firestore locks and idempotent processing. The same feedback event cannot create duplicate work.
Branch identity is based on the base commit SHA and patch fingerprint, so repeated execution maps to the same validated fix rather than creating duplicate branches or pull requests.
Scoped permissions and credentials
GitHub and App Store Connect credentials are stored in Google Secret Manager, not in source code, logs, Firestore, or the dashboard.
Production internal endpoints require Google-signed OIDC authentication. Protected branches are never written to.
Safe failure behavior
ShipGuard does not invent a fix when evidence is weak. It reports
needs_more_context
.
It reports partial validation when the environment cannot validate meaningfully, rather than claiming success. Builds and tests have timeouts.
If the branch changes, the patch differs, validation fails, or risk is high, ShipGuard stops for human review.
The core principle is simple:
AI proposes → deterministic checks verify → real Xcode validates → developer reviews
AI agents
Agent
Role
Access
ShipGuardAgent
Turns a bug report into structured analysis
No tools
InvestigationAgent
Investigates the repository and gathers evidence
Read-only GitHub tools
FixAgent
Proposes the smallest evidence-based patch
Read-only GitHub tools
ValidationAgent
Explains real build and test results
No tools
Tech stack
Area
Technology
Agent orchestration
Google ADK
AI model
Gemini 3.5 Flash through Vertex AI
Backend
Python, FastAPI, Cloud Run
Events
Cloud Pub/Sub
Scheduling
Cloud Scheduler
State and database
Cloud Firestore
Secrets
Google Secret Manager
TestFlight feedback
App Store Connect API
Repository and pull requests
GitHub API
iOS validation
GitHub Actions hosted macOS runner, Xcode,
xcodebuild
Dashboard
Next.js, TypeScript, Firebase Web SDK
Challenges I ran into
The first challenge was making ShipGuard autonomous without making it unsafe.
Letting an LLM generate code and push it directly would have been easy, but unreliable. I addressed this with confidence thresholds, minimal-patch checks, risk classification, protected-branch rules, exact base-commit tracking, patch fingerprints, real build validation, and human review.
The second challenge was iOS validation in the cloud.
Google Cloud Run is Linux, but Xcode requires macOS. I separated reasoning from validation. Google Cloud orchestrates the workflow, while GitHub Actions provides a hosted macOS runner for the real Xcode build.
The third challenge was long-running work.
An Xcode build can take minutes, so Cloud Run should not keep one HTTP request open waiting for it. Pub/Sub, Firestore validation jobs, Cloud Scheduler checks, and continuation events let ShipGuard continue the workflow asynchronously.
Accomplishments I’m proud of
I’m most proud that ShipGuard performs a real end-to-end workflow rather than simulating one.
In the demo, ShipGuard automatically:
Detected TestFlight feedback → investigated a real repository → found supporting evidence → generated a minimal fix → created a validation branch → ran a real Xcode build → verified patch identity → opened a real GitHub pull request
The developer’s computer was not running, and no manual debugging workflow was started.
I’m also proud that the project treats safety as a feature, not an afterthought. ShipGuard does not write to protected branches, does not auto-merge, and does not claim an AI suggestion is validated until the exact patch has passed real Xcode validation.
What I learned
I learned that reliable agents need more than an LLM. Gemini handles investigation and reasoning, but deterministic code controls validation, repository writes, and safety checks.
The most important difference is between an AI suggestion and a fix that has passed a real Xcode build.
What's next
Next, I want to add crash-log analysis, duplicate issue grouping, Crashlytics integration, Slack notifications, configurable approval rules, and authenticated team dashboards.
The goal is simple: reduce the time between a tester finding an issue and a developer receiving a validated fix for review.