Skip to content
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.

Tags

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.

Team