{"path":"research/auto-connect-upgrade.md","content":"# Auto-Connect Beyond Cosine: Four Upgrades\n\n**Date**: 2026-08-20 · **Status**: designed, built, tested (1,250 passing); live in code, exercised at next extraction (extraction currently paused). Founder mandate: *\"document and then implement all of your suggestions.\"*\n\n## §1 The measured failure this answers\n\nRun 6 (the Israel/Palestine pair): claim-level cosine produced **402 within-debate candidates against 4 for the entire rest of the corpus, zero at the auto-link threshold** — cosine measures vocabulary, cross-domain kinship is structural. And the corpus-wide facts: 56 SIMILAR_TO edges across 4,768 claims (claim-layer reuse near-absent) against 509 concept usages (concept layer healthy). A supply-side-filled graph with this linker becomes an archipelago ([incentives-analysis.md §6b](incentives-analysis.md) gate 1).\n\n## §2 The four upgrades\n\n### 2a. Concept-route candidate generation (`candidate_generation.concept_route_candidates`)\nCandidates from claims sharing a Concept node across sources — routing through the layer where reuse actually lives. **Polysemy guard** (the cost-curve safety condition): sense-stable concepts (≤3 distinct senses) route freely; polysemous concepts route only SAME-SENSE pairs, because linking across senses of a polysemous concept is how false agreement gets manufactured (measured anchor: \"public good / welfare\" 13 usages/2 senses routes freely; \"intelligence\" 17/4 routes same-sense only). Measured pool before building: **129 cross-source concept-sharing pairs** in the current corpus, via 4 bridging concepts.\n\n### 2b. Structural-kinship candidate generation (`candidate_generation.structural_kinship_candidates`)\nThe deterministic first rung of the meaning-graph-alignment ladder ([retrieval-instruments-beyond-cosine.md](retrieval-instruments-beyond-cosine.md)): a claim's signature = the multiset of (direction, edge type, scheme) over its incident scheme-bearing edges plus claim type; kinship = weighted Jaccard. Explainable by construction — the shared atoms ARE the explanation — zero model calls, computed over the 2,167 edges carrying scheme lists. Full LLM-side alignment remains the research tier above this.\n\n### 2c. Write-time stance guard (`stance_guard.py` + classifier stance check)\n`stance.py` finds same-fact-opposite-use *after the fact*; the guard prevents the flattening *at write time*. Before auto-connect stores an agreement edge: near-identical pair (cosine ≥ 0.80, same constant as the instrument) across a documented adversarial pair → `stance_caution='same_fact_opposite_use_candidate'` on the edge; reported-speech asymmetry across an adversarial pair → its own caution. The classifier prompt also gained a stance check (rule 7 + a `same_fact_opposite_use` boolean): classify the propositional relation, AND flag the opposite-roles signature — the propositions agreeing does not mean the authors agree. Propose-only: the caution travels WITH the edge; nothing is blocked or rewritten, because suppressing the propositional relation would be its own flattening.\n\n**Lexicon discipline honored, one real gap found by a real fixture**: the verbatim Econlib claim (\"A majority of economists *believe that*…\") does not match the brake's shared reported-speech lexicon — and `reported_speech.py` had already found, documented, and DECIDED this (\"deliberately a separate lexicon, not a widening of the shared one… widening a pattern list in place is how one instrument silently retunes another\"). A first attempt widened the shared lexicon anyway and broke a stance-instrument test within seconds — the recorded decision was right. The guard now composes the two lexicons in the consumer, per that decision.\n\n### 2d. Cross-source implicit-premise pass (`cross_source_premises.py` + operator script)\nThe pass the pipeline never had: the existing implicit-premise pass is within-argument by design (its necessity filter deliberately excludes cross-source background), while the sharpest extraction finding is that **the crux of a real debate is implicit** — in run 6 unwritten on both sides, and supplying it found the opposition at 0.80. This pass reads an adversarial source PAIR and proposes the unstated premises one side needs and the other contests (classificatory premises, default premises, scope premises — the measured shapes).\n\n**Governance, per the graph-daemon tiers**: minting is propose-only territory. `propose_bridging_premises` returns proposals and writes NOTHING; storage is a separate explicit act (`--write` on `scripts/propose_cross_source_premises.py`), and everything stored is proposal-grade: `claim_kind='implicit'`, `confirmed=false`, `provenance='cross_source_premise'` — asserted by nobody, countable as such by the asserted-vs-minted split. One LLM call per pair, operator-invoked, never pipeline-automatic (spend gate; also quota-gated until the Google account clears).\n\n## §2e Measured on the real corpus before shipping (read-only, zero LLM calls)\n\nOn the run-6 con-side source (`no-israel-does-not-have-the-right-to-self-defense-in-int`): cosine 182 candidates (35.2s), concept_route 21 (0.1s), structural kinship 244 (0.7s) — merged 435, **of which 253 are pairs cosine never surfaced** (58% of the pool is new). The concept-route samples arrive via the shared concept `self-defence`, which is exactly the layer the corpus said reuse lives in. A wider sweep (4 further sources retained from a full-corpus run: the UBI pro/con, the American Prospect wage piece, the wisdom-of-the-crowd article, the game-theory text) held the pattern at **76% never-surfaced-by-cosine in aggregate** (887 of 1,171 merged candidates; the wisdom-of-the-crowd source peaked at 98%). **Precision was then measured WITHOUT quota, by hand** (run-3F method: a frontier model classifying a stratified random sample, 6 pairs per generator, seed 42, run-6 source): cosine ≈ 4.5–5/6 genuine logical connections; **concept_route ≈ 6/6** — including surfacing a real inter-source doctrinal crux (the Wall Opinion's state-against-state reading of Article 51 against the no-restriction-on-who-attacks claim); **structural kinship ≈ 3.5/6 with a diagnosed failure mode**: claims with a single incident edge carry near-information-free signatures and scored spurious 1.0 matches against absurd partners (a legal-doctrine claim \"matched\" a thermostat seed claim). Fix shipped same hour: a minimum-signature-mass gate (≥4 atoms), which cut the structural pool 244 → 78 by removing exactly the information-free tail. Hand precision is a quality CEILING measurement (frontier judge, small n) — cheap-model precision under quota remains the production question. Side observation: the legacy cosine generator's per-claim subqueries make it 50–350× slower than both new generators; an efficiency pass on it is now the bottleneck, not the additions.\n\n## §3 Design gates answered\n\n- **Does this flatten contestation?** 2a/2b only ADD candidate pairs for the classifier to judge — they cannot flatten. 2c exists to *reduce* a known flattening. 2d mints — the flattening risk of minting is the phantom-asserter problem, answered by the always-mint provenance rules (labeled, unconfirmed, non-propagating-by-confirmed-flag).\n- **Confession channels**: every candidate carries `generator` provenance, written onto edges (`r.generator`, `r.via_concept`, `r.stance_caution`) — a reader can always ask why two claims were ever compared, and the caution travels with the data. Per-generator counts print at each run; `scripts/measure_auto_connect_generators.py` measures yields read-only against the real corpus.\n- **The April-2026 silent-regression shape stays impossible**: the cosine path is untouched; the new generators fail OPEN (an erroring generator logs and contributes nothing, never blocks).\n- **Known limitations, logged not hidden**: the reported-speech signal is an English lexicon (misses Swedish and authorial-distance phrasings — the documented register ceiling); structural signatures are only as good as scheme coverage; the premise pass's LLM judgment is subject to the free-tier fallback chain's quality degradation.\n\n## §4 What was deliberately NOT done\n\nThe 0.80 threshold was not retuned (fitting the instrument to its motivating example — the warned-against move); full meaning-graph alignment stays the research tier above 2b; the premise pass was not wired into the automatic pipeline (propose-tier work stays operator-gated until ratified).\n\n## Cross-references\n\n[dogfood-run-6-israel-palestine-cross-domain.md](dogfood-run-6-israel-palestine-cross-domain.md) (the measured failure) · [incentives-analysis.md §6b](incentives-analysis.md) (cluster ingestion, gate 1) · [retrieval-instruments-beyond-cosine.md](retrieval-instruments-beyond-cosine.md) (the per-population instrument argument) · [lowering-the-cost.md](lowering-the-cost.md) §6 (the polysemy safety condition) · [the-load-bearing-unsaid.md](the-load-bearing-unsaid.md) (why the crux is implicit) · [graph-daemons-design-space.md](graph-daemons-design-space.md) (the propose-only tier) · [self-similar-decomposition-and-claim-ontology.md](self-similar-decomposition-and-claim-ontology.md) (always-mint provenance rules)\n"}