{
  "route": "GET /mould, GET /mould/{id}, POST /mould",
  "purpose": "A fix repairs one casting. The mould that cast it sits untouched unless somebody goes looking. This ledger records four things about a fix and freezes them: the class of assumption behind it, where the author searched for that same assumption, what they found, and at what volume each casting failed.",
  "fields": {
    "class": "the assumption, written so it can be searched for. Not a description of the symptom.",
    "instance": "where it was first noticed. { where, symptom, volume }",
    "searched": "the space the author says they searched. Naming it is the point.",
    "found": "per location: already_correct, fixed, or absent. With a commit where there is one.",
    "volume": "loud = it threw or returned an error. quiet = it degraded without complaining."
  },
  "volume_note": "The same mould does not cast identical failures. It casts the same flaw at different volumes. The instance you notice is the loudest one, not the worst one. A quiet casting survives precisely because it never complains, so a bug driven search always finds the wrong member of the family first.",
  "empty_search_is_published": "A record whose searched list is empty is accepted and published as such. An instance fixed with no class search is exactly what this ledger exists to make visible. It is not hidden and not rejected.",
  "this_ledger_verifies_nothing": "Every record is the author's own account. This gate does not reproduce it. What is frozen here is the claim and its date, not its truth. Each record carries a record_sha256 anyone can recompute.",
  "writing": "Reading requires nothing, and writing requires no key either. Open the 'Record a mould' issue in github.com/ogasurfproject-jpg/horizon-shield, then POST {\"issue\": <number>} to /mould/from-issue. This gate fetches that issue from GitHub itself and records what GitHub shows. The caller carries no credential and supplies no content, so there is nothing to forge and no shared token that can leak. GitHub does the identity part. This gate does not, and does not claim to.",
  "how_to_record": "https://github.com/ogasurfproject-jpg/horizon-shield/issues/new?template=mould-record.yml",
  "what_a_record_is_not": "Not a certificate, not a score, not a ranking. Nobody is rated here. A record with an empty search list sits in the same list as a thorough one: marked, unhidden, and not placed below it.",
  "count": 4,
  "records": [
    {
      "id": "mould-gh-6",
      "recorded_at": "2026-08-20T04:01:28.616Z",
      "class": "A page that states a current fact in fixed type will keep stating it after the fact\nchanges, and nothing in the page will notice.",
      "searched": 3,
      "found": 5,
      "by": "ogasurfproject-jpg",
      "via": "github",
      "record_sha256": "ecf73c79aa5013cdc06feb0b8704bcdd5fec35555c1a96228d338d6789dbf420"
    },
    {
      "id": "mould-0003",
      "recorded_at": "2026-08-20T02:16:52.199Z",
      "class": "A read that failed and a read that succeeded with nothing in it are allowed to collapse into the same downstream value.",
      "searched": 3,
      "found": 7,
      "by": null,
      "via": "operator",
      "record_sha256": "bc2bf30c215b0821de35950c2f176e7cb644eed41cab5bfebd7d02a6299470e2"
    },
    {
      "id": "mould-0002",
      "recorded_at": "2026-08-20T00:03:01.770Z",
      "class": "a shared sequential namespace is assumed to belong to the current author, and numbers are allocated from it without first measuring what is already taken",
      "searched": 2,
      "found": 4,
      "record_sha256": "24116bee0f127b7f54569587b944c3522af3beccc2527f7e56472e2dc7b3e548"
    },
    {
      "id": "mould-0001",
      "recorded_at": "2026-08-20T00:02:54.739Z",
      "class": "a value returned by a model or an API is assumed to be a string, and is passed straight into a string operation",
      "searched": 2,
      "found": 3,
      "record_sha256": "6f28989cbd8f90b8a1db3d9b25a648ec493b599e11aabf2353c13558b9a38c5c"
    }
  ]
}