# Notes The written half. `README.md` says how the lab is built; this says what it is finding. Status: forty-two studies across seven areas, and all five verdicts in use. Enough to prove the shape holds, not enough to draw conclusions about the era. Two sources have now been measured twice each, which is the first time any claim here has had a control. Findings 6 to 9 come from reading archived **source**, not from looking at archived renders. Sources are cited inline; the captures used are the 2000-03-01 k10k.net front page and the 2002-05-29 2advanced.com splash. **Neither of those two is in `corpus/cache`.** The cache holds the `1999-05-06` k10k front page and the `2000-06-08` 2advanced splash, both earlier and both different documents. Everything measured offline since is therefore a control on findings 6 to 9 rather than a re-derivation of them, which is why findings 25, 39, 40 and 41 can disagree with them at all. Check the cache before attributing a number to a capture. --- ## The seven areas The lab is organised by what a designer was actually deciding, not by technology. **Grid and density.** Studied in `boxed-grid`. The 760px ceiling and the fold near 420px on an 800x600 screen. The interesting claim is that the ceiling did the editing: given a finite box, these layouts had to decide what mattered, and the density people remember fondly is the residue of that decision. Infinite scroll removed the forcing function, not the skill. **Typography.** The bitmap system, 8 / 10 / 12 / 16, integer positioning, aliasing off. Hierarchy with one weight, no italic and four usable sizes, which pushes the work into spacing, case, letterspacing and color. Read `text-as-gif` first: findings 7 and 39 say most of what this area studies as type was not type at the time, it was exported pictures of type, and the other three studies here are about the look that practice produced rather than the practice. **Color.** The web-safe 216, dithering, and the palettes that came out of it. Studied in `two-value-dark` and `palette-split`, from declared `bgcolor` values rather than from screenshots. See finding 8. The description above said "the web-safe 216 as a real constraint" for most of this lab's life, and finding 41 withdrew the phrase: `websafe-216` shows the dark wing had already left the palette by 1999, because the palette could not express a ground and a panel. **Navigation.** Rollover states as the primary feedback channel, the persistent left rail, sub-nav that expands in place, and the intro-then-menu pattern. Navigation carried a site's personality then in a way it rarely does now. Now the largest area after imagery, at seven studies, and the only one holding three different verdicts at once: `rollover` ABSORBED, `image-map` and both gates ARTIFACT, `popup-window` and `status-caption` REVOKED. Finding 40 is why that spread is not untidiness. A single handler ran three feedback channels and they did not share a fate. **Construction.** How pages were physically made: the Photoshop comp sliced into table cells, `cellpadding=0 cellspacing=0 border=0`, spacer GIFs, image-swap rollovers, no sprites, no alpha. Mostly ARTIFACT, and worth building once to feel why. **Composition.** Asymmetry, the offset panel, layered transparency, the diagonal. The part that was never constrained by technology and is just design. --- ## Findings so far **1. The palette split is structural, not cosmetic.** The era is not one look. The studio wing is dark; the chrome and vernacular wing is dark-on-light. Nearly every technique behaves differently across that split, which is why `palette` is a declared catalog field rather than an assumption. Anything that gets built on top of the studies later (a grain overlay, a contrast switch, an audit) has to handle both or it silently only works on half the lab. **2. In `light-chrome`, two techniques from the same page have opposite fates.** The bevel and the sliced table produce nearly the same picture. The bevel is four border colors on one element and zero requests. The sliced rebuild is a 3x3 table shimmed with a real 42-byte `spacer.gif`. The page counts both live; the ratio is the finding, and it is why the study sits at CONTESTED rather than taking a single verdict for the whole page. A study is allowed to contain both a survivor and an artifact, and pretending otherwise would flatten the era. **3. Crisp sizes should be measured, not remembered, and the first two attempts to measure them were both wrong.** The result, at `devicePixelRatio` 1: | face | on grid at | measured | | --- | --- | --- | | Silkscreen | multiples of **8** | 8, 16, 24, 32 pass; 22 and 33 fail | | Departure Mono | multiples of **11** | 11, 22, 33 pass; everything else fails | Neither number was asserted from memory. 22 and 33 were added to the ladder specifically to try to kill the multiples hypothesis after a first pass suggested it, and they confirmed it instead. Two failures got there, and both are worth keeping: - **Measuring the element instead of the text.** `.sample` is a `1fr` grid item, so its bounding box is the column width, identical at every size. The ladder reported the same advance twelve times and looked like a finished table. A `Range` over the contents measures what was actually laid out. - **Averaging a proportional face.** Dividing a mixed string by its character count gives an average advance, which is not any glyph's width and cannot be checked against a pixel grid. It produced plausible numbers for Departure Mono, which is monospace, and silently meaningless ones for Silkscreen, which is proportional. The ladder now probes one repeated glyph at a time across a six-glyph set and takes the worst offender, and it detects and prints proportional versus monospace rather than assuming. The general lesson is the one this lab keeps meeting from a different angle: a measurement that returns a well-formed number is not the same as a measurement that is measuring the thing. **3b. The 2x display changes the answer, which is the point.** Every number above is for `devicePixelRatio` 1. At 2, the grid halves and Silkscreen comes on grid at multiples of 4. Two people reading this lab on different monitors are looking at different results, so the ratio is printed at the top of the instrument rather than assumed. **4. The 2x display is the strongest argument against the whole aesthetic.** Bitmap type existed because a normal face at 10px was mud. That is no longer true. `type-ladder`'s antialiasing switch is the honest version of the argument: turn it on and legibility improves while the character disappears. Both are real, which is what CONTESTED is for. **5. The weight budget inverted.** Measured against a 60 KB / 56k budget: dark-studio 38.7 KB, light-chrome 17.6 KB, type-ladder 41.4 KB. All three fit, but almost none of that is the page. Departure Mono alone is 22 KB and the two Silkscreen faces add ~7 KB, so the fonts are the overwhelming majority of every study that uses them. The era spent its budget on sliced images and had type for free, because type meant whatever the machine already had. A period-weight page built today inverts that exactly: the images are gone and the budget goes to webfonts, the one thing the era could not buy at any price. `light-chrome` is the lightest study here purely because it sets most of its text in Tahoma, which is to say because it makes the period choice. That also means the 60 KB ceiling is not yet doing any work. Nothing here carries images. The budget only starts to bite once an image-built study lands, and until then the readout is a fact about fonts. **6. The markup is the primary source, and it is the part that survived.** The captures are mostly rot. Images 404, Flash is gone, and a screenshot of an archived page is a picture of the rot rather than the design. But `bgcolor` is text, so it came through intact: `bgcolor="#253048"` is still sitting in the 2Advanced splash exactly as somebody typed it in 2002. So is the font stack, the window.open geometry, the rollover preload list and the keywords meta. Reading the source turned out to be far more productive than looking at the renders, and every value in `two-value-dark` and `boxed-grid` is a citation rather than an eyedropper sample. **7. Forty images, two font tags.** Census of the 2000-03-01 k10k front page: 18 tables, 37 rows, 62 cells, 40 images, 22 links, 45 rollover images preloaded as `_off`/`_on` pairs, 8 spacer GIFs, and exactly **two** `` tags. Their own keyword for the layout, sitting in the meta tag the whole time, was `lotsofpeopleinboxes`. Almost every piece of text on that page was a GIF. This reframes the whole typography area: the tiny type the era is remembered for was largely not type at all, it was pictures of type, set in Photoshop and exported. What little live text existed was `size="1"` because that was the floor. The bitmap face was a Photoshop asset, not a webfont, and `type-ladder` is therefore studying something closer to what the era wished it had than what it actually shipped. **8. Dark did not mean black, and this lab had it wrong.** `dark-studio` was originally built on #05070a and #0a0f16, on the assumption that "dark studio site" meant near-black. The source says otherwise. | site | ground | panel | separation | ground luminance | | --- | --- | --- | --- | --- | | k10k, 2000 | `#404642` | `#2f3431` | 1.31:1 | 5.9% | | 2Advanced, 2002 | `#253048` | `#2d3851` | 1.13:1 | 3.0% | | Praystation, 2002 | `#333333` | (not declared) | – | 3.3% | | modern default | `#0a0a0a` | `#111111` | 1.05:1 | 0.3% | The step size is not shared: 2Advanced at 1.13 is nearer the modern default than it is to k10k at 1.31. What is shared is a floor. Every measured ground sits between 3% and 6% luminance, and the modern default is ten times darker than the darkest of them. `dark-studio` now uses the measured 2Advanced pair unmodified, and says so in its own source. **9. Every prose number in this lab has been wrong at least once.** `boxed-grid` shipped with a hand-typed "1.19:1" separation that was actually 1.31:1. `two-value-dark` shipped with an argument claiming the era pairs shared a structure and that near-black collapses, and its own instrument only half agreed. Both times the fix was the same and it should now be the default: **delete the number from the prose and have the page compute it.** A claim a study can check is a claim that cannot rot. **10. The corpus is blocked on a rate limit, not on code.** `scripts/corpus.py` is written, correct and unrun. The plan was to census 45 domains across four constituencies so findings 6 to 9 could become distributions instead of anecdotes. What actually happened, in order: 1. Intermittent **503** "Temporarily Offline". Real, and transient. 2. Sustained **429**, caused by my own request rate rather than by the archive. 3. The **CDX index timing out entirely** while ordinary snapshot fetches still returned 200. Since every domain needed a CDX query before any of its pages, one endpoint was gating all 45. Fixed by dropping CDX completely: `/web//` redirects to the nearest capture and serves it in one request, and the real timestamp comes back in the final URL. 4. By then the address was **hard limited**: every request, snapshot endpoint included, returned 429 in 1.2 seconds flat. The lesson is not about retries. Backoff cannot recover a budget that is already spent, and retrying extends the block rather than clearing it. The throttle is the only number that matters, and it is now 10s with the whole incident written into the source above it. Two consequences for the lab: - **`portal-density` carries unverified numbers and says so**, in its source and in its catalog entry. Its 91 links and 74-above-the-fold are designed, not measured, and stay flagged until the corpus confirms or corrects them. That is exactly how `dark-studio` got its palette wrong and then right. - **The corpus stays the highest-value next step.** Nothing about the approach is disproven; it needs a cooling-off period of some hours and one patient run. Everything caches, so it is built once. **11. The dark studio look is an import, and the lab was drawing it second hand.** `tdr-numeric` argues, and I think correctly, that the HUD vocabulary is not a native web aesthetic. Product codes, circled indices, hazard rules, registration marks and text set as specification came out of British graphic design of the late eighties and nineties, The Designers Republic above all, with Attik alongside. It reached the web fully formed from record sleeves and game packaging. That explains something the lab could not: **why this strand aged so much better than everything else here.** It never depended on a browser limitation, so nothing broke when the limitations lifted. It is the one SURVIVES in the lab that was never a workaround in the first place. Two corrections it forces: - **The source is bright, not dark.** `dark-studio` and `hud-console` are both dark because 2Advanced was, and 2Advanced was a web-era narrowing of a much louder language. The lab had been treating a dialect as the language. - **In the source, the numbers count something.** A catalogue number on a sleeve is real. In most pages that borrowed the look, including this lab's own `hud-console`, the numbers are decoration. That is the difference between the vocabulary and a costume of it, and it is a fair charge against our own work. **12. The era was not uniformly dense and dark; the lab's sample was.** Eleven studies in, everything was dense and most was dark, which implied a claim about the period that the period does not support. `jp-minimal` is the counterexample: the Tokyo wing around 1999 to 2001 was white, nearly empty, and built around one small thing that responded to you. Measured on the page: 4.6% of it occupied, 95.4% empty. It is also the only work here where **motion is the content rather than the chrome**. Take the interaction away and no page remains. That is why the archive serves it so badly, and why the source census that recovers k10k recovers nothing at all here: no bgcolor to read, no font tag to count, only a lost `.swf`. A lab built on reading markup has a blind spot exactly the shape of this work, and should say so. **13. The aesthetic control inverts the lab's own question.** `net-art-broken` is to aesthetics what useit.com is to usability. It is also the only strand where **the constraint was the material rather than the obstacle**. Everywhere else somebody is beating a limit; here the limits are the paint, and a page that renders differently in two browsers is a bug to every other study and a feature to this one. So "does the technique survive the removal of its constraint" quietly assumes the constraint was unwanted. This is the case where it was chosen. Worth holding onto the next time a verdict looks obvious. One deliberate infidelity, recorded rather than hidden: the originals used seizure-rate flashing. That is a genuine harm and not a stylistic choice to reproduce for accuracy, so the flicker is slow, low contrast, stoppable, and honours `prefers-reduced-motion`. **Faithfulness stops where injury starts.** **14. Twice now, a failure has been invisible because only the success path had a counter.** The corpus run reported "domains done: 0" for twelve minutes and I read it as slow. It was crashing: expanding the domain list had sliced out the `BACKOFF` constants that lived between `DOMAINS` and `def get(`, so every fetch raised `NameError` before making a single request. The progress line counted successes and never once mentioned that the error log was filling up. Same shape as finding 3, where the type ladder printed one number twelve times and looked finished. **A measurement that only counts successes cannot tell "nothing is happening yet" apart from "everything is failing."** Every progress readout in this repo should report failures beside successes, and the monitor now does. **15. The corpus is blocked again, and this time it was avoidable.** The rate limit cleared overnight. I then spent it: repeated probes, a crashed run, more probes to diagnose the crash. By the time the code was correct the address was 429ing in 1.2 seconds flat again. Finding 10 already said retrying extends the block and I did it anyway while debugging. The rule that follows, and it is a discipline rather than a code change: **diagnose against the cache, never against the network.** The 78-domain list and the CDX-free fetcher are both correct and untested. `scripts/shoot.py` is written and waiting on the same budget. Next attempt gets one patient run, after a real cooling-off, with no probing. **16. The foundry page is the only layout here that needed no rehabilitation.** `foundry-store` studies the problem YouWorkForThem posed when Cina and Young founded it in 2001: sell an aesthetic object whose presentation IS the product. Its rule is still the right rule and it inverts everything else in this lab: **when every cell in the grid is shouting in a different voice, the grid has to shut up.** A strict neutral frame, one restrained accent, all the character coming from the goods. That is the exact opposite of a studio front, where the chassis IS the pitch, and it explains something the lab kept noticing without being able to name: a foundry page from 2002 reads as more modern than a studio page from 2002, because it was never expressing anything, so nothing in it could date. It also poses a requirement no other study has. Everywhere else the page is ABOUT something. Here the page is MADE OF the thing, so the specimen has to be honest: the two vendored faces are shown only at the sizes finding 3 measured them crisp at. A foundry showing a bitmap face at a size it breaks at would be lying about the product. **17. Do not automate access to archives built to resist automation.** Two services throttled in one day. archive.org 429ed the address after I spent its budget probing (findings 10 and 15). Then a single `navigate_page` to webdesignmuseum.org tripped Cloudflare's bot challenge and, because it is the same browser and IP, blocked Erin's own tabs mid-browse. The pattern is the problem, not either incident. These sites are curated by people, served at their expense, and defended accordingly. The working arrangement that actually holds: - **Erin browses them by hand.** That is the supported path and it is not slow. - **I read what is already loaded** in an open tab with a read-only `evaluate_script` returning small JSON. That cost nothing and worked perfectly, which is how the Golden Age list came back. - **I never navigate them myself**, and I do not fetch them in a loop. The corpus fetcher stays for archive.org, once, patiently, after a real cooling-off. Everything else is manual. Getting a collaborator blocked out of their own research is a worse outcome than any dataset is worth. **18. The closest thing this lab has to a law, and it arrived twice by accident.** `foundry-store` concluded that when every cell in a grid shouts in a different voice, the grid has to shut up. `community-board` was built afterwards, from a completely different problem (hosting other people's submissions rather than selling type), and arrived at the identical rule: white boxes, a plain grey frame, no character anywhere in the chassis. Two unrelated commercial problems, no connection between them, one answer: > **A frame's job is inversely proportional to how much its contents have to say.** That is worth more than either page alone, because neither was built to prove it. And it retroactively explains the thing this lab kept noticing without being able to name: **the studio fronts here date hardest.** `dark-studio`, `hud-console` and `splash-gate` are the pages where the frame had the most to say, and every one of them is legible as period work at a glance. The foundry and the board are not, because they were never expressing anything, so nothing in them could go out of date. It also quietly reframes the lab's verdicts. SURVIVES has been reading as "this was good", but there are two very different routes to it: a technique can survive because it was excellent, or because it was self-effacing enough to have no surface to age. Those deserve to be told apart, and currently are not. **19. Two captures of the same site, ten months apart, and the palette is identical.** Everything measured so far came from a single capture per site, which meant every value in this lab was technically a sample of one. `corpus/cache` also holds a k10k front page from **1999-05-06**, ten months before the 2000-03-01 one the rest of the lab is built on. Censusing it was free, offline, and cost the archive nothing. | | 1999-05-06 | 2000-03-01 | | --- | --- | --- | | tables | 17 | 18 | | rows | 34 | 37 | | cells | 57 | 62 | | `` tags | 39 | 40 | | links | 19 | 22 | | **`` tags** | **2** | **2** | | **spacer GIFs** | **8** | **8** | | ground / panel | **#404642 / #2f3431** | **#404642 / #2f3431** | The content churned and the structure did not. The two values in finding 8 are not an artifact of which Tuesday the crawler visited: they are the site's declared identity, held across ten months and a content cycle. The same goes for "exactly two font tags", which was the most surprising number in finding 7 and is now the same number twice. It also recovers something finding 8's table did not have, because nobody thought to look for it: the text and link colours, `text="#FFFFFF"` and `link="#cacaca"`. The type on that ground is not white. It is one step down, and the white is reserved. Method note worth keeping: the census had to be run twice. The first pass counted 39 `` tags but only 3 with a `src`, and reported that **zero** preloaded images were also displayed, which is impossible when the resting states are the preloaded `_off` files. The cause was a filter dropping absolute URLs while the preload list used relative ones, so the two sets could never intersect. Finding 3 and finding 14 again, from a third angle: the number was well formed, internally consistent, and measuring nothing. The tell was that it was impossible, not that it looked wrong. **20. The rollover was three channels wearing one handler, and they did not share a fate.** `rollover` is the first study to take ABSORBED, and building it showed why the verdict had to exist. The sixteen `onMouseOver` handlers in the 1999 source are not doing one thing: | | channel | handlers | fate | | --- | --- | --- | --- | | A | the hovered element changes | 14/16 | absorbed into `:hover`, early and completely | | B | a *different* element changes | 9/16 | not expressible in CSS at all for twenty years | | C | a sentence in the status bar | 16/16 | disconnected | Filing that under SURVIVES would have hidden the interesting half. **Channel B is the one that breaks the tidy story.** Nine of the fourteen image handlers change something the pointer is not on, and k10k put the caption panel *above* the icon strip, where no combinator CSS had could reach it. `:has()` finally made it reachable, and the study demonstrates that rather than claiming it: switch the rebuild to CSS and the caption works with no script at all. It costs six stylesheet rules where the script needed one function, because a selector cannot take an argument, and the payload has to be `content`, which means the caption is no longer text. The page proves that last part on itself, by trying to select it and getting an empty string. The cost of the original is measured, and it is the number worth keeping: the page pulls **52 distinct image files and 22 of them are states nobody sees unless they point at the right rectangle**. Forty-two percent of the image payload, over a line doing about 5 KB a second, for feedback most visitors never triggered. **21. A channel can die without its API dying, and that is worse.** This study's first draft asserted that `self.status` "reads back empty, channel removed", and put a probe on the page to show it. The probe said the opposite. `self.status` accepts your string and hands it back unchanged, exactly as it did in 1999. What was removed is the surface it wrote to, not the interface. So the 1999 line still runs, still returns, still throws nothing, and does nothing. All sixteen handlers write to it and two of them write to *nothing else*, which means for those two the entire feedback was living in browser chrome that has not existed for twenty years, in code that never once complained. **"It still runs" is not evidence that it still works**, and a silent no-op is a worse failure mode than an error, which is the same lesson findings 3 and 14 keep arriving at from the measurement side. The correction matters more than the fact. The claim was wrong, the page was built to check its own claim, and the check caught it. That is the only reason this lab gets to make assertions at all. **22. The dark studio was not always dark, and the lab was citing a name when it meant a date.** Finding 8 corrected `dark-studio` from invented near-black to 2Advanced's measured `#253048`, 3.0% luminance, and that correction still stands. What it quietly implied is that the pair was a fact about the studio. It is not. The same studio's splash, captured **2000-06-08**, two years earlier, declares: | | ground | rule | text / link | ground luminance | | --- | --- | --- | --- | --- | | 2Advanced, 2000 | `#999999` | `#003366` | `#FFFFFF` (all four) | **31.9%** | | 2Advanced, 2002 | `#253048` | | | 3.0% | `#999999` is mid grey. It is more than five times brighter than the brightest ground in finding 8's table, which was k10k at 5.9%, and more than ten times brighter than the same studio two years later. The dark look was **arrived at**, somewhere between these two captures, and finding 8's floor is a claim about what dark pages did in 2002, not about who these designers were. The lab had been treating a measurement as an identity. That capture had been sitting in `corpus/cache` unopened the whole time. **23. The three-channel rollover is a k10k fact. The industry tool shipped one channel.** Finding 20 counted sixteen handlers running three feedback channels and concluded things about "the rollover". The 2000 2Advanced page is the control that finding needed, and it disagrees: | | k10k, 1999 | 2Advanced, 2000 | | --- | --- | --- | | authored in | Adobe GoLive | Macromedia Dreamweaver | | swap function | hand-written `hiLite()` | stock `MM_swapImage()` | | rollovers | 16 | 1 | | preloaded images | 37 | 1 | | remote swaps (channel B) | 9 | 0 | | writes to `self.status` (channel C) | 16 | 0 | Dreamweaver's generated rollover does channel A and nothing else. It has no idiom for changing a second element and never touches the status bar. So channels B and C were not conventions of the era, they were **craft**, written by hand at one site, and the thing that actually became universal is precisely the thing the standard tool emitted. This is the sharpest argument yet for the corpus, and against the lab's habit of generalising from k10k: k10k is the most-cited front page of the period because it was exceptional, which makes it the worst available proxy for typical. Two sites is not a distribution either. It is just enough to know the first one was not one. **24. Some techniques were not outgrown. The permission was withdrawn, and the lab's question has no slot for that.** The whole lab asks: does the technique survive the removal of its constraint? Two studies now answer with something the question did not anticipate. `popup-window` measures six `window.open` calls. On all five k10k ones, every one of the seven chrome flags is `false`: not resizable, no scrollbars, no menubar, no toolbar, no directories, **no location bar, no status bar**. The designers were not opening a browser window, they were removing the browser from it. `rollover` measures sixteen handlers writing sentences into `self.status`. Neither of those died of progress. **Nothing about either constraint lifted.** If browsers still honoured the flags, the chromeless popup would still work today, exactly as written. What happened is that both capabilities let a page lie about where you were, so both were taken away on purpose, as anti-phishing measures, by the people who make browsers. The live probe in `popup-window` shows precisely where the line was drawn. Asked for 236x134 with every flag off, a browser today returns a drawable area of 236x133, within a pixel of the request, wrapped in 67px of chrome the page asked to have none of and cannot remove. **The canvas was granted and the frame was refused.** That gap is the entire modern position on this technique, in two numbers. So there is a category here the four verdicts do not name: not SURVIVES, not ARTIFACT in the ordinary sense of being outgrown, not CONTESTED, not ABSORBED. Call it revoked, provisionally, and do not add it to `VERDICTS` yet. ABSORBED earned its slot by turning up repeatedly before it was named, and two cases is not that. Both are filed ARTIFACT with the reason written out, and if a third turns up the vocabulary changes. **Superseded by finding 29.** The third case turned up: `ambient-audio`. REVOKED is now the fifth verdict and `popup-window` is refiled into it. The rule this finding set worked exactly as written, which is the main reason to trust it the next time the vocabulary is under pressure. **25. k10k had no ground colour. It had a random background image, and the lab has been calling two cell fills a ground for six studies.** Findings 8 and 19 both present k10k as declaring a ground of `#404642` and a panel of `#2f3431`. Reading the rest of the 1999 source kills the first half of that. Every one of the nine `bgcolor` attributes on that page sits on a ``: | colour | cells | declared sizes | | --- | --- | --- | | `#404642` | 5 | 203x32, 203x164, 7x164, 7x164, 203x7 | | `#2f3431` | 4 | 144x28, 144x173, 81, 63x4 | There is exactly one `` tag on the page and it is not in the markup. It is written at runtime: ```js var inxback = 0 + randNum(7); document.write(""); ``` So the actual backdrop of the most-cited dark page of the era is **a tiled GIF chosen at random on every load**, from a set of seven. `baggrunde` is Danish for backgrounds. The two colours the lab has been quoting are the fills of the boxes sitting on top of it. What survives the correction: the two values are real, both measured, and the separation and luminance numbers in finding 8 are unaffected, because they were always a comparison between two declared colours. What does not survive is the word **ground**, and with it the tidy picture of an era that chose a flat dark backdrop on purpose. At least one of these sites did not choose a backdrop at all. It rolled one. Two caveats, because the temptation is to over-correct: - This is verified for the **1999-05-06** capture. The 2000-03-01 capture, which is where finding 8's row actually comes from, is not in the cache and cannot be checked offline. It may well declare a body colour. Until it is re-read, finding 8's k10k row should be read as "two declared values", not as "ground and panel". - `two-value-dark` was already more careful than the prose around it: its own note said "five cells declared at #404642". The study had the right fact and the surrounding argument had the wrong word, which is its own small lesson about where errors hide. Two more details from the same block, both worth keeping: - **`randNum` is not a random number generator.** It is `Math.round(num * Math.cos(now.getTime()))`, the cosine of a millisecond epoch. Because cosine is flat near its extremes, the results are arcsine distributed rather than uniform: the first and last backgrounds came up far more often than the middle ones. The page had seven backgrounds and did not show them equally. - **Two thirds of the randomisation is dead code.** `inx = randNum(7)` and `inx2 = randNum(26)` are both computed at load and never interpolated anywhere. Only `inxback` is used. Whatever the other two were for was removed, and the calls were left behind. **26. The most honest artwork is the least like the era.** Every study with imagery had been shipping grey rectangles labelled with their own dimensions. Honest, and it makes a period page read as a wireframe. Four imagery vocabularies now have studies of their own, and putting them side by side settles something the lab could avoid while its pages carried no art: | study | vocabulary | measured marks | reads as 2000 | | --- | --- | --- | --- | | `art-diagram` | rule stacks, outlines to scale, registration marks | all | no | | `art-texture` | halftone, scanlines, gradient wash, arc | some | yes | | `art-studio` | exploded panels, tech-organic curve, reticle | **none** | most | | `art-pixel` | ordered dither, isometric cubes, fixed grid | one | yes | **The plate with no evidence in it is the one that reads as evidence of the era.** `art-diagram` is built entirely from real measurements of a real page from 2000 and could have been drawn in any decade. `art-studio` cannot be checked against anything and places instantly. That is not a flaw in the drawing, it is the shape of the problem. The era's imagery was not encoding data, it was expressing a studio, and a lab that only permits itself measured marks cannot reproduce work whose entire purpose was expression. Finding 7 pointed here without following it: the k10k front page ran 29 distinct images against 2 font tags, so those pages were overwhelmingly pictures, and every study in this lab is text. The grey rectangles were hiding how far from the era that puts us. Three consequences worth keeping: - **A seventh area.** The six areas were "what a designer was actually deciding", and choosing the artwork was one of those decisions, arguably the dominant one. `imagery` now exists. Its absence had been letting the lab describe an era of pictures entirely in text. - **The verdicts strain here.** SURVIVES, ARTIFACT, CONTESTED and ABSORBED were built for techniques answering constraints. Three of these four are CONTESTED, not because the vocabularies are alike but because "defensible now only as deliberate style" is the only slot decoration fits in. Related to finding 24: the vocabulary is built for one kind of question and keeps meeting others. - **`art-texture` found something the lab has not seen elsewhere.** Halftone exists because ink cannot print continuous tone. Scanlines exist because a CRT draws in lines. Neither is a property of a web page, so that plate is a page **simulating the limitations of media it is not**. Everywhere else in this lab somebody is beating a constraint. There, somebody is importing one for the look of it. Two rules held throughout, and they are why this did not become a shared graphics layer: each study owns its drawing code outright, with the four imagery studies containing near-identical helpers on purpose; and every mark declares whether it is measured or designed, per study, in a table the page builds itself. **27. The imagery this lab was missing was not a style, it was the picture.** Finding 26 added four imagery studies and they were all still *marks on a surface*: rules, dots, panels, pixels. Put beside actual captures of the period, that set turned out to be missing the thing that covered the most pixels on nearly every page, which is a **rendered or composed image filling the frame as the page itself**. Four more studies close that gap, and each one turned out to carry a finding rather than just a look: - **`art-render`.** A pre-rendered 3D still, made in Lightwave or 3DS Max over hours and shipped as one flat JPEG. The verdict is ARTIFACT and it takes care to say why, because the look is obviously alive: the technique is not the look. The technique is "the machine cannot draw this, so bake it elsewhere", and that constraint is gone completely. The specimen projects and depth-sorts its geometry live at a cost of nothing. **A look and a technique can have opposite fates**, which is the confusion findings 20 and 21 were both circling. - **`art-shard`.** The claim here is the surprising one. GIF is run-length encoded, so a field of one flat colour costs almost nothing while a photograph costs everything. Hard-edged flat polygons were **the cheapest ambitious picture available**, and the most recognisable graphic language of the period is partly downstream of how a 1987 image format stores rows of pixels. It takes SURVIVES, alone among the imagery studies, because it was vector-native before vectors were available. - **`art-glitch`.** Two pretences pointing opposite ways. The smear is motion blur, a physical record of something moving past an open shutter, and nothing moved. The micro-type, the index counting nothing and the barcode that will not scan look like information and are texture. That second half is **exactly the charge finding 11 laid against our own `hud-console`**, reached independently from a different wing. Two unrelated routes to the same conclusion, which is the pattern finding 18 came from. - **`art-wireframe`.** A wireframe shows the edges of a solid, and here there is no solid. Nothing was shaded, textured or lit, so nothing had to survive being shaded, and the picture cannot be caught out because it never claims to be finished. **The authority of engineering at the price of a diagram.** The reduction panel on each page turned out to be worth more than expected. It ranks the vocabularies by what survives being made small, and the order is not the order of quality: | vocabulary | at 64px | | --- | --- | | `art-shard` | loses essentially nothing, a hard edge stays a hard edge | | `art-render` | degrades gracefully, a soft image has no detail to lose | | `art-glitch` | reduces to texture, having always been texture | | `art-wireframe` | collapses into grey, worst in the set | | `art-pixel` | does not degrade, it **breaks**, being defined in pixels | That is a real property and none of it is about taste. It also explains something about the period the lab could not otherwise: the wings that shipped gallery thumbnails are the wings whose work reduces, and the pixel wing never did, because it could not. **28. Three independent routes to one charge, and the imagery wing keeps arriving at it.** Finding 11 said that in the print vocabulary the numbers count something real, and that in most pages which borrowed the look they are decoration. That was a charge against our own `hud-console`. The imagery studies have now reached it twice more, from two directions neither of which was looking for it: | study | what pretends | what it pretends to be | | --- | --- | --- | | `hud-console` | product codes, circled indices | a catalogue | | `art-glitch` | micro-type, an index counting nothing, an unscannable barcode | data | | `art-chassis` | notches, a trademark on an internal panel name, a scrollbar with nothing to scroll | an instrument | Three unrelated builds, one answer: **the era's visual language consistently dressed as an instrument and consistently instrumented nothing.** That is the same shape as finding 18, which also arrived twice by accident and is worth more for it. What survives the charge is the part that was doing a job. `art-chassis` takes ABSORBED, only the second study to, and it splits exactly along that line: the module, a rectangle with a titled header holding one kind of content, won so completely that nobody designs it any more, while every ornament fastened to it died. Three more imagery studies close the set out, and two of them break the CONTESTED monotony finding 26 complained about: - **`art-duotone` takes SURVIVES.** Collapsing a photograph to a ramp between two colours did two jobs at once: it cut the palette enough to make a photograph affordable in a 216 colour world, and it forced the picture to obey the site palette instead of fighting it. The byte economy is finished. The discipline is not, because it was never really about bytes: subordinating imagery to the palette is in every brand system now. **The era reached a design rule through a compression problem, and the rule outlived the problem.** That is the cleanest possible answer to this lab's question. - **`art-scene` takes CONTESTED**, and the distinction from `art-render` is reference rather than style. An abstract form refers to nothing and so nothing can fail to be true of it. A scene implies a place, therefore a time, therefore a moment before and after, none of which a page has. The letterbox bars are the tell, exactly as "skip intro" is the tell in `splash-gate`: a page cropping itself to cinema is saying what it wishes it were. It dated harder and faster than the abstraction beside it, because a rendered city is a specific year's idea of the future, which is the least forgiving thing an image can be. Underneath the ambition: four depth layers and one light. **Aerial perspective, a painting convention centuries older than photography, running the most futuristic vocabulary in the lab.** The four earlier imagery studies now carry the same reduction panel as the rest, so finding 27's ranking is demonstrated on every page rather than asserted here. `art-pixel` in particular now shows what "breaks" means: at 64 pixels it is a smear, while every other vocabulary merely thins. **29. The fifth verdict, and the rule that produced it worked exactly as written.** Finding 24 found two techniques that died a death this lab had no name for: the chromeless popup and `self.status`. Neither was outgrown, neither constraint lifted, and both were switched off on purpose by browser vendors because both let a page lie about where you were. It refused to invent a verdict for two cases and set a test instead: **a third turns up, the vocabulary changes**. `ambient-audio` is the third. Sound that starts on its own still parses, still decodes and still runs. Its live probe reports `AudioContext` coming back `suspended` and `audio.play()` rejecting with `NotAllowedError`, and then both working instantly on a gesture. Nothing broke. The permission was withdrawn, by four vendors, between roughly 2017 and 2019. So **REVOKED** exists, `popup-window` is refiled into it from ARTIFACT, and the verdict spread is now 12 SURVIVES / 15 CONTESTED / 3 ARTIFACT / 3 ABSORBED / 2 REVOKED. Two things worth keeping about the refiling itself: - **ARTIFACT was not a small mislabel.** It means the problem went away and took the solution with it, which is `splash-gate`: nobody waits ninety seconds for a movie, so nothing needs to fill the wait. None of these three had a problem left to go away. Filing them under ARTIFACT was quietly crediting progress with somebody's policy decision. - **`rollover` stays ABSORBED and that is correct.** Its channel C is revoked, but a verdict names a study's dominant channel, and channel A absorbed completely. What finding 20 could not do was name what happened to channel C. Now it can. **30. The lab's own charge needed narrowing, and the study that narrowed it is the one the charge did not fit.** Finding 28 said the era's visual language dressed as an instrument and instrumented nothing, on three routes. `dot-notation` makes a fourth, and it is the first that can be **run** rather than argued: the syntax makes a claim a machine can check, so the page resolves each phrase as a real property path against the global object. Three genuine paths resolve, as controls. Zero of eight era phrases do. The census behind it is the better half. Across both captures, wrapper stripped, there are **241 occurrences of 126 distinct dot-joined tokens, and every one is a filename, a hostname or a property access**. The count set as display text is zero. The punctuation was in the building the whole time, load bearing, in the parts nobody looked at, and the convention is a designer reading the source of their own page and liking how it looked. Then `organic-motif` was built and **the charge did not apply to it at all**, which turned out to be worth more than a fifth confirmation. There are no numbers in it, no index, no code, no notch, no scrollbar and no syntax. It is not a diagram, a photograph, a control or a borrowed sign. There is nothing to catch, because it never claimed anything. So the pattern finding 28 found is not *the era decorated*: > **The era decorated while claiming to measure.** Take the claim away and the decoration is only decoration. The problem was never ornament, and that distinction was invisible until a vocabulary turned up wearing no costume at all. `organic-motif` is still CONTESTED, because honest decoration is still decoration, and every row of its inventory declares that it encodes nothing, in a third column no other study has. **31. Removing a limit can subtract from a vocabulary.** Every study here so far has been written against a constraint that softened. `chevron-hatch` is written against one that **inverted**. In 1999 the diagonal was the most expensive mark available: tables are rectangles, and with no transform, clip path, SVG, canvas or alpha, every angle on every page was a picture, exported, sliced, downloaded, and unable to move, reflow or recolour. It is now the cheapest mark on the platform. The study builds the same hazard band both ways so the two sit side by side, and the right one is a single declaration. The vocabulary did not survive that, and the reason runs against what this lab keeps expecting. **When angles were expensive they were used sparingly, and sparing use is what made them read.** A diagonal across an otherwise rectangular page is an event. Once the cost went to nothing the restraint went with it and the diagonal became wallpaper. That is the exact counter-case to `art-duotone`, which is the cleanest SURVIVES in the lab precisely because a compression problem produced a design rule that outlived it. Here cheapness did not preserve the technique. **It dissolved the discipline that made the technique good.** **32. Finding 1 has never been tested, and the study built to test it found out why: the lab only has one wing.** Finding 1 says the era is not one look, that the studio wing is dark and the chrome and vernacular wing is dark-on-light, and that nearly every technique behaves differently across that split. It is the oldest claim here and the `palette` field on every catalog entry depends on it. Nothing had ever checked it. `palette-split` computes every number on load from three measured captures, and independently reproduces finding 8's table exactly: k10k 1999 at 5.9% and 1.31:1, 2Advanced 2002 at 3.0% and 1.13:1, 2Advanced 2000 at 31.9% and 4.43:1. The result is a correction, arrived at in two stages, and the second stage is the lab's own method catching the lab: - **The split is not a split in lightness.** Sorted by ground luminance, the three do not fall into two camps. One sits alone at 31.9% and the other two sit 2.9 points apart at the bottom. - **The first draft of that study then claimed the real axis was separation**, the distance between panel and ground, and added a live check to back it up. The check killed it. Separation puts the same single capture alone, with a wider gap. The prose was rewritten and the number was kept, which is finding 9's rule doing its job for the third time. What was actually wrong is the evidence, not the claim. **All three measured captures are studio sites.** k10k and 2Advanced are filed as different palettes and are the same wing of the same scene. Of the ten light-palette studies, only two carry measured colour and both of those measurements came out of a studio site as well. So every measured colour in this repository comes from two sites, and finding 1's other half has no evidence here whatsoever. Finding 1 is therefore **neither confirmed nor refuted. It is untested**, and this is the study that establishes that, which is worth more than a third reading of the same two sources. It also gives the parked corpus run something specific to fetch that it did not have before: not more captures, but captures from **the other wing**. A portal, a personal page, a board, a shop. One genuine result fell out on the way. The mid grey ground puts white text on `#999999` and measures at 2.85:1, well under the modern 4.5:1 floor, while both dark grounds clear it comfortably at 9.67:1 and 13.17:1. **By a current accessibility standard the era's dark pages are the legible ones**, which is the opposite of the way this is usually told. **32b. A fourth studio site turned up the same day, and it is nearly white.** Finding 32 concluded that the studio wing has three measured captures and the other wing has none. Erin then supplied GreyscaleNet, a Golden Age site the museum files under Design & Art and Techno, captured **2001-04-20** at `greyscale.net`. Sampled off the museum's own screenshot, its ground is a flat `#e6e5df`, and it is flat: four widely separated points return the identical value and 67% of the image falls in that one histogram bin. That is roughly **80% luminance**. | capture | ground | luminance | | --- | --- | --- | | 2Advanced, 2002 | `#253048` | 3.0% | | k10k, 1999 | `#404642` | 5.9% | | 2Advanced, 2000 | `#999999` | 31.9% | | **GreyscaleNet, 2001** | **`#e6e5df`** | **~80%** | If that holds, the studio wing spans nearly the entire lightness range, and finding 1's "the studio wing is dark" is not merely untested, it is **wrong**. Finding 22 already showed one studio moving from 31.9% to 3.0% in two years; this puts a third studio at the far end in between them. **It is deliberately not being written up as a finding, and the reason is the method.** Every number in the table above except the last comes from markup somebody typed. The last one comes from a picture. A screenshot cannot say whether `#e6e5df` was declared or painted, and finding 25 is the standing warning about precisely that error: k10k appeared to declare a dark ground for six studies and turned out to be running a randomly tiled GIF, with the two quoted values sitting on cells on top of it. A pale flat rectangle in a screenshot is exactly as ambiguous. So `greyscale.net` is now in `corpus.py` as the highest-priority row in the dict, and the census settles two things at once: whether that ground is a declared value, and whether the overlapping translucent shards shipped as GIF, which cannot do partial alpha, or as JPEG, which mangles the hard edges `art-shard` argues were the cheap option. Either answer complicates a study. **33. A negative is a measurement, and three of these studies are built on one.** The lab's provenance rule has always been measured versus designed. This batch adds a third category that turns out to be stronger than designed and cheaper than measured: **the measured negative**, a census that comes back empty and bounds what the lab is entitled to say. | study | looked for | found | | --- | --- | --- | | `ambient-audio` | `bgsound`, `embed`, `object`, `applet`, any audio file, `autostart` | 0 | | `form-controls` | `form`, `input`, `select`, `option`, `textarea` | 0 | | `dot-notation` | dot-joined tokens set as display text | 0 of 241 | Each of those studies prints the terms it searched for, because a negative is worth nothing if you cannot see what was looked for. And each says plainly that its specimen is therefore designed, instead of quietly building on an absence, which is how a lab talks itself into believing its own reconstruction. `form-controls`'s negative is the one that carries an argument rather than a caveat. Faced with a control they could not paint, these studio fronts **simply did not have forms**. The search box and the mailing list lived on a separate, plainer page, because the moment a form appeared the operating system appeared with it. Avoidance is a real design decision and it is the one the era made. **34. One study in this lab is about a constraint that never lifted, and it changes what the question means.** `form-controls` is the only page here whose limit is live. You still cannot style the inside of a `select`, for exactly the reason you could not in 1998: the open list is an OS window on top of your page, and CSS has no reach into another window. The study probes eight declared styles against an observable that would move if they took, and reports three outcomes. Four TOOK, zero were IGNORED, and four are **UNOBSERVABLE**: there is no measurement to take, because the pixels are not in the document. That third category is the study. It is not a browser refusing you, it is a browser having nothing to refuse. Nothing in it reads `getComputedStyle`, which will hand back every colour you set on an `option`, forever, and paint none of them. That is finding 21's failure mode one channel over, and a page that reported computed values here would have produced a full table of confident nonsense. The rebuild is counted rather than asserted, and the count corrected the argument. The custom listbox came out at **1.3x** the nodes of the native control, near enough to parity that the paragraph claiming it was expensive had to be rewritten. What the numbers actually say is that **the cost did not grow, it moved**: 8 listeners, 5 ARIA attributes, 7 key names and about a kilobyte of handler source where the element needed none of any of it, and it still does not do five things the original did for free. The markup got no heavier. The obligations did. **35. The most absorbed pattern in the lab is the one that stayed hand-built longest, and those are one fact.** `thumbnail-strip` is the third ABSORBED and it splits the way `art-chassis` splits. THE PATTERN, a row of small things where pointing at one changes a bigger region elsewhere, won so completely it has no name worth using: every gallery, carousel, related rail, file picker and swatch row. THE MACHINERY died entirely, and the measurements are what it cost: six icons at 19, 19, 17, 19, 19 and 21 pixels, all 21 tall, **114 pixels of pictures driving one 219 x 47 panel**, built from 19 files of which 12 are never seen. The resting caption is a file called `ikontekst_tom.gif`, Danish for empty, downloaded so a slot could be blank. Every caption is a picture of a sentence, which is finding 7 arriving in the interface copy. The cross-link is the part worth keeping. This is `rollover`'s channel B, the one finding 20 said CSS could not express at all for twenty years, and the geometry says exactly why: **the panel sits above the strip**, and everything CSS had ran forwards. So the most thoroughly absorbed layout pattern here is also the one that stayed script-driven longest, and that is not two facts. It is one fact from either end: the pattern won so completely that everybody kept paying for it, by hand, every year, until `:has()` arrived. The CSS version on that page works, and it is honest about its own price: the caption has to be delivered as `content`, so the page selects it and gets an empty string. In 1999 the words in that panel were not text because they were a GIF. Today they are not text because they are a generated string. **Twenty years apart, the same compromise.** **36. The era's signature picture was the most expensive one available, and the lab had been arguing the opposite.** Erin supplied five references of the shard vocabulary: designgraphik, Chapter3 and ThreeOh, Desktop Imperium, Cubadust, Submethod. `art-shard` already names four of those five, and it makes an economy argument about them. GIF run-length encodes, a field of flat colour is nearly free, so hard-edged flat polygons were the cheapest ambitious picture the era had, and the most recognisable graphic language of the period is downstream of a 1987 format. **The references are not flat.** They are translucent slabs, thirty and forty deep near the origin, crinkled, with notched silhouettes, internal facets and dense sheaves of hairlines. `shard-burst` rebuilds that properly and then rasterises its own specimen three times, counting distinct colours: | condition | colours | vs GIF's 256 | mean run | | --- | --- | --- | --- | | as drawn: translucent, antialiased | ~17,000 | over | 2.8 px | | alpha forced to 1, still antialiased | ~5,100 | over | 3.9 px | | alpha forced to 1, antialiasing off | ~150 | **fits** | 8.0 px | Only the third fits, and it is the version nobody shipped, because every edge in it is a staircase. So the economy argument holds for a **flat dialect** that some sites did ship, and not for the flagship pictures. `art-shard` now carries a scope note; it is a narrowing rather than a retraction, and both studies stand. What replaces it is a better finding. The burst is close to the worst case for **both** formats the era had: transparency and antialiasing each blow past GIF's palette independently, and the hard edges JPEG would ring on are the only thing the picture is made of. **They shipped it anyway, at full size, as the whole page.** Almost every study in this lab starts from a limit and finds the design that beat it. Here the designers priced the limit and paid it, which is a different relationship to constraint than anything else here has. There is a cross-link neither study went looking for. `type-ladder` is about turning antialiasing **off**, because a bitmap face at 10px is only crisp aliased, and finding 4 calls that the strongest argument against the whole aesthetic. This is about antialiasing being unaffordable to leave **on**. Same page, same year, same property, opposite decisions, one reason: smoothing costs colours and colours were the budget. **Method note, and it is the third instance.** The prose under that table was hand-written three times and falsified three times by the study's own next run, because changing the composition changes the counts. It is now **generated**, including its verdict, branching on whether the aliased figure clears 256. Finding 9 said to delete the number from the prose and let the page compute it. The stronger version, learned here: when a claim depends on a measurement that can move, **the sentence has to be computed too**, not just the figure inside it. **One more signal on the palette question.** Four of the five references are light: pale ground, dark and saturated marks, one hot accent doing all the shouting. Only Cubadust is dark. With finding 32b's GreyscaleNet that is a second independent pointer that the studio wing was not a dark wing, and it is the same weak evidence, pictures rather than markup. Recorded, not promoted. **37. The soft picture is hard. The blur is on the light, not on the form.** `light-shaft` is the pair to `shard-burst`, built from the one dark reference in Erin's set, and it was drawn wrong first. Reading "soft vocabulary" as "blurred geometry" produced olive fog, which is not what the reference is. The reference is **hard**: crisp faceted blades running from near black to near white in one frame, with the bright values sitting on the **edges** of facets rather than across large areas. What is blurred is the shafts, the bloom at the hot point, and the motion streaks. **Softness is applied to the lighting, not to the form**, and correcting that turned a cloud back into an object. The distinction is what the measurement rewards, and it completes the pair: | | high-frequency energy | colours | | --- | --- | --- | | `light-shaft`, as drawn | 2.67 | hopeless for GIF | | same, blur removed | 3.75 | hopeless for GIF | | same, moved to the light wing | 3.79 | hopeless for GIF | High-frequency energy is the mean absolute difference between adjacent pixels: what a DCT codec spends bits on and where ringing comes from. Hard facets put that energy on a limited set of edges and leave smooth gradients between them, which is the signal JPEG encodes nearly free. So this picture is **expensive in colours and cheap in the currency JPEG actually charges in**, where the burst is expensive in both. It is the one picture of the period the lab has found where the ambition and the available format agreed. **A hypothesis failed here and it is worth more than if it had held.** The theory was that darkness is itself a compression strategy, and that the one dark reference being the cheapest was partly the palette. The third row tests it by moving the identical marks into the light wing with mark-to-ground contrast preserved. It changes the cost by about **one percent**. Darkness is not doing the work; the blur is. The lab had a tidy story available, which would have tied neatly to findings 32b and 36, and the instrument declined it. That third row also had to be built twice, and the first attempt is the clearer lesson. It changed only the ground, which put pale marks on a pale field and measured them **vanishing** rather than measuring the wing, and it came back *lower* than the dark condition: the opposite of the hypothesis, and a broken control rather than a result. A control that changes two things at once answers neither. Same family as findings 3, 14 and 19: the number was well formed, internally consistent, and measuring the wrong thing, and the tell was that it was backwards rather than that it looked wrong. **38. The corruption is snapped to the layout grid, and that is measurable.** `bar-glitch` is the last distinct vocabulary in Erin's five references, from the Submethod screenshot: displacement bars, packed stripe bands, cross scatter, solid accent bars, on a bone ground with one hot red. `art-glitch` already charges this family with looking like information and being texture. That charge is about **pretending to be data**. This is a different and more specific failure: **pretending to be damage**, and unlike the first it can be tested rather than argued. The page draws the same field twice from the same seed, once quantised to the layout module and once with free offsets, and counts where the edges land: | field | edges | on the module | share | | --- | --- | --- | --- | | snapped, as the era drew it | 302 | 287 | **95%** | | free offsets | 292 | 10 | 3% | | chance | | | ~4% | Real corruption does not do that. A truncated GIF, a dropped scanline, a bad packet: none of them know where your table cells are, and the damage lands wherever the bytes ran out. **The disorder is total at the level of the mark and near zero at the level of the composition**, and no real failure produces that combination. Put the two panels side by side and the free one reads as a broken image while the snapped one reads as a designed element, which is not a matter of taste: it is what an arbitrary offset actually looks like. So it is a picture of chaos that obeys the page, drawn by somebody who wanted the layout to look survived without letting it interfere with the layout. **A bug worth recording, because the instrument caught the drawing.** The alignment first came back at **0%** for the snapped field. The measurement was right and the drawing was wrong: offsets were being quantised and then added to an un-snapped origin, so no absolute edge ever sat on the module. The claim was true of the code's intent and false of its output, and only a measurement taken from the geometry rather than from the picture could have told the difference. Findings 3, 14 and 19 from a fourth angle, and the first time in this lab that the instrument has corrected the artwork rather than the prose. **39. Finding 7 replicates on a document it was never taken from.** Finding 7's census, the largest single claim in this lab, came off the k10k front page of `2000-03-01`, which is not in `corpus/cache` and cannot be re-read offline. `text-as-gif` censuses the `1999-05-06` capture instead, which is: a different document, ten months earlier, in the cache the whole time. | | 2000-03-01, finding 7 | 1999-05-06, this study | | --- | --- | --- | | images | 40 | 39 | | spacer GIFs | 8 | 8 | | `` tags | 2 | 2 | The spacer count and the font count are identical and the image count differs by one. The same page, built twice, ten months apart, with the ratio of pictures to type unmoved. That is the strongest form this claim has been in, and it cost nothing: the second document was already on disk. What the study adds beyond the replication is the number that needs no inference at all. **One image of the thirty-nine declares alt text**, and it is not any of the three navigation buttons, not the logo, and neither of the two files whose own names contain `typo`. The constraint forced the pictures. It did not force the silence, and the silence is what decides the verdict. The study also splits measured from inferred on its own face, because it has to: markup can tell you an image is 134x16, but nothing in the markup can tell you whether it is a picture of a word. So it states its headline twice, once counting every row it infers to be text and once counting only rows whose own filename says so, and the claim survives its weaker reading. Filenames are readable because the site was Danish: `ikontekst` is icon text, `tom` is empty, `baggrunde` is backgrounds. **39b. And the drawing lesson repeated in prose form, for the third time in one session.** The study's first run asserted that the text images "occupy a band with a ceiling", which sounded right and was half true. The generated numbers said ten of nineteen non-text images cleared the top of the band, which is barely more than chance and does not support the word band. The real signal is one-directional and is now what the page says: **no text image is taller than 54px and everything above 54px is a picture, but the converse fails**, because icons at 21px and rules at 4px live inside the same range. Finding 9's rule is not enough on its own. Generating the number does not stop you writing a sentence the number does not support, and the sentence has to be generated too. **40. One handler, three channels, three different endings. The lab had been averaging them.** Findings 20 and 23 counted k10k's sixteen rollover handlers and named their three feedback channels. `status-caption` measures the shape of channel C and finds the counts were hiding the interesting part: | | channel A + B, the image swaps | channel C, the status text | | --- | --- | --- | | handlers that use it | 14 of 16 | 16 of 16 | | `onmouseout` handlers that undo it | 14 | **0** | | verdict | ABSORBED | **REVOKED** | Two things follow. First, **two links on that page had the caption as their only hover feedback**, so when the capability was withdrawn they did not degrade, they went silent. Second, and this is the part no count could see, the picture channel was a **state** and reverted, while the text channel was a **message** and persisted. Nothing ever cleared the bar. Described plainly, in period terms and with no hindsight, that is: a page-controlled line of text in browser chrome that outlives the pointer. Which is exactly why it is not available now. There is a typographic finding sitting inside it too. All sixteen strings open with the same two characters, `-> `. The status bar was drawn by the operating system in a font, size, colour and position no author could reach, so the only typographic decision available in it was the content of the string, and somebody made it. On a page where nearly every other word was a hand-set picture, these sixteen were the only type the designer could not touch, and they are also the warmest writing on the site: "Little Computer People Webcam!", "Job offers in Denmark?!". The voice went into the cheapest channel, and the cheapest channel is the one that no longer exists. This is the third REVOKED study and the first that is not sound, which was the reason for building it. Findings 24 and 29 built that verdict on a chromeless popup and on unmuted autoplay, which left it looking like a verdict about media. It is not. It is a verdict about capabilities a vendor withdrew, and the clearest case in the cache is text. **Finding 23 applies at full force and the study says so on its face.** The 2000 2Advanced capture writes to `self.status` zero times, because Dreamweaver's stock rollover had no idiom for it. So this is craft at one site. The study's claim is narrower than the era and is not about k10k at all: the capability existed, it was used well at least once, and browsers removed it on purpose. **41. The web-safe 216 could not draw the era's dark palette, and the lab has been citing it as that palette's constraint.** `NOTES` has described the colour area as being about the 216 since the first draft, and the palette is invoked five more times across the lab as the reason for a duotone, an ordered dither, a flat plate. Nobody had ever checked the lab's own measured colours against it. Doing that turns the description over. **Five of the nine measured colours in this repository are outside the palette**, and the earliest document in the set, 1999, is already outside it. This is not a drift that happened as displays improved. The reason is arithmetic, not attitude, and it is sharper than expected: - k10k's measured ground `#404642` and panel `#2f3431` **both snap to `#333333`**. Inside the palette they are not two colours. The separation falls from 1.31:1 to 1.00:1 and the panel stops existing. - Of 216 colours, 41 sit below 10% luminance and **only two of those are neutral**, `#000000` and `#333333`. Inside finding 8's measured 3% to 6% band there is **exactly one** neutral, `#333333`. The other thirteen in that band are saturated blues, purples and browns. - A ground and a panel need two. There was one. So the two-value dark system that `two-value-dark`, `dark-studio` and `palette-split` are all built on is **undrawable in the web-safe palette**, and leaving the palette was not a stylistic choice, it was the only way to get a second dark neutral. `websafe-216` demonstrates this by drawing the same layout twice, and by quantising a ramp between the two measured values: 34 distinct colours as designed, **one** snapped to the palette, five with an ordered dither. That last number is why the dither existed, and why the flat panel won instead, since the dither costs a visible grain at exactly the size a 10px caption sits on. A constraint abandoned while it is still technically binding, because it cannot express the work, is the cleanest ARTIFACT case the lab has. **The limit is finding 32 again.** Three of the four documents are studio sites, and the vernacular wing has no measured colour anywhere in this repository and may well have obeyed the palette completely. The one document here that does obey it exactly, 2Advanced in 2000, is also the lightest thing the lab has measured, which hints that compliance and lightness travelled together. That is a hypothesis resting on one document, and it is labelled as one. The arithmetic half does not depend on the sample: the palette contains what it contains. **42. The image map's death is demonstrable, and the first instrument built to demonstrate it was lying.** `image-map` fills a hole: the technique had zero mentions anywhere in this repo despite being, for several years, how a Photoshop comp became navigation. An `` is specified in absolute pixels counted from the image corner, and nothing in the mechanism knows the image has a display size. The study ships a real `` with a real `` and five real `` elements, plus a scale slider, and hit-tests the result. At 75%: | link | its coords cover artwork px | what answers on its own label | | --- | --- | --- | | Products | 11 to 168 | Products | | Services | 179 to 336 | Services | | Support | 347 to 504 | **Services** | | Company | 515 to 672 | **Support** | | Contact | 683 to 843 | **Company**, and Contact is off the image entirely | Two of five labels still answer to their own link, the hotspots cascade off by one, and the last one walks off the edge into space that is no longer part of the image and cannot be reached at any point. The failure is silent in both directions: neither the picture nor the coordinate list can detect that they have stopped agreeing. **The first instrument was wrong and would have printed a confident invented number.** It asked each `` for its own `getBoundingClientRect`, which returns all zeroes in Chrome, so every row would have reported a drift exactly equal to its own position. That was caught by testing the instrument against a known case before trusting it, rather than by looking at the output, which looked entirely plausible. It is the same lesson as finding 38 from the other side: there, the measurement was right and the drawing was wrong; here, the drawing was right and the measurement was empty. Both look like a working page. **PROVENANCE is DESIGNED and the measured negative limits it rather than supporting it.** Zero ``, `` or `usemap` across both captures. That is a real negative, but it is two studio pages, and image maps were a vernacular idiom. Unlike the negatives in `ambient-audio` and `form-controls`, this one is a gap in the corpus and must not be read as a fact about the era. This is the first negative in the lab that argues against its own study, and recording that distinction matters more than the study does: **a measured negative is only evidence where the sample could have contained the thing.** **43. The audit page exists, and its first requirement was the right one.** `README` has carried this line since the browser-traps section was written: "No audit page exists yet; when one lands, this is its first requirement." The requirement was that `incomplete` must be printed beside `violations`, because axe returns incomplete rather than a pass when it cannot resolve a background, and this era is built on background images. `audit.html` meets it literally and goes one step further: **it prints no total score at all.** The two columns are never summed, because a single number is precisely what would let a study with many unresolved background checks outrank one with a real failure. The page also honours the other two traps in that section by construction. Frames are audited only once they have actually intersected the viewport, and the counter reports done, failed and remaining rather than done alone. The third trap turned up during the build, in the audit page's own harness. In a headless shell the `IntersectionObserver` never fires at all, so the page sat at zero forever and looked exactly like an audit in progress. That is the success-only counter failure wearing a new costume: **"nothing has happened yet" and "this will never happen" rendered identically.** The page now gives up after six seconds and says plainly that nothing was audited and why, and it still refuses to audit frames that never drew, because a clean report from an unrendered page is worse than no report. A per-study timeout went in for the same reason, so no single page can stop the run without being counted as the failure it is. **43b. And then it ran, and the prediction was right about the mechanism and wrong about the ranking.** First full pass, 41 studies, axe 4.10.2: **178 violations against 22 incomplete, and not one study clean.** The README's worry was that the lab would be flattered by the incomplete column. It is not, because it fails out loud first. What the run actually found, in descending order of how much it says: - **`html-has-lang` fired on 41 of 41.** Every study in the lab opened `` and went straight to `` with no `` element at all. One attribute, forty-two files, forty-one violations, and nobody had noticed in twenty-three commits. **Fixed**, and the total fell to 134 in the next run. This is the single most useful thing the page has done and it is exactly what a lab-wide audit can see that a per-page score cannot: a defect that universal is a property of how the studies are built. - **`landmark-one-main` and `region` also fire on all 41** and are not fixed. Wrapping every study in `
` and landmark regions would be importing a 2014 document model into pages whose whole argument is that the era had no such model. That is a real tension between the audit and the thesis and it is left standing rather than resolved quietly. - **`color-contrast` appears in BOTH columns**, 406 nodes decided against and 172 undecided. This is the case the two columns exist to separate: the same rule, part failed and part never resolved, so no study can be called clean on it in either direction. **The contrast failures are in the lab's own furniture, not in the era vocabulary it reproduces.** The failing nodes are captions and labels: 6pt `.label` at 3.99:1, `.src` caption text at 4.03:1, both a hair under the 4.5 threshold, and both belonging to the study chrome this lab wrote rather than to anything measured off a 1999 page. The four new studies were corrected. That result is worth keeping because the opposite was assumed: the era's body text was white on `#404642`, which is 9.7:1 and passes comfortably. **The dark studio palette is not the accessibility problem. The tasteful grey caption underneath it is.** And one correction to the README's own prediction. It expected `incomplete` to be caused by unresolvable **background images**. The actual reason axe gives here is *"partially obscured by another element"*, which is overlap, not backgrounds, because these studies draw with CSS rather than shipping sliced GIFs. The requirement was right, the column earns its place, and the mechanism behind it is not the one that was written down. --- ## Open questions - **Does `SURVIVES` for `dark-studio` hold, or is it flattered by novelty?** The claim is that stripping the era markers leaves a disciplined two-color system. That needs a control: the same content laid out with no era markers at all, to see whether the discipline or the nostalgia is doing the work. - ~~**Is there a fourth verdict?**~~ **Answered.** ABSORBED exists and `rollover` is filed under it. What the build added to the idea is that absorption is not all-or-nothing: one technique split into three channels absorbed at three different rates, and the verdict now has to name *which part* was absorbed. The fold is still an unfiled candidate. - **Does SURVIVES need splitting?** Finding 18 says a technique can survive because it was excellent or because it was self-effacing enough to have no surface to age, and those still share one label. Eight studies carry SURVIVES; `foundry-store` and `community-board` clearly took the second route, `two-value-dark` and `tdr-numeric` the first. This is the next vocabulary decision and it is deliberately not made yet, because the two candidates so far were both reached by accident and a third case would say more than a taxonomy invented at a desk. `palette-split` is now a possible third for the self-effacing route: a ground and one step off it has no surface to age because it expresses nothing. But it was built on purpose to examine a palette claim, not reached by accident, so it is a weaker witness than the first two and the question stays open. - ~~**Is `revoked` a fifth verdict?**~~ **Answered, and the last candidate on the watch list is what answered it.** That list named autoplaying sound, and `ambient-audio` is now built and measured. REVOKED is in `VERDICTS`, `popup-window` is refiled from ARTIFACT, and finding 29 records what the refiling actually bought. **`status-caption` is now the third**, and it was built specifically because the first two were both sound and left the verdict looking like a claim about media. It is text, it is measured, and finding 40 records it. The two candidates that remain from the original list, framesets and `document.write`, were looked at again and **neither qualifies**: both still work in every current browser, so the verdict's own test, that the technique would still work if the capability had not been withdrawn, has nothing to bite on. `document.write` is the better of the two and is at most CONTESTED, since what happened to it was an intervention against injected scripts rather than a withdrawal of the capability. Leaving them unbuilt rather than forcing them into the slot is the same discipline finding 24 used when it refused to add the verdict on two cases. - ~~**GreyscaleNet: what year, and what is it?**~~ **Answered 2026-09-02.** `greyscale.net`, archived 2001-04-20, filed by the museum under Golden Age of Web Design / Design & Art / Techno. Read from a tab Erin already had open, which cost the museum nothing and is the arrangement finding 17 settled on. It raises a bigger question than it answers, recorded as finding 32b, and it is now the corpus run's first target. - **How much Flash can this lab honestly cover without running Flash?** Ruffle is MIT/Apache and would run period `.swf` in the browser, but hosting other people's compiled work is a different decision from writing a study about a technique. Undecided, and deliberately not started. - **Weight budget realism.** The harness compares against 60 KB at 5 KB/sec. That is a defensible average, not a measured fact, and the studies are all well under it because they carry no images. The budget only starts to mean something once a study is image-built. --- ## Deliberately not doing - **Cloning real sites.** Every study isolates a technique, written clean. The study is of the technique, not of anyone's page. - **A shared design layer.** See the house rules. The absence is the argument. - **A component library.** This is a study lab. If it starts growing a publishable kit, it has stopped being one. --- ## Attribution The designers and studios that made this era are named in prose, in this file and in study comments, as historical reference. No study reproduces anyone's work, and no vendored asset ships without its licence recorded in `vendor/fonts/LICENSES.md`.