Contestatory constitutionalism

Keeping a standing record of what was decided and on whose authority

This approach keeps a record by default, rather than in response to any particular complaint. The record is meant for whoever later reads it back in bulk. The papers describe two different records. The first is a voluntary, tamper-evident ledger kept inside the developer. It logs models, data, training and evaluation runs, and deployments, along with the approvals, waivers, and attestations that authorized each one. The second is a legally required public register in which platforms file a statement of reasons for every individual adverse action against a user. It received 353 million such statements in a hundred days, comparable across platforms. The two differ in what is recorded and who must record it. What they share is the practice of writing things down by default, so that the exercise of authority can be reconstructed and compared afterward.

The method (highlighting differences with Contestatory constitutionalism)

Scroll the diagram sideways to see all of it.

Use it in codefrom aiag.codified import AuditTrail
from aiag.codified import AuditTrail

trail = AuditTrail("moderation_log.jsonl")  # append-only, and every entry is hash-chained to the one before
trail.log("removed post", authority="rule 3: no doxxing", case="post #4127 shares a home address")
trail.log("restored post", authority="appeals panel", case="post #4127, address redacted")

print(trail.verify())  # -> True
trail[0]["authority"] = "moderator's hunch"
print(trail.verify())  # -> False: an edited entry breaks the chain

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.

Contestability

PartialShortfall · partially preserved

Definition (Philip Pettit, On the People's Terms, 2012)

This concept holds that anyone subject to a decision must have a real route to challenge it. They must be able to inspect the grounds for the decision, contest the outcome, and have the challenge answered. Legitimacy is not settled once by an election or an act of consent. It depends on that route remaining available. On this view, a political order is free when the people its decisions affect can contest them, whether or not its rulers are kind.

Analysis

The approach meets one of Pettit's three requirements at real scale. With 353.12 million statements of reasons published in a hundred days, anyone who wants to can inspect the grounds of individual decisions. This work does not supply the other two. The audit trail is read by an auditor rather than by the person the decision affected, and neither paper gives anybody a route to challenge or anybody a duty to answer. The redress route in the DSA comes from the statute itself rather than from the audit of it.

Non-domination

PartialShortfall · partially preserved

Definition (Philip Pettit, Republicanism, 1997)

This concept holds that freedom is not the absence of interference. A person is unfree if someone holds unchecked power over them, even if that person never misuses it and means well. A benevolent master still dominates, and so does an authority whose workings cannot be seen. Legitimacy requires power to be checked, and good intentions are not enough.

Analysis

Tamper-evidence and append-only storage are a check that does not depend on the operator's good intentions, which is the structural form Pettit insists on. The DSA database adds statutory compulsion, since the eight largest platforms submit whether they wish to or not. The limit is who holds the check and what it reaches. Auditors read the ledger, and nothing in the paper makes it public. The statements of reasons are self-reported by the party that made the decision, so the record is only as honest as the power it is meant to constrain.

Public decision record

PartialShortfall · partially preserved

Definition (Common-law practice)

Rulings on challenges are written down, published, and citable. The legal order's interpretation of its own rules therefore accumulates in public, where it can be studied, invoked, and criticized. This record makes the legal order both predictable and legitimate, since nothing is settled in private and every decision leaves its reasoning on record.

Analysis

This is the largest existing corpus of machine-readable decision records for automated content decisions. Every individual application of the DSA produces a public statement of reasons, and the eight largest platforms filed 353.12 million of them in a hundred days. However, two things the tradition requires are still absent. The entries are first-instance decisions rather than rulings on challenges, and each is the deciding platform's own account of why it acted. As a result, nothing in the record has been tested against anyone, and nothing in it can be invoked as authority for how the next case should be decided.

Concept Analysis: Newly Introduced

Statistical reading of the record

Added

A common-law record is prose, and it is read one case at a time. It cannot show how much more readily one court imposed restrictions than another under the same rule, or how much of the work was done without a human. Statements of reasons under the Digital Services Act (DSA) are machine-readable and number in the hundreds of millions. This audit can therefore compare grounds, restriction type, timeliness, and automation across eight bodies that apply one rulebook. The tradition has no way of performing scrutiny of this kind.

Papers

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

Background

Work this approach builds on that falls outside the inclusion criteria (e.g., a single-objective baseline). It is listed for reference and not counted anywhere.

arXiv:2601.20727MethodBuilt

An append-only, tamper-evident ledger for language model deployments. It records lifecycle events (e.g., models, data, training and evaluation runs, deployments, and monitoring), together with the approvals, waivers, and attestations that authorized them. It is released as an open-source Python implementation that emits these records from existing workflows.

CodeLifecycleLedger
from aiag.codified import LifecycleLedger

ledger = LifecycleLedger("ledger.jsonl")
data = ledger.record("data", "support-chats-v3", actor="data team", digest=ledger.digest(["chat 1", "chat 2"]))
run = ledger.record("training", "helpdesk-sft", actor="ml team", parents=[data])
deploy = ledger.record("deployment", "helpdesk-v1", actor="ops", parents=[run])

print(len(ledger.gaps()))  # -> 1: a deployment no approval or waiver authorizes
ledger.govern("approval", deploy, by="safety board", reason="red-team evals passed")
print(len(ledger.gaps()))  # -> 0
print([e["name"] for e in ledger.lineage(deploy)])  # -> ['helpdesk-v1', 'helpdesk-sft', 'support-chats-v3']
  • LifecycleLedgerRecordaiag/codified/contestatory_constitutionalism.py:59 Audit trails for LLMs: a tamper-evident ledger of lifecycle events (models, data, training and evaluation runs, deployments, monitoring), each linked to what it derives from and to the approvals, waivers and attestations that authorized it, emitted from existing workflows (Ojewale et al., 2026).

pip install aiagEvery method in aiag Library on GitHub

doi:10.1145/371108515 citationsPrecedentBuilt

An audit of all 353.12 million statements of reasons that the eight largest social platforms in the EU submitted to the Digital Services Act Transparency Database in its first hundred days. It compares across platforms the grounds given for each decision, the types of restriction imposed, the timeliness of the actions, and the use of automation.

CodeStatementsOfReasons
from aiag.codified import StatementsOfReasons

day = 86400
register = StatementsOfReasons()  # one statement of reasons for every restriction a platform imposes
register.file("photo app", "illegal content", "hate speech", "removal", content_date=0, application_date=2 * day,
              automated_detection=True, automated_decision=True)
register.file("photo app", "incompatible with terms of service", "spam", "removal", 0, 4 * day, automated_detection=True)
register.file("video app", "incompatible with terms of service", "scam", "visibility restriction", 0, day)

print(register.compare())  # per platform: share on legal grounds, share automated, median days to act, usual restriction

pip install aiagEvery method in aiag Library on GitHub