The factory floor

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.

4 connectors built by the crew 9 written before the factory 25 lanes on the clock 75 verification checks today 1 disagreed with the source

The workshop

How a source becomes a lane

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.

1 · Draft

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

2 · Build

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

3 · Audit

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

4 · Keep

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

frededgarstatcanblsfiscaldataworldbankecbabs-data-api · index-onlybis-stats · index-onlyeurostat · index-onlyinsee-bdm · index-onlyons-api · index-only

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

Twenty-four hours, as it happened

Coordinated Universal Time 22:04:06 Fri 24 Jul 2026 92.0% of the UTC day elapsed
Next lane 07:55:53 refresh fred · due 06:00Z nothing running right now · last event 58m ago
Today's shift 18 / 7 lanes run · 75 verification checks, 1 disagreed 2 internal runs withheld
000306091215182100 refresh fredrefresh fred · succeeded · 06:00Z → 06:03Z (3m) · 12 checks, 7 passed · 1 new values refresh edgarrefresh edgar · succeeded · 07:00Z → 07:00Z (8.3s) · 13 checks, 7 passed refresh statcanrefresh statcan · succeeded · 14:00Z → 14:01Z (41.9s) · 21 checks, 9 passed · 2 new values refresh blsrefresh bls · succeeded · 15:00Z → 15:00Z (28.4s) · 9 checks, 6 passed refresh ecbrefresh ecb · succeeded · 16:16Z → 16:16Z (12.2s) · 5 checks, 5 passed · 4 new values refresh fiscaldatarefresh fiscaldata · succeeded · 21:00Z → 21:01Z (58.8s) · 15 checks, 3 passed · 3 new values promotepromote · succeeded · 08:00Z → 08:00Z (2.5s) · 1 promoted, 0 demoted
succeeded failed running abandoned scheduled, not yet run slot missed now

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.

LaneScheduleStateLast runTookNext 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.