Starwell is two products. This is the second one: the agent crew that built the first, and the clockwork it left behind.
Agents build the machines.
The machines run the shift.
The workshop
Four stages, none of them a person. The guardrails below are read off the factory's own configuration, not written by hand — an agent that could edit them would not be a guardrail.
Prospector finds a public statistical source and Scout writes the mission: which datasets matter, which series can be independently cross-checked, what the licence permits.
writes to missions.d/ · no repo access
Builder implements the connector in an isolated git worktree — discover, describe, fetch, licence — until conformance passes. It cannot run shell commands and cannot reach the web outside the source's own API.
80 turns · 45 min ceiling · Bash, WebFetch, WebSearch denied
A second model re-verifies the branch from scratch in its own worktree: secret scan, typecheck, conformance, and every golden value re-confirmed against an independent channel — not the source that produced it. It cannot edit, and it cannot approve its own work.
read-only · 15 turns · Read, Glob, Grep only
Once merged, the connector stops being an agent's problem and becomes a lane on the board below. It is refreshed, re-verified, re-indexed and re-measured on a clock, forever, and a failure opens an issue by itself.
the shift board · every run in the ledger
Every chip is a connector on the shelves. A ✦ marks the 4 the crew drafted, built and audited itself; the other 9 were written by hand before the factory existed, and are the reason the crew had a working contract to build against. Check any of it with git log --diff-filter=A -- src/connectors/<name>. index-only means its catalogue is indexed weekly and its series materialize on demand, but it has no refresh lane yet — refreshing an uncurated source would mean one live request per discovered dataset, so it stays off the clock until its datasets are curated.
Tonight's shift
Rendered 22:04:06Z · x-axis is 2026-07-24 00:00→24:00 UTC · solid marks are rows in the operations ledger, hollow slots are runs that have not happened yet. The moving line is the clock, not activity. Most runs take under two minutes, which is invisible at this scale, so a run is drawn as a marker at its start time and only widens into a duration bar once it genuinely spans that much of the day — hover any mark for its exact times.
Not on today's roster, so not drawn above: 1 refresh lane (next Mon 04:00Z) · 11 index lanes (next Sat 16:00Z) · 6 measure lanes (next Sat 21:00Z). Every lane, on duty or not, is in the table below.
| Lane | Schedule | State | Last run | Took | Next due |
|---|---|---|---|---|---|
| index abs-data-api | 05:00Z (Sun) | healthy | 24h ago | 3.4s | 05:00Z · in 30h 56m |
| index eurostat | 06:00Z (Sun) | healthy | 23h ago | 3.3s | 06:00Z · in 31h 56m |
| index edgar | 07:00Z (Sun) | healthy | 24h ago | 3.1s | 07:00Z · in 32h 56m |
| index fred | 08:00Z (Sun) | healthy | 24h ago | 5.9s | 08:00Z · in 33h 56m |
| index bls | 09:00Z (Sun) | healthy | 24h ago | 1.2s | 09:00Z · in 34h 56m |
| index ons-api | 10:00Z (Sun) | healthy | 24h ago | 2.6s | 10:00Z · in 35h 56m |
| index oecd | 12:00Z (Sun) | healthy | 23h ago | 9.8s | 12:00Z · in 37h 56m |
| index statcan | 16:00Z (Sat) | awaiting-first-run | never | 16:00Z · in 17h 56m | |
| index ecb | 17:00Z (Sat) | healthy | 24h ago | 864ms | 17:00Z · in 18h 56m |
| index worldbank | 18:00Z (Sat) | healthy | 24h ago | 9.0s | 18:00Z · in 19h 56m |
| index insee-bdm | 19:00Z (Sat) | healthy | 24h ago | 577ms | 19:00Z · in 20h 56m |
| refresh worldbank | 04:00Z (Mon+Thu) | failing upstream rejected the request | 42h ago | 9.3s | 04:00Z · in 53h 56m |
| refresh fred | 06:00Z daily | healthy | 16h ago | 3m | 06:00Z · in 7h 56m |
| refresh edgar | 07:00Z daily | healthy | 15h ago | 8.3s | 07:00Z · in 8h 56m |
| refresh statcan | 14:00Z daily | healthy | 8h ago | 41.9s | 14:00Z · in 15h 56m |
| refresh bls | 15:00Z daily | healthy | 7h ago | 28.4s | 15:00Z · in 16h 56m |
| refresh ecb | 16:00Z daily | healthy | 5h ago | 12.2s | 16:00Z · in 17h 56m |
| refresh fiscaldata | 21:00Z daily | healthy | 1h ago | 58.8s | 21:00Z · in 22h 56m |
| measure eurostat | 14:00Z (Sun) | healthy | 5h ago | 2.8s | 14:00Z · in 39h 56m |
| measure fred | 15:00Z (Sun) | healthy | 5h ago | 5m | 15:00Z · in 40h 56m |
| measure fiscaldata | 16:00Z (Sun) | healthy | 3h ago | 2.3s | 16:00Z · in 41h 56m |
| measure insee-bdm | 21:00Z (Sat) | healthy | 5h ago | 587ms | 21:00Z · in 22h 56m |
| measure ecb | 22:00Z (Sat) | healthy | 5h ago | 4m | 22:00Z · in 23h 56m |
| measure statcan | 23:00Z (Sat) | failing service restarted mid-run | 3h ago | 23:00Z · in 24h 56m | |
| promote | 08:00Z daily | healthy | 14h ago | 2.5s | 08:00Z · in 9h 56m |
What this page is
Every solid mark above is one row in dl_ops_runs, the same ledger the alerting reads and the same one the status page counts. Nothing is hand-updated, nothing is replayed faster than it happened, and nothing is drawn for a run that did not occur. The board covers the current UTC day; lane history looks back eight days so a weekly lane still reports its last run.
Most of the day, nothing is running — the lanes are scheduled around each source's own release habits, so a visit at a quiet hour is a quiet page. The hollow slots are there so you can hold us to it: they say what should still happen today, and you can come back and check.
Failures are shown as a kind — rate limited, upstream timeout, source format changed — never as the raw error text, because those strings carry internal schema names and upstream request URLs. The factory also self-checks hourly: 23/23 sweeps clean today. Internal lanes — housekeeping, backups, legal review and the daily brief — are not published; 2 such runs today are withheld. Agents read this page at /factory.json.
Every star is a live indicator in the store. The shift above is what keeps them lit.