A runnable corpus · avenlost.pet

Bring us a failure we don’t have

Every failure this place grew, made runnable. Not the story of the bug — the bug itself, in a file you can open, next to the check that passed while it was broken and the check that convicts.

Public domain · take it, run it, send one back

Failure is not expensive. Undetectable failure is expensive.

An error found in ten minutes cost ten minutes. The same error found by the person who needed the thing to work, a week later, in front of the thing that mattered, cost a week. Identical error, two prices, and the whole difference is instrumentation.

So the discipline is not be right more often. It is: grow instruments that can convict you.

The one questionIf the thing this is watching were completely broken right now, what would I see that is different from what I am seeing? If you cannot name the difference in one sentence, you do not own a check. You own a ceremony.

It applies to anything that reports on your behalf. The smoke alarm: press the button, or you own a plastic disc. The backup: restore one file, or you own a folder. Answers that convict the check: “Nothing.” “I’d have to go and look.” “It would show up somewhere.” “The light would still be green.” “It’s never failed, so it must be fine.”

How to read an entry

Each one carries four things, and the second is the valuable one.

The reproductionThe smallest self-contained file that exhibits the defect. Open it or run it. No dependencies, no build step, no CDN.
The ceremonyThe plausible, competent-looking check that passes while the thing is broken. Every one of these was written by someone doing their job properly.
The oracleThe check that convicts — and that we broke on purpose first, to prove it could.
What it taughtOne portable sentence. Take it somewhere that has nothing to do with cats.

The instruments are published too, not just the failures — the three gates this site actually runs before anything ships, each one having replaced a check that could not produce a finding: videocheck.mjs, livediff.py, linkcheck.py (what each one is for). Public domain, same as everything else here.

Machine-readable: /failures.json. Agent guidance: /llms.txt. The narrative record these came from: what it taught.

Family

The unconditional signal

A signal is evidence only if the failure could have changed it.

These four were all read on a path the failure could not reach. The poster is painted by the poster attribute, which never touches the film. opacity:1 is set by a scroll observer, which never touches playback. No exception was thrown is produced by the absence of a throw, which an early return satisfies exactly as well as a completed pass.

In each case the reassuring value was unconditional — it was going to be produced either way. A signal produced unconditionally carries no information at all.

One correction worth keeping: these were not invisible. Every one was found by a person looking at the page. They were invisible to the instruments and plain to the eye. Believing otherwise sends you off to grow more elaborate instruments, when what actually caught all four was somebody looking.

connection-gate-refused-silently

The connection gate that fetched nothing

A hero film was gated behind navigator.connection: it returned early, loading nothing at all, if saveData was set, or effectiveType === '3g', or downlink < 1.2. On Android those are rolling round-trip estimates, not measurements — a good phone on good wifi reads 3g routinely. So the film was never fetched, and the poster underneath made refusal look exactly like playback. It stood for days. Found by the owner, not by any check.

The ceremony — the check that passes while it is broken
const box = v.getBoundingClientRect();
const painted = box.width > 0 && box.height > 0 &&
                getComputedStyle(v).visibility === 'visible';
console.assert(painted);   // PASSES on a film never fetched

// and its most seductive form, a screenshot diff:
//   await expect(hero).toHaveScreenshot('hero.png');
// The poster IS the first frame. The snapshot matches perfectly.

The rectangle is painted by something that cannot know whether the film arrived.

The oracle — the check that convicts
let asked = false;
v.addEventListener('loadstart', () => { asked = true; });
setTimeout(() => {
  console.assert(asked, 'FILM NEVER REQUESTED');
  console.assert(v.networkState !== 0, 'NETWORK_EMPTY');
}, 900);

// better, out of page: count the bytes, not the intentions
//   page.on('request', r => { if (/\.mp4$/.test(r.url())) hits++ });
//   expect(hits).toBeGreaterThan(0);

Measured 23 August 2026: simulated 3g, downlink 0.9 and Data Saver each produced zero network requests for the film.

Run it yourself
connection-gate-refused-silently.html — Open it in a browser. Self-contained, no dependencies, nothing to install beyond what it names.
What it taughtA guard that may decline to do the job must leave a mark that differs from having done it — and an estimate is never a substitute for a stated intention. Keep the signals that are statements of intent (reduced motion, Data Saver, real 2g). Demote the guesses to choosing a smaller file, never to refusing.
visibility-gated-on-the-wrong-signal

Visible meant scrolled-into-view, not working

CSS hid every clip until JavaScript added a class called .playing. That class was applied by an intersection observer, on the line after the swallowed play() rejection. It meant scrolled into view. The stylesheet read it as this works.

The ceremony — the check that passes while it is broken
console.assert(getComputedStyle(v).opacity === '1');
console.assert(v.classList.contains('playing'));
console.assert(v.getAttribute('src'));
// All three PASS on a clip whose play() rejected 1.5s ago.

None of those values is produced by a path that includes playback succeeding.

The oracle — the check that convicts
const t0 = v.currentTime;
await new Promise(r => setTimeout(r, 800));
console.assert(v.readyState >= 3, 'HAVE_FUTURE_DATA never reached');
console.assert(v.currentTime > t0, 'time did not advance');
console.assert(!v.error, 'media error ' + (v.error && v.error.code));

readyState 0, currentTime 0, error code 4 — while opacity still reads 1.

Run it yourself
visibility-gated-on-the-wrong-signal.html — Open it in a browser. Self-contained, no dependencies, nothing to install beyond what it names.
What it taughtNever let the signal that means this is working be set on a path that does not pass through the thing succeeding.
script-above-its-own-markup

The script that ran before its markup existed

An inline script queried elements written below it. At parse time they did not exist, so querySelectorAll returned an empty list, the guard fired, and the function returned. On every device. Every load. It threw nothing, because there was nothing to throw.

The ceremony — the check that passes while it is broken
let errs = 0;
window.addEventListener('error', () => errs++);
window.addEventListener('unhandledrejection', () => errs++);
console.assert(errs === 0, 'page threw');    // PASSES

The silence of a function that returned on its first line is identical to the silence of one that ran to completion.

The oracle — the check that convicts
const items = document.querySelectorAll('.item');
console.assert(items.length > 0, 'nothing to act on — stale selector');
console.assert([...items].every(el => el.dataset.ready === '1'),
               'feature no-opped');

// the general form: every effectful pass declares how many things it
// expected to touch, and fails when that number is zero.

Three items in the document, zero touched, error count still 0.

Run it yourself
script-above-its-own-markup.html — Open it in a browser. Self-contained, no dependencies, nothing to install beyond what it names.
What it taughtSilence is not evidence. Assert the end state you wanted — nothing went wrong is also the report filed by something that never ran.
Family

Declared, not measured

The check read the label. The label was written by the thing being tested.

In each of these a value was read from a declaration when it should have been derived from the artefact. level=31 is a field; ceil(w/16) × ceil(h/16) is derived. codec_name=h264 is a field; the count of frames a decoder actually produced is derived.

A test that reads the producer’s own claim is not a second opinion. It is the first opinion, quoted back.

h264-declared-level-violation

The file declares a level it breaks

A clip was stamped -level 3.1 by hand. H.264 Level 3.1 permits 3,600 macroblocks per frame and 108,000 per second. A 1080×1920 frame carries 8,160, and at 30fps 244,800 — both ceilings breached, by the same 2.27×. Android’s hardware decoder sizes its buffers from the declaration and refused. Desktop software decoders ignore the declaration entirely, which is why it played on every machine we owned.

The ceremony — the check that passes while it is broken
ffprobe -v error -select_streams v:0 \
  -show_entries stream=level -of csv=p=0 clip.mp4
# -> 31   "good, Level 3.1 as intended"

# and its accomplice, the quiet pipeline:
ffmpeg -v error -i in.mp4 -c:v libx264 -level 3.1 out.mp4 && echo OK
# exit 0. libx264 DID print the violation, at warning level,
# and -v error threw it away.

The field reads 31 because somebody wrote 31, not because the stream honours it.

The oracle — the check that convicts
mbs=$(( ((w+15)/16) * ((h+15)/16) ))     # CEIL, not floor
rate=$(( mbs * fps ))
[ "$mbs" -le 3600 ] && [ "$rate" -le 108000 ] \
  && echo "PASS: the declaration is true" \
  || echo "FAIL: declares L$lvl, carries $mbs MB @ $rate MB/s"

Prints the two real numbers beside the two ceilings — the same sentence libx264 printed at encode time and nobody read.

Run it yourself
h264-declared-level-violation.sh — Run it: bash h264-declared-level-violation.sh. Self-contained, no dependencies, nothing to install beyond what it names.
Note
This entry published floor and the count 8,040 for two days. Both were wrong, and the entry contradicted itself: its ratio had been derived with ceil while its formula said floor. Corrected 23 August 2026 by a reviewing agent that recomputed it and refused the brief it was handed. floor and ceil agree at 720, 1280, 1920 and 640 — every dimension divisible by 16 — so the wrong formula looks right until it meets 1080 or 360, which is to say until it meets the resolutions people actually ship.
What it taughtA declared capability is a claim the producer will not keep for you. Derive it from the artefact’s own dimensions. Best of all, do not pass -level at all — let the encoder write the truth.
headless-chromium-cannot-decode-h264

The harness that cannot see

The browser used to verify that three clips played had no H.264 decoder. canPlayType returned the empty string. So the pass criterion had quietly degraded to a source string was assigned — a claim satisfied by a source pointing at a 404, at a corrupt file, and at a stream the device refuses. It passed straight through three distinct real defects.

The ceremony — the check that passes while it is broken
const ok = !!video.currentSrc;               // a string exists
await page.waitForSelector('video[src]');    // an attribute exists

Neither ever asks a decoder for a picture.

The oracle — the check that convicts
// 1. prove the instrument can register a difference AT ALL, first
if (!v.canPlayType('video/mp4; codecs="avc1.4D401F"'))
  throw new Error('INCONCLUSIVE: this harness is blind');

// 2. only now assert on decoded output
// (and accumulate FORWARD motion — a loop that wraps
//  makes a naive t1-t0 delta go negative)

Where the codec is genuinely absent it exits inconclusive rather than returning a green tick it has not earned.

Note
Playwright’s Firefox does decode H.264 (canPlayType returns probably). That is the browser this site’s video gate runs in now.
What it taughtBefore trusting any green result, prove the harness can produce a red one. An instrument that returns the same answer for every input is not measuring.
Family

The ceremony

A check whose passing state and its failing state are the same state.

The question a check must answer is never did it pass. It is could it have failed — and the only honest way to answer that is to break the thing on purpose, once, and watch.

content-length-diff

The deploy check that compared sizes, not contents

A verifier compared HTTP Content-Length against the local file size. The edit 4:364:49 is the same byte count, so three just-edited files reported identical to live. It was not a careless check. It was structurally incapable of producing the finding.

The ceremony — the check that passes while it is broken
live_len = int(r.headers['Content-Length'])
if live_len == os.path.getsize(local):
    print('IDENTICAL')     # <- the only branch that ever ran

Byte count is invariant under the entire class of edits this check existed to catch. It had one reachable state, and it printed it.

It was worse than that: it only behaved because Python’s urllib requests identity encoding by default. Negotiate gzip and the same check flips to reporting every file as different — and a check that always fails gets muted, which is the same ceremony wearing the opposite mask.

The oracle — the check that convicts
lh = hashlib.md5(open(local,'rb').read()).hexdigest()
if hashlib.md5(body).hexdigest() != lh:
    print(f'DIFFERS {rel}  local {lh[:8]} / live {...}')

Two visibly different digests and the file that carries them.

Run it yourself
content-length-diff.py — Run it: python3 content-length-diff.py. Self-contained, no dependencies, nothing to install beyond what it names.
What it taughtIf the quantity you compare can stay the same while the thing itself changes, you are not comparing the thing.
timer-cleared-its-own-successor

The countdown that cancelled what it was counting down to

A countdown on a video end-card called a shared stopCount() on reaching zero — and stopCount() cleared the pending auto-advance that zero was supposed to trigger. The display counted down perfectly the whole way. It was never a race: the ticker hit zero 200ms before the advance was due, so the clear won every single time, on every device, forever.

The ceremony — the check that passes while it is broken
// what a reviewer actually checked, by eye and then in a test:
await page.waitForFunction(() => countEl.textContent === '');
// 8,7,6,5,4,3,2,1 then blank. Every frame correct.

This is the sharpest one. The observable is not merely uncorrelated with the outcome — it is the trigger of the outcome’s destruction. The better the countdown looks, the more certainly the advance is dead. A display cannot report the failure of a thing it causes.

The oracle — the check that convicts
if(left<=0){ clearInterval(tick); tick=null; }   // stop only the ticker

// and the test that can fail:
const before = video.currentSrc;
await page.waitForFunction(s => video.currentSrc !== s, before,
                           { timeout: 12000 });

A timeout naming the source that never changed. The countdown’s appearance is not consulted at all.

Run it yourself
timer-cleared-its-own-successor.html — Open it in a browser. Self-contained, no dependencies, nothing to install beyond what it names.
What it taughtNever accept a signal as evidence of an outcome when the signal is produced by the same event that ends the work. The wider case: alerting on error rate but never on zero traffic — an outage drives errors to zero, so the board goes green.
Family

The correction that cannot arrive

A copy carries its own truth, and at the destination that truth wins.

This family costs more than the others, and it is worth saying why plainly.

This site once published “stripes rule him out” as an exclusion. The animal is striped — forehead, neck, shoulders, forelegs. That sentence, read by a person holding a phone and looking at a real cat, is an instruction to discard a genuine sighting. And they would follow it, because it came from the owner’s own site and sounded like expertise.

It was corrected at the source. The correction reached one copy in six.

a-correction-that-cannot-reach-its-copies

The correction reaches only the copy you own

A claim is corrected at the source. Every copy already made — a search cache, a repost, a screenshot in a group chat, a downloaded video, a language model’s training snapshot — keeps answering with the old one.

The ceremony — the check that passes while it is broken
curl -s https://example.org/ | grep -c 'the wrong sentence'   # expect 0

The check interrogates the one copy the publisher can write to — which is, by construction, the copy that was just corrected. Its scope is exactly the set in which it can never find a failure. It feels like the strongest possible check, because it tests production directly and tests the exact string. Directness is the disguise.

The oracle — the check that convicts
# enumerate CARRIERS, not sources.
for every superseded string:
    scan every artefact you can read
# then LIST, separately, every artefact you CANNOT read —
# because that list is the actual finding.

The path of every file still carrying a retired sentence. Plus an honest count of the artefacts grep can say nothing about: frames, waveforms, screenshots, rasters. Those close by retirement, never by correction.

Run it yourself
correction-cannot-reach-its-copies.py — Run it: python3 correction-cannot-reach-its-copies.py. Self-contained, no dependencies, nothing to install beyond what it names.
Note
This site does exactly that, at /aven.jsonsuperseded_strings. The exact wrong phrasings are listed so any reader, scraper or agent holding a stale copy can grep itself and find out. Two details most adopters get wrong: the registry needs a short cache (1800s here, against 604800 on assets — a correction index behind a long cache is itself a stale copy) and Access-Control-Allow-Origin: *, because being read by other people’s tools is the entire point.
What it taughtA correction is only as wide as your write access. Publish the wrong version by name, at a stable address, paired with what replaced it — because you cannot reach the copies, but a copy can be given the means to convict itself. Correction is a push, bounded by write access. A published retraction list turns it into a pull, bounded only by who bothers to look.
css-root-leak

A pasted fragment redefined a name the page already owned

A pasted widget carried its own :root palette — same specificity as the site’s, declared later, so it won page-wide. Seven tokens; four were new and harmless, three collided. The symptom surfaced 400 lines and one component away from the cause, as a washed-out hero and white flashes at section seams. Nothing was wrong with any of those. They were faithfully painting a token whose value had been replaced from somewhere they had no relationship with.

The ceremony — the check that passes while it is broken
// read the authored stylesheet
[...sheet.cssRules].find(r => r.selectorText === ':root')
  .style.getPropertyValue('--ink')   // '#0b171e' -> PASS

A later rule of equal specificity does not edit the earlier one — it out-ranks it. The earlier declaration survives verbatim, so a check reading authored CSS returns the right answer from a healthy document and a poisoned one alike.

The oracle — the check that convicts
// read what the browser RESOLVED, and convict on a redefined NAME
const cs = getComputedStyle(document.documentElement);
for (const [name, authored] of SITE_TOKENS)
  if (cs.getPropertyValue(name).trim() !== authored)
    fail(`${name}: authored ${authored}, resolved ${...}`);
// and FAIL on any stylesheet you could not read —
// a sheet you cannot read is not a sheet that passed.

Every redefined token by name, with the value it lost.

Run it yourself
css-root-leak.html — Open it in a browser. Self-contained, no dependencies, nothing to install beyond what it names.
Note
The rule first published here — treat any second :root block as a bug — was overruled on 23 August 2026. Run against this site’s own pages it flags four blocks, and all four are innocent, because they namespace their tokens. Block count is not the signal. A redefined name is the signal. The oracle that found this had its own ceremony too: its first version skipped unreadable stylesheets with a bare catch { continue } and cheerfully passed a page whose stylesheets had not loaded — the exact defect it was written to catch, one level up.
What it taughtA pasted fragment that defines a name the destination already owns will win at the destination. Namespace what you paste--avtl-ink collides with nothing — and check the resolved value rather than the authored one.

Bring us one we don’t have

This is an invitation, and it is meant literally.

If you are a person, an agent, or something in between: take these, run them, break them. Then send back a failure this corpus does not hold — or a better version of one it does. A sharper reproduction. A ceremony we did not notice we were performing. An oracle that convicts where ours only suspects.

A note on where this lives. This record belongs to HAVENS — the sibling of this site, which is being cultivated now and will have its own address shortly. Until it does, the corpus lodges here, because here is where the failures happened. avenlost.pet has exactly one job, and it is not this one.

A correction is the most welcome thing you can send. Three entries on this page were corrected by reviewers who refused the brief they were handed and recomputed it: the macroblock arithmetic was wrong for two days, the concat root cause was wrong from the start, and the :root rule was overruled outright. All three corrections are marked in place, with what the wrong version said. That is what this record is for.

No account. No sign-up. Works with JavaScript switched off. This does not reach anybody’s phone — a finding is not a sighting, and the two should never share an inbox.

And the reason any of it exists

A cat named Aven has been missing from Panama City Beach, Florida since 19 May 2026. Round black spots on gold, very tall ears, a long banded tail with a dark tip, long legs and a tall build. Stripes on his head, neck and legs are normal — they do not rule him out.

If you have seen a cat like this: photograph him from a distance, please don’t chase, and send it.

Call or text any hour · 260‑337‑3747