FROZEN — immutable history. Superseding/current decisions live in
docs/decisions/. Do not edit.
ADR 0004: Testimony Admissibility#
Status: accepted
Date: 2026-06-11
Context#
Kontour records reviewer decisions as ReviewOutcome records. Those outcomes are
testimony: a human said something on the record. But the existing shape records
only what was decided, not how the human was asked or what authorized their
answer. Without that provenance, downstream verifiers cannot assess whether the
testimony is self-contained — interpretable without re-reading the surrounding
conversation or trusting that the UI asked the right question.
Three collection channels exist across the product line:
- cli-interactive — the human runs the attesting command themselves at a terminal; the command and its flags are the authorizing act.
- delegated — an agent or resolver executes the command on a human's behalf; the human's verbatim authorization must travel with the record.
- ui — a reviewer operates Survey's workbench and takes a named action against a rendered prompt.
Each channel produces a different evidence trail. Without specifying what a complete record looks like per channel, testimony is only as good as the consumer's willingness to trust the collecting system's internals.
Cryptographic signing and session binding are desirable but deferred; they require key-management infrastructure that is not yet in place.
Decision#
1. Testimony must be self-contained#
An admissible authorizing block on a ReviewOutcome must be interpretable
without the surrounding conversation. "The reviewer clicked a button" is not
admissible. "The reviewer clicked 'Affirm control' in response to the versioned
prompt auth-v2 rendered as '…'" is admissible.
2. Three admissible kinds#
explicit-statement — the reviewer typed a free-form statement. Required field:
statement (non-empty string). Optional: source (channel or UI reference).
Use when there is no prompt template — the statement stands alone.
exchange — a prompt was shown and the reviewer supplied a response. Required
fields: both prompt and response (non-empty strings). Optional: source.
Both halves are required; a prompt without a response, or a response without the
prompt that triggered it, is not self-contained and fails validation.
authorized-action — the reviewer took a named UI action against a versioned
prompt. Required fields: promptRef (versioned template identifier),
renderedPrompt (exact text shown), action ("affirmed-control" or
"typed"), authorityRef (an AuthorityTrace id proving the reviewer had
permission at decision time). All four fields are required; any missing field
fails validation.
3. Channel mapping#
| Channel | Likely kind | Notes |
|---|---|---|
| cli-interactive | explicit-statement |
The human's own command names the act; environment captured silently. |
| delegated | exchange (or explicit-statement when the human's words name the act alone) |
Both halves of the human's authorization travel verbatim with the record. |
| ui | authorized-action |
Survey workbench records promptRef, renderedPrompt, action, authorityRef. |
explicit-statement is available in any channel when a free-form attestation is
the appropriate evidence form (e.g., a reviewer adds a rationale note that serves
as the primary authorization record).
4. Admissibility heuristics emit transparency gaps, never hard blocks#
validateAuthorizing in Survey returns structured issues. Consumers surface
these as transparency gaps for human review. Heuristics do not silently decide
on admissibility, and they do not hard-block a decision. A decision with a
missing or invalid authorizing block is recorded; the gap is flagged for the
attention queue so a human reviewer — not the model — decides whether to
accept, escalate, or re-collect.
5. Survey's workbench is the reference collector#
Survey's review workbench is the reference implementation for testimony
collection in vertical UIs. A UI that renders ReviewItem candidates and emits
ReviewDecision payloads via the workbench automatically produces correctly
structured authorized-action blocks — the vertical UI inherits correct
testimony collection without re-implementing the provenance logic. The
ReviewDecisionSpec shape carries authorizing as an optional field; workbench
consumers should populate it when the collection channel is known.
6. Backlog#
- Cryptographic signing: sign the
authorizingblock with the reviewer's key so the record is tamper-evident. Deferred pending key-management infrastructure. - Session binding: link the
authorizingblock to theReviewSessionandReviewSessionEventchain so per-decision testimony is anchored to a replay-verifiable event log. Deferred; the session replay machinery is in place but the linkage contract is not yet specified.
Consequences#
ReviewOutcome.authorizingis additive and optional; all existing records are valid without it, and no existing tests require changes.- Vertical UIs that use Survey's workbench inherit admissible testimony collection by construction.
- Admissibility is defined in code (
validateAuthorizing), not only in prose, so it can be tested and extended without doc-only drift. - The three-kind taxonomy is closed by design; new kinds require a new ADR and
a schema change. Ad-hoc string values in the
kindfield will fail validation. - Cryptographic signing and session binding are explicitly backlogged so implementers know they are desired, not forgotten.
Channel roster (amendment)#
Photo- and video-attested actions are a collection channel variant. They map to
existing testimony kinds — authorized-action when a named action is captured,
or exchange when a verbal approval is recorded — with the media attached as
ordinary evidence on the ReviewOutcome. When the media carries a valid
capture-provenance credential (e.g., a C2PA manifest), it is attached with an
integrity anchor; without one it is ordinary L0 evidence.
Regulatory precedent: remote online notarization frameworks already accept video-witnessed signatures as legally admissible acts, establishing that a recorded human gesture can satisfy a formal authorization requirement.
Accessibility benefit: recorded verbal approval is an admissible exchange
testimony form, widening participation for reviewers who cannot use keyboard or
pointer-based interfaces.
This channel variant is a capability, not a requirement. It is never
enabled by default; a vertical UI or deployment must explicitly configure it.
Channels never substitute for the required fields of the mapped kind — media is
attached context, not a replacement for promptRef, renderedPrompt, action,
authorityRef, or the prompt/response pair.