Skip to content

docs: record privacy declaration evidence join trace - #183

Merged
coreytshaffer merged 1 commit into
mainfrom
claude/declared-privacy-join-trace
Aug 30, 2026
Merged

docs: record privacy declaration evidence join trace#183
coreytshaffer merged 1 commit into
mainfrom
claude/declared-privacy-join-trace

Conversation

@coreytshaffer

Copy link
Copy Markdown
Owner

Summary

Read-only falsification trace resolving the one dependency the Track C record deliberately left open. One new file, 196 lines, documentation only.

No CR identifier is minted, no remedy is proposed, and no triage_core/ source, schema, test, or fixture is changed. Candidate B is outside this record entirely. The only CR identifier appearing in the document is CR-DD-012B, cited as historical context.

The inherited question

Track C's Finding 1 established that the operator's declared privacy class is not recoverable from the route_decision payload, then explicitly declined to resolve whether GovernedRunSnapshot.declared_privacy was nonetheless joined to that event in persisted evidence — because that distinguishes a genuine recording gap from an already-existing but undocumented join.

Determination

On the ordinary execution path there is no persisted evidence join from route_decision to the operator's declared privacy class. This is a recording/provenance gap, not merely an undocumented existing join.

Static evidence carries the conclusion

The census is corroborating only; the determination rests on the trace:

  1. The governed decision body is never ledger-appended. serialize_governed_decision is called at exactly one site (client.py:573), for an in-memory serialize/reparse verification of the decision id. The route-decision append site (client.py:686) writes the route payload only.
  2. run_plan_review_confirmed has an exact-key payload excluding the privacy value. _CONFIRMATION_KEYS is a 12-member frozenset; declared_privacy_class is not among them.
  3. The optional plan artifact is the only identified persisted carrier of declared_privacy_class — a file on disk, not a ledger event.
  4. That artifact contains no decision_id — zero occurrences in the module, so correlation could only be attempted by task_id.
  5. --plan-output defaults to None and is conditioned on --plan, --model, and --task-id, enforced at tc_cli.py:1084 and :1104.

Therefore an ordinary tc run persists neither a recoverable declared privacy value nor any join to one.

Census with method controls

probe result role
task_privacy_level in route_decision 6/8 positive control
selected_route in route_decision 8/8 positive control
zzz_not_a_real_key 0/8 negative control
declared_privacy / declared_privacy_class / operator_intent 0/8 the question
zzz_fake_event in corpus 0 negative control

Plus a deliberately broader raw substring scan for declared_privacy across all 814 rows: 0. The controls are preserved so the zero-result method stays falsifiable — without them a table of zeros is indistinguishable from a census that silently reads nothing.

Three distinctions the record preserves

  • Authentication is not recovery. plan_body_digest / artifact_byte_digest let a holder authenticate a retained artifact against the ledger. A digest is not a preimage: ledger evidence alone cannot reconstruct the declared privacy class.
  • decision_id = 0/8 is historical-corpus context, not behavior. The corpus predates CR-DD-012B, which introduced the linkage. Absence in a corpus predating the feature carries no information about present-day emission, and the record says so explicitly. The determination does not depend on it.
  • Candidate A is evidence-supported but undecided and unminted. Its prerequisite is discharged and the answer supports rather than dissolves the finding — but no CR is created, no scope drafted, and nothing obliges a change.

Explicit non-findings

Left open rather than resolved by inference: possible non-ledger persistence outside the traced scope; plan-artifact retention convention; present-day empirical decision_id emission on a governed path; and whether the absence is intentional — it may be a deliberate minimisation choice, given the ledger already withholds prompt content. That question is prerequisite to any remedy and is not answered here.

Test plan

  • 19 source locations verified against main 5003761 before writing; all 19 resolved.
  • Set-membership re-verified after writing: every file:line reference in the document is one of the 19; zero outside the checked set.
  • Quantitative claims independently confirmed, not trusted: _CONFIRMATION_KEYS is 12 members with declared_privacy_class absent; run_plan_artifact.py contains zero decision_id occurrences.
  • git diff --check clean (exit 0, with -N intent-to-add).
  • Exactly one changed path; git status clean after commit.
  • File absent on main — clean add, no conflict.

No test-suite run: documentation only, no code changed. No model calls, no tc run, no ledger writes.

Review note

A pre-commit self-review found and corrected one defect in the baseline paragraph, which had implied the document contained 19 citations when it contained 17. The first correction was itself wrong in an instructive way — naming the two uncited locations by line number turned them into citations. The final wording states set membership rather than a count, so it cannot drift as the prose changes.

What this does not grant

Merge authority. Any implementation change. Any reopening of Track B or Track C. Any decision on Candidate A, or any modification to Candidate B.

🤖 Generated with Claude Code

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@netlify

netlify Bot commented Aug 30, 2026

Copy link
Copy Markdown

Deploy Preview for poetic-quokka-0fd859 ready!

Name Link
🔨 Latest commit 88ec49b
🔍 Latest deploy log https://app.netlify.com/projects/poetic-quokka-0fd859/deploys/6a93c9885335d700082ff811
😎 Deploy Preview https://deploy-preview-183--poetic-quokka-0fd859.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coreytshaffer
coreytshaffer merged commit ede8ef1 into main Aug 30, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant