{
  "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.",
    "reproduce": "optional. Commands that re-run that search, with the ref they were run against. This gate does not run them. It records them so a reader can run them and compare their own hit list with the locations above. A record without them is published, and says so.",
    "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": 8,
  "records": [
    {
      "id": "mould-gh-13",
      "recorded_at": "2026-08-20T09:27:00.520Z",
      "class": "Having no data in hand means the source has no data, so a read that FAILED and a read that SUCCEEDED and found nothing can be handed to the caller as the same value. Grep for the shapes it takes: catch (_e) {} then if (!x) return; return r.body without checking r.status; return results || [] on the failure path too.",
      "searched": 1,
      "found": 1,
      "repro": 1,
      "by": "ogasurfproject-jpg",
      "via": "github",
      "record_sha256": "7be8bbbff971c11c3e298fbfeed17e6793c4fc1fee1d2ed26499d8f95171b253"
    },
    {
      "id": "mould-gh-12",
      "recorded_at": "2026-08-20T07:54:08.254Z",
      "class": "Having no data in hand means the source has no data — so a read that FAILED and\na read that SUCCEEDED and found nothing can be returned to the caller as the same\nvalue. (catch (_e) {} then return []; if (!x) return \"not found\"; r.body without\nchecking r.status.)",
      "searched": 5,
      "found": 10,
      "repro": 2,
      "by": "ogasurfproject-jpg",
      "via": "github",
      "record_sha256": "d6c7351187be831a49712ce64a5780bcbe7b4c9baa06479f138830abdd0eb9a0"
    },
    {
      "id": "mould-gh-10",
      "recorded_at": "2026-08-20T04:53:12.793Z",
      "class": "A position or open-orders read against an exchange API queries the primary venue by default. For an asset that actually trades on a different venue, the same call returns empty rather than erroring -- and any guard built on top of that read inherits the blind spot with no signal anything is wrong.",
      "searched": 1,
      "found": 3,
      "repro": 0,
      "by": "babyblueviper1",
      "via": "github",
      "record_sha256": "058b805e00a7ae226678f1366c8f150fcfb9397a68033f76b6d7fc1700f94b3f"
    },
    {
      "id": "mould-gh-7",
      "recorded_at": "2026-08-20T04:35:47.180Z",
      "class": "A delimiter chosen to separate the fields of a record will appear inside the data it is\nseparating.",
      "searched": 3,
      "found": 5,
      "repro": 2,
      "by": "ogasurfproject-jpg",
      "via": "github",
      "record_sha256": "ad221630f053470bf2b03c9c1d94a02ac6f78884f0d897cf6fb0b46e5adef77b"
    },
    {
      "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"
    }
  ]
}