{
  "schema": "org-writing@v1",
  "slug": "two-classifiers-two-truths",
  "kg": {
    "id": "org:writing:two-classifiers-two-truths",
    "type": "brick",
    "graph": "/kg.json"
  },
  "title": "Two classifiers, two truths",
  "subtitle": "When two surfaces decide the same fact independently, a system holds both answers and notices neither",
  "abstract": "A keyboard that was open and closed at once inside one running application, and why the repair is a single owner per fact rather than two components instructed to agree more carefully. The canonical treatment of one authority per fact.",
  "kind": "brick",
  "topics": [
    "Boundaries",
    "Machine judgment"
  ],
  "courseMemberships": [
    {
      "course": "org:courses:boundary",
      "topic": "Boundaries",
      "wall": "org:walls:engineering",
      "position": 5,
      "total": 5
    },
    {
      "course": "org:courses:machine-decides",
      "topic": "Machine judgment",
      "wall": "org:walls:engineering",
      "position": 5,
      "total": 5
    }
  ],
  "publishedAt": "2026-08-03T00:00:00.000Z",
  "version": 1,
  "guidelinesVersion": 15,
  "brief": {
    "problem": {
      "text": "The same state is often classified in more than one place in a running system, and each classifier is correct given the evidence it accepts, so the disagreement never surfaces as a fault.",
      "claims": [
        "classify the same keyboard state independently, on different inputs"
      ]
    },
    "mechanism": {
      "text": "Two independent decisions about one fact produce two answers that never meet, so the system never holds a contradiction, only two truths, each locally consistent and consumed by a different half of the layout.",
      "claims": [
        "classifications are never compared anywhere in the system"
      ]
    },
    "move": {
      "text": "Name one owner for each fact a system acts on, make every consumer read that owner, and treat a second place that decides the same thing as a defect on sight rather than a redundancy.",
      "claims": []
    }
  },
  "sources": [
    {
      "repo": "mnstry-review-packets",
      "path": "2026-08-03 mobile keyboard defensive review packet (directory name withheld, tenant-identifying)"
    }
  ],
  "canonicalPath": "/writing/two-classifiers-two-truths/",
  "body": "A person taps a text field on a phone and the keyboard rises, and the field they were about to type in is no longer on the screen. Everything a test would check has survived. The input element is still in the document, it is still the focused element, and its text cursor is still blinking somewhere below the visible edge of the application. This is the failure a review packet we read this year was commissioned to explain, and the explanation is not a bug in the ordinary sense. Nothing miscomputed.\n\nTwo different parts of the application decide, independently, whether a keyboard is open. One of them accepts a rich set of evidence, the height the screen had before anything moved, the physical screen height, and the fact that a focused editor may own the contraction, and during the failure it decided that the keyboard was open. The other accepts a narrower set, the current heights and whether it had recently believed a keyboard was open, and on the platform's newer behavior, where both heights shrink together, that narrower evidence cannot distinguish a keyboard from any other reason a window got smaller. It decided the keyboard was closed and published a usable height that was roughly double the space the outer container had actually taken. The container beneath it did exactly what it was built to do and pinned the text input to the bottom of that larger region, which put it below the visible clip, by construction, while focus stayed exactly where it was.\n\nThe mechanism is not disagreement but the missing room in which to disagree, because two independent decisions about one fact yield two answers that are never compared anywhere in the system, so nothing ever holds a contradiction, only two truths, each locally correct on its own evidence and each consumed by a different half of the layout.\n\nThe most expensive version of this on record left the planet. In 1999 the Mars Climate Orbiter was lost on arrival because ground software supplied thruster impulse in pound-force seconds while the spacecraft's navigation expected newton-seconds. Neither program was wrong internally. Both were consistent, both were tested, and the two truths met for the first time in the atmosphere of another planet. Every subsequent recommendation in that investigation was a version of the same structural point, that the fix is not more careful agreement between two owners of one quantity but ending the situation in which there are two.\n\nWhich is why the repair here is not to give the narrower classifier better inputs. That is a behavioral fix, a promise that two components will keep saying the same thing, and it holds only until someone extends one of them under deadline. The structural fix is *one authority per fact*, which here means naming the single component that decides whether a keyboard is open, having it publish a usable height, and having every surface that lays out against it read the published value rather than deriving its own. Then a wrong answer is still possible and a divergent one is not, which is a strictly smaller class of failure, and the second classifier's disappearance is the whole of the change.\n\nOur own reading of that packet turned up a fitting coda. One of the numbers in its classifier comparison had been reconstructed from how the code says data flows rather than read off a live instrument, so the exact divergence at that instant is not fully established. It changes nothing structural. The duplication is visible in the source whether or not the two answers differed on that Tuesday, and a system with two authorities for one fact is already broken in the way that matters, quietly, until the day it takes something away from the person holding the phone. Build one place where the truth lives, and disagreement becomes a thing you can find.",
  "apparatus": {
    "note": "The human-facing essay is deliberately practical; this apparatus carries the full references, evidence-graded claims, article-local concepts, and research context behind it. Canonical concept definitions come from the concept registry.",
    "references": [
      {
        "id": "org:references:two-classifiers-two-truths:r01",
        "author": "Held privately (client engagement, deidentified)",
        "work": "A defensive review packet commissioning an independent review of a mobile keyboard regression, dated 2026-08-03",
        "year": 2026,
        "relevance": "The primary artifact. Its competing-classifiers section sets out the two evidence sets side by side and asks, in its own boundary questions, why two surfaces are permitted to classify the same keyboard state independently. The brick answers that question structurally."
      },
      {
        "id": "org:references:two-classifiers-two-truths:r02",
        "author": "NASA Mars Climate Orbiter Mishap Investigation Board",
        "work": "Phase I Report on the loss of the Mars Climate Orbiter",
        "year": 1999,
        "relevance": "The paradigm case of two internally consistent authorities for one quantity with no reconciliation point between them. Used for the structural argument, not as a units-conversion anecdote."
      },
      {
        "id": "org:references:two-classifiers-two-truths:r03",
        "author": "MNSTRY (this corpus)",
        "work": "'Structural, not behavioral' (the parent essay)",
        "year": 2026,
        "relevance": "The frame. A promise that two components will agree is behavioral safety; removing the second authority is structural."
      }
    ],
    "claims": [
      {
        "id": "org:claims:two-classifiers-two-truths:c01",
        "claim": "In the reviewed application, two components classify the same keyboard state independently, on different inputs: one accepts a pre-keyboard baseline height, the screen height, and evidence that a focused editor may own the contraction, and the other accepts only current viewport heights and a prior open flag.",
        "basis": "The packet's competing-classifiers section, which lists what each classifier accepts and what the narrower one does not, cross-read against the source files it names.",
        "confidence": "verified",
        "sources": []
      },
      {
        "id": "org:claims:two-classifiers-two-truths:c02",
        "claim": "On the platform behavior where the window height and the visual viewport height shrink together, the narrower input set cannot distinguish a keyboard from another cause of contraction.",
        "basis": "Follows from the inputs each classifier accepts; the packet states the equal-height case explicitly and the evidence-rich classifier's baseline and focus inputs are what resolve it.",
        "confidence": "verified",
        "sources": []
      },
      {
        "id": "org:claims:two-classifiers-two-truths:c03",
        "claim": "The two classifications are never compared anywhere in the system, so a divergence produces two locally consistent layouts rather than a raised error.",
        "basis": "Absence established by source review across the components the packet names; an absence claim over a scoped read rather than a whole-repository proof.",
        "confidence": "directional",
        "sources": []
      },
      {
        "id": "org:claims:two-classifiers-two-truths:c04",
        "claim": "One number in the packet's classifier comparison was reconstructed from static dataflow rather than read from a live instrument, so the exact divergence at that moment is not fully established.",
        "basis": "A follow-up source read on 2026-08-03 against the same worktree; the reconstruction is consistent with the code path but was not instrumented live. This does not bear on the structural duplication, which is visible in the source.",
        "confidence": "verified",
        "sources": []
      },
      {
        "id": "org:claims:two-classifiers-two-truths:c05",
        "claim": "The Mars Climate Orbiter was lost in 1999 after ground software supplied impulse data in pound-force seconds while the spacecraft's navigation software expected newton-seconds.",
        "basis": "NASA's mishap investigation board Phase I report and the subsequent public record.",
        "confidence": "verified",
        "sources": []
      }
    ],
    "concepts": [
      {
        "id": "org:concepts:one-authority-per-fact",
        "name": "One authority per fact",
        "definition": "Each fact a system acts on has exactly one component that decides it and publishes it, and every consumer reads the published value rather than deriving its own. A second place that decides the same fact is a defect rather than a redundancy, because two independent classifiers produce two locally consistent answers that are never compared, so the system holds two truths and has nowhere to notice the contradiction. Instructing the two to agree is a promise; removing the second is a shape.",
        "provenance": "canonical"
      },
      {
        "id": "org:concepts:structural-safety",
        "name": "Structural safety",
        "definition": "Safety that is a property of the system's shape: the unsafe action is not permitted-and-blocked but absent. A bridge holds when a cable snaps because of its shape, not because cables are forbidden to snap.",
        "provenance": "canonical"
      }
    ],
    "researchContext": "Sourced from the same client packet as \"The ledger says unknown\" and\nscrubbed on the same standing instruction: no tenant, client, product\nsurface, repository path, branch, or commit identifier appears anywhere in\nthe piece, and the source label (mnstry-review-packets) records the packet's\ndate and character rather than its directory. The two bricks read one\nartifact for two different findings and neither re-argues the other's half.\n\nThe brick's contribution is the reframing of the packet's own boundary\nquestion. The packet asks why two surfaces are allowed to classify the same\nstate independently, which invites a fix that improves the weaker\nclassifier; the brick answers that the number of classifiers is the defect,\nwhich is the parent essay's structural-over-behavioral argument applied to\na fact rather than to a permission.\n\nGrading note: the reconstructed-number claim is included deliberately even\nthough it weakens the vividness of the case, because the alternative is\npublishing a divergence as measured when one of its inputs was inferred.\nThe structural finding survives it, and saying so in the body was preferred\nto omitting it from the apparatus. The absence claim, that nothing compares\nthe two classifications, is graded directional rather than verified because\nit rests on a scoped read of the named components rather than an exhaustive\nsearch."
  },
  "contract": "https://mnstry.org/contracts/org/org-writing.v1.schema.json",
  "releaseHash": "95b38a87f88cbdc1aa9fa830de972c133097a1248d5c5b91c614d75504f05a64",
  "versions": [
    {
      "version": 1,
      "cutAt": "2026-08-03",
      "note": "Initial publication, machine-decides wave",
      "visibility": "published",
      "path": "/writing/two-classifiers-two-truths/",
      "contentHash": "sha256:de46ae363b90566c",
      "releaseHash": "95b38a87f88cbdc1aa9fa830de972c133097a1248d5c5b91c614d75504f05a64"
    }
  ]
}