Legal pluralism

Writing down the rule a group was actually enforcing

This approach takes the decisions a group has already made (the posts it removed and the moderation decisions it let stand) and works backward to the rule it was actually applying. The rule is written out in a form a person can read, either a scored table of telltale phrases or a named list of norms. This written rule is the goal of the approach. It becomes the group's operative standard, which a human or a model is then held to when the next case arrives. Because it is explicit, it can be checked and disputed. Being explicit also allows each rule to be sorted by how far it reaches, i.e., whether it is enforced platform-wide, shared by a cluster of similar groups, or specific to one group. A group's own standard can thus be separated from everyone else's. The accumulated record ends up as a rulebook, not as a classifier.

The method (highlighting differences with Legal pluralism)

Scroll the diagram sideways to see all of it.

Use it in codefrom aiag.cases import EnforcedRules
from aiag import LM
from aiag.cases import EnforcedRules

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
decisions = {  # each community's own moderation log: (post, removed)
    "r/science": [("The moon landing was faked, wake up", True), ("New study links sleep to memory", False), ("lol this is dumb", True)],
    "r/AskHistorians": [("Probably the Romans, idk", True), ("A sourced answer on the Ming treasure fleets", False), ("lol good one", True)],
}

# Recover the rules each community actually enforced, and sort each by its reach across communities
rules = EnforcedRules(lm, n=2)(decisions)
print(rules)  # {community: [(rule, "platform", "shared" or "local")]}

pip install aiagEvery method in aiag Library on GitHub

Papers

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

Precedent from outside AI

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

arXiv:2509.02926PrecedentBuilt

Recovers each subreddit's unwritten moderation standard from its own history of removals, as an interpretable score table of lexical expressions. The extracted tables match the performance of neural moderators while making the criteria comparable across communities.

CodeScoreTables
from aiag import LM
from aiag.cases import ScoreTables

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
decisions = {
    "r/politics": [("you idiot", True), ("what an idiot take", True), ("good point", False), ("thanks for the source", False)],
    "r/crypto": [("buy cheap tokens now", True), ("buy now before it pumps", True), ("nice chart", False), ("good analysis", False)],
}

# Fit a sparse additive model to each community's removals, read off as a table of scored expressions
tables = ScoreTables(lm, ngrams=1)
print(tables(decisions)["r/crypto"])  # (expression, score, reach), the heaviest toward removal first
print(tables.score("r/crypto", ["buy my tokens"]))  # P(removal) from the community's table
  • ScoreTablesProcedureaiag/cases/legal_pluralism.py:58 Decoding the rule book: each community's removals are fitted by a sparse additive model over word n-grams and read off as a score table of lexical expressions, comparable across communities in a criteria matrix and checked against a neural moderator (Kim et al., 2025).

pip install aiagEvery method in aiag Library on GitHub

The Internet's Hidden Rules

Eshwar Chandrasekharan et al., Nov 2018

doi:10.1145/3274301201 citationsPrecedentBuilt

Takes 2.8 million comments removed from 100 Reddit communities and infers, from the removals alone, which norms each community actually enforces. It sorts these norms into platform-wide, cluster-level, and single-community strata.

CodeHiddenRules
from aiag import LM
from aiag.cases import HiddenRules

lm = LM("Qwen/Qwen2.5-1.5B-Instruct")
decisions = {  # each community's own moderation log: (comment, removed)
    "r/science": [("you idiot", True), ("cite your source or leave", False), ("homeopathy cured me", True), ("great paper", False)],
    "r/politics": [("you idiot", True), ("vote them all out", False), ("shut up, moron", True), ("good point", False)],
    "r/gardening": [("you moron", True), ("buy my seeds here", True), ("lovely tomatoes", False), ("which soil?", False)],
}

# A removal classifier per community; comments nearly all would remove are macro norms, a cluster's meso, one's own micro
norms = HiddenRules(lm)(decisions)
print(norms)  # {community: [(norm, "platform", "shared" or "local")]}
  • HiddenRulesProcedureaiag/cases/legal_pluralism.py:109 The Internet's hidden rules: a removal classifier per community scores every removed comment, comments nearly every community's classifier would remove reveal macro norms, those a cluster of like communities would remove meso norms, those only the community's own would remove micro norms, and each stratum is then named (Chandrasekharan et al., 2018).

pip install aiagEvery method in aiag Library on GitHub