I · Home calibration
Before the books, twelve memory requests
A cache holds a few pages of computer memory. When the program asks for an absent page, the machine must retrieve it and may evict another. This page will not touch the library data until its engine reproduces a published operating-systems answer, frame by frame, and then passes every check in section IX.
NYU Core Examination, February 2007, Question 5
Reference string 7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3. Three initially empty frames. A hyphen is a hit, so the frame does not change.
Wide table. Scroll it sideways, or use the arrow keys once it has focus.
| Rule | Published faults | Live faults | Live frame states after each request |
|---|---|---|---|
| FIFO | 10 | not run | not run |
| LRU | 9 | not run | not run |
| OPT / MIN | 7 | not run | not run |
The second published string is the anomaly check: FIFO has 9 faults with 3 frames and 10 with 4. More space makes it worse. Live result: not run.
Published source: NYU February 2007 Core Examination sample answers. The exam paper labels this Question 5, and it says in its own words that “the OPT algorithm is un-implementable.” MIN evicts the resident requested farthest in the future. Tied next uses evict the numerically largest identifier, a supplied convention that changes frame contents but not these totals.
II · What sits in a slot
A holding is not a book
Before any rule can be tested, something has to be counted. The registers record loans of holdings, and the same source attaches to every loan the physical volumes that left the desk. Record 38013 reads two Vols of Farindon’s Sermons and carries two volume identifiers, 11761 and 123952. One work. Two books. Two units of shelf space.
What the source actually supplies
The 4,973 replayed loans name 5,924 volumes in total, and 887 distinct ones against 440 distinct holdings. 492 loans name more than one volume, the largest names 16 at once, and no retained loan names none. Not one volume disagrees with its loan about which holding it belongs to.
Two shelves can therefore be built from the same register, and they disagree about 1,910 of the 4,973 loans. The first disagreement is request 11, where a loan of Taylor’s Antiquitates christianae is a hit for the holding shelf and a fetch for the volume shelf, because the volume it names is not the one that came before.
Calibrate first.
What a volume identifier does not tell you
392 of the 887 volume identifiers carry no volume number at all: the part field is blank, or says “unspecified,” or “unspecified/unclear,” or “unclear.” 1,103 of the 5,924 volume requests land on one of those. 66 holdings carry both a numbered volume and an unnumbered placeholder, so one physical book can appear under two identifiers depending on how precise a clerk was that day.
That inflates the volume count somewhat. It does not come close to closing a gap of 440 against 887, and both units are offered below so a reader can see the difference for themselves rather than take this sentence for it.
No source field gives a volume a size, so a folio and a duodecimo occupy one slot each. That is a convention supplied by hand, and it is listed with the others in section VII.
III · The replay
Two shelves that never existed
Each dated loan becomes a request. A shelf of fixed size serves it only when every object it names is already there, and otherwise fetches what is missing and evicts to make room. This is a counterfactual ready shelf over recorded successful loans, not Haddington’s actual shelves and not a measure of what readers waited for.
TRANSFER BROKE: on the 2,984 held-out loans, the imported recency rule needed 1,995 retrievals against 1,787 for an ordinary five-year circulation count, 11.6% more, and no capacity in either object unit reverses that.
Nothing has been checked yet. Run the calibration above.
Shelf: 64 volumes. The five numbers below are scored on the held-out segment only.
API transcription
Calibrate to open the register.
Normalized holding label
No loan selected.
Where the rules part company
Cumulative retrievals through the register. The shaded band on the right is the held-out segment: nothing inside it was allowed to influence which window or which imported rule the decision uses.
This is empirical trace replay, not competitive analysis. Competitive analysis asks for a worst-case guarantee over every possible request sequence. The ratios here describe one frozen sequence. At least one line must stay switched on, so the comparison can never be emptied. Dragging across the chart moves the same cursor the slider above moves; the chart itself is an image, and the labelled slider is the keyboard route through the register.
IV · The baseline is a dial
How far back is the librarian allowed to look?
The ordinary rule keeps the books that have been borrowed most in the recent past. “Recent” is a dial. Turn it all the way up and the rule counts every loan since 1732, which is exactly the baseline the first version of this page used, and it loses badly. Turn it down to a month and the rule makes the same number of retrievals as LRU. In between, it beats both.
Calibrate to draw the curve.
That is the whole shape of the finding. The imported rule is not competing with a library method. It is competing with one setting of a library method, and the setting the first version of this page chose is the worst one available.
Wide table. Scroll it sideways, or use the arrow keys once it has focus.
| Unit and shelf | Window | Retrievals over all 4,973 loans |
|---|---|---|
| holding / 32 | 30 days | 1,509 |
| holding / 32 | 90 days | 1,507 |
| holding / 32 | 180 days | 1,504 |
| holding / 32 | 365 days | 1,433 |
| holding / 32 | 730 days | 1,402 |
| holding / 32 | 1,825 days | 1,369 |
| holding / 32 | 3,650 days | 1,397 |
| holding / 32 | 7,300 days | 1,552 |
| holding / 32 | all history | 1,927 |
| volume / 64 | 30 days | 3,349 |
| volume / 64 | 90 days | 3,349 |
| volume / 64 | 180 days | 3,322 |
| volume / 64 | 365 days | 3,206 |
| volume / 64 | 730 days | 3,107 |
| volume / 64 | 1,825 days | 3,087 |
| volume / 64 | 3,650 days | 3,095 |
| volume / 64 | 7,300 days | 3,238 |
| volume / 64 | all history | 3,527 |
Counting only loans inside a window is not an invention of this page. Library collection work has used recent circulation to decide what stays within reach for decades, and the obsolescence literature is explicit that the change in loans over time predicts future use better than an undifferentiated lifetime total. See Baba, Minami and Nakatoh, 2016 and Silverstein and Shieber, 1996. The dial is the same rule with a date filter, and the source supplies the dates.
The honest complication: when the window is short, almost every resident has a count of zero and the tie is broken by recency, so the rule collapses towards LRU. The win therefore has to come from the counting, not the tiebreak. Replacing the recency tiebreak with the lowest identifier, with admission order, or even with the reverse of recency still leaves the five-year window ahead of LRU: 1,392, 1,377 and 1,419 retrievals respectively against LRU’s 1,509 at the holding unit and a shelf of 32. The count is doing the work.
V · The decisive test
Choose on the first part, score on the last
Both sides get the same budget. The first 1,989 loans are used to pick one imported rule from FIFO, LRU and resident LFU, and to pick one window from eight candidates. Then both are frozen and scored on the last 2,984 loans, which no choice on this page has been allowed to see.
On the selection segment the imported family scores FIFO 1,394, LRU 1,354 and resident LFU 1,498, so the imported rule is LRU. The ordinary family scores 1,354, 1,354, 1,351, 1,322, 1,302, 1,300, 1,304 and 1,335 for windows of 30, 90 and 180 days and 1, 2, 5, 10 and 20 years, so the window is 1,825 days.
On the held-out segment, at the volume unit and a shelf of 64:
- the imported rule needs 1,995 retrievals
- the ordinary rule needs 1,787
- the baseline this page retracted needs 2,157
- a rule that can see the whole future needs 1,137
D = +208 / 1,787 = +0.1163961947, which is 11.6% more retrievals for the imported rule. The decision rule is: D at or below −0.05 is held, D at or above +0.05 is broke, and the interval between them is undetermined.
The same test at every capacity, in both units
A shelf of 64 volumes is 7.2% of the 887 volumes, which is the same fraction as the 32 of 440 holdings the first version of this page invented. That is the only reason 64 is the reported number, and it is still an invented number, so here is the whole curve rather than one point.
Wide table. Scroll it sideways, or use the arrow keys once it has focus.
| Unit | Shelf | Of all objects | Window | Imported | Ordinary | D | Verdict |
|---|---|---|---|---|---|---|---|
| holding | 8 | 1.8% | 1,825 | 1,943 | 1,832 | +6.1% | BROKE |
| holding | 16 | 3.6% | 730 | 1,343 | 1,240 | +8.3% | BROKE |
| holding | 24 | 5.5% | 1,825 | 1,020 | 932 | +9.4% | BROKE |
| holding | 32 | 7.3% | 1,825 | 784 | 703 | +11.5% | BROKE |
| holding | 48 | 10.9% | 1,825 | 542 | 476 | +13.9% | BROKE |
| holding | 64 | 14.5% | 3,650 | 385 | 323 | +19.2% | BROKE |
| holding | 96 | 21.8% | 7,300 | 222 | 196 | +13.3% | BROKE |
| holding | 128 | 29.1% | 7,300 | 162 | 159 | +1.9% | UNDERDETERMINED |
| holding | 192 | 43.6% | 30 | 159 | 128 | +24.2% | BROKE |
| holding | 256 | 58.2% | 30 | 117 | 117 | +0.0% | UNDERDETERMINED |
| volume | 8 | 0.9% | n/a | n/a | n/a | n/a | infeasible |
| volume | 16 | 1.8% | 1,825 | 2,732 | 2,518 | +8.5% | BROKE |
| volume | 24 | 2.7% | 730 | 2,631 | 2,391 | +10.0% | BROKE |
| volume | 32 | 3.6% | 1,825 | 2,491 | 2,196 | +13.4% | BROKE |
| volume | 48 | 5.4% | 730 | 2,223 | 2,001 | +11.1% | BROKE |
| volume | 64 | 7.2% | 1,825 | 1,995 | 1,787 | +11.6% | BROKE |
| volume | 96 | 10.8% | 1,825 | 1,644 | 1,463 | +12.4% | BROKE |
| volume | 128 | 14.4% | 1,825 | 1,379 | 1,170 | +17.9% | BROKE |
| volume | 192 | 21.6% | 3,650 | 955 | 819 | +16.6% | BROKE |
| volume | 256 | 28.9% | 7,300 | 641 | 611 | +4.9% | UNDERDETERMINED |
Sixteen of the nineteen workable settings say broke and three say undetermined. Not one says held. The three undetermined ones are the largest shelves, where the shelf holds a fifth to three fifths of everything and hardly anything is ever evicted.
A shelf of 8 volumes is not a small result, it is no result: one recorded loan names 16 volumes at once, so that shelf cannot serve the register at all. The engine refuses rather than printing a number, and the row says so.
Does the order of the day decide it?
The manuscript gives a deterministic row order, but that may be recording order rather than the order of desk events. Reversing every same-day group gives D +11.88%. Across 1,000 seeded within-day shuffles, D ran from +11.24% to +12.49% and never came near the five-percent boundary.
Not run in the browser. The offline verifier runs all 1,000 on every pass; the button above runs whatever you select here and prints what it actually ran.
VI · The one thing only this collision can say
Half again as many trips to the back room
Every rule argued about above is online: it decides what to keep knowing only what has already been asked for. Bélády’s offline rule is not. It reads the whole register first and evicts whatever will be wanted last. No librarian could ever have run it, and no result on this page depends on which ordinary baseline was chosen, because it beats all of them.
Volume unit, shelf of 64
The best rule that cannot see the future needs 3,087 retrievals across the whole register. The rule that can see it needs 1,963. The difference is 1,124 retrievals, 57.3% above, and 22.6 points of retrieval rate.
Where a loan names several volumes at once, farthest-future eviction is a strong heuristic and not a proven optimum, so the true optimum is at most this number and the gap is at least this large.
Holding unit, shelf of 32
The best online rule needs 1,369 against 874 for the offline rule: 495 retrievals and 56.6% above, 10.0 points of retrieval rate. Here every loan names exactly one object, so this offline number is Bélády’s optimum exactly.
Measured against LRU alone rather than against the best online rule on this page, the same gap is 635 retrievals and 72.7%.
This is the statement the collision actually earns. It is not a race that one side had to win. It is a measurement of how much of a librarian’s fetching is irreducible ignorance of what will be asked for next, and the answer is more than half of the work above the floor, in both units, at every shelf size we tried.
It is also, precisely, a claim about the recorded successful loans and nothing else. The offline rule is optimal for the sequence that was written down, which is itself the product of whatever was on the shelf at the time.
VII · The sophisticated dismissal
Which mapping is carrying the verdict?
Disable one mapping at a time and run the same held-out test again. Every button below doctors the data the engine consumes and re-runs the unmodified replay; none of them edits a result or reads a stored answer. An ablation survives when the verdict is unchanged and D moves by no more than 0.10, which is the full width of the undetermined band, so a change smaller than the whole indecision region cannot by itself carry the result to the opposite verdict.
Operate the ablations
Choose a mapping to remove. The two label buttons blank the label in the event card above, which is what they are for.
What the offline verifier gets
Wide table. Scroll it sideways, or use the arrow keys once it has focus.
| Mapping removed | What the button does to the data | Requests | Objects | Held-out result | Moves D by | Verdict |
|---|---|---|---|---|---|---|
| the volume identity the source supplies | replay with the coarser bibliographic holding as the object, which is what the first version of this page did | 4,973 | 440 | imported 385, ordinary 323, D +19.20% | 0.0756 | BROKE |
| object identity itself | give every object the same identifier | 4,973 | 1 | not a number: the domain becomes one object and the held-out segment records 0 retrievals for every rule, so D is 0 over 0 | n/a | undefined |
| date sorting | replay in manuscript page order instead of date order | 4,973 | 887 | imported 2,013, ordinary 1,852, D +8.69% | 0.0295 | BROKE |
| same-day order | reverse every same-day group | 4,973 | 887 | imported 1,997, ordinary 1,789, D +11.63% | 0.0001 | BROKE |
| the inclusion flags | restore the eleven replayable outside-statistics rows | 4,984 | 887 | imported 1,995, ordinary 1,785, D +11.76% | 0.0013 | BROKE |
| the normalized title | blank every normalized title in a cloned label domain | 4,973 | 887 | imported 1,995, ordinary 1,787, D +11.64% | 0.0000 | BROKE |
| the transcription | blank every transcription in a cloned label domain | 4,973 | 887 | imported 1,995, ordinary 1,787, D +11.64% | 0.0000 | BROKE |
| one loan, one request | collapse adjacent same-day repeats of one holding | 4,867 | 886 | imported 1,968, ordinary 1,767, D +11.38% | 0.0026 | BROKE |
| a loan as a set of volumes | serialise a multi-volume loan into one request per volume | 5,924 | 887 | imported 2,370, ordinary 2,145, D +10.49% | 0.0115 | BROKE |
Eight of the nine leave the verdict alone. For a page reporting that a transfer held, that would be damning: it would mean no mapping was doing any work and the collision was empty. For a page reporting that a transfer broke it means the opposite, that the failure is not manufactured by any one choice we made. The ninth cannot be run at all: collapsing object identity leaves a single object, every rule then records zero retrievals on the held-out segment, and D would be zero divided by zero. That row prints no number.
The row that matters most is the first. Coarsening the volume identity back to the bibliographic holding is exactly what the first version of this page did, and it does not rescue the imported rule: it makes the loss larger, from 11.6% to 19.2%, once the ordinary rule is allowed to look at dates.
VIII · Fault laboratory
Two errors the machine must see. One it must not.
Every fault below doctors the frozen data and runs the same replay again. None of them appends an answer to a list, and none calls a different function than the one behind the headline.
One: two loans exchange their volumes
Borrowing 38013, the loan on the manuscript page below, hands its two volume identifiers to borrowing 42765 seventy-six years later, and takes that loan’s two in return. No holding identifier moves. A shelf counted in volumes must notice. A shelf counted in holdings cannot possibly notice, and that blindness is the exact reason the first version of this page reported the wrong verdict.
Not shown.
Two: a volume nobody ever borrowed, in the middle
A synthetic request arrives at loan 2,500. It must be a retrieval for every rule, every state before it must be identical, and because it displaces a resident, what happens afterwards must change. A fault appended to the very end cannot do that: almost any broken eviction rule still counts one cold retrieval at the end of a register. This one is in the middle on purpose.
Not shown.
Three: a changed borrower, which must be invisible
The surname and gender on record 38013 are changed. Those fields were dropped by the adapter, so the derived row and every total in both units must be identical. Catching this one would mean an undeclared field had entered the engine.
Not shown.
A fourth check runs before any of these and never appears as a button: the engine has to reproduce three eviction sequences, victim by victim, that were produced by a separate implementation of the same published rules written in another language. A wrong choice of victim survives a check on the number of retrievals. It does not survive that one.
IX · What this page used to say
The number that was right and the comparison that was not
The first version of this page reported TRANSFER HELD. Its arithmetic was correct and is still reproducible above: at the holding unit with a shelf of 32, LRU makes 1,509 retrievals against 1,927 for cumulative lifetime circulation, D = −0.2169174883. Both numbers are recomputed live by the same engine that produces everything else here.
Two things were wrong with the comparison, and neither of them was a slip in the arithmetic.
The object was too coarse. The source supplies a volume identifier for every loan and the page did not use it. At the volume unit and the same shelf fraction, the same comparison gives 3,349 against 3,527, D = −0.0505: still held, but by half of one percentage point instead of by seventeen. At the same shelf size of 32 rather than the same fraction it is undetermined.
The baseline was the worst member of its own family. Cumulative lifetime circulation weighs a loan in 1732 exactly as heavily as one in 1816, on a register that records the dates. Allowed to count only recent loans, the same ordinary rule beats the imported one, in both units, at nearly every shelf size.
The decision rule changed too, and that change was made after seeing these results, which is the kind of thing this page should say out loud rather than bury. The first version fixed a single capacity in advance and compared against a single baseline. This version reports the whole capacity curve, gives both families the same selection budget on a segment held apart from the scoring, and takes the verdict from that. It is a better rule. It is not a rule that was written down before the numbers were seen, and no wording on this page should suggest otherwise.
The old page’s own ablation layer could not have caught this. All seven of its ablations made the adapter cruder, and none refined it toward the volume level the source actually supplies. An ablation layer that can only coarsen cannot detect an adapter that is already too coarse.
X · Adapter audit
The losses are larger than the analogy
A book is not a page of memory. The table names every retained mapping and puts what it destroys in the widest column.
Wide table. Scroll it sideways, or use the arrow keys once it has focus.
| Source | Formal field | Rule | What this loses |
|---|---|---|---|
| items[].biid, or holding.bhid | cache object identity | One physical volume is one object. The coarser bibliographic holding is offered beside it. | A volume identifier without a volume number cannot be told from another copy of the same part, and no source field gives a volume a size. |
| the identity itself | distinctness of objects | Objects are distinct exactly when their identifiers differ. | Two clerks describing the same book in different words can produce two identifiers, and one identifier can stand for a run of unnumbered volumes. |
| byear, bmonth, bday | request timestamp and the baseline window | Require a valid complete Gregorian date. | Estimated, partial and malformed dates are dropped and precision stops at one day. The imported rules read only the order of these dates, never the gaps. |
| rid, manifest pageorder, record pageorder, bnid | within-date order | Sort by date, then these four fields. | Manuscript order may be recording order rather than the order of desk events. |
| isactive, instats | inclusion flag | Keep only Y and Y. | Editorial exclusions leave the modeled stream even when they preserve evidence. |
| holding.standardisedtitle | display label only | Never use as identity. | Normalization and edition detail remain presentational. |
| transcriptionstripped | audit label only | Show beside the normalized title. | The clerk’s own words are the only evidence of how many volumes left the desk, and they are read by people, not by the engine. |
| one retained borrowing object | one unit-cost request | Count one hit or miss whatever the loan contains. | Reader identity, loan duration, object size, retrieval time and substitution vanish. Fetching sixteen volumes costs exactly what fetching one costs. |
| the items[] array of one borrowing | a set-valued request | A loan is served only when every volume it names is on the shelf, and a miss admits all of them. | Whether a reader who could not get volume three would have taken volume four instead is not recorded anywhere. |
Dropped fields
- borrower name and ID, gender, occupation, address and subscription type
- notes, return date, loan duration, volume format, size and copy count
- edition and work IDs, author, genre, language, publication place and date
- ESTC and catalogue links, editor identity, edit timestamps, confidence notes and HTML
- acquisition, withdrawal and cross-library facts
- 16 outside-statistics rows, 12 rows without integer holding IDs, 201 partial dates and one impossible date
Dropping borrowers merges many people into one requester. Dropping returns removes concurrency. Dropping format and size makes a folio and a duodecimo the same size. Dropping editions removes possible substitution. Missing acquisition and withdrawal facts prevents reconstruction of the historical collection.
Conventions supplied by hand
- The shelf starts empty on 19 February 1732.
- Capacity is a synthetic object count. The reported primary is 64 volumes, which is the shelf fraction of the 32 holdings the first version of this page invented; every capacity from 8 to 256 is reported beside it.
- Every object occupies one slot and every missed loan costs one unit, whether it names one volume or sixteen.
- Every missed loan is served in full, evicting as many residents as it takes.
- The volumes a loan names are pinned while that loan is served, so a loan cannot evict its own volume and fetch it again.
- All borrowers become one ordered stream.
- Backing storage is infinite, instantaneous and always supplies a missed volume.
- FIFO hits preserve admission order, and volumes admitted together share one admission time, tied by lowest numeric id. LRU hits update recency.
- Resident LFU resets frequency on readmission and breaks ties by LRU, then lowest numeric id.
- Windowed circulation counts requests inside the window in calendar days, including the current one, and breaks ties by LRU, then lowest numeric id. An infinite window is exactly the cumulative lifetime count.
- The offline rule sees the whole retained future and evicts the object needed farthest ahead, breaking ties by largest numeric id.
XI · The check
Everything that can make the answer smaller
Source and freeze
Books and Borrowing: An Analysis of Scottish Borrowers’ Registers, 1750-1830, University of Stirling. Retrieved 10 September 2026. API licence: CC BY-NC-SA 4.0. DataSTORRE instead says CC BY-NC 4.0, so the more restrictive terms are used and the conflict remains open. The frozen files carry an adjacent notice naming each upstream file, its licence and what was changed: data/NOTICE.txt.
Haddington library page · repository record · API documentation
Exact nonempty page endpoint prefix: https://borrowing.stir.ac.uk/api/v2/1/json/page/ . IDs: every integer from 1641 through 2134, plus 147055, 147058, 147067, 147070, 147073, 147076, 147079, 147082, 147085, 147088 and 147091.
Raw ordered JSON: 20,203,804 bytes
bfda6719b2836a491e549b4ffc78094f3454467c40ac0c16ab7dfa0455c3b16a
Derived loan trace: 158,223 bytes
764b6eba802a7296c7b663045bcf5feeeb130a9d2b013320a65c3cc67f67eaa7
Derived volume layer: 211,002 bytes
cf7de524f7bc795cb7c04a834dca73dbf12d4b1e909b83a7bc664593a464df57
The raw byte count and its hash are declarations recorded when the extractor ran, not something the browser can recheck: the 20 MB of nested source JSON is not shipped. The three derived files above are hashed live in the browser on every visit, and the extraction code that produced them from the raw responses is in the repository beside this page.
Row accounting
Those 4,973 loans name 440 distinct holdings and 887 distinct volumes, from 1732-02-19 through 1816-03-14. There were 0 additional inactive rows after the statistics filter.
All 505 advertised nonempty page endpoints returned HTTP 200. Eight manifest pages advertised with zero borrowings returned HTTP 500 at their CSV endpoints; they contribute no advertised borrowing rows.
Show the eight failed zero-row endpoints
147046 (500, 210 bytes); 147049 (500, 222); 147052 (500, 219); 147061 (500, 227); 147064 (500, 223); 147094 (500, 234); 147097 (500, 234); 147100 (500, 216).

Transcription spot check, read by a person
The page behind row 38013
This manuscript image was not used to choose the adapter. A person looking at it can read the heading “Had Janry 31 1739,” then the Farindon, Le Blanc, Taylor, Beza, Hammond, Poole and Turrettini entries, with Pat Bannerman as borrower. That supports the date, the borrower and the sequence around record 38013.
It is a spot check and not a held-out test. The image carries no borrowing identifier and no holding identifier, so nothing on it can confirm the mapping the result depends on, and no assertion on this page reads a pixel. The held-out test is the temporal split in section V.
Frozen IIIF image SHA-256
a8833d729aa458bbd09a23cd1faa81eca6dceb094daa7ff8eb2e2c246f8e6fea
Every retrieval total, both units, every capacity
Wide table. Scroll it sideways, or use the arrow keys once it has focus.
| Unit | Shelf | FIFO | LRU | resident LFU | 5-year window | offline | all-history |
|---|---|---|---|---|---|---|---|
| holding | 8 | 3,507 | 3,340 | 4,313 | 3,155 | 2,176 | 3,527 |
| holding | 16 | 2,653 | 2,393 | 3,886 | 2,244 | 1,447 | 2,771 |
| holding | 24 | 2,111 | 1,882 | 3,525 | 1,714 | 1,090 | 2,284 |
| holding | 32 | 1,788 | 1,509 | 2,993 | 1,369 | 874 | 1,927 |
| holding | 48 | 1,349 | 1,097 | 2,633 | 1,007 | 642 | 1,392 |
| holding | 64 | 1,077 | 860 | 1,921 | 791 | 527 | 1,066 |
| holding | 96 | 781 | 626 | 1,017 | 607 | 459 | 737 |
| holding | 128 | 663 | 535 | 753 | 534 | 440 | 601 |
| holding | 192 | 528 | 473 | 502 | 473 | 440 | 485 |
| holding | 256 | 477 | 452 | 453 | 452 | 440 | 453 |
| volume | 8 | n/a | n/a | n/a | n/a | n/a | n/a |
| volume | 16 | 4,594 | 4,584 | 4,527 | 4,258 | 3,425 | 4,545 |
| volume | 24 | 4,386 | 4,336 | 4,346 | 4,005 | 3,026 | 4,355 |
| volume | 32 | 4,170 | 4,126 | 4,250 | 3,753 | 2,711 | 4,152 |
| volume | 48 | 3,765 | 3,709 | 4,005 | 3,384 | 2,276 | 3,810 |
| volume | 64 | 3,477 | 3,349 | 3,875 | 3,087 | 1,963 | 3,527 |
| volume | 96 | 2,955 | 2,736 | 3,522 | 2,533 | 1,547 | 3,032 |
| volume | 128 | 2,515 | 2,291 | 3,247 | 2,067 | 1,268 | 2,661 |
| volume | 192 | 1,906 | 1,642 | 2,889 | 1,509 | 960 | 2,063 |
| volume | 256 | 1,526 | 1,223 | 2,518 | 1,175 | 840 | 1,634 |
Every number in that table is recomputed in the browser before the controls unlock, and every one of them was independently reproduced by a separate implementation of the same published rules, written in Python from the conventions listed in section X. The two agree at every capacity, in both units, for all five rules, and on three complete eviction sequences.
The missing demand
Philip M. Morse’s 1979 library circulation model treats an arrival that finds a book busy as lost to the system. Circulation therefore cannot reveal total demand directly. These registers record successful loans, not refused, unavailable, abandoned or substituted requests. No result here estimates reader delay, disappointment, historical retrieval cost or the quality of the actual Haddington shelf, and the sequence the offline rule optimises is itself a product of whatever happened to be available.
What this page does not know
- Whether the library fetched one volume, a bound set, or a whole holding for a multi-volume loan. Both readings are offered above; neither is recorded.
- Whether a reader refused volume three would have taken volume four instead. Nothing in the register says.
- What the shelf actually held, how large it was, when books arrived or left, or how long a loan lasted.
- How many of the 887 volume identifiers are really distinct books rather than the same book described twice.
- Whether a longer window than 20 years, or a decay rather than a hard window, would do better still. A separate re-derivation using exponential decay with a two-year half-life reached the same conclusion by the same margin.
Terminology and publication history
Bélády’s theoretical-optimum study appeared in 1966. The anomaly paper by Bélády, Nelson and Shedler appeared separately in 1969. This page does not call the 1969 result “Bélády’s 1966 anomaly.” Sleator and Tarjan’s 1985 analysis concerns worst cases across sequences; this target result is an empirical trace ratio, also called a clairvoyance gap here.
Bounded novelty search
We searched OpenAlex, Crossref, and the open web on 10 September 2026 with the queries listed in the audit and did not find a published application of FIFO, LRU, LFU, and Bélády MIN to a dated historical library-loan ledger. This is a search result, not a claim that none exists.