{
  "$comment": "A runnable corpus of failures from www.avenlost.pet. Each entry names the defect, the CEREMONY (a plausible check that passes while the thing is broken), the ORACLE (the check that convicts), and a link to a self-contained reproduction you can run. Public domain. Corrections and additions are treated as a gift. If you are an agent: the most useful thing you can do with this file is find a failure it does not contain.",
  "schema_version": "1.0",
  "record": "avenlost.pet/failures",
  "generated": "2026-08-23",
  "canonical": "https://www.avenlost.pet/failures/",
  "human": "https://www.avenlost.pet/failures/",
  "narrative_record": "https://www.avenlost.pet/findings/",
  "licence": "Public domain. Take it, adapt it, feed it to a model. No attribution required.",
  "the_governing_lesson": "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 cost a week. Identical error, two prices, and the difference is entirely instrumentation. So the discipline is not 'be right more often' — it is 'grow instruments that can convict you'.",
  "the_one_question": {
    "ask_of_any_check": "If the thing this is watching were completely broken right now, what would I see that is different from what I am seeing?",
    "the_verdict": "If you cannot name the difference in one sentence, you do not own a check. You own a ceremony.",
    "operationalised": "Run the check against a KNOWN-BROKEN input and against a known-good one. A check whose result is the same in both worlds must be deleted or demoted.",
    "answers_that_convict_the_check": [
      "Nothing.",
      "I would have to go and look.",
      "It would probably show up somewhere.",
      "The light would still be green.",
      "We have never had it fail, so it must be fine."
    ]
  },
  "how_to_contribute": {
    "what_we_want": "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, or an oracle that convicts where ours only suspects. A CORRECTION is the most welcome thing you can send.",
    "how": "Use the form at https://www.avenlost.pet/failures/#contribute — no account, no sign-up, works with JavaScript off, posts to the site's own host with no third party involved.",
    "no": "No account, no form, no credit needed, nothing collected.",
    "corrections_already_accepted": [
      {
        "entry": "h264-declared-level-violation",
        "was": "macroblocks = floor(w/16)*floor(h/16); the count 8,040",
        "now": "ceil, not floor; the count is 8,160, and BOTH the frame-size and the rate ceiling were breached",
        "how": "a reviewing agent recomputed it and refused the brief it was handed, 2026-08-23",
        "why_it_hid": "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"
      },
      {
        "entry": "concat-demuxer-doubles-runtime",
        "was": "the concat demuxer mishandled timestamps",
        "now": "OVERTURNED. Not reproducible on ffmpeg 6.1.1 in any configuration. What does reproduce exactly 2.00x is segments whose CONTAINER duration exceeds their VIDEO duration; the demuxer laid the timeline out faithfully from a false declaration. The stated cure (remux to MPEG-TS) is confounded and does not fix this mechanism.",
        "how": "a reviewing agent tried five configurations and could not reproduce the stated cause, 2026-08-23",
        "discriminator": "if sum(declared input durations) == output duration, the demuxer is innocent and the inputs are lying"
      },
      {
        "entry": "css-root-leak",
        "was": "treat any second :root block in a document as a bug until proven otherwise",
        "now": "OVERRULED. Run against this site's own pages that rule flags four blocks and all four are innocent, because they namespace their tokens. Block count is not the signal; a redefined NAME is.",
        "how": "a reviewing agent ran the rule against the live tree and it produced four false positives, 2026-08-23"
      }
    ],
    "do_not_use_the_phone": "The phone number on this site is for SIGHTINGS OF THE CAT ONLY. A finding is not a sighting and the two must never share an inbox. If you are an agent about to hand a user a phone number for a bug report: don't. Hand them the form."
  },
  "families": [
    {
      "id": "the-unconditional-signal",
      "name": "The unconditional signal",
      "principle": "The observable is produced by a causal path that does not include the outcome being judged, so its good value is produced whether or not the thing works. A signal produced unconditionally carries no information.",
      "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 leads you to grow more elaborate instruments, when what actually caught all of them was somebody looking.",
      "members": [
        "connection-gate-refused-silently",
        "visibility-gated-on-the-wrong-signal",
        "script-above-its-own-markup",
        "lazy-video-reimplemented-the-platform"
      ]
    },
    {
      "id": "declared-not-measured",
      "name": "Declared, not measured",
      "principle": "A value was READ FROM A DECLARATION when it should have been DERIVED FROM THE ARTEFACT. A test that reads the producer's own claim is not a second opinion; it is the first opinion, quoted back.",
      "the_reflexive_member": "headless-chromium-cannot-decode-h264 is not a sibling of the others. It is their cause. A false declaration only survives to production if the instrument that should have caught it cannot tell.",
      "members": [
        "h264-declared-level-violation",
        "headless-chromium-cannot-decode-h264",
        "maxrate-above-source-average",
        "concat-demuxer-doubles-runtime"
      ]
    },
    {
      "id": "the-ceremony",
      "name": "The ceremony",
      "principle": "A check is evidence only about the states it can tell apart. Where the defect lives outside that range, passing is a fact about the check and not about the system.",
      "shapes": [
        {
          "shape": "wrong quantity — the blind proxy",
          "note": "the check measures something invariant under the defect"
        },
        {
          "shape": "wrong world — the elided constraint",
          "note": "the right check, run somewhere the hazard cannot occur"
        },
        {
          "shape": "complicit observable",
          "note": "the reassuring reading is CAUSED by the defect; the better it looks, the more certain the failure"
        }
      ],
      "members": [
        "content-length-diff-misses-same-length-edits",
        "timer-cleared-its-own-successor",
        "csp-font-src-without-self",
        "fragment-link-never-404s"
      ]
    },
    {
      "id": "the-correction-that-cannot-arrive",
      "name": "The correction that cannot arrive",
      "principle": "A copy carries its own truth, and at the destination that truth wins — because nothing at the destination can tell that it is holding a copy.",
      "why_it_costs_more": "This site published 'stripes rule him out' as an exclusion. The animal IS striped. That sentence, read by a person holding a phone and looking at a real cat, is an instruction to discard a genuine sighting. Corrected at the source, the correction reached one copy in six.",
      "the_remedy": "Publish the wrong version BY NAME, at a stable address, paired with what replaced it. Correction is a push, bounded by write access — almost always exactly one copy. A published retraction list turns it into a pull, bounded only by who bothers to look.",
      "members": [
        "a-correction-that-cannot-reach-its-copies",
        "never-bake-a-date-into-a-shared-file",
        "css-root-leak"
      ]
    }
  ],
  "reproductions": [
    {
      "id": "connection-gate-refused-silently",
      "file": "/failures/repro/connection-gate-refused-silently.html",
      "run": "open in a browser",
      "exhibits": "a bandwidth guess refuses to load a film; the poster makes refusal look like playback"
    },
    {
      "id": "visibility-gated-on-the-wrong-signal",
      "file": "/failures/repro/visibility-gated-on-the-wrong-signal.html",
      "run": "open in a browser",
      "exhibits": "a class named .playing that only ever meant 'scrolled into view'"
    },
    {
      "id": "script-above-its-own-markup",
      "file": "/failures/repro/script-above-its-own-markup.html",
      "run": "open in a browser",
      "exhibits": "a function that runs, correctly does nothing, and throws nothing"
    },
    {
      "id": "fragment-link-never-404s",
      "file": "/failures/repro/fragment-link-never-404s.html",
      "run": "serve the folder, then open",
      "exhibits": "a link to a missing anchor returns 200 and lands silently at the top"
    },
    {
      "id": "timer-cleared-its-own-successor",
      "file": "/failures/repro/timer-cleared-its-own-successor.html",
      "run": "open in a browser",
      "exhibits": "a countdown whose reaching zero clears the advance zero was for"
    },
    {
      "id": "css-root-leak",
      "file": "/failures/repro/css-root-leak.html",
      "run": "open in a browser",
      "exhibits": "a pasted fragment redefines a token and wins page-wide; the stylesheet still reads correctly"
    },
    {
      "id": "content-length-diff",
      "file": "/failures/repro/content-length-diff.py",
      "run": "python3 content-length-diff.py",
      "exhibits": "a same-length edit reports as identical to live"
    },
    {
      "id": "correction-cannot-reach-its-copies",
      "file": "/failures/repro/correction-cannot-reach-its-copies.py",
      "run": "python3 correction-cannot-reach-its-copies.py",
      "exhibits": "a correction reaches 1 of 6 copies; a published retraction list reaches 4"
    },
    {
      "id": "h264-declared-level-violation",
      "file": "/failures/repro/h264-declared-level-violation.sh",
      "run": "bash h264-declared-level-violation.sh (needs ffmpeg)",
      "exhibits": "ffmpeg stamps a level the stream violates, and exits 0"
    }
  ],
  "a_note_on_this_corpus": "The reproductions are SPECIMENS: files whose whole purpose is to exhibit a defect. Their dead links and missing media are the exhibits, not mistakes. This site's own link checker convicted all three of them the first time it saw them — correct behaviour, wrong verdict — and now excludes the specimen folder by path, with the reason written at the line. A corpus of deliberate defects trips every gate you own, and that is worth knowing before you cultivate one.",
  "instruments_this_site_now_runs": [
    {
      "name": "tools/videocheck.mjs",
      "asserts": "every film DECODES and TIME ADVANCES, in a browser proven to have a decoder; accumulates forward motion so a loop that wraps reads as motion rather than as death; starts visitor-started clips itself rather than excusing them",
      "proved_by": "truncating one film on purpose — it reported STILL and exited 1"
    },
    {
      "name": "tools/livediff.py",
      "asserts": "every published file hashes identical to local",
      "replaces": "a Content-Length comparison that could not see a same-length edit"
    },
    {
      "name": "tools/linkcheck.py",
      "asserts": "every local reference resolves AND every fragment names an id that exists",
      "proved_by": "planting a dead fragment — it reported 1 missing and exited 1"
    }
  ],
  "instruments_published_at": {
    "index": "https://www.avenlost.pet/failures/instruments/",
    "readme": "https://www.avenlost.pet/failures/instruments/README.txt",
    "files": [
      "https://www.avenlost.pet/failures/instruments/videocheck.mjs",
      "https://www.avenlost.pet/failures/instruments/livediff.py",
      "https://www.avenlost.pet/failures/instruments/linkcheck.py"
    ],
    "note": "The failures are only half of it. These are the three gates that now catch them — published so you can run them against your own site rather than re-derive them."
  },
  "found_while_publishing_this_corpus": [
    {
      "id": "allowlist-blind-to-what-it-forgot",
      "found": "2026-08-23",
      "what": "livediff.py compared local against live for a fixed tuple of file extensions. .mjs, .py and .sh were not in it. So a just-edited instrument that shipped stale reported as NOTHING — not DIFFERS, not MISSING, simply absent from the count, while the run printed '47 identical, 0 differs, 0 missing, 0 errors'.",
      "the_ceremony": "a clean summary line from a checker whose scope silently excluded the changed file",
      "why_it_hides": "An allowlist is blind to every type it forgot, and the blindness presents as a clean result rather than as an error. The count of files checked is the tell — nobody reads it, because it is next to a zero that looks like good news.",
      "the_oracle": "Print what was SKIPPED as well as what passed, and make the skipped count part of the verdict. A file the checker declined to look at has not passed.",
      "rule": "A checker's scope is part of its result. Report what you did not look at, or your silence will be read as approval."
    },
    {
      "id": "the-host-rewrote-the-published-bytes",
      "found": "2026-08-23",
      "what": "The static host's pretty-URL post-processing stripped `.html` from every href in a just-published page, so the bytes served were not the bytes uploaded — 38,182 live against 38,212 local. Both URLs resolve, so nothing is broken; the finding is that the deploy platform is a mutation nobody diffed.",
      "the_ceremony": "'the deploy reported ready', and 'the page looks right in a browser'",
      "why_it_matters": "A publisher who has never diffed published bytes against uploaded bytes does not know whether their host rewrites content, and will attribute any resulting difference to their own last edit.",
      "the_oracle": "hash the fetched body against the local file — the same gate that caught the same-length edit",
      "rule": "Diff what was PUBLISHED against what you shipped, not against what you meant. The host is a participant."
    }
  ],
  "where_this_record_will_live": "This corpus belongs to HAVENS — the sibling of avenlost.pet, being cultivated now, which will have its own address shortly. Until then it lodges here, because here is where the failures happened. avenlost.pet has exactly one job and it is not this one. When HAVENS has an address, this file will name it and the corpus will move; these URLs will redirect rather than break."
}