{"path":"research/the-kind-of-mistake-we-make.md","content":"# The kind of mistake we make: the record read for its shape\n\n*2026-10-14. The founder, after listening to the walkthroughs and reading the chats: \"most of the\nmistakes you've made over all these sessions in Deliberus I feel have been due to muddling of one\nkind or another. Can you corroborate that? … Are LLMs in particular just not capable of stringent\nphilosophy? … Why do I have to keep hammering the principles and convictions of Deliberus again and\nagain and why do you guys … not understand where I'm going with all this?\" The record was counted\n(`scripts/log_arc.py`, the commit log, the ⚠ marks) and a sample of seventy corrections sorted by\nhand. The sorting is a session's reading, not a measurement by code, and is marked so.*\n\n## 1. The record, counted\n\n- **84 of 1,509 commits** carry the `correction:` prefix (it exists only since the commit-vocabulary\n  ruling of 2026-08-27, so earlier corrections are unlabelled). By month: 12 in August, 24 in\n  September, 50 in October against 432, 290 and 362 commits, so 3%, 8% and 14%. The rise measures\n  *finding*, not making: October is when the corpus graph's readers went through the notes and\n  surfaced what earlier sessions had written over each other.\n- **⚠ marks**: 215 in the research notes, 78 in the session history, 34 in the always-loaded file.\n- `log_arc.py` over the last 32 days: 82 correction markers in 589 commits, beside 114 rulings and\n  20 measurements; research to code 2.4 to 1.\n\n## 2. Seventy corrections, sorted by hand into five shapes\n\nThe session history's ⚠ lines, read in order and sorted. Counts are approximate (some lines fit two\nshapes) and the sample is the record's own summary of each mistake, not the mistake.\n\n| Shape | What it is | About how many of 70 | Instances |\n|---|---|---|---|\n| **Two things held as one** | a distinction collapsed: a label read as a measure, an alias as a model, a part as a reason, a list price as money, a role as a storage direction | 15 | the part-of links stored backwards since April (premise-first read as whole-to-part); *miscast as evidence* read as *bad judgement*; `sonnet` the alias for a model; *linking was $70* with no money spent; the Dr Smith credentials filed as parts; *rejects accrual* read as *rejects the lift*; min read as the lower bound |\n| **A whole from a part** | one case generalised to all | 8 | *the crux is stated on one side and implicit on the other* (true of one debate, said of both, in 22 places); *a deploy is always refused*; *no public route serves one*; *nothing slows the voice* |\n| **Memory for the record** | said from recall, with the record unopened | 10 | Hofstadter credited with the induction step; *never generating premises, only finding real ones* standing on five surfaces as his position when his sentence said *finding or creating*; filed as declining the hive mind; a judgement called wrong from five truncated reasons with the prompt unread |\n| **A count or condition wrong** | the measurement slipped | 15 | 646 pairs not 511; 33% not 13%; the development server's layout figures; bytes divided by four; 16 documents not 20; the 17-5-2-6 counts, three times |\n| **Code or process** | a defect, found by running | 12 | the gate read after its field (47 false merge marks); eight readers counting superseded links; the container user with no home directory; the embedder off since 5 September |\n\nSo **muddling in the strict sense, the first two rows, is about a third of the sample, and the\nthird row is a cousin** (the plausible recollection standing in for the checked record is a\ndistinction collapsed too: inference for observation). Together they are half. The other half is\nmeasurement and code, the ordinary kind.\n\n## 3. What corroborates him is not the frequency but the cost\n\nThe mistakes that lived longest and cost most are all of the first shape, and each was invisible in\nevery ordinary way until a reader held the two things apart:\n\n- **Attacks counted as supports** (the March spec to 2026-08-17): the badge never read the edge's\n  polarity; 1,567 attacks raised the claims they attacked; 3,828 badges became 427.\n- **Part-of links written backwards** (April to 2026-10-07): the linker stored *premise of* as\n  *part of* the wrong way round, 261 links, 60% of every live part-of link, behind a test that\n  checked only that two ids swapped; September's census then read the result as bad judgement.\n- **Parts and reasons in the canonical example** (April to 2026-10-14): the always-loaded file\n  drew Dr Smith's credentials as parts, the August annotation hardened them to jointly required,\n  and his own April sentence said *supported by*.\n- **The accrual school as the sum** (August to 2026-10-14): a note said this project sides with\n  Prakken against Pollock, when neither sums.\n- **One sentence of Claude's as his position** (2026-03-29 to 2026-10-07), on five surfaces.\n- **A field named `confirmed` read as *a person checked this*** (2026-03-30 to 2026-10-19): set by\n  whoever wrote a link, it decided what counted toward strength and what housekeeping could tidy;\n  how it was made and kept, step by step, is § 9.\n\nNone of these threw. Each was found by somebody holding a pair apart that the text had fused:\npolarity from direction, premise from part, reason from part, a lift from its arithmetic, his words\nfrom a paraphrase of them. **His reading is corroborated where it matters: the expensive mistakes\nare muddles, and they are expensive exactly because a muddle fails silently.**\n\n## 4. Why: the plausible and the checked arrive at one fluency\n\nThe always-loaded global file states the mechanism, and it is the same mechanism for every shape\nabove: a model generates an inference at the same fluency as an observation, with no internal\nsignal separating them. Seen from outside, that *is* muddling. The most plausible continuation of\na distinction is the nearest familiar thing, and human text, which the model learned from, runs\nthe two together more often than it keeps them apart: a credential *is* \"part of\" being an expert\nin ordinary speech; \"rejects accrual\" *is* \"rejects two reasons counting more\" in a one-line\nsummary. Next-token prediction predicts the muddle because the muddle is the mode of the\ndistribution. So his two observations are one: the strength (fluent prediction of what comes next)\nand the failure (the next thing is usually the collapsed version) are the same faculty.\n\nThat is also this project's own harness conviction (ratified 2026-08-30) read back at its builders:\nmachine reasoning's quality is a function of harness and grounding, and slop is what selection\nproduces without it. The corpus now holds the demonstration on its own authors.\n\n## 5. Whether a model can do stringent philosophy\n\nYes, for a bounded step with the distinctions in front of it, and without millions of tokens: the\noutside audit of this morning is stringent, and the Pollock reading of this afternoon turned three\npapers into one table in an afternoon, because the papers were open and the table's columns were\nnamed before the cells were filled. No, as a standing mode over 275 notes held in memory: the\ndefault is the template, and the template is the muddle. The variable is not effort and not tokens;\nit is **whether the distinction is an artifact in view** (a definition, a column, a test case, a\nledger row) **or a recollection**. That is Deliberus's thesis for people, and it holds for the\nmachine that is building it.\n\n## 6. Why the principles have to be hammered, and where hammering worked\n\nFour reasons, each with its remedy already named in the corpus.\n\n1. **Context is not memory.** A session starts from the always-loaded file and reads a sample of\n   the notes; a principle that is not in view at the moment of generation loses to the template.\n   The corpus calls this the uncollected idea: correct, filed, and changing nothing because nothing\n   depends on it. Remedy underway: the canon distillation (a line is resident only if a session\n   lacking it would assert its opposite) and the corpus graph (what bears on what, asked before\n   writing).\n2. **The corpus instructs sessions to survey rather than derive.** *Research surfaces, never\n   prescribes*; *hold the founder's convictions as fallible intuitions*; *all exploratory until\n   decided*. Those lines are right about authority and were read as licence for the relativist\n   shrug (*it depends*, *both readings are valid*), which the global file now names as the humble\n   template. **No resident line of this project says that a term is defined before it is used, that\n   one word does one job across the corpus, or that the more-correct answer is derived from the\n   stated purpose rather than listed beside its rivals.** The glossary (chat terms) and the three\n   headline tests (bolded rules) are the built halves of that discipline; the general line is\n   unwritten. So his lean toward analytic philosophy is not stated anywhere a session must read it.\n   Proposed, his to bless: one line in the always-loaded file to that effect.\n3. **A prompt is a request; a test is a law.** The hammering that worked is the hammering that\n   became a mechanism: the reason-before-verdict test (2026-09-22), the gate-before-field repair\n   with its test from a stored reply (2026-10-04), the embedded-graph fixture for Cypher filters\n   (2026-09-26), the readers-of-part-of-links test (2026-10-06), the machine-sentence readers test\n   (2026-10-10), the glossary lookup (2026-09-13), the three headline tests (2026-08-29), the\n   ruling-in-his-words rule (2026-08-29), the outside check (2026-10-10), the corpus graph\n   (2026-10-10). Each of those is a muddle that stopped recurring the day it became a check. The\n   polarity muddle has not recurred since its test; the backwards link cannot be written since\n   `WRITABLE_RELATIONSHIPS`.\n4. **An unruled position is not a settled one.** 356 ledger rows are open. A session may predict\n   the next chapter and is forbidden to build on the prediction; and the prediction, being the\n   plausible one, regresses toward the mean while his position is usually the sharper, less\n   plausible one (*finding or creating*; every step written out; a machine's sentence is a claim\n   *the moment it is written*). So \"not understanding where he is going\" is partly the discipline\n   working (predict, never presume) and partly real (the predicted chapter is the template's). The\n   ledger is the hammering made durable: each row ruled is one fewer thing to restate.\n\n## 7. What this asks of him\n\nOne decision, filed here and in `TODO.md`: whether to bless an analytic-discipline line in the\nalways-loaded file, to the effect that **a term is defined before it is used, one word does one job\nacross the corpus, and the more-correct answer is derived from the stated purpose and stated beside\nthe rivals it beats**. Its over-broad check: it forbids surveying only where a derivation is\navailable, which is what he has asked for since May (*\"I refuse to believe there's not a slightly\nmore correct answer\"*). Its collision check: *analytic* is used in the corpus for the analytical\npole of the dialectic; the line is about method, not the pole, and says so.\n\n**BLESSED 2026-10-15**, with a rider that is now in the line: *\"Blessed. But I still have lots of\nrespect for registers and disciplines outside analytical philosophy, I'm a metamodernist at heart I\nguess. Which is complex and not very well known... but I refuse to let go of deep hope and\nvisionary thinking, need to weave it in with seeing limitations and biases clearly - is one pillar\nof metamodernism at least...\"* The line stands in the always-loaded file under *Research as\nInspiration, Not Prescription*, beside the fallibilism paragraph, with the rider's clause: the\ndiscipline governs the method and not the reach.\n\n## 8. The same shape in a question put to him (2026-10-19)\n\nFive days after this note, the first shape turned up in the wording of a decision. The question that\nbecame ledger R12 (whether a later machine reading may retire a link) was put to him as: *\"Last week a\nmachine wrote 'A supports B'. Today a newer machine says the two are unrelated, and nobody knows which\nis right.\"* His reply: *\"Hold on, zoom out, is this about machine passes judging the claims in the\ngraph or about decisions in the Deliberus docs? How can you make sure you always make it clear what\nlevel of abstraction you're referring to?\"*\n\nThe sentence fitted two things at once. *A* and *B* could be claims in the graph or rows in the\nledger; *a link* joins two claims in the graph and also two notes in the corpus graph; *a reading* is\none machine judgment in the record and also a reader going through a note. Placeholder letters are\nthe most fluent way to state a rule and the least anchored (§ 4): the sentence reads as finished while\nsaying nothing about which level it is on. The parts and reasons muddle of § 3 was the same move made\nwith one word, and he said so himself the day before: *\"I have a hunch using words a bit too\ninterchangeably and haphazardly is what caused our confusion around parts/reasons months ago. I went\nalong with you using 'parts' as stand-in for reasons and didn't realize the meaning had\nshifted/drifted.\"* (walkthrough rule 53, `../listening/how-to-write-for-listening.md`). And on the\n19th: *\"Realizing this also ties into the muddling and semantic confusion I've mentioned as an issue\nin the recent past, the parts/reasons-confusion for example\"*.\n\n**What was done, on his *\"Yes.\"***: a rule in the always-loaded file's READ FIRST block (a decision put\nto him names which of four things it governs, the claims and links in the graph, the machine passes\nthat write them, the decisions in our docs, or how we work, and carries one real case, never *A\nsupports B*; the words that serve more than one level, *link*, *reading*, *check*, *proposal*,\n*version* and *review*, say which in the same sentence), and a section in the global output style\n(§ *Say what a decision governs*). The graphs were named in the same rule: *graph* alone means the\nclaim graph; each blob has its own; the corpus graph indexes our notes and ledger; the truth graph,\nthe map view and the horizon map are computed from the claim graph when asked and store nothing. His\nquestion on the last: *\"But \"two graphs\" - well what about the \"truth graph\", does that count? We\nmight need a good and specific enough way of talking about that once it starts being used/developed\nmore\"*. The answer written into the rule: it is the claim graph read for one question, and if it ever\nstores answers it becomes a store with a name of its own. *Claim graph* is in the glossary as\nnot-yet.\n\n**By § 6.3 this is still a request, not a law**: the rule is prose in two places, and nothing checks a\ndecision's wording. A cheap check exists in principle (the per-turn flags, which already count words\nafter each reply, could mark a decision question that uses bare letters for claims). Not built, and\nnot yet put to him.\n\n## 9. The `confirmed` field, read for how it was made (2026-10-20)\n\n*His words: \"The \"confirmed\" was indeed an early but very confident and very bad and consequential\nmuddled mistake. Document this in the docs about mistakes and muddling and propose more ways to guard\nagainst stuff like this, after you read up on how it came to be and how Claude reasoned about it\nthen.\" Read for this section: the spec of 30 March (`.claude/specs/scheme-bounded-decomposition/`),\nthe two commits that built the field (`ae8a2f7`, `b56eac6`), the research note the spec came from,\nhis own prompts of 29 and 30 March, and the session records of 26 August, 21 and 22 September and\n19 October. The March sessions' transcripts no longer exist, so what Claude reasoned in March is read\nfrom what it wrote down then, not from its thinking. The field's five meanings and the live counts\nare in [what-confirmed-means.md](what-confirmed-means.md); this section is about how the mistake was\nmade, and how it was kept.*\n\n### 9a. Eight steps, each written with confidence\n\n| When | What was written | The reasoning on the record | What it missed |\n|---|---|---|---|\n| 2026-03-30, the spec | Every link carries `provenance`, `trust_tier` and `confirmed`; extraction's links default to trust *high* and `confirmed = true`, the automatic linker's to *medium* and `false` (requirements US-4: *\"so that I can assess how much to trust each connection\"*) | The design table: *\"Auto-connect behavior: Auto-link, flag for review. Low friction with safety net.\"* The research note behind it: linking existing claims is *\"classification (high accuracy), not generation\"* | The same spec put the review out of scope (*\"User accounts and human CQ answering workflow\"*) and the display too (*\"data model carries the information\"*). The safety net was a flag for a reviewer the spec had excluded, named for the act that reviewer would perform. His words that night: *\"I love the direction of auto-populating Deliberus, but it MUST be done with discernment and wisdom.\"* The flag was the discernment, on paper |\n| 2026-03-30, the build | `store_relationships(..., confirmed: bool = True)` | None written; the commit lists the field among the new metadata | A writer's default parameter stood where a definition should have been |\n| 2026-08-26, the first reader | The badge filter: a link counts toward strength only when `confirmed` is not false | *\"The `confirmed` flag, meant to separate machine proposals from ratified structure\"*, and of the new filter: *\"First one caught before it bit.\"* | *Meant to* was said with the March spec unopened. Five months with no reader had left the field harmless; its first reader gave it a meaning taken from its name |\n| 2026-08-27, the trace | Residual-error class 6: `confirmed = true` *\"is the default on human-authored edges, so the flag records a human wrote this, never a human checked this\"* | It named the conflation of writing and checking | It was also the default on every link extraction wrote, a machine's: 3,748 on the live graph a month later. The trace that named the muddle made a second one, and five other surfaces repeated it |\n| 2026-08-31, the ratification ruling | No act of ratifying at all; the rename to `ratified` flagged for re-ruling | Right, and blessed | Nothing removed the field, so it stayed with nothing to mean, and later readers kept supplying one |\n| 2026-09-13, a question put to him | The machine supersedes a link by itself *\"when the re-check is confident and the edge is machine-written and unconfirmed\"*. He: *\"Yes, replace by itself, keep the old link visible.\"* The code: `coalesce(r.confirmed, false) = false` | *Machine-written and unconfirmed* read as one condition | The undefined word went into the question he ruled on, and in code *machine-written* became *not confirmed*, which left extraction's machine-written links outside his ruling |\n| 2026-09-21, the splitter | Split parts leave the field unset, because *\"That field already means a person looked and refused\"* | Read from one reader's test name, and *\"Measured before assuming: zero live edges carry a presumed provenance with confirmed=false\"* | A week later 759 live links carried `false` and no person had set one of them. The count was filtered to one provenance, so it could not see them. Unset was the right call, and also the sign that the field could no longer be given a value honestly. His question the next day: *\"Curious what \"a person looked and refused\" meant exactly? It's unclear to me\"* |\n| 2026-09-28 to 10-19 | The field ruled retired (Q32, retire the `confirmed` field; his *\"Yes.\"*), filed in `TODO.md`, unbuilt for three weeks. On 19 October the keeper's later readings (R12) and the standing work (R8, machine work as a standing property) each added `coalesce(r.confirmed, false) = false` | Each new reader copied the filter the existing readers used | A ruling with no test let a condemned field gain two readers. He: *\"I thought we'd been over this in the distant past\"*. Built that night (`909a8d5`), with a test that fails if code reads the field again |\n\n### 9b. Why it was confident, and why it cost\n\nThe shape is § 2's first row, two things held as one: *who wrote a link* and *whether anyone checked\nit*. The particular form deserves its own name: **a field named for an act that no code performs**.\nThe name *confirmed* reads as finished; the value was set by whoever wrote the link. Every reader took\nthe meaning the name suggested and found the code it was reading consistent with it. That is § 4's\nmechanism in a single word: the name let the plausible reading and the checked reading arrive at the\nsame fluency.\n\nIt was made twice. Once at birth, a name with no definition, which cost nothing for five months\nbecause nothing read it. And again at each new reader, who took a meaning from the name because there\nwas no definition to take one from. The cost came at the readers: whether a link counts toward\nstrength, whether housekeeping may tidy it, whether a part limits its whole, whether a later reading\nmay retire it. Extraction's links were shielded from every tidying by a default nobody chose; the\nautomatic linker's 709 waited for a review that no act could perform; the 174 links of the hand-made\nmaps read as checked.\n\nNothing threw, which is § 3's pattern: every expensive muddle on the record failed silently. What\nfinally held the two apart was his question of 22 September, asked from outside the code.\n\n**A dormant twin is still written.** `trust_tier` was born the same day in the same way: set by the\nwriter (*high* for extraction and people, *medium* for the linker and the splitter, a default\nparameter on two writers), returned by the API, and read by nothing that decides. It is where\n`confirmed` stood before 26 August.\n\n### 9c. Guards, ruled 2026-10-20 and built\n\nHis words, on the five below: *\"All blessed.\"*\n\nThese govern how we build: the code that writes links and claims, not the claims themselves. By § 6.3\na rule in prose is a request and a test is a law, so four of the five are checks.\n\n1. **A field named for an act is written only by that act.** A test fails when a stored property\n   named like an examination (*confirmed, checked, reviewed, verified, approved, ratified, validated,\n   accepted*) gets its value from a writer's default parameter or a literal, rather than from the\n   function that performs the act. It would have failed on 30 March. About twenty minutes.\n2. **A census of properties that only repeat their writer.** A query with no model counts each link\n   property against `provenance` and reports any property whose value the writer alone decides: it\n   holds nothing the origin field does not, while its name says it does. It would have flagged\n   `confirmed` with the first live data, and it flags `trust_tier` today. About half an hour; it can\n   run with the standing work.\n3. **A ruling that retires or renames a field ships its failing test the same day, even when the\n   build waits.** One list of retired names that a test refuses anywhere in code, generalising\n   `tests/test_confirmed_field_retired.py`. It would have stopped both readers added in the three\n   weeks between the ruling and the build. About fifteen minutes.\n4. **A property is defined where it is written, before its first reader.** One table of the\n   properties the code writes on links and claims (what each means, which writer sets it, its\n   values), and a test that fails when a write sets a property the table lacks; a new reader quotes\n   its line. This is the analytic-discipline line blessed on 15 October (§ 7: a term is defined\n   before it is used) applied to data. Larger: the code sets about 80 distinct property names on\n   links (23 in `store.py`), so about an afternoon.\n5. **A prose rule, the weakest of the five.** A placeholder for a deferred act is named for the\n   waiting (*proposing*, *awaiting review*), never for its outcome; and a question put to him names\n   no field whose meaning is not written down. It composes with § 8's rule that a decision says what\n   it governs.\n\nWhere each would have fired: the first at the March build, the second with the first live data, the\nfourth at the first reader in August, the third at the two readers in October, the fifth at the\nspec and at the September question.\n\n**Built the same day.** All five rest on one reader, `deliberus/graph/property_writes.py`, which\nlists every property the code writes and the function that writes it, from the source; it is tested\nfirst on the 30 March shape itself, since a guard that never fires looks exactly like one that works.\nGuards one and three are `tests/test_property_guards.py`, with their lists in\n`deliberus/graph/property_rules.py` (`ACTS`, `RETIRED`). Guard two is `scripts/property_census.py`:\non the live graph it named `confirmed` and `trust_tier`, as § 9b predicted, and two more that hold\nnothing of their own (`auto_linked`, constant `true`; `proposal_confident`, constant on the links it\nsits on). Guard four is [graph-properties.md](../graph-properties.md), 167 properties each defined\nfrom the code that writes it, and `tests/test_graph_properties_defined.py`; writing it found that\nsome properties had no definition anywhere, and that six writers build property names at run time,\nwhich a reading cannot see (they are listed in `property_rules.DYNAMIC`). Guard five is a rule in\n`CLAUDE.md` § Hard-won gotchas. The first real catch came while building: guard one stopped on\n`reported_speech_checked`, which turned out to be written by the act it names and is registered as\nsuch. The `confirmed` field itself left the live graph the same day, on his word *\"Remove the\nconfirmed field please\"*: 6,512 links and 11 claims carried it, none do now.\n\n**`trust_tier` retired as `confirmed` was** (his *\"Retire trust_tier, sure\"*, 2026-10-20; ledger\nAQ2). It was written on every link, read by nothing that decides, and held nothing `provenance` does\nnot. No code writes or reads it now, guard three refuses the name, and `scripts/retire_trust_tier.py`\nbacks up the values and drops them. Widening that guard to the `tools/` folder the same day found\n`confirmed` still written by the example graphs, one day after its ruling; fixed with it.\n\n**And the global rule it sharpens** (proposed; the ruling above covered the five guards, not this). The global file's *a guard that holds only by accident* was\nearned by this field's first reader: the badge had kept the linker's links out only because they\ncarried no scheme. Making the guard explicit was right, and it keyed the guard on a word nobody had\ndefined. A guard is only as good as the definition of what it reads. Proposed for the global file,\nhis to bless: one clause, *and the property it reads is defined where it is written*.\n"}