Skip to main content

Authority policy and uncertainty vocabulary

Horologium never guesses when two sources disagree. This page documents what an authority conclusion means when you read one, and — just as important — what it does not promise.

What this is not​

There is no global "Code beats Jira" rule, no confidence percentage, and no overall integrity score. A conflict between two claims stays open and visible until either a written policy rule resolves it, or a human decision does. Shipping no policy at all is a deliberate default, not a placeholder for one — it means every disagreement stays exactly as visible as it would be with no automation at all.

Reading a conclusion​

GET /v1/findings/{id}/authority explains one claim_conflict or documentation_conflict finding's authority conclusion, if one has been computed:

{
"issue_key": "iss_...",
"outcome": "chosen",
"rule_id": "rule-tracker-most-recent",
"chosen_claim_id": "clm_...",
"policy_revision": "pol_...",
"cited_claim_ids": ["clm_...", "clm_..."],
"cited_evidence_ids": ["evd_..."],
"rationale": "Automated authority resolution: rule rule-tracker-most-recent chose claim clm_... under policy revision pol_....",
"decided_at": "2026-08-25T09:15:00Z"
}

outcome is one of two values:

  • chosen — a rule matched, was not marked requires_review, and covered the disagreement (at least one claim's evidence belongs to a ranked source class). chosen_claim_id names which claim; rule_id and policy_revision name exactly which rule and which version of the policy document decided it.

  • no_authority — no automated conclusion was reached. reason is always present and is one of:

    ReasonMeaning
    no_rule_matchesNo rule in the active policy scopes to this predicate/product/target/reality-layer/time combination. The default policy is empty, so this is the common case until an operator writes a rule.
    ambiguous_rulesTwo or more rules matched with equal specificity — an authoring error in the policy document, refused rather than guessed.
    requires_reviewA rule matched and would have chosen a claim, but is marked requires_review: true — it never applies unattended; a human decision (decide:human, ADR-0021) is required first.
    chosen_source_not_coveringA rule matched, but none of the disagreeing claims' evidence belongs to any of its ranked_sources classes — the rule doesn't actually apply to this specific disagreement, even though its scope matched.
    rule_expiredThe matching rule's own ranked_sources is empty — the documented convention for retiring a rule while keeping its rationale for audit.

cited_claim_ids always lists every claim in the disagreement, regardless of outcome — a no_authority conclusion still names exactly what it is declining to resolve. cited_evidence_ids is populated only for chosen (the winning claim's own evidence).

A 404 from this endpoint means one of: no finding with that ID, the finding's kind has no authority resolution (only claim_conflict/ documentation_conflict get one), or no decision has been recorded for it yet.

What "no_authority" does not mean​

It does not mean the system failed, and it does not mean the disagreement is unimportant. It means: given the policy as written today, no rule tells the system which claim to prefer. The finding stays open, both claims stay visible with their own evidence, and nothing is silently picked. Writing a rule that covers this case — and reviewing whether it should — is an operator decision, not something Horologium infers on its own.

Coverage: what "no false completeness" means​

Separately from authority, every snapshot records whether collection was complete: snapshot.coverage_complete is true only when every in-scope source reported success this run (ADR-0017's T8 transition) — one successfully-connected source never makes an otherwise-incomplete run look complete. GET /v1/sources/{id} exposes a source's own access_state (ok, unauthorized, forbidden_scope, unreachable, not_configured, never_collected) so "configured but never reachable" and "reachable but the last attempt failed" are always distinguishable, not collapsed into one "missing" bucket.