{
  "schema": "org-writing@v1",
  "slug": "prose-is-not-behavior",
  "kg": {
    "id": "org:writing:prose-is-not-behavior",
    "type": "brick",
    "graph": "/kg.json"
  },
  "title": "Prose is not behavior",
  "subtitle": "A checker that cannot tell a mention from a use puts a price on explaining yourself",
  "abstract": "What happened when a scanner flagged a file for the very pattern it was explaining away, and why a codebase required to document itself cannot also be penalized for the documentation. The canonical treatment of the explanation tax.",
  "kind": "brick",
  "topics": [
    "Machine judgment"
  ],
  "courseMemberships": [
    {
      "course": "org:courses:machine-decides",
      "topic": "Machine judgment",
      "wall": "org:walls:engineering",
      "position": 2,
      "total": 5
    }
  ],
  "publishedAt": "2026-08-03T00:00:00.000Z",
  "version": 1,
  "guidelinesVersion": 15,
  "brief": {
    "problem": {
      "text": "Static checks are run over raw source, and a file that explains why it avoids a forbidden pattern contains the forbidden pattern, so the most carefully documented work is the work most likely to be flagged.",
      "claims": [
        "reported a file as shipping a forbidden font-display setting"
      ]
    },
    "mechanism": {
      "text": "A pattern matcher has no access to whether a string is doing something or describing something, so a check reading raw text charges the same penalty for committing a fault and for documenting its avoidance.",
      "claims": [
        "cannot distinguish a use of a token from a mention of it"
      ]
    },
    "move": {
      "text": "Strip the comments before matching on any check whose pattern could plausibly appear in an explanation, and treat a rule that taxes documentation as a defect in the rule.",
      "claims": []
    }
  },
  "sources": [
    {
      "repo": "mnstry-website",
      "path": "scripts/foundation/validators/heuristics.mjs"
    },
    {
      "repo": "mnstry-website",
      "path": "AGENTS.md"
    }
  ],
  "canonicalPath": "/writing/prose-is-not-behavior/",
  "body": "A check we run over one of our own sites reported that a file was shipping a font-loading setting the design foundation forbids. It was not. The file contained a comment explaining why that setting is forbidden and what it uses instead. The pattern matched the explanation, the check had no way to tell an explanation from an instruction, and the only thing wrong with that file was that somebody had taken the trouble to write down why it was right.\n\nThe repair was small and the doctrine attached to it was not. Comments are now stripped before matching, and any check whose pattern could plausibly appear in an explanation reads the source with the prose removed rather than the raw text. The comment recording the incident states the rule in four words, that prose is not behavior, which is worth more than the four lines of code underneath it, because the four lines fix one check and the four words fix the next fifty.\n\nThe mechanism is the distinction between using a term and mentioning it, which philosophy of language settled long ago and most tooling has never encountered, and it bites here because a regular expression matches a run of characters with no access to whether that run is doing something or describing something, so a scanner reading raw text charges the same penalty for committing a fault and for documenting its avoidance. Quine gave the distinction its formal treatment in 1940 and the practical version is older than any of us: the word poison on a bottle and the word poison in a sentence about bottles are not the same object, and only one of them will hurt you.\n\nThe failure has a famous public ancestor. In 1996 a profanity filter refused to register residents of Scunthorpe, an English town whose name contains an obscenity as a substring, and the pattern has recurred so reliably since that the town's name became the standard label for it. Every instance is the same error wearing local clothes. The matcher sees the string and has no access to the situation, and the situation is the whole question.\n\nWhat makes the cost more than an annoyance is the discipline sitting next to it. That same site requires that any change altering rendered appearance append a dated ruling to a ledger in the same commit, with framework-level rules amended in the shared design authority as well. The codebase is under an obligation to explain itself. Put a naive scanner beside that obligation and the two rules argue: the more thoroughly a file records what it rejected and why, the more surface it offers to be misread, and the cheapest way for a team to stay green is to stop writing the reasons down. Call it *the explanation tax*. Nobody decides to pay it. It is learned, one false positive at a time.\n\nWhich is the same requirement this corpus already argues for a different structure. A tradition that keeps its rejected opinions with their reasoning can reopen a question it once closed wrongly, and preserved dissent is the mechanism by which any collective structure revises itself. A codebase is one of those structures, its comments are where its dissents live, and a check that penalizes a recorded rejection is a system charging its own memory rent. Honest checks read the source and leave the reasons alone, which costs four lines and buys a codebase still willing to tell you what it decided against.",
  "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:prose-is-not-behavior:r01",
        "author": "MNSTRY (internal)",
        "work": "Marketing-site foundation heuristics and the site's rulings-ledger practice",
        "year": 2026,
        "relevance": "The primary artifact. The comment-stripping pass carries the incident in its own docstring, and the rulings-ledger practice is the standing obligation that makes the false positive expensive rather than merely irritating."
      },
      {
        "id": "org:references:prose-is-not-behavior:r02",
        "author": "Willard Van Orman Quine",
        "work": "Mathematical Logic",
        "year": 1940,
        "relevance": "The formal treatment of the use-mention distinction and of quotation as the device that marks it. The brick's mechanism is this distinction restated for pattern matchers."
      },
      {
        "id": "org:references:prose-is-not-behavior:r03",
        "author": "The Scunthorpe problem (documented from the 1996 AOL filter incident onward)",
        "work": "The standard name in filtering and moderation practice for a substring match that ignores context",
        "year": 1996,
        "relevance": "The public ancestor of the internal case, and the reason the failure is treated as a class rather than an incident."
      }
    ],
    "claims": [
      {
        "id": "org:claims:prose-is-not-behavior:c01",
        "claim": "A build check reading raw source reported a file as shipping a forbidden font-display setting when the file contained only a comment explaining why it avoids that setting; the fix was to strip comments before matching, and the rule was recorded as prose is not behavior.",
        "basis": "The validator source read directly on 2026-08-03; the incident is recorded in the comment-stripping function's own docstring, which states the case and the resulting rule.",
        "confidence": "verified",
        "sources": []
      },
      {
        "id": "org:claims:prose-is-not-behavior:c02",
        "claim": "A pattern matcher operating on raw text cannot distinguish a use of a token from a mention of it, because the two are the same run of characters.",
        "basis": "Definitional. The use-mention distinction is standard in philosophy of language (Quine's treatment is the usual citation) and the limitation of substring matching follows from what matching is.",
        "confidence": "verified",
        "sources": []
      },
      {
        "id": "org:claims:prose-is-not-behavior:c03",
        "claim": "In 1996 an online service's profanity filter refused registrations from residents of Scunthorpe because the town's name contains an obscenity as a substring, and the failure class took the town's name.",
        "basis": "Widely reported at the time and since; the name is standard in content-filtering practice. The date and the service are the commonly cited account rather than a primary record.",
        "confidence": "verified",
        "sources": []
      },
      {
        "id": "org:claims:prose-is-not-behavior:c04",
        "claim": "The site's own practice requires that any change altering rendered appearance append a dated ruling to a ledger in the same commit, with framework-level rules also amended in the shared design authority.",
        "basis": "The site's agent-facing contract read directly; the practice is stated there as a feedback protocol step and a completeness condition on a change.",
        "confidence": "verified",
        "sources": []
      }
    ],
    "concepts": [
      {
        "id": "org:concepts:preserved-dissent",
        "name": "Preserved dissent",
        "definition": "Conflicting judgments stored attributed and in tension rather than resolved away; the conflict is information, and this year's rejected opinion is routinely next decade's ruling.",
        "provenance": "canonical"
      },
      {
        "id": "org:concepts:explanation-tax",
        "name": "The explanation tax",
        "definition": "The cost a naive check imposes on documentation. Because a scanner reading raw text cannot tell a mention of a pattern from a use of it, the most thoroughly explained file carries the most surface to be flagged, and a team under a green build learns to write fewer reasons down. The repair is to strip comments before matching on any check whose pattern could plausibly appear in an explanation, and to treat a rule that taxes documentation as a defect in the rule.",
        "provenance": "canonical"
      }
    ],
    "researchContext": "Sourced from our own marketing-site foundation, where the incident, the\nrepair, and the doctrine all live in the same file; the brick names the\nprinciple the code already states in four words. The Scunthorpe case is\nintroduced to establish the failure as a documented class rather than a\nlocal mishap, and it is graded on the strength of its standard account\nrather than a primary record, which is why the entry says so.\n\nThe brick's contribution is the collision it identifies, between a standing\nobligation to document decisions and a check that prices documentation, and\nthe reading of source comments as a codebase's preserved dissent. That\nkinship is deliberate and is cited in the body: \"Preserved dissent\" owns the\nargument that a structure keeping its rejected opinions can revise itself,\nand this brick applies it one layer down, where the rejected option is a\npattern a file explains it does not use.\n\nBoundary with \"The unambiguous half\": that brick owns what an automated\nruling may fail a build on, this one owns what a scanner misreads before any\nruling is reached. Both elaborate the discernment essay's minor-premise\nargument from the builder's side, and neither re-argues the other's half."
  },
  "contract": "https://mnstry.org/contracts/org/org-writing.v1.schema.json",
  "releaseHash": "42f97cada8dd37e37ae1266f3f678ad4c1c489a49f3f803b60be51812af130a1",
  "versions": [
    {
      "version": 1,
      "cutAt": "2026-08-03",
      "note": "Initial publication, machine-decides wave",
      "visibility": "published",
      "path": "/writing/prose-is-not-behavior/",
      "contentHash": "sha256:d7f3196497d01037",
      "releaseHash": "42f97cada8dd37e37ae1266f3f678ad4c1c489a49f3f803b60be51812af130a1"
    }
  ]
}