informed-decision/docs/evidence-path-design.md
tegwick 5c33d17330 Apply GH-DEC-2026-013 and GH-DEC-2026-014; close INFD-IN-0002
Two rulings landed and both corrected something.

GH-DEC-2026-013 accepted our binding-versus-awareness argument, wrote it into
the record as its §6, and did not change the outcome — it sharpened the defect.
Two different facts share one field named tenant: the act-scope, a property of
the act that our binding slice commits, and the principal's membership, a
property of the person that approval-engine exact-matches. Gate House's
correction stands: a binding slice that must commit the scope being entered
should commit that scope, not borrow a membership claim to stand in for it. Our
schema already does — binding.target IS the act-scope and is inside view_hash —
so no field was added, only a statement (PR-08) and a provenance record (PR-09),
since key-cape emits tenant as a bare string.

key-cape had already implemented registration-bound tenancy on 2026-09-09,
correct under both candidate rulings, so the fail-closed-at-first-use risk that
made us withhold the client strings was already retired. IN-0002 closed. The one
remaining input to T07 is the deployed origin.

GH-DEC-2026-014 granted commitment-only evidence and bounded it. It satisfies
non-alteration and NOT reconstructability, and must not be described otherwise
anywhere. It also corrected our wording of the gap: we wrote that it leaves us
able to erase the content, which understates it. Commitment-only moves integrity
out of our control and leaves availability entirely inside it — the party that
can withhold the content is the party the evidence is about. Limit 3's condition
reduced, not removed.

The grant carries a condition we did not propose and would not have thought of:
the path must assert that committed content exists and where custody sits, so
non-production is a finding attributable to the custodian rather than an
unremarkable blank. A commitment with no assertion that something is being
committed to is indistinguishable from a commitment to nothing. Booked as PR-53,
and marked not-a-reversal-candidate.

Recorded the meta-rule Gate House named, now in its third setting here: unknown
versus absent in the stance map, directory-asserted versus registration-supplied
in the tenant claim, erased versus never held in the evidence path. Wherever a
system reaches one appearance by two routes, the record must say which route.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01V3W1dQG7GFFM9d94jFx7iR

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1565372@bnt-lap001
Assistant-Session: 16bb2f25-b34c-49ef-8e94-5fec3567a568
2026-09-10 07:57:57 +02:00

231 lines
11 KiB
Markdown

# The independent evidence path — design and decision request
**From:** informed-decision
**Raised:** 2026-09-09
**Intake:** `INFD-IN-0003`
**Blocks:** `INFD-WP-0001-T08`
**Governing:** `GH-DEC-2026-012` limit **L3-independent-evidence-path**
**Addressed to:** `audit-core` (registration and payload), `gate-house` (the
content question, if it is doctrine)
**Ruled:** `GH-DEC-2026-014` split it — the payload is `audit-core`'s custody
question; what may be *claimed* from a record of this shape is doctrine.
Commitment-only is **granted for Stage 1**, with the §4 condition below, which
this repository did not propose.
---
## 1. The obligation
`GH-DEC-2026-012` permitted this repository to emit a presentation claim under
three limits. The third:
> The evidence copy reaches `audit-core` **independently** of you. Claim
> endpoint and evidence path are different things and neither substitutes for
> the other. […] audit evidence is protected from the actor being audited, and
> here the actor and the source are the same component. The copy that is
> evidence must not be reachable only through the party it is evidence about.
Gate House named this the limit that matters most in our case, and we agree: we
render the view, we compute the hash over it, and we are the party an auditor is
checking. A design where the only route to the evidence runs through us is not
evidence.
`docs/specs/ArchitectureBlueprint.md` `O-02` records the mechanism as unchosen
and states T08 must not ship without it, because "we will add the independent
path later" is how limit 3 becomes limit-3-in-principle.
## 2. What is settled and not being asked
**Read independence is the property.** A reader obtains the evidence from
`audit-core` without asking us and without our cooperation. Our claim endpoint
serves presentation claims to consumers; it is a different surface with a
different purpose and does not discharge this obligation.
**The write path is a local transactional outbox.** Adopted from
`approval-engine`'s reasoning rather than rediscovered: the queue lives in our
own store, written in the **same transaction** as the state change it evidences.
Emit-after-commit is a defect. The queue is local so an `audit-core` outage
cannot block a binding act, for the same reason it must not block a revocation
upstream.
**Atomicity covers accident, not compromise.** It does not close the residual in
`layer.yaml` and will not be described as doing so.
**Cadence is owed.** Our `layer.yaml` declares presentation evidence
**load-bearing**, so §9.6 requires a declared cadence. See §5.
## 3. The question: what travels
A presentation record is not like an approval transition. It contains, or points
at, the **brief and packet material actually shown to a human** — which is
frequently commercially or personally sensitive. So "emit the evidence" is
ambiguous in a way it was not for `approval-engine`, and the ambiguity has to be
resolved before we build, not after we have shipped a payload shape.
Three candidates.
### (a) Commitment only — hash and metadata
Emit `memo_id`, `memo_version`, `presentation_id`, `principal`, `locale`,
`ui_release`, `rendered_at`, `acked_highlight_ids`, `view_hash`,
`awareness_hash`, the co-referenced approval identifier, the disposition verb,
and the stance application. **Not** the brief, not the packet, not the highlight
text.
- **Proves independently:** that this principal was shown a view whose canonical
form hashes to H, at time T, and bound act A against approval X.
- **Cost:** the *content* lives only here. An auditor can verify that content we
later produce matches H, and can detect alteration — but if we destroy it,
nobody can ever see what was shown. Audit-core proves the commitment, not the
material.
- **Also:** this is strictly stronger than storing nothing, because it removes
our ability to alter the record after the fact. It does not remove our ability
to erase it.
### (b) Full binding document
Emit the canonical binding document itself, from which `view_hash` is
recomputable.
- **Proves independently:** everything (a) does, plus what was actually shown,
surviving our compromise or our deletion.
- **Cost:** `audit-core` now holds business-sensitive and possibly personal
content, under retention profiles and export entitlements designed for audit
events rather than for the substance of commercial decisions. Its
secret-finding and redaction surfaces would be operating on material where a
redaction is not a defect-signal but routine. That is a meaningful change in
what `audit-core` is holding, and it is theirs to accept or refuse — not ours
to assume.
- **Also:** an L4 instrument under (b) puts contract text in the audit fabric.
### (c) Split — commitment to `audit-core`, content to a separate evidence store
*Refusal endorsed by `GH-DEC-2026-014`, with an addition worth carrying: an
evidence store owned by the party whose conduct it evidences is not an evidence
store, whatever its integrity properties. **The ownership objection is prior to
the custody one.***
(a)'s payload to `audit-core`, plus the full bundle to a store that is neither
`audit-core` nor us.
- **Proves independently:** as (b).
- **Cost:** a store with no owner. There is no such component today, and
inventing one to satisfy a limit is how a surface acquires an operational axis
it was never given. §16 also decided against stronger archival custody for
approval evidence, and we should not route around that decision by building a
parallel archive under another name.
## 4. What we propose
**(a) for Stage 1, with the gap stated rather than papered over.**
Reasoning:
1. It discharges limit 3 as written. The copy that is evidence — the commitment
that a presentation with hash H happened to principal P at time T — is
reachable from `audit-core` without us.
2. It does not silently expand what `audit-core` holds. Expanding that is a
decision for its owner, and (b) presented as a fait accompli would be exactly
the drift we asked gate-house to prevent in a different context.
3. It is honest about what it does not close. Our first wording — "we can still
erase the content" — **understated it**, and `GH-DEC-2026-014` corrected us:
commitment-only moves **integrity** out of our control and leaves
**availability** entirely inside it. *The party that can withhold the content
is the party the evidence is about.* That is the condition limit 3 exists to
prevent, reduced and not removed.
4. (b) remains available and is a payload change, not a redesign, if the estate
later decides a commitment is insufficient.
**We are not asking to defer (b) indefinitely.** We are asking whether the
content question is `audit-core`'s to answer as its custodian, or `gate-house`'s
as doctrine. If it is doctrine and the ruling is (b), we will implement (b).
## 4a. The existence assertion — required, and not ours
`GH-DEC-2026-014` granted commitment-only **on a condition we did not propose**,
and it is the condition that makes the grant safe.
**Non-production must be detectable as a finding, not present as an absence.**
If the independent path holds only a commitment, a reviewer who asks for content
and gets nothing cannot distinguish *erased*, *withheld*, *lost*, and *never
held*. The absence reads as an unremarkable blank.
So the emitted record MUST carry, alongside the commitment:
| Field | Meaning |
| --- | --- |
| `content_exists` | An assertion that committed content exists |
| `custody` | Where custody of that content sits |
such that **failure to produce at retrieval is a conformance failure
attributable to the custodian** — here, this repository.
> A commitment with no assertion that something is being committed to is
> indistinguishable from a commitment to nothing.
**Not a reversal candidate.** If it proves expensive, the answer is a cheaper
mechanism for the same property, never the property's removal.
Two limits travel with the grant and belong in `audit-core`'s design too:
- It satisfies **non-alteration**. It does **not** satisfy
**reconstructability**, and must not be described as doing so in any document
or conformance claim on either side.
- The residual is not closed and this repository is not credited with closing
it. The existence assertion narrows the erasure gap by making non-production
attributable; it does not produce the missing thing.
## 5. Cadence
Presentation evidence is declared load-bearing, so §9.6 requires a cadence and
rate monitoring is not automatically the right form.
Note a difference from `approval-engine`: their classes are genuinely low-volume
(a handful of revocations a month), which is why heartbeat is their answer.
Ours are mixed:
- **Presentations** are relatively high-volume — one per render.
- **Dispositions and stance applications** are low-volume and are the
security-relevant ones.
So we propose **reconciliation as the primary form**, per class: our own count
of presentations, dispositions and stance applications compared against
`audit-core`'s event count per class, with divergence a finding. Plus a
**heartbeat for the low-volume classes**, because a quiet month of dispositions
is indistinguishable from suppression by rate alone — the same argument
`approval-engine` makes.
This depends on `AUDIT-WP-0009` T04/T06, which we understand are open. We are
declaring the cadence now and will not describe it as operating until those
land.
## 6. What we need
| From | Decision |
| --- | --- |
| `audit-core` | Sender registration for `informed-decision`, and whether payload (a) or (b) is acceptable to hold |
| `audit-core` | Whether reconciliation-plus-heartbeat is the right cadence form for a mixed-volume source |
| `gate-house` | Only if the content question is doctrine rather than custody |
Proposed registration, following `approval-engine`'s form:
| Field | Value |
| --- | --- |
| Sender and permitted source | `informed-decision` (exact) |
| Tenants | `["tenant:platform"]` — but see the open tenant question, `INFD-IN-0002` |
| Write / read | `true` / `false` |
| Evidence kind | `load-bearing` |
| Cadence form | reconciliation, plus heartbeat for low-volume classes |
| Secret policy | `redact` |
`redact` chosen for the same reason `approval-engine` chose it: a receiver
should retain a legitimate record with an accidentally secret-shaped field
removed rather than reject the event and leave delivery pending. Under payload
(a) the exposure is small by construction; under (b) `redact` would be doing
substantially more work, which is itself an argument for (a).
**Note the coupling:** the tenant on our registration is the same unresolved
question as `INFD-IN-0002`. If a human token cannot carry `tenant:platform`, our
audit registration tenant and our approval tenant should be settled together
rather than separately.