docs: record Track C privacy propagation investigation - #182
Merged
Conversation
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
✅ Deploy Preview for poetic-quokka-0fd859 ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Read-only investigation record for Track C of CR-DD-016's Sequencing section, the last of that CR's three tracks. One new file, 282 lines, documentation only.
No CR identifier is minted, no implementation is proposed, and no
triage_core/source, schema, test, or fixture is changed by this PR. Every CR identifier in the document is a citation of an existing one (CR-DD-012B, -013, -016, -018).The headline revises Track C's original suspicion
CR-DD-016 asked whether
privacy_level="local_ok"is "intentional normalization, legacy dead code, or a genuine propagation defect."It is none of those three in the sense the question implied.
local_okis a constructor default that both callers override wherever the value is load-bearing, and the--privacydeclaration is enforced end to end viaexternal_model_allowed->make_external_safe_packet->is_local_only. No privacy-attributable routing defect was demonstrated. The record leads with this, before any finding, so the original suspicion cannot be carried away intact.Findings
task_privacy_level='local_only', two onto'local_ok'. Structurally the same defect Track B found in the classifier lane.local_okbelongs to no declared privacy vocabulary.--privacyandGovernedRunSnapshot.declared_privacyboth accept exactly{local_only, external_safe, public};local_okis a fourth term no operator can type.client.pynever readsallow_cloud— cloud exclusion on the execution path rests entirely on one derived boolean. Recorded as shape, not a demonstrated defect.run_taskwith defaultPrivacyMetadata()is external-model-eligible with no declaration made. Recorded as behavior, not a defect claim — it may be intentional API policy, and CR-DD-013 set a precedent for treating absent evidence differently from negative evidence.Negative finding. The apparent plan/execution route divergence is capability-attributable, not privacy-attributable.
Historical evidence. All six
route_decisionevents carryingtask_privacy_levelrecordlocal_only; none recordslocal_ok. The finding-1 ambiguity is latent in the recorded corpus, not yet realized.Two things the record deliberately does not resolve
GovernedRunSnapshot.declared_privacydoes carry all three values faithfully, so the declaration exists in the system. Whether it is reliably joined to the correspondingroute_decisionevent was not traced, and the record says so. That determines whether finding 1 is a recording gap or an undocumented join, and it is named as the first thing any follow-up must settle.The negative finding preserves two probes that pointed the wrong way
This is recorded at length because the intermediate results were misleading. Isolating
privacy_leveland asking the router directly produced dramatic divergences —external_safeselectingcloud_primarywherelocal_onlyselectedhuman_handoff. Both probes forced cloud availability on both sides, which does not model the plan path's owninternet_ok. A field-level sensitivity analysis is not a reachability claim, and it was being read as one.The control that settles it: with local routes unavailable,
--privacy local_onlydiverges too — with identicalprivacy_levelon both sides. A divergence that persists when the variable under test is held constant is not caused by that variable. The cause is capability (run_plan.py:378-380passescapability=Noneunconditionally, by CR-DD-012B design). Without that control row, the earlier tables read as a serious enforcement gap.Test plan
file:linecitations verified to resolve to the attributed text atc0545a7.privacy_metadata_for_run,verify_packet,make_external_safe_packet,_build_resilience_route_input,choose_resilience_route, andbuild_route_decision_payload— no logic re-implemented.triage_core.__file__pinned to the working checkout).git diff --checkclean (exit 0, both bare and with-Nintent-to-add).git statusclean after commit.main— clean add, no conflict.No test-suite run: documentation only, no code changed. No live model calls were made during this investigation.
What this does not grant
Merge authority for this PR. Any implementation change. Any reopening of CR-DD-016 or Track B. Any decision on the Candidate A/B split.
🤖 Generated with Claude Code