{"path":"research/weighing-answers-and-the-badge-threshold.md","content":"# Weighing answers, and a badge that waits for weighing\n\n*2026-10-24. Built the same day on his word (ledger Q3, *weigh answers, never count them*, and his idea of a\nbadge threshold). What is here: why the counted answers had to go, the hole the first build fell into, how the\nlowest tier was read off the row's own scale, and what is still open. Code: `deliberus/graph/badge_inputs.py`\n(`weigh_answers`, `weighed_contributions`, `BADGE_MIN_WEIGHED`); tests: `tests/test_answers_weighed.py`;\nmeasurement: `scripts/measure_first_nudge.py`.*\n\n## 1. How the question arose\n\nThe maps had just stopped showing the badge words that only say nothing has been weighed (*no data*,\n*unexamined*), on his word: *\"There's no easy way for users to contribute/examine right now in the UI and ppl\naren't actively using the site, so just hide the label for stuff like this for now, it just clutters the UI.\"*\nCounted that afternoon, not one of the 556 claims on the Swedish and English institute maps and the\nAI-governance map was weighed. He then asked: *\"This is also clearly a spectrum, right? How much does\nstrength/relevance nudge this after the ONE initial interaction by a user?\"*\n\nMeasured on the live strength code in a throwaway graph (`scripts/measure_first_nudge.py`): a vote, a new\nreason, any *no*, and a *yes* about the link itself all moved nothing; a *yes* to a question about the reason's\npremise moved its claim to 0.506; ten premise and ten link yeses reached 0.793, **counted alike whoever gave\nthem**.\n\nHis reply set the problem:\n\n> *\"Wait, yes/no responses like that, where'd they come from in the UI? That feels like a way to vote (which we\n> don't like) without voting. Ample opportunity for gaming. What would balance this better? Ideas?\"*\n\nThey come from the claim page's *Answer this question* box: a sentence and a Yes or No pill (`POST\n/claims/{id}/answer-cq`). Each answer added a fixed push to its question's pole, whatever it said. That was the\ncounting rule his ruling of 2026-09-28 had already turned against (ledger Q3: *\"It feels rather obvious that the\nanswers should move the link's strength in proportion to how well supported it is. But here we also ... need to\nconsider the *relevance* as well\"*), and nobody had built the ruling. He said build it: *\"Build Q3 (answers\nweigh by their own strength times relevance) and one answer per account per question.\"*\n\n## 2. What was built\n\n- **An answer moves its pole by its own standing times its relevance**: `EVIDENCE_SHIFT × relevance ×\n  (strength − 0.5) / (lowest tier − 0.5)`, capped as before. Relevance is read as for any link\n  (`relevance.read_relevance`): an argued relevance claim, a confident machine reading, else the presumption for\n  who wrote the link (0.5 for a person's).\n- **One account counts once per question**, by its latest answer, whichever pole it took. An answer with no\n  account counts as its own.\n- **An answer attacked below neutral drops out** (Q34, *a reason that fails drops out*).\n- The weighing runs after gathering (`weigh_answers`, called from `attach_flow_inputs`), so every surface that\n  computes a badge, orders questions or checks slicing stability reads the same weighed poles.\n\n## 3. The hole the first build fell into, and the lowest tier\n\nThe first build let an unweighed answer move nothing: a bare *yes* would then be a record of who holds what,\nwhich fits the canon line that bare judgments are telemetry. **It made the whole strength layer dark.** Ten\nanswers left a claim unexamined, because examination has to start somewhere: an answer's support is a reason, a\nreason weighs only once examined, and examination comes through answered questions. If an unweighed answer\nmoves nothing, nothing can ever start to count. I had told him the opposite in chat (*\"A bare 'yes' then counts\nfor nothing until someone gives it support\"*) and had to correct it.\n\nThe Q3 row already held the answer, in its own text: *\"each answer carries a direction and a proposed,\nattackable strength tier on a log-odds scale (the ACMG/Tavtigian shape: 1 / 2 / 4 / 8 points), lowest tier by\ndefault\"*. The second build read the tier as an eighth of the way from neutral to certain, which was wrong and\nleft the layer dark again (the answers' pushes fell under the tolerance below which a link counts as unmoved).\nIn Tavtigian's Bayesian reading of the gene-variant scale (2018), a point multiplies the odds by 350^(1/8),\nabout 2.08, so the lowest tier alone takes a neutral claim to **0.675**. That is the value now\n(`ANSWER_DEFAULT_STRENGTH`), calibrated so that an unweighed, fully relevant answer moves its pole as one answer\ndid before. A person's link presumes relevance 0.5, so a lone answer now moves half as far.\n\nA third correction before the tests were written: an answer with weak support computed below the tier, so\nsupporting an answer could lower it. Now an answer's reasons move it from the tier, never replace it.\n\n## 4. The badge waits for weighing\n\nHis idea, while the build ran: *\"Could we not just let the effects of all future interactions speak for\nthemselves, until the badge starts signifying something real, an accumulated effect above a certain\nthreshold?\"* The refinement he agreed to (*\"Great, do it\"*): the threshold counts how much weighing has\nhappened, not how far a claim sits from the midpoint, so a claim with much evidence on both sides keeps its\n*unsettled* word (balance is a state, P22's sibling ruling of 2026-08-23).\n\nBuilt as `weighed_contributions`: answers that moved a pole (one per account per question), reasons whose own\nclaim has standing, examined parts. The badge's older `weight` field could not serve: it counts links that moved\nat all, so one answer and twenty read 1 for both. A badge shows from **three** (`BADGE_MIN_WEIGHED`, a first\nsetting); every badge carries `weighed` and `shown`, and the frontend's `shownBadge` hides one not yet shown.\nBelow the threshold a card still shows its strength as fill.\n\n## 5. Figures after the build\n\n| One person's acts, each answer from its own account | Strength of the claim |\n|---|---|\n| one yes about the reason's premise | 0.501 (counted: 0.506) |\n| three such yeses | 0.512 (counted: 0.542) |\n| ten premise and ten link yeses | 0.622 (counted: 0.793) |\n| ten answers from one account to one question | as one answer |\n\nEight answers existed on the live graph that day, so nothing visible changed.\n\n## 6. Open\n\n- **One account can still answer ten different questions**, one each. The ruling asked for one per question;\n  whether an account's answers across one claim's questions should share a budget is not asked yet.\n- **The two numbers are mine**: the tier read as Tavtigian's lowest point, and the threshold of three. Both are\n  named constants with their reasons beside them.\n- **An unweighed card and a weighed card near zero still look alike** on the map (`ux-principles.md` P22, the\n  2026-10-24 note); the faint-track proposal was set aside the same day because no claim on the maps was\n  weighed.\n- The answers' relevance is the presumption for a person's link; no pass reads an answer's relevance to its\n  question yet.\n\n## Cross-references\n\nLedger Q3 (built) and Q27 (*answers barely move badges*, which this supersedes in practice) in\n`session26-open-rulings.md`; `docs/ux-principles.md` P22; `specs/map-view/design.md` § 3a (the quiet badges and\nthe threshold); `deliberus/graph/qbaf.py` § NEUTRAL_BAND (the measured figures); `the-yellow-link.md` (the same\nsession's other strength-adjacent ruling).\n"}