{"path":"research/session35-the-verification-night.md","content":"# Session 35: the night things were measured rather than remembered\n\n**Date**: 2026-09-21 → 22 · **Type**: session record · **What it was**: a sameness bug fixed in the\ncode after eight days in the canon, two months of open loops checked against the running system, the\nledger read end to end, two propose-only passes built, and a live Facebook thread mapped into the\nfirst blob that is not a community's.\n\n---\n\n## 1. The reversal that was sitting in the prompt\n\nThe canon has said since 2026-09-13 that **sameness is decided before any relation is written**. The\nprompt said the opposite, out loud, and had all along:\n\n> *\"if the two claims assert essentially the SAME proposition, still classify the propositional\n> relation (usually supports)\"*\n\nThe founder's reaction on being shown it was two words — *\"and fix this pls?!\"* — and the fix\nreversed a build-time decision rather than filling a gap, which is the distinction worth keeping:\nthe instruction that wrote the 14 false links retired earlier that month was **live and deliberate**,\nnot an omission.\n\nWhat shipped: `same` is asked at step 0 and stops there · a `same` verdict writes **no propositional\nedge** and marks the pair `merge_candidate` on its `SIMILAR_TO` link, where the sameness sitting can\ndraw it (the sitting was built and had no machine input) · the stance check survives, re-aimed, so\n`same_fact_opposite_use` rides onto the merge candidate — the Wall pair's lesson, that propositions\nagreeing never meant the authors do.\n\n**And one thing found while fixing it**: `SIMILAR_TO` could never reach a badge, but only because\nthose edges carry no scheme. Now that auto-connect writes properties onto them it is named in the\nexclusion list beside `REPORTS` — the satisfied-by-accident shape, caught before it bit.\n\n---\n\n## 2. Two months of open loops, measured rather than re-read\n\nFounder: *\"Review everything going back two months… are they still unruled/open?\"*\n\nFour items had closed with nobody noticing, which makes the register itself a source of false work:\n\n| Recorded as open | Measured |\n|---|---|\n| `/api/feed` returns 500 on every mode | **the section body was fully closed on 2026-08-13**; only the heading still read as live, which is enough to make a reader treat it as a P0 |\n| the scheme confession channel is unverified | **it fires** — and the count moved 43 → 70 within hours, which is why the figure now cites its query |\n| sameness before relation | built that night |\n| `frontier.md` is back at its cap | **2,774 words, 226 of headroom** — the stale-gate item had itself gone stale, which is the class it was filed to catch |\n\n**The heading lesson generalises**: a closed body under a live heading reads as open to every future\nscan, and nothing in the corpus checks headings.\n\nStill open, with numbers: the stance field on **0** claims · concept tagging never backfilled ·\n**197 of 197** decomposition edges untagged · `count_safe_summary` still uncalled.\n\n**New**: `/graph/stats` cannot see `REPORTS`, `ANSWERS`, `ABOUT` or `EXTRACTED_FROM`, because its\nquery filters a `group_id` those edges never carry. `REPORTS` is the always-mint ruling's own link\ntype and it is invisible on the public count.\n\n---\n\n## 3. The ledger, read end to end — and what 143 actually contains\n\nFounder: *\"How would you cluster stuff into blocking fork rulings vs non-blocking ones?\"*\n\n**Pass one, mechanical**: a row blocks only if something outside the ledger names it as a\nprecondition. **21 of 143 are cited anywhere else; 122 by nothing**, and eight of the 21 are already\nruled.\n\n**Pass two**: a keyword sort left **109 of 143 unclassifiable**, so the rows do not self-declare and\ngrepping cannot do this. Reading all of them gives the shape that matters:\n\n> **The overwhelming majority are FINDINGS** — measurements and observations that change nothing\n> until acknowledged. Whole arcs are findings end to end. **That is why the pile reads as impossible\n> and is not.** Nine are genuine forks.\n\n**And a third category the register has no slot for: EXPIRED.** Two rows still count down to an\nelection that passed and a fund that closed for good. **A row can stop being a question by the world\nmoving, and nothing retires it**, so every scan re-reads them as live.\n\nThe nine forks, with what waits on each, are in `TODO.md` § The ledger's two passes.\n\n---\n\n## 4. Two propose-only passes, built\n\n### Concept tagging, sense-aware or not at all\n\nThe backfill half of the 2026-08-30 ruling. **The polysemy guard is the whole design**: a tag whose\nsense is not copied *exactly* from that term's recorded list is skipped and counted, and a\n**reworded** sense is refused rather than repaired — admitting a near-miss paraphrase would mint a\nnew sense, which is the concept layer corrupting the exact distinction it exists to preserve.\n\nMeasured before building: 1,428 untagged substantive claims, 92 concepts holding 160 senses, and\n**785 claims carry a concept term lexically while 643 do not**. The 643 are reported rather than\nhidden — the substring matcher's limit, not a finding about those claims.\n\n### What a decomposition's parts are, and how much the whole rests on each\n\nMeasured first, and it is the finding the build rests on: **nothing in the codebase had ever written\n`support_semantics`**, and 197 of 197 live decomposition edges are untagged. The arithmetic was\ncorrect and running on a default rather than on anything judged.\n\n**Five answers rather than the ruling's three**, and the deviation is deliberate so it is a proposal.\n`alternative` already exists in the schema and is a real case, so offering only\nnecessary/corroborative/miscast would force every alternative-support decomposition into a wrong\nneighbouring cell — the closed-enum-without-an-exit failure this corpus has now measured twice. Plus\n`does_not_fit` with a required reason.\n\n**A second, model-free detector runs beside the model** and both readings are recorded. Alone on all\n197 edges it reads **77% unclear, 19% part, 3% evidence item** — an honest second opinion rather than\na classifier. Where the two agree the proposal is stronger than either; **the disagreement rate is\nthe calibration signal**, the alternative being a model marking its own homework.\n\n### The full run, 197 edges, 53 minutes — and it is two defects rather than one\n\n| Who wrote the edge | n | mean relevance | genuine parts | miscast as parts | fits nothing |\n|---|---|---|---|---|---|\n| `auto_connect` | 84 | **0.17** | **0** | 36 | 48 |\n| `split` | 44 | 0.42 | **30 (68%)** | 4 | 10 |\n| `human` | 39 | 0.32 | 9 | 18 | 12 |\n| `extraction` | 30 | **0.49** | 6 | **20** | 4 |\n\n**Defect one — auto-connect writes non-relations.** Of 84 edges, **not one is a genuine part**, and\nmean relevance is 0.17. (⚠ corrected 2026-10-07: these links were stored premise first, so the judge was asked whether a conclusion is a piece of its premise; the zero records that, and says little about the pairs, of which 16% held no relation when read again: `auto-connect-upgrade.md` § 2c) The relatedness gate ruled the same day fixes this going forward; the\nexisting 84 are the retirement case under the already-ruled re-check rule.\n\n**Defect two — extraction writes evidence as parts, and it is a different problem.** Its edges have\nthe **highest** relevance of any provenance (0.49) and **20 of 30 are miscast**: the child genuinely\nbears on the parent, it simply is not a piece of it. **The gate does nothing for this**, because\nthese pairs are related. Only the kind judgement catches it, and it is the original\nparts-versus-evidence hypothesis arriving with a provenance nobody suspected.\n\n**And the splitter validates.** `split` is the only provenance that mostly writes real parts — 30 of\n44, against 0 of 84 for the pass that guesses. The machine cutting one sentence into its pieces is\ndoing a different and evidently better-founded job than the machine guessing a relation between two\nsentences somebody else wrote, which is what the trust ladder assumed and had not measured.\n\n**The two detectors disagree on 9%**, with 77% no-signal. The model-free reading is mostly silent,\nso agreement carries less weight than the design hoped, and the disagreeing 18 edges are the ones\nworth a human eye first.\n\n---\n\n## 5. The finding that only appeared when the arithmetic was written\n\nThe relevance proposal exists to answer the founder's attack-proofness worry: as shipped, **one\nirrelevant part added by anybody caps its whole at 0.75** and the defender must argue it away, so a\nsaboteur pays one contribution and the defence pays an argument.\n\nWriting the arithmetic surfaced what the design conversation had not:\n\n> **The defence works by LOOSENING caps, and loosening is the flattering direction** — the one this\n> module's own comment names as dangerous, because failing to presume a part constitutive makes its\n> whole read *stronger*.\n\nThree bounds make it proposable rather than obviously wrong, and each is load-bearing:\n\n1. it can only ever **lower** a cap, never raise one above what provenance earned;\n2. an **unconfident** reading changes nothing — without that guard a hesitant pass quietly loosens\n   every cap in the graph;\n3. the **argued** channel still only raises, so a good part wrongly scored low is restored by one\n   argument.\n\nThe residual cost, stated rather than hidden: **until somebody argues, that good part's cap is\nsuppressed.** Default off (`DELIBERUS_RELEVANCE_PRESUMPTION`), the same discipline as fair-share\ndiscounting.\n\n---\n\n## 6. A live thread, and why it went into a blob\n\nThe founder asked for a public Facebook thread to be extracted. It went into a blob rather than the\npublic graph, which he had not asked for and which is flagged as an unasked call.\n\nThree parts to the reasoning: four of the six speakers are **private individuals** commenting under\ntheir own names, and the exposure inversion that makes mass mapping fair for published authors does\nnot reach a commenter · a public extraction is **wider than the room the words came from** (front\npage, feed, sitemap, crawlers, at claim granularity with attribution) · **two lines are\ninflammatory** enough that minting them as standing attributed claims is a founder decision.\nPromotion is one ruling and a re-run; the other direction is not reversible once crawled.\n\n**The extraction itself came out well**: 204 claims from 1,696 words, **125 supports against 120\nattacks** — genuinely adversarial — 118 questions, and **55 reported-speech links**. Attribution\ndistinguishes *\"Daniel Kokotajlo (cited by Giego Caleiro)\"* from Caleiro's own claims, which is the\nalways-mint machinery on a thread that is largely second-hand positions, and the best live exercise\nit has had.\n\n**Zero decomposition edges.** On conversational material the pipeline produces only supports and\nattacks, which makes the parts-versus-evidence question almost entirely theoretical in the live\ncorpus today — the miscast would need decomposition edges to exist before it could be miscast.\n\n---\n\n## 7. Two process corrections worth keeping\n\n**A pipe hid a success and I read it as a stall.** The thread extraction ran with `| tail -40`, which\nbuffers until the process ends, so its output sat at zero bytes throughout. Long elapsed time plus\nzero output read as wedged; it had in fact completed the full eight-pass pipeline and stored\neverything. **Zero output through a buffering pipe is evidence about the pipe, not the process** —\nthe same shape as attribution-before-evidence, one layer down.\n\n**A timestamp gap makes a small discrepancy unresolvable.** A decomposition-edge count moved 194 →\n197 within the session and could not be explained, because **only `split` edges carry `made_at`** —\nextraction, auto-connect and human writes record none. The graph cannot say when an edge was made.\nThat is the finding; the +3 is not recoverable.\n\n---\n\n## Cross-references\n\n`TODO.md` § Verification pass 2026-09-21, § The ledger's two passes ·\n[unweighed-answers-two-months.md](unweighed-answers-two-months.md) (the register this session's\nreading produced) · [auto-connect-upgrade.md](auto-connect-upgrade.md) § 2c (the sameness build) ·\n[weakest-link-arithmetic-and-the-merge-hunch.md](weakest-link-arithmetic-and-the-merge-hunch.md)\n§ 9e (the attack-proofness question the relevance pass answers) ·\n`deliberus/decomposition_judgement.py`, `deliberus/concept_backfill.py` (both propose-only) ·\n`.private/blobs/ai_safety_threads.md` (the membrane)\n"}