Skip to content
← Documentation

docs/authority-audit.md


Should authority be a first-class field?

It already is. Four times, under four names, with four different value sets — plus free prose in eleven more places. The question is not whether to introduce it but whether four vocabularies are one axis or several.

What exists

where field values what it grades
adapters/repository.ts warrant evidence | convention how a fact was licensed
projection/rule.ts warrantOf evidence | convention | mixed how a projection step is licensed
ledger/warrant.ts WarrantAxis single | collapsed | none how many warrants a channel carries
ledger/justification.ts Justification derived | historical | assumption why a structure exists
everywhere basis: string free prose, 11 sites anything not covered above

Are they one axis?

Two are the same axis. The adapter's warrant and the rule's warrantOf grade the same thing — observed versus stipulated — and mixed is just the composition of the two over a multi-step pipeline. These should not be separate types.

Justification overlaps it. assumptionconvention; derived is computable-from-observation; historical is observed-but-no-longer-observable. It is the same axis with a different partition, applied to structures instead of facts.

WarrantAxis is genuinely orthogonal. single | collapsed | none counts warrants; it does not name one. A channel can be collapsed regardless of whether its inputs were evidence or convention. This one is not a duplicate.

basis is the escape hatch. Eleven sites carry prose where the vocabulary had no cell — and every one of them is in the observation class: UnplacedSubject.basis, Unobserved.basis, ObservationWindow.basis, WorldOrigin.basis. That is the tell: the existing vocabularies grade statements about the world, and had nothing to say about statements about the observation, so those fell through to prose.

The proposed vocabulary, against what exists

proposed covered today by what
observed warrant: evidence
inferred Justification: derived
assumed warrant: convention / Justification: assumption
refused prose in Refusal.why
unknown prose in UnplacedSubject.basis
configured nothing — COGNITHAMUS_REPOS, STALE_AFTER_DAYS are conventions by another route
user supplied nothing — no user-supplied fact exists yet

The four uncovered values are exactly the observation-class states. Subject class and authority are not independent: refused and unknown are only available to statements whose subject is the observer.

What this recommends

Not a new field. A reconciliation, and only when something forces it:

  1. warrant and warrantOf are one type and should be one type.
  2. Justification is the same axis over structures; folding it is a larger change and should wait for a case where the two disagree about the same thing. None has appeared yet.
  3. WarrantAxis stays — it counts rather than names.
  4. The eleven basis prose sites are where a typed observation authority would go: refused | unknown | configured. That is the real gap.

Why not build it now

No measured failure demands it. Every defect this month came from a missing statement, not from an unclassified one — the Python repository, the shallow boundary, the invisible omission, the 1925 subjects blamed for a limit of the window. In each case the repair was to make the statement, and prose was sufficient to carry it.

A type system for authority would be the fifth vocabulary unless it replaces the other four, and replacing them is a refactor with no user-visible consequence and no failing test behind it. Recorded, not built — the same standing as the observed-peak reference.

The audit's finding is the redundancy itself: this codebase spent months eliminating dual authority over facts, and has four authorities over authority.