Cascadia Portfolio · Matter Ledger
A governed model of the public federal civil docket — 10,960,173 case records — and what happens to one ordinary legal-operations question when the governance is missing.
How long does it take to resolve a contract dispute in federal court?
It is a question a legal-operations team gets asked, and the data to answer it is public. Below, it is answered twice from the same file, retrieved once, on the same day. Neither query contains a mistake anyone would call obvious.
Against the raw file
-742.3 days
32,767 matters behind this figure have a negative duration. Nothing errors, nothing warns, and no null appears anywhere to hint that something is wrong.
Against the governed model
208.0 days
Median, over 1,370,419 closed contract matters. Every figure on this page is re-derived from the frozen source down a second, independently written path before it is published.
| Step | Rule applied | Effect, days | Running answer, days |
|---|---|---|---|
| 1 | correct the encoding | +0.0 | -742.3 |
| 2 | disable quoting | -0.0 | -742.3 |
| 3 | quarantine field-shifted records | +0.0 | -742.3 |
| 4 | exclude pending matters | +1062.0 | 319.8 |
| 5 | one record per matter (reopenings) | -0.1 | 319.6 |
| 6 | the subject-matter control | -0.1 | 319.5 |
| 7 | median, not mean | -111.5 | 208.0 |
Both versions of the trend agree. That is not reassurance — it is the reason this class of error survives review.
| Statistical year | Ungoverned mean, days | Governed median, days |
|---|---|---|
| 2001 | 285.1 | 174.0 |
| 2002 | 327.5 | 223.0 |
| 2003 | 340.4 | 242.0 |
| 2004 | 356.1 | 250.0 |
| 2005 | 331.5 | 227.0 |
| 2006 | 330.7 | 219.0 |
| 2007 | 317.1 | 217.0 |
| 2008 | 304.6 | 218.0 |
| 2009 | 311.4 | 208.0 |
| 2010 | 313.1 | 223.0 |
| 2011 | 310.6 | 214.0 |
| 2012 | 317.9 | 221.0 |
| 2013 | 330.9 | 229.0 |
| 2014 | 321.0 | 217.0 |
| 2015 | 337.3 | 243.0 |
| 2016 | 338.4 | 231.0 |
| 2017 | 330.2 | 224.0 |
| 2018 | 338.6 | 222.0 |
| 2019 | 336.1 | 238.0 |
| 2020 | 355.1 | 243.0 |
| 2021 | 353.7 | 249.0 |
| 2022 | 371.5 | 267.0 |
| 2023 | 357.0 | 257.0 |
| 2024 | 359.1 | 268.0 |
| 2025 | 362.0 | 263.0 |
Suppose the analyst does notice the pending records and reaches for the obvious fix — keep only the rows the source marks as terminated. That gives 332.0 days, and silently discards 637,118 records, 45.0% of the slice, because the status field did not exist before statistical year 2001. Both reasonable choices are wrong, in opposite directions. Only a closure rule that is effective-dated is right, and that rule is not derivable from the data — it comes from a sentence in the publisher's codebook.
Three things, each of which caught something. A written rule
mapping a court docket onto a matter-shaped entity, stating what it loses. Conformed
dimensions loaded from the published codebook rather than written as CASE WHEN
blocks. And five certified measures, each with a definition, a named owner and source
lineage.
| Progress at termination | Group | Matters | Share | Median days |
|---|---|---|---|---|
| other, after issued joined | after issued joined | 254,521 | 18.6% | 274 |
| no court action, before issue joined | before issue joined | 245,289 | 17.9% | 108 |
| order entered, before issue joined | before issue joined | 244,641 | 17.9% | 120 |
| judgement on motion, after issued joined | after issued joined | 188,833 | 13.8% | 279 |
| pretrial conference held, after issued joined | after issued joined | 171,326 | 12.5% | 388 |
| no court action, after issued joined | after issued joined | 134,076 | 9.8% | 274 |
| order decided, before issue joined | before issue joined | 92,363 | 6.7% | 118 |
| after court trial, after issued joined | after issued joined | 13,130 | 1.0% | 654 |
| after jury trial, after issued joined | after issued joined | 12,663 | 0.9% | 641 |
| hearing held, before issue joined | before issue joined | 6,872 | 0.5% | 154 |
| during jury trial, after issued joined | after issued joined | 3,051 | 0.2% | 581 |
| during court trial, after issued joined | after issued joined | 2,302 | 0.2% | 495 |
| request for trial de novo after, after issued joined | after issued joined | 1,352 | 0.1% | 372 |
| Nature of suit | Closed matters | 25th pct | Median | 75th pct |
|---|---|---|---|---|
| Contract Product Liability | 13,652 | 113 | 307 | 636 |
| Stockholder's Suits | 12,266 | 98 | 280 | 636 |
| Insurance | 376,683 | 130 | 265 | 446 |
| Overpayments under the Medicare Act | 5,032 | 106 | 255 | 516 |
| Miller Act | 23,176 | 115 | 238 | 444 |
| Other Contract Actions | 588,952 | 103 | 234 | 462 |
| Negotiable Instruments | 42,084 | 108 | 224 | 438 |
| Marine Contract Actions | 72,809 | 93 | 202 | 399 |
| Franchise | 6,415 | 97 | 200 | 378 |
| Overpayments & Enforcement of Judgments | 15,872 | 64 | 159 | 363 |
| Recovery of Defaulted Student Loans | 166,985 | 68 | 106 | 178 |
| Recovery of Overpayments of Vet Benefits | 46,493 | 61 | 98 | 157 |
| Disposition | Matters | Share |
|---|---|---|
| settled | 421,277 | 30.7% |
| voluntarily | 224,458 | 16.4% |
| default | 169,367 | 12.4% |
| other | 142,391 | 10.4% |
| motion before trial | 107,632 | 7.9% |
| remanded to state court | 52,637 | 3.8% |
| lack of jurisdiction | 46,772 | 3.4% |
| consent | 46,743 | 3.4% |
| statistical closing | 32,851 | 2.4% |
| transfer to another district | 31,660 | 2.3% |
| other | 30,699 | 2.2% |
| want of prosecution | 27,123 | 2.0% |
| jury verdict | 12,200 | 0.9% |
| court trial | 11,419 | 0.8% |
| multi district litigation transfer | 4,585 | 0.3% |
| stayed pending bankruptcy | 3,153 | 0.2% |
| award of arbitrator | 2,171 | 0.2% |
| remanded to U.S. Agency | 1,827 | 0.1% |
| directed verdict | 1,187 | 0.1% |
| appeal affirmed (magistrate judge) | 178 | 0.0% |
| appeal denied (magistrate judge) | 89 | 0.0% |
The frozen model is validated once. The live edge is not: it runs on a schedule, takes a bounded increment from a second source, re-asserts the module's invariants on every run, and reconciles itself against the frozen baseline. The surface below is the module's own record of that, rendered from the machine-readable health file the pipeline writes — not restated by hand.
| Live roster | 337 |
|---|---|
| Frozen baseline, same slice | 954 |
| Variance | -617 |
| Live, filed after the frozen file ends (2026-06-30): the live edge is ahead by design | +20 |
| Live, in the IDB under another nature of suit | +0 |
| Live, not in the IDB at all | +13 |
| Frozen, reopened cases the IDB dates by their refiling; CourtListener keeps the original filing date | -10 |
| Frozen, 2024-or-later cases missing from the live roster | -639 |
| Frozen, two matters on one docket number, which the roster lists once | -1 |
| Unexplained residual | +0 |
The largest line is a collection defect, not a gap in the source. Sampled 2026-10-06: 12 of 12 of those cases are in CourtListener. Their nature-of-suit field is either blank or reads Contract: Other without the 190 code, and the roster finds dockets by matching that text, so it never sees them. Matching each docket number the frozen file already lists closes the gap without re-defining anything; until that runs, the line stays on this table.
A surface that has only ever shown green has demonstrated nothing. This pipeline has caught four defects in itself, every one of them a silent failure — nothing errored, and each would have under-collected or mis-stated while reporting success. It has also missed three, and they are recorded with the same care: for nineteen days, from 17 September to 6 October 2026, it completed no successful run while every run described itself as the design working. No check found them. A reader noticed the page had stopped moving. Each fix is checkable in the repository's history, except the one marked, which lives in the scheduled task's own instructions.
| What was wrong | How it surfaced | Fixed in |
|---|---|---|
| The watermark advanced past dockets whose rows were never written — 36 dockets marked done, zero rows persisted | The run's own record showed the watermark had moved while the output file did not exist | 5ef5234 |
| A docket was called complete on the strength of its first page; 29 of the first 36 had more than one | Row counts did not reconcile against the roster | 5ef5234 |
| The request budget read the daily rate-limit window while the hourly window was already exhausted | The run spent itself on 90-second backoffs for requests that could not succeed | 5ef5234 |
| A tie-break in the matter-grain rule depended on row order, which a parallel query engine does not guarantee | The independent re-derivation disagreed with the build by one record in 1,370,419 | 317d827 |
| A run that could not get quota was recorded as ordinary pacing. Twelve consecutive runs skipped; the two whose readings survive saw every window at zero. The note blamed the hourly limit whichever window bound, and the scheduled task's instructions called every skip the design working | Not by any check. The last successful run stayed at 17 September for nineteen days, and a reader noticed | 58e8ea8 |
| One slow response from the source ended the whole run. The entry walk survived only rate limits, although the roster had been made to survive any network failure in August | Three runs failed on 6 October; a test with the network mocked reproduced the exact error | 58b81ff |
The page stopped following the record. The scheduled task's bare python resolved to a newly installed interpreter with no packages, so the pull ran and the page rebuild silently did not |
The run log reached 1 October while the health record and the page stopped at 24 September | Not in this repository — the scheduled task now names its interpreter by path |
An independent portfolio project by Aaron Robbins. Built from the Federal Judicial Center's Integrated Database — public federal civil case records — frozen at 2026-08-26 and verified by SHA-256 on every build, plus a bounded live increment from CourtListener's RECAP archive. No client data and no proprietary data of any kind. Nothing here is legal advice, and nothing here is an assessment of any identified party's litigation exposure: the model is aggregate by construction and carries no party column.
Source, governance documents and build scripts:
github.com/RobbinsAnalytics/cascadia-matter-ledger.
Every figure on this page is computed at build time from a certified measure; the
independent re-derivation that gates publication is src/validate_measures.py.
Frozen as of 2026-08-26 · health surface generated 2026-10-06 17:06:35 UTC