Progress · the corpus ledger
Is the universe becoming a graph?
Every other page here shows what the corpus holds. This one shows what it is learning — and it is built to be able to say “nothing useful”. Six relation counts, one row per corpus state, each one a single SQL query that is printed at the foot of this page. A round that lands nine hundred new calibers and no new links has made the universe a denser dust field, not a better graph, and only a per-relation ledger tells those two apart the morning after.
The filled band is the share of the corpus that sits in a family. The hatched region above it is the share that does not — drawn as absence rather than as a lighter quantity of something, the same rule the coverage matrix uses for an empty cell. The axis runs the full 0–100% and is not allowed to crop: this is a share, and a share plotted on a quarter-height axis flatters itself. The x positions are corpus states, evenly spaced — they are rounds, not clock time, and three of the four landed within thirty-six hours of each other.
The six relations, and what each round moved
Each sparkline is normalised to its own minimum and maximum, because these six live three orders of magnitude apart and a shared scale would flatten five of them into a floor. A sparkline here therefore carries shape only; the level is the number printed beside it, and every step’s delta is spelt out underneath.
Designs touching at least one lineage edge at either end. The singleton number: how much of the corpus is a graph rather than a dust field.
Every recorded descent link — derived_from, variant_of, clone_of and the rest — in any lane and at any status.
A watch model wearing a caliber execution. The direction-1 harvest lane.
Designs a sourced watch model actually reaches, through an execution that resolves to a design. The corpus's thinnest relation.
Designs whose producer the corpus can name at all — reviewed or not.
Designs carrying a year a source stated, or a bound this corpus derived. The era axis can place these; everything else sits in the reservoir.
Scale, for the denominators: 12,269 designs · 180,161 claims · 12,386 watch models — 0, +1,011 and 0 against the previous corpus state.
Last night’s round
| Lane | Rows | What it writes | What it refused, and why |
|---|---|---|---|
| direction2_corroboration | 125 | refs appended to existing claims; no claim minted | watch is not a corpus model ×29 claim carries a qualifier this lane will not reproduce ×10 lineage note needs a design this corpus does not hold ×2 |
| designation_resolution | 0 | one `designates` claim per row, in the staging lane at status unverified — it does NOT resolve the execution until a human promotes it into corpus/ (compile.py resolves on accepted targets only). The loop stages evidence; it does not accept it. | no design with this number from this issuer ×250 designation already carries an adjudicated designates target ×6 |
No source was quarantined. A source is parked when its yield per page falls below 60% of its own seven-night median — not when it errors, because a template change that still parses badly is the failure that corrupts a corpus, and an exception is not how you catch it. 0 of 0 sources produced a measurable parse tonight and 0 do not yet have the three nights a median needs, so the rule could not have fired on them either way — which is stated rather than hidden, because a rule that cannot fire yet is not a rule that passed.
Tier 4 of the escalation ladder — work the loop is deliberately not allowed to do on its own, in data/pipeline/needs-human.jsonl:
- lineage-notes/direction2 mint decision
- unowned-harvest/cjk-citizen promotion round needed
- unowned-harvest/cjk-cn-rest promotion round needed
- unowned-harvest/cjk-seagull promotion round needed
- unowned-harvest/cjk-seiko promotion round needed
- vocabulary/specimen-lane vocabulary decision
Not published. the round did not reach the deploy. The round made 0 model calls and spent 0 tokens: every number above came out of a regex, a SQL query or a byte comparison.
The ledger, in full
One row per corpus state, keyed on corpus_sha — so recompiling the same corpus updates its row instead of appending a second one, and a loop that runs twice cannot manufacture a flat night. The source column is not decoration: 3 of these 34 rows were recovered from static export trees left on disk by earlier builds, because this repository has a single commit and git log reconstructs nothing. The recovery is only allowed to write a row when the export tree agrees with itself about which corpus it is, and it is cross-checked against the database on the one corpus both can measure.
| Compiled | Corpus | Connected calibers | Lineage edges | Usage edges | Calibers with a watch | Calibers with a maker | Calibers placed in time | Scale | Measured from |
|---|---|---|---|---|---|---|---|---|---|
| 8 Sep 2026 17:57 | 70c0140ebad3f9a6 round/2026-09-08 | 2,519 | 1,695 | 6,277 | 247 | 6,499 | 5,188 | 12,269 designs 180,161 claims 12,386 models | db/caliber.db |
| 1 Sep 2026 20:30 | fa575cfc7ff00b86 round/2026-09-01 | 2,519 | 1,695 | 6,277 | 247 | 6,499 | 5,188 | 12,269 designs 179,150 claims 12,386 models | db/caliber.db |
| 1 Sep 2026 17:41 | 4e1f3ba84a7595c6 round/2026-09-01 | 2,519 | 1,695 | 6,277 | 247 | 6,499 | 5,188 | 12,269 designs 179,150 claims 12,386 models | db/caliber.db |
| 1 Sep 2026 15:29 | 84352ac608aabe36 round/2026-09-01 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 5,188 | 12,269 designs 179,138 claims 12,386 models | db/caliber.db |
| 1 Sep 2026 11:18 | ba63fac25ff9ab19 round/2026-09-01 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 4,873 | 12,269 designs 179,088 claims 12,386 models | db/caliber.db |
| 1 Sep 2026 10:42 | b08ba5bae34337fa round/2026-09-01 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 169,554 claims 12,386 models | db/caliber.db |
| 1 Sep 2026 10:31 | 0b3e1f28eb52ca3e round/2026-09-01 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 166,028 claims 8,860 models | db/caliber.db |
| 1 Sep 2026 10:03 | 66a8a8f5544e2453 round/2026-09-01 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 165,887 claims 8,719 models | db/caliber.db |
| 1 Sep 2026 09:53 | fae763f96ffb8a3d round/2026-09-01 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 165,895 claims 8,721 models | db/caliber.db |
| 31 Aug 2026 23:45 | 95234afb64956040 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 165,372 claims 8,464 models | db/caliber.db |
| 31 Aug 2026 23:00 | 5ef19d9951a38738 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 163,997 claims 8,464 models | db/caliber.db |
| 31 Aug 2026 17:50 | 47167abbf859aec0 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 162,408 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 17:39 | cb04c3c2fb32a0d9 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 162,408 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 17:18 | 25ac74fac66cdbe5 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 162,050 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 16:19 | dfdd46d6a637fc61 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 161,124 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 16:09 | 28c4172795feb849 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 161,124 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 15:59 | ca91efe01b07aaef round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 161,058 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 15:49 | 251cf1a8ae24973a round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 161,128 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 07:28 | 7d111e9351608687 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 244 | 6,499 | 3,760 | 12,269 designs 161,052 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 07:17 | 33caa5954077ac39 round/2026-08-31 | 2,519 | 1,695 | 6,277 | 243 | 6,499 | 3,760 | 12,269 designs 161,052 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 06:54 | 84a1812997b96fad round/2026-08-31 | 2,519 | 1,695 | 6,277 | 243 | 6,499 | 3,760 | 12,269 designs 161,042 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 06:40 | b956f08989cf854e round/2026-08-31 | 2,519 | 1,695 | 6,268 | 243 | 6,499 | 3,760 | 12,269 designs 161,033 claims 6,875 models | db/caliber.db |
| 31 Aug 2026 06:30 | 391433b97fac186c round/2026-08-31 | 2,519 | 1,695 | 6,268 | 243 | 6,499 | 3,760 | 12,269 designs 161,033 claims 6,875 models | db/caliber.db |
| 30 Aug 2026 21:18 | 4d2a2aab99bd5a46 round/2026-08-30 | 2,518 | 1,695 | 6,268 | 243 | 6,499 | 3,760 | 12,269 designs 161,033 claims 6,875 models | db/caliber.db |
| 30 Aug 2026 13:48 | ef6422a038a70297 round/2026-08-30 | 2,518 | 1,695 | 6,268 | 243 | 6,499 | 3,760 | 12,269 designs 161,033 claims 6,875 models | db/caliber.db |
| 30 Aug 2026 13:38 | cecaedea296cb293 round/2026-08-30 | 2,518 | 1,695 | 6,268 | 243 | 6,499 | 3,760 | 12,269 designs 161,033 claims 6,875 models | db/caliber.db |
| 30 Aug 2026 11:53 | cbb76647435fc9dc round/2026-08-30 | 2,518 | 1,695 | 6,268 | 243 | 6,499 | 3,760 | 12,269 designs 160,505 claims 6,875 models | db/caliber.db |
| 30 Aug 2026 02:39 | 3946c950e7947f20 round/2026-08-30 | 2,518 | 1,695 | 6,072 | 235 | 6,499 | 3,760 | 12,269 designs 159,297 claims 6,780 models | db/caliber.db |
| 30 Aug 2026 00:05 | 474a5e327cf625e6 round/2026-08-30 | 2,518 | 1,695 | 5,039 | 213 | 6,499 | 3,760 | 12,269 designs 154,621 claims 5,726 models | db/caliber.db |
| 29 Aug 2026 16:01 | 715f3f78d2ef51e0 round/2026-08-29 | 2,541 | 1,707 | 5,039 | 213 | 6,499 | 3,760 | 12,269 designs 154,620 claims 5,726 models | db/caliber.db |
| 29 Aug 2026 11:49 | ba30011f835a7d19 round/2026-08-29 | 2,541 | 1,707 | 5,039 | 213 | 6,499 | 3,760 | 12,269 designs 154,620 claims 5,726 models | db/caliber.db |
| 28 Aug 2026 21:46 | af6817320e3d65fa round/2026-08-28 | 2,541 | 1,707 | 525 | 189 | 5,674 | 3,760 | 11,492 designs 132,898 claims 615 models | backfill:app/out/data |
| 28 Aug 2026 16:08 | 8fd1788a58812cd2 round/2026-08-28 | 2,492 | 1,674 | 525 | 125 | 5,525 | 3,755 | 11,300 designs 131,726 claims 615 models | backfill:app/.next-stale/data |
| 25 Aug 2026 15:36 | 7faf7373424fd28c round/2026-08-25 | 227 | 168 | 383 | 124 | 315 | 446 | 744 designs 12,169 claims 383 models | backfill:app/.next-r13/data |
How each number is defined
These are not descriptions of the queries. They are the queries: tools/ledger.py runs this text against db/caliber.db and writes the same string into the payload this page reads, so a definition cannot drift away from the number it produced.
| Metric | What it counts | Query |
|---|---|---|
Connected calibers connected_designs | Designs touching at least one lineage edge at either end. The singleton number: how much of the corpus is a graph rather than a dust field. | SELECT COUNT(*) FROM (SELECT src_design AS d FROM lineage_edge UNION SELECT dst_design FROM lineage_edge) |
Lineage edges lineage_edges | Every recorded descent link — derived_from, variant_of, clone_of and the rest — in any lane and at any status. | SELECT COUNT(*) FROM lineage_edge |
Usage edges usage_edges | A watch model wearing a caliber execution. The direction-1 harvest lane. | SELECT COUNT(*) FROM model_uses_execution |
Calibers with a watch calibers_with_user | Designs a sourced watch model actually reaches, through an execution that resolves to a design. The corpus's thinnest relation. | SELECT COUNT(DISTINCT e.resolved_design_id) FROM model_uses_execution m JOIN execution e ON e.execution_id = m.execution_id WHERE e.resolved_design_id IS NOT NULL |
Calibers with a maker designs_with_maker | Designs whose producer the corpus can name at all — reviewed or not. | SELECT COUNT(*) FROM design WHERE maker_agent_id IS NOT NULL |
Calibers placed in time dated_or_bounded | Designs carrying a year a source stated, or a bound this corpus derived. The era axis can place these; everything else sits in the reservoir. | SELECT COUNT(*) FROM design WHERE intro_year IS NOT NULL OR bound_lo IS NOT NULL OR bound_hi IS NOT NULL |
Designs designs | scale, not a relation — the denominator the six are read against | SELECT COUNT(*) FROM design |
Claims claims | scale, not a relation — the denominator the six are read against | SELECT COUNT(*) FROM claim |
Watch models models | scale, not a relation — the denominator the six are read against | SELECT COUNT(*) FROM watch_model |
What these numbers do not say
An isolated caliber is one this corpus records no relative for — never one that has none. 9,750 of 12,269 calibers carry no lineage link here. That is what the sources say, not what horology did: the archive most of this corpus is drawn from records a family block on a minority of its pages. No caption, filter or count on this site may state the second thing, and the falling share above is a statement about our coverage, not about watchmaking.
Lineage edges are counted in every lane and at every status. The number here is the same one the landing universe draws — all 1,695 of them, including the inbox staging lane. This paragraph used to continue “a far smaller set has been reviewed and accepted”, and pointed at coverage as the answer to “what anyone has checked”. That question was retired on 2026-08-29: nobody was ever going to review 154,620 claims, so the answer would have stayed “almost none” forever while the corpus said something else. What is left is one question, and it is the one that was always doing the work — what does the corpus record, and what is behind each record? Every edge counted here carries a source url, a retrieval date and a verbatim quote, and clicking any of them shows all three.
The staging lane is a place, not a caveat. A claim in inbox/ has not been through a promotion step into corpus/, and gate G3 plus a schema CHECK make it structurally impossible for one to assert anything else — that guard is what allows an unattended pipeline to run at all, and it did not move. What changed is that the site stopped DRAWING the lane: staged edges are no longer dotted, staged values no longer hatched, and the default family profile no longer hides them. The effect on this page is none at all, because both metrics above were always lane-blind; the effect on the universe and the family pages was to stop showing a fifth of what the corpus holds.
3 of these 34 rows are archaeology, not a nightly log. Nothing was running to record history, so the earlier points were reconstructed from static export trees this repository still had on disk — each one carrying its own corpus_sha, its own compile timestamp and its own counts. Where an older payload predates the field that names the connected count, the number was taken from the edge list it ships instead, which is the same measurement and is asserted to be so on every tree that carries both. Rows are labelled with the tree they came from. Nothing was interpolated, smoothed or invented, and there is no point here for a day the corpus was not compiled.
A row is a corpus state, not a night. The x axis is evenly spaced because rounds are, and clock time is not: three of the first four states were compiled inside thirty-six hours. The schedule exists but is installed disabled — the owner arms it — so until it is armed the spacing is still rounds, and reading the slope as a rate would be reading a ratio of two things that were never rates.
A night that adds nothing is a normal night, not a broken one. Most of what the loop does is confirm that eighteen catalogues still say what they said yesterday, which costs a few dozen conditional requests and produces no rows at all. The block above reports a zero the same way it reports a thousand, because a pipeline that only appears in this page when it has news is a pipeline whose silence you cannot read.
Nothing here relaxes a gate. The ledger is written after make lint passes, so a corpus that fails the integrity gates never reaches this page at all — it aborts the round instead. Growth that arrived by lowering the standard would not show up as growth; it would show up as a build that stopped.
The real progress bar is the picture. Every new lineage edge lifts a caliber out of the reservoir and into a family, so the universe itself densifies as these numbers move. This page exists to say by how much, and in which direction, on a morning when the picture looks about the same as it did yesterday.
Provenance of this page
| Ledger | data/pipeline/ledger.jsonl · 34 rows · keyed on corpus_sha |
|---|---|
| Generator | tools/ledger.py v1 → app/public/data/progress.json |
| Clock | none. A row’s timestamp is the database’s own meta.built_at — when that corpus state was compiled — so the emitted JSON stays a pure function of files already on disk and make verify keeps proving what it proves. |
| Current corpus | round/2026-09-08 · corpus 70c0140ebad3f9a6 · compiled 2026-09-08T17:57:55 |