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. assumption ≈ convention; 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:
warrantandwarrantOfare one type and should be one type.Justificationis 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.WarrantAxisstays — it counts rather than names.- The eleven
basisprose 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.