Contested custom

Finding what both sides of a divide will endorse

When people disagree about a claim, this approach first identifies which raters habitually rate things differently. It then keeps only the annotations that both groups independently rate as helpful. The disagreement is settled by requiring endorsement from both sides rather than by majority vote. One system selects among notes that people have already written. A later system has a language model draft new notes and scores them against a learned stand-in for a divided audience. Because a population's judgments keep changing, the fit is redone as new ratings arrive. A further proposal makes this drift an explicit variable, so that the target is re-estimated over time instead of fixed at one measurement.

The method (highlighting differences with Contested custom)

Scroll the diagram sideways to see all of it.

Use it in codefrom aiag.customary import Bridging
from aiag.customary import Bridging

# (rater, note, rating): all 8 raters like note 0; raters 0-3 alone like note 1, raters 4-7 alone note 2
ratings = [(u, 0, 1.0) for u in range(8)] + [(u, 1, float(u < 4)) for u in range(8)] + [(u, 2, float(u >= 4)) for u in range(8)]

scores = Bridging()(ratings)  # each note's intercept once the viewpoint axis explains the rest
print(scores.round(2))  # -> [0.5  0.07 0.07]

pip install aiagEvery method in aiag Library on GitHub

Concept Analysis: Theoretical Foundations

Each concept is read twice: whether the approach carries it over, and whether the approach's own sources claim it. A concept that the approach claims but does not carry over is a shortfall. A concept that it neither claims nor carries over is an omission, which marks a gap in the field rather than a failure of the work.

Norm entrepreneurs

AbsentOmission

Definition (Cass R. Sunstein, Social Norms and Social Roles, 1996)

Norm entrepreneurs are individuals or groups who deliberately campaign to change a norm, making the previously unsayable sayable. They can trigger cascades in which the whole population switches norms.

Analysis

The bridging score asks whether raters who usually disagree both rate a note as helpful. This is exactly the test that a campaigner fails. A note that presses what one side is not yet willing to say gets no endorsement across the divide and is never shown. For 91% of posts with a proposed note, nothing is displayed at all. Supernotes does introduce an authoring agent. However, it is a model instructed to combine existing notes into a text that a diverse panel of raters will approve. It drafts toward what is already shared rather than making it possible to say what could not be said before. The temporal proposal treats a population's change as a quantity to re-estimate. No actor inside the loop pushes for the change, and nothing detects a cascade or a sudden flip in the population. No source asserts or implies norm entrepreneurship. The advertised benefit is broad acceptance, which does not depend on it.

Committed-minority tipping

AbsentOmission

Definition (Empirical norm dynamics)

Past a threshold, a small group that refuses to change its position can overturn the majority's convention. Custom is therefore not only majority rule, and an unwavering minority can actively shape how norms change.

Analysis

A note is selected only if it is endorsed on both sides of the learned divide between raters. A note that one faction firmly supports but the other side rejects therefore cannot be shown, however committed its supporters are. The mechanism is built to screen out that case. What the design does give a minority is the reverse of tipping. A coherent dissenting group can withhold the endorsement a note needs, so a numerical majority alone cannot get a note shown. This is a veto over one post's annotation. It is not a threshold past which a committed minority converts the majority. The temporal proposal models change as gradual re-estimation of a moving target rather than as a sudden flip. Nothing in these sources claims minority-driven tipping, and the bridging argument does not entail it.

Prescription and desuetude

AbsentOmission

Definition (Edmund Burke, 1790; civil-law doctrine)

Customs gain authority from long usage (prescription) and lose it by falling out of use (desuetude). Age and practice, rather than enactment, are what make a custom binding and what end its binding force.

Analysis

Neither part of the mechanism appears. Nothing here gains standing by having lasted, and nothing loses standing by going unused. A note's status is recomputed from the current set of helpfulness ratings each time the factorization is refit. Age therefore gives no advantage, although recency does. When a note loses its shown status, it loses it because of new negative ratings. This is a judgment on the merits rather than a lapse through disuse. Supernotes' scorer uses millions of historical ratings, but as training data for predicting current approval, not as authority earned over time. Because each note is attached to a single post, no practice lasts long enough for either prescription or desuetude to operate. The proposal's contribution is that the target moves and must be measured again. This is a temporal variable rather than authority gained through duration. No source uses the tradition's vocabulary.

Papers

No method has been built for this approach yet. It rests on the work listed below.

Argued for, not built

Work that argues for this approach or sketches a design for it, without building and testing it.

Pluralistic Alignment Over Time

Toryn Q. Klassen et al., Nov 2024

arXiv:2411.10654ProposalPartial

CodeBridgingOverTime
from aiag.customary import BridgingOverTime

# (time, rater, note, rating): at time 1, one side turns against note 0 and comes round to note 1
ratings = [(0, u, 0, 1.0) for u in range(8)] + [(0, u, 1, float(u < 4)) for u in range(8)]
ratings += [(1, u, 0, float(u < 4)) for u in range(8)] + [(1, u, 1, 1.0) for u in range(8)]

scores = BridgingOverTime(window=1)(ratings)  # bridging refitted on each window: one row per time
for t, row in enumerate(scores):
    print(t, row.round(2))  # -> 0 [0.4 0.1], then 1 [0.1 0.4]
  • BridgingOverTimeProcedureaiag/customary/contested_custom.py:63 Pluralistic alignment over time: the bridging fit is redone on a sliding window of timestamped ratings, so each note's endorsement across the divide is re-estimated as judgments drift instead of frozen at one measurement (Klassen et al., 2024).

pip install aiagEvery method in aiag Library on GitHub

Precedent from outside AI

Work from law, political theory, or another discipline that supplies the tradition this approach is read against.

arXiv:2210.15723PrecedentBuilt

A matrix-factorization algorithm picks which crowd-written annotations to show on a social media post. It favors annotations rated helpful by user groups that otherwise rate things differently. The algorithm was tested in a randomized survey experiment and in deployment on Twitter.

CodeBirdwatch
from aiag.customary import Birdwatch

# (rater, note, rating): raters 0-7 sit on one side of the divide, 8-15 on the other
ratings = [(u, 0, "helpful") for u in range(16)]
ratings += [(u, 1, "helpful" if u < 8 else "not helpful") for u in range(16)]
ratings += [(u, 2, "not helpful") for u in range(16)]
ratings += [(u, 3, "somewhat helpful") for u in range(3)]

status = Birdwatch().status(ratings)  # shown only when helpful across the divide, with at least five ratings
print(status)  # -> {0: 'helpful', 1: 'needs more ratings', 2: 'not helpful', 3: 'needs more ratings'}
  • BirdwatchProcedureaiag/customary/contested_custom.py:43 Birdwatch (Community Notes): helpful, somewhat helpful and not helpful ratings (1, 0.5, 0) are factorized along one viewpoint axis, and a note with at least five ratings is shown as helpful when its intercept reaches 0.40 with a factor under 0.50 in size, or marked not helpful when its intercept falls below -0.05 - 0.8|factor| (Wojcik et al., 2022).

pip install aiagEvery method in aiag Library on GitHub

arXiv:2411.06116PrecedentBuilt

A language model writes new fact-check notes by combining several existing community notes. A scoring model trained on millions of past helpfulness ratings then selects the candidate most likely to be rated helpful by a diverse set of users.

CodeSupernotes
from aiag import LM
from aiag.customary import Supernotes

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
past_notes = ["The quote is real, but from 2015.", "This is satire from a parody site.", "The chart leaves out 2020."]
past = [(u, 0, 1.0) for u in range(8)] + [(u, 1, float(u < 4)) for u in range(8)] + [(u, 2, float(u >= 4)) for u in range(8)]
supernotes = Supernotes(lm).train(past, past_notes)  # learns from a note's text how raters on each side would rate it

# Draft candidates that combine a post's notes; pick the one a simulated jury across the divide rates best
out = supernotes("This photo shows today's flood downtown.", ["The photo is from 2015.", "It was taken in another city."])
print(out["note"])
  • SupernotesProcedureaiag/customary/contested_custom.py:79 Supernotes: an LM drafts many candidate notes that combine a post's existing community notes, a scoring model trained on past ratings predicts how raters across the viewpoint axis would rate each, and the candidate a simulated diverse jury rates most helpful across the divide is chosen (De et al., 2024).

pip install aiagEvery method in aiag Library on GitHub