{
  "$type": "site.standard.document",
  "bskyPostRef": {
    "cid": "bafyreiejg3ekjoymum35tge6vcji4anq426uku5kfawpludd3jrsmdddvy",
    "uri": "at://did:plc:2u26gaflouttm3uj6jkgroyz/app.bsky.feed.post/3mizu7enk2vi2"
  },
  "coverImage": {
    "$type": "blob",
    "ref": {
      "$link": "bafkreicnmuehvg42mdv5d3bpkulnf3646ilu2nrdtyqgmcgthnxgumzmpa"
    },
    "mimeType": "image/png",
    "size": 1124470
  },
  "description": "I’ve been building cross-platform software where every change needs to be validated across Windows, macOS, Linux, Android, and iOS before it can land. The coding is handled by AI agents working in parallel across multiple worktrees. The constraint isn’t codegen; it’s coordinating reliable builds.",
  "path": "/2026/04/09/shipyard-is-a-cross-platform-ci-orchestration-layer-that-coordinates-validation-for-ai-agents-working-across-parallel-worktrees/",
  "publishedAt": "2026-04-09T03:23:31.000Z",
  "site": "https://danielraffel.me",
  "tags": [
    "GitHub Actions",
    "Namespace",
    "Shipyard",
    "GitHub - danielraffel/Shipyard: Cross-platform CI coordination — local VMs, SSH hosts, cloud runnersCross-platform CI coordination — local VMs, SSH hosts, cloud runners - danielraffel/ShipyardGitHubdanielraffel"
  ],
  "textContent": "I’ve been building cross-platform software where every change needs to be validated across Windows, macOS, Linux, Android, and iOS before it can land.\n\nI rely heavily on AI agents to do the coding work. They operate in parallel across worktrees—writing code, committing, opening PRs, and attempting to validate before auto-merging.\n\nAt first, everything ran on local VMs. That worked fine when things were mostly sequential. But as I started running agents in parallel, builds began colliding. Jobs stepped on each other. Results became unreliable.\n\nI added a queue to protect the machines.\n\nThat solved the collisions. But once everything flowed through a single queue, something more interesting happened: I could coordinate validation across all my execution environments—local machines, VMs, SSH hosts, and cloud runners (e.g. GitHub Actions runners or Namespace).\n\nAgents could:\n\n  * run builds\n  * read failures\n  * fix issues\n  * retry\n\n\n\nAll without me involved.\n\nI didn’t want to stand up or maintain traditional CI infrastructure. I wanted something lightweight that worked with the machines I already had.\n\nThat abstraction became Shipyard.\n\nShipyard is a thin coordination layer for builds and tests. It doesn’t replace your build system. It answers one question:\n\nDoes this commit pass everywhere it needs to?\n\nIf you’re building cross-platform software—especially with agents working in parallel—that turns out to matter.\n\n* * *\n\n### **What Makes Shipyard Different**\n\n**Exact-SHA validation**\nEvery target validates the specific commit you queued, not whatever happens to be checked out. Code is delivered via git bundles, so targets don’t need credentials. Evidence is bound to the SHA, preventing stale results from satisfying merge gates.\n\n**Smart queue for parallel agents**\nAll agents share a machine-global queue. Jobs are prioritized and scheduled FIFO within priority. New commits replace older pending jobs on the same branch, while targeted reruns and different validation modes can run independently.\n\n**Fail-fast across targets.**\nIf Mac fails, Shipyard stops immediately — it doesn't waste time running Windows and Linux when you already know you need to fix something. Remaining targets are marked as skipped. When you want to run everything regardless (to see the full picture), use `--continue`.\n\n**Targeted re-runs**\nIf Windows fails but macOS and Linux pass, you re-run only Windows. Previous successful results are preserved and reused.\n\n**Stage-aware resume.**\nIf your build succeeded but tests failed, you don't need to rebuild from scratch. Use --resume-from test to skip configure and build, running only the test stage. This works because Shipyard runs validation in stages (configure → build → test) and tracks which stage failed — so both you and your agent know exactly what broke and where to pick up.\n\n**Failover with intent**\nIf a machine is unavailable, Shipyard walks a fallback chain (VM → cloud → hosted runner). Real test failures do not trigger fallback. Every result records which backend produced it.\n\n**Transient failure handling**\nCommon SSH failures are retried with backoff. Permanent errors fail immediately.\n\n**Ecosystem detection**\n`shipyard init` detects 22 common stacks (CMake, Swift, Xcode, Rust, Go, Node, Python, etc.) and infers build/test commands. Polyglot repos are handled without duplication.\n\n**Structured output for agents**\nEvery command supports --json with a versioned schema. Agents consume structured results directly.\n\n**Profiles**\nSwitch between environments (local, normal, full) without editing config.\n\n**Merge gating**\n`shipyard ship` merges only when all required platforms pass for the exact HEAD SHA.\n\n**Operational cleanup**\nLogs and artifacts are managed automatically, with safe cleanup controls.\n\n* * *\n\n## **Sound Useful?**\n\nTry it:\n\nGitHub - danielraffel/Shipyard: Cross-platform CI coordination — local VMs, SSH hosts, cloud runnersCross-platform CI coordination — local VMs, SSH hosts, cloud runners - danielraffel/ShipyardGitHubdanielraffel",
  "title": "Shipyard is a cross-platform CI orchestration layer that coordinates validation for AI agents working across parallel worktrees",
  "updatedAt": "2026-04-09T03:44:50.063Z"
}