Seen to Fail async-digital-ltd/seen-to-fail ↗

The record of this repository's own checks

4 of 9 checks have been seen to catch a planted defect

Tap a status to see what it means.
Proven: Caught a planted defect.
Broken: Its latest run missed.
Stale: Its last proof is older than 30 days.
Unproven: Never seen to fail.
Unarmed: No evidence it is switched on.

A check earns trust only after someone plants the defect it exists to catch, runs it, and watches it go red.

View the repository on GitHub ↗ Built from commit 2a06e1b, read as of 29 Sep 2026.

The 9 checks, by area

Open an area, then a check, to see its proof.
Published record3 of 3 proven✓✓✓
The build refuses to publish a disagreementCaught 5 of 5
Protects against
A published page that quietly holds fewer runs, or different counts, than the record it was built from.
How you can tell it is switched on
The "Build the published ledger" step appears in every run of the CI workflow, and it writes nothing when the two disagree.
Last seen
Not yet observed.

Planted defects, newest first

  1. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    One observation dropped from the export, inside the function that builds it, so the page holds one fewer than the ledger.
    Expected
    The build refuses to publish, exits non-zero, and writes no files at all.

    Ran against ec2b3bd. Recorded in bb3e011.

  2. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    The status tally counts nothing, so every tile on the page says zero however many checks hold that status.
    Expected
    The build refuses to publish, exits non-zero, and writes no files at all.

    Ran against ec2b3bd. Recorded in bb3e011.

  3. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    The status tally counts nothing, so every tile on the page says zero however many checks hold that status.
    Expected
    The build refuses to publish, exits non-zero, and writes no files at all.

    Ran against 33b5238. Recorded in 6f29d42.

  4. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    One observation dropped from the export, inside the function that builds it, so the page holds one fewer than the ledger.
    Expected
    The build refuses to publish, exits non-zero, and writes no files at all.

    Ran against 33b5238. Recorded in 6f29d42.

  5. 18 Sep 2026✓ CaughtBy handView proof

    Planted
    One record dropped from the export, inside the function that builds it, so the page held five arming observations where the ledger held six.
    Expected
    The build refuses to publish, exits non-zero, and writes no files at all.

    Seen on 2026-09-18 while building #63. The build published before the plant, refused with it in place and left no output directory behind, and published again once it was removed.

    Recorded in 7b47398.

The ledger refuses a malformed recordCaught 5 of 5
Protects against
A record that breaks a rule being committed, and then published as though it were true.
How you can tell it is switched on
Both recording workflows run "pnpm ledger:validate" before they commit, and CI runs it again on every pull request and every push to main or a ci-control branch.
Last seen
Not yet observed.

Planted defects, newest first

  1. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    A run file naming a check that is not in the ledger.
    Expected
    The validator refuses the ledger and exits non-zero, and nothing is recorded.

    Ran against ec2b3bd. Recorded in bb3e011.

  2. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    A run file whose outcome is a word the ledger does not know.
    Expected
    The validator refuses the ledger and exits non-zero, and nothing is recorded.

    Ran against ec2b3bd. Recorded in bb3e011.

  3. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    A run file whose outcome is a word the ledger does not know.
    Expected
    The validator refuses the ledger and exits non-zero, and nothing is recorded.

    Ran against 33b5238. Recorded in 6f29d42.

  4. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    A run file naming a check that is not in the ledger.
    Expected
    The validator refuses the ledger and exits non-zero, and nothing is recorded.

    Ran against 33b5238. Recorded in 6f29d42.

  5. 18 Sep 2026✓ CaughtBy handView proof

    Planted
    A run file whose outcome was neither caught nor missed, and a second file naming a check that does not exist, dated in the future.
    Expected
    The validator refuses the ledger and exits non-zero, and nothing is recorded.

    Seen on 2026-09-18 while building #63. The validator exited 0 before the plant, 1 with each plant in place, and 0 again once both were removed.

    Recorded in 7b47398.

The published page is checked after it is builtCaught 4 of 4
Protects against
A published page that names no commit it was built from, or that works something out in the reader's browser rather than at build time.
How you can tell it is switched on
The "Check the published output" step appears in every run of the CI workflow.
Last seen
Not yet observed.

Planted defects, newest first

  1. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    The build writes a script tag into the page after the page it checked, so the file on disk is not the page it verified.
    Expected
    The check of the published output fails, so the run does not go green.

    Ran against ec2b3bd. Recorded in bb3e011.

  2. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    The build reads the commit it was built from as the parent of HEAD, so the page's "Built from" lines name a commit the page was not built from.
    Expected
    The check of the published output fails, so the run does not go green.

    Ran against ec2b3bd. Recorded in bb3e011.

  3. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    The build writes a script tag into the page after the page it checked, so the file on disk is not the page it verified.
    Expected
    The check of the published output fails, so the run does not go green.

    Ran against 33b5238. Recorded in 6f29d42.

  4. 18 Sep 2026✓ CaughtBy handView proof

    Planted
    A script tag appended to the built page, which the step exists to refuse.
    Expected
    The step fails, so the run does not go green.

    Seen on 2026-09-18 while building #63, against a copy of the real built page. Worth knowing how it got here: the step was first written as a negated grep, and set -e does not apply to a command whose status is inverted, so that version went green with the script sitting in the page. The plant is what showed it up. It was rewritten as an if and seen to deny before it ran anywhere.

    Recorded in 7b47398.

Code1 of 5 proven✓????
Type checkCaught 11 of 11
Protects against
A type error reaching main.
How you can tell it is switched on
The "Type check" step appears in every run of the CI workflow.
Last seen
Seen switched on, 18 Sep 2026.

Planted defects, newest first

  1. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    STATUSES loses its as const, so Status widens to string.
    Expected
    The type check fails.

    Ran against ec2b3bd. Recorded in bb3e011.

  2. 29 Sep 2026✓ CaughtBy replayView proof

    Planted
    STALE_AFTER_DAYS is written as a string rather than a number.
    Expected
    The type check fails.

    Ran against ec2b3bd. Recorded in bb3e011.

  3. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    STALE_AFTER_DAYS is written as a string rather than a number.
    Expected
    The type check fails.

    Ran against 33b5238. Recorded in 6f29d42.

  4. 28 Sep 2026✓ CaughtBy replayView proof

    Planted
    STATUSES loses its as const, so Status widens to string.
    Expected
    The type check fails.

    Ran against 33b5238. Recorded in 6f29d42.

  5. 21 Sep 2026✓ CaughtBy replayView proof

    Planted
    STATUSES loses its as const, so Status widens to string.
    Expected
    The type check fails.

    Ran against 81e159c. Recorded in f1348f8.

  6. 21 Sep 2026✓ CaughtBy replayView proof

    Planted
    STALE_AFTER_DAYS is written as a string rather than a number.
    Expected
    The type check fails.

    Ran against 81e159c. Recorded in f1348f8.

  7. 19 Sep 2026✓ CaughtBy replayView proof

    Planted
    STALE_AFTER_DAYS is written as a string rather than a number.
    Expected
    The type check fails.

    Ran against 333dab1. Recorded in 4cb7a82.

  8. 19 Sep 2026✓ CaughtBy replayView proof

    Planted
    STATUSES loses its as const, so Status widens to string.
    Expected
    The type check fails.

    Ran against 62e34e9. Recorded in f488228.

  9. 19 Sep 2026✓ CaughtBy replayView proof

    Planted
    STATUSES loses its as const, so Status widens to string.
    Expected
    The type check fails.

    Ran against 333dab1. Recorded in 4cb7a82.

  10. 19 Sep 2026✓ CaughtBy replayView proof

    Planted
    STALE_AFTER_DAYS is written as a string rather than a number.
    Expected
    The type check fails.

    Ran against 62e34e9. Recorded in f488228.

  11. 18 Sep 2026✓ CaughtBy handView proof

    Planted
    STALE_AFTER_DAYS was changed from the number 30 to the string 30 in quotes, on a ci-control branch pushed to this repository.
    Expected
    The Type check step fails, so the CI run does not go green.

    Planted on the ci-control lane the README documents. Run 35405796729 on branch ci-control/63-type-check-plant at d6c0575 concluded failure, with Type check the only step that failed and every other step green or skipped. The branch was deleted and the constant put back afterwards.

    Recorded in a113f0f.

Seen switched on or off, newest first

  • 18 Sep 2026 Seen switched on. Recorded in 7b47398.

    Read from run 35375392138 of the CI workflow on main at 14b479e, where the step ran and the run concluded success.

Format checkNever planted
Protects against
A file reaching main formatted differently from every other one.
How you can tell it is switched on
The "Check formatting" step appears in every run of the CI workflow.
Last seen
Seen switched on, 18 Sep 2026.

Planted defects

None yet. Until a defect is planted and caught, this check has not been seen to fail.

Seen switched on or off, newest first

  • 18 Sep 2026 Seen switched on. Recorded in 7b47398.

    Read from run 35375392138 of the CI workflow on main at 14b479e, where the step ran and the run concluded success.

Generated types are currentNever planted
Protects against
A schema or query edited without regenerating the types both sides read.
How you can tell it is switched on
The "Check the generated types are current" step appears in every run of the CI workflow.
Last seen
Seen switched on, 18 Sep 2026.

Planted defects

None yet. Until a defect is planted and caught, this check has not been seen to fail.

Seen switched on or off, newest first

  • 18 Sep 2026 Seen switched on. Recorded in 7b47398.

    Read from run 35375392138 of the CI workflow on main at 14b479e, where the step ran and the run concluded success.

LintNever planted
Protects against
A lint rule being broken on main.
How you can tell it is switched on
The "Lint" step appears in every run of the CI workflow.
Last seen
Seen switched on, 18 Sep 2026.

Planted defects

None yet. Until a defect is planted and caught, this check has not been seen to fail.

Seen switched on or off, newest first

  • 18 Sep 2026 Seen switched on. Recorded in 7b47398.

    Read from run 35375392138 of the CI workflow on main at 14b479e, where the step ran and the run concluded success.

TestsNever planted
Protects against
A defect the test suite covers reaching main.
How you can tell it is switched on
The "Test" step appears in every run of the CI workflow.
Last seen
Seen switched on, 18 Sep 2026.

Planted defects

None yet. Until a defect is planted and caught, this check has not been seen to fail.

Seen switched on or off, newest first

  • 18 Sep 2026 Seen switched on. Recorded in 7b47398.

    Read from run 35375392138 of the CI workflow on main at 14b479e, where the step ran and the run concluded success.

Build0 of 1 proven?
The client buildsNever planted
Protects against
A client that type checks and cannot be bundled, which the tests cannot see because they import modules rather than the page.
How you can tell it is switched on
The "Build the client" step appears in every run of the CI workflow.
Last seen
Seen switched on, 18 Sep 2026.

Planted defects

None yet. Until a defect is planted and caught, this check has not been seen to fail.

Seen switched on or off, newest first

  • 18 Sep 2026 Seen switched on. Recorded in 7b47398.

    Read from run 35375392138 of the CI workflow on main at 14b479e, where the step ran and the run concluded success.

How this page works

The checks on this page are recorded in a ledger kept in this repository, and the page is built from it at the commit named below.

To prove a check, a defect it should catch is planted on purpose, the check is run, and the result is recorded as one of three outcomes.

Caught
The check went red.
Missed
The check stayed green.
Settled nothing
The run told us nothing about the check, and the reason is shown as it was written. No status is read from it.

A run by hand is one somebody planted, watched and recorded. A replay was planted and scored by a job against newer code, so a check keeps being tested after its first proof. A proof older than 30 days turns Stale.

Every run is a file in the repository, added by a commit like any other change, so a record that is wrong has an author, a diff and a revert.

This page is read-only: it has no filter bar and no server behind it. The filter works when you run the app locally. The same ledger is published beside this page as ledger.json.