M5: Run CI on our own spindle (ENG-470) #36

Merged demi.dev
targeting main from stoopkidddd/eng-470-s3-move-pneumos-ci-to-spindledemidev
Merged opened by and assigned to demi.dev
targeting main from stoopkidddd/eng-470-s3-move-pneumos-ci-to-spindledemidev

Linear: ENG-470 (project Spindle). It closes out ENG-460.

Summary #

Pneumo's CI now runs on our own spindle, spindle.demi.dev: a mill on Railway plus a nixery executor on the owner's home server. Tangled's hosted spindle had denied every run since its 4 GiB repo quota arrived (ENG-460). The workflow files don't change.

  • docs/adr/0005-ci-on-our-own-spindle.md records the context, the decision and the consequences:

    • 4 seats in parallel;
    • a 15-minute run-time timeout, which retires the queue-inclusive 5-minute budget;
    • the home server as a dependency;
    • about $5/month;
    • the hosted CI history dropped at the switch.
  • docs/agents/tangled.md gets a new "Our spindle (since 2026-11-01)" section:

    • the architecture, and where the runbook lives;
    • limits and scheduling;
    • the cancel path (spindle XRPC);
    • what to do when the executor is offline;
    • the first runs' durations and memory.

    The old hosted-spindle measurements are kept under "Hosted spindle (history, until 2026-11-01)". The CI coverage table notes that its durations are hosted and its local-only choices still stand.

  • docs/SPEC.md §16.4: the CI line now names our spindle and links ADR 0005.

Verify #

$ mise run check:infra   → exit 0 (workflow files valid)

Evidence on our spindle (2026-11-01) #

  • Pull 35, pipeline 3mzbe5b6nod22: 4/4. ts 3m25s · infra 3m12s · android 2m57s · e2e 6m34s.
  • Pull 34, retry 3mzbexpv5zb22: 4/4. Its first run hit the ENG-497 test-timeout flake under parallel load.
  • Peak memory per container (cgroup memory.peak): 2.6 to 3.6 GiB, and two at the 6 GiB cap. The kernel recorded 0 OOM kills.

🤖 Generated with Claude Code

Commits 0