Repository navigation
Re-derive 10 published digests that hashed unmasked bytes; guard evidence, blueprints and manifests - #1010
Conversation
…evidence, blueprints and manifests Correction #161: the 2026-10-11 masked-digest audit of main at 7b76a88 found 8 sha256 values under evidence/artifacts that hash bytes from before sanitization. Its residual list found 2 more under blueprints. Each sits beside a copy in which the home directory is replaced by ~ or the user name by <user>. Anyone could put a guessed value back, hash the result and confirm the guess offline. Each value is now the sha256 of the published bytes. That is the basis scripts/host_receipts.py record has used for output_sha256 since #492 (scripts/host_receipts.py:1012-1029 at 7b76a88). - sota-refresh-20260925 markitdown (2), mcporter (3) and rtk (1) results.json: files[].run_copy_sha256 is now the sha256 of the committed file, the same value as the entry's sha256. byte_identical_to_run_copy stays false. Each record gets a corrections entry; mcporter had no list, so one is added. - The withdrawn nemotron vLLM use receipt -2: commands[1] and commands[4] output_sha256 are now the sha256 of output_excerpt (UTF-8), and its README records the change. This removes no oracle, because 4 registered evidence/hosts receipts keep the same digests (commands[1]'s in 4, commands[4]'s in 3). - blueprints/retrieval-quality-v2/review-293-repro-20260926.json: inputs.files[0].as_run_sha256 is now the committed driver's sha256. A corrections entry in the record's own shape records the change. - The withdrawn byterover-cli install receipt: commands[0].output_sha256 is now the excerpt digest. retained-outputs.json, the byterover-cli README and the trials README record the exception to "kept byte-for-byte". The sha256 of a file before this change would confirm a guess the same way: rebuild the old file from a guess, hash it and compare. Every digest of an old file is therefore re-pinned or dropped: - the three evidence/receipts qualification receipts re-pin results.json in provenance[], as #314 did; - retained-outputs.json gives the new receipt bytes for both private_original and published; - the review-293 correction records no as_recorded_sha256; - manifests/evidence.json re-registers the 13 files through host_receipts.register_file. tests/test_published_digest_privacy.py walks every JSON file under evidence/, blueprints/ and manifests/. It flags a 64-hex digest that hashes none of the published texts or files in its own or enclosing object, but does hash one of them once a home directory or name is put back. The masks are ~, <home>, <HOME>, <host-home>, $HOME, ${HOME}, <user>, <USER> and $USER, under /home/<name> and /Users/<name>. Names come from LANDING_PROHIBITED_NAMES. Without them, as in CI, that check skips. LEGACY_SITES freezes the 106 remaining sites by path, key and 8-hex prefix, with a count assertion: - 96 output_sha256 values in evidence/hosts receipts recorded before 2026-09-29, append-only since #492; - 10 that the audit's probe could not reach, because it put back only ~ and <user> and read only files named in the digest's own object. A new site fails. A listed site that is gone also fails until it is removed, so the list only shrinks. Two checks run in CI too: every listed site is still present, and the 10 fixed sites hash the published bytes. Fail-before: on the 7b76a88 tree, the guard reports exactly the 10 fixed sites and the fixed-site check fails 10 subtests, with or without names. After this change, all 11 tests pass, or 10 pass and 1 skips without names. Not changed: git history keeps the old digests. No rewrite is proposed, because the exposure is a home directory or account name, not a credential. Co-Authored-By: Claude Opus 5.5 <[email protected]>
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7a035936be
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…rd in pre-push (#1010 round 1) B1 (CC adjudication of #1010 round 1): catalogs/north-star/readiness.json still pinned the pre-change sha256 of the three qualification receipts this PR re-pins, in 15 places. Each receipt had five: the repo:<receipt>@<digest> key, that entry's sha256 and expected_sha256, and two nested receipt objects. Rebuilt from the new bytes and a guessed name, each old receipt matched its pin, which is the second-order oracle of correction #161. Each pin now names the receipt's current sha256: - markitdown-018: d9a1a348 -> 74d066a1; - mcporter-0141: 5379b1e3 -> 9b69956e; - rtk-050: 9de293b6 -> b47326a1. Byte counts are unchanged. tools/north-star/build_readiness.py --write was not used, because it would also fold in readiness drift that predates this PR. tests/test_published_digest_privacy.py: - ReadinessPinTests needs no names. Every readiness binding of a receipt changed since the merge base with origin/main must hash that receipt's current bytes. It fails at 7a03593 (15 stale pins) and passes after. - The guard is now enforced. scripts/git-hooks/pre-push runs it on each pushed tip with PUBLISHED_DIGEST_GUARD_HOST_NAMES=1, so the names come from scripts/host_name_scan.py host_names(), the runtime source of #934's scan (docs/decisions/2026-10-09-host-name-scan.md); NATIVE_AGENT_HOST_NAMES_JSON replaces them in fixtures. The hook's runner refuses a skip, and an unavailable source errors. CI keeps the name-free tests. - The legacy check is one-directional, so it works in a clone whose names differ. An unlisted site fails. A listed site the names do not reproduce is reported only as a count. test_the_frozen_list_only_shrinks still fails, without names, once a listed digest is gone from its file. - The mask set adds the repository's existing markers <user-home>, <SCRATCH_HOME>, %USERPROFILE% (as C:\Users\<name>, C:/Users/<name> or /mnt/c/Users/<name>), <WSL_USER> and <hostname>. Every subset of up to four present masks is tried; beyond four, all of them or one at a time. - Measured with LANDING_PROHIBITED_NAMES (3 names) and with host_names() (5 names), the guard finds exactly the 106 listed sites both times. There is no new site, so the list and LEGACY_COUNT are unchanged. - Caching texts and resolved paths halves the whole-tree walk, from 24 s to 11 s with 3 names. tests/test_pre_push_gate.py overlays the guard module on the fixture tip, as it does the scanner sources. A clean push runs the guard once. A committed receipt whose output_sha256 hashes its excerpt with the fixture home put back is refused without echoing the name. Co-Authored-By: Claude Opus 5.5 <[email protected]>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 42519c9a45
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Scope
~or<user>and confirm the guess offline (correction 2026-09-24 community sweep: effort-guard SessionStart notice, working plugin-install commands, dated dispositions #161). Each is now the sha256 of the published bytes.7b76a88c3e669dac328a8e05018ef0ccc029fd8flane:foundationevidence/artifacts/sota-refresh-20260925/{markitdown,mcporter,rtk}/results.jsonevidence/artifacts/workstation-lane-20260925/nemotron-qualification/withdrawn/(receipt and README)evidence/receipts/{markitdown-018,mcporter-0141,rtk-050}-qualification-20260925.json(provenance re-pin only)catalogs/north-star/readiness.json(re-pin of those three receipts only)blueprints/retrieval-quality-v2/review-293-repro-20260926.jsonblueprints/trials-20260926/README.mdblueprints/trials-20260926/byterover-cli/(README,retained-outputs.json, withdrawn install receipt)manifests/evidence.jsonscripts/git-hooks/pre-pushandtests/test_pre_push_gate.py(guard wiring)tests/test_published_digest_privacy.py(new)The ten sites
sota-refresh-20260925/markitdown/results.json:72run_copy_sha256(out/install.log)c18a803d→98299a10sha256)markitdown/results.json:293(verify/legs-baseline.log)d87b4a64→6134751amcporter/results.json:263(verify/npm-ls-0.13.13.txt)f84a3c2c→689a0ba4mcporter/results.json:271(verify/npm-ls-0.14.1.txt)0423c8c5→b48758aamcporter/results.json:294(verify/bin-link-before.txt)afa01755→54f9f581rtk/results.json:499(out/a2/raw/python-m-pytest.native.err)a08e9184→388552e4…vllm--use--20260925-2.withdrawn.json:32commands[1].output_sha256ab46ba7b→f24f21c2output_excerpt(UTF-8, surrogateescape):53,commands[4].output_sha256c30eaa1b→2d37f307blueprints/retrieval-quality-v2/review-293-repro-20260926.json:21as_run_sha256(repro_record.py)de8e61a9→7aba596asha256)blueprints/trials-20260926/byterover-cli/withdrawn-host-receipts/…byterover-cli--install--20260926.json:25commands[0].output_sha256d540b96f→eda25377output_excerptevidence/hostsreceipts carry the same digests (commands[1]'s in 4,commands[4]'s in 3). They are fixed for consistency.retained-outputs.json(verbatim: false, a sanitization rule), the byterover-cli README and the trials README, which record the exception to "kept byte-for-byte".results.jsoninprovenance[](the Fix Codex post-merge findings: wider rtk blob exclusion, TOML-parsed bootstrap reminder, blind-packet leak, retained markitdown evidence #314 precedent);catalogs/north-star/readiness.jsonre-pins those three receipts in its 15 bindings, five per receipt:d9a1a348→74d066a1;5379b1e3→9b69956e;9de293b6→b47326a1;build_readiness --writewas not used, because it would fold in drift that predates this PR;retained-outputs.jsongives the new receipt bytes for bothprivate_originalandpublished;as_recorded_sha256;manifests/evidence.jsonre-registers every changed file it lists throughhost_receipts.register_file;blueprints/retrieval-quality-v2/README.mddescribes the record and carries a corrections list;blueprints/trials-20260926/README.md:59,73andbyterover-cli/README.md:200describe the withdrawn receipts as "kept byte-for-byte". That is the same kind of statement the nemotron withdrawn README made, and it now records the exception.The guard
tests/test_published_digest_privacy.pywalks every JSON file underevidence/,blueprints/andmanifests/.path/file/logfiles in its own or enclosing object as published, but does hash one of them once masks are put back. Masks are put back as follows:~,<home>,<HOME>,<host-home>,<user-home>,<SCRATCH_HOME>,$HOMEand${HOME}as/home/<name>or/Users/<name>;%USERPROFILE%asC:\Users\<name>,C:/Users/<name>or/mnt/c/Users/<name>;<user>,<USER>,$USER,<WSL_USER>and<hostname>as<name>.scripts/git-hooks/pre-pushruns the guard on each pushed tip withPUBLISHED_DIGEST_GUARD_HOST_NAMES=1.scripts/host_name_scan.pyhost_names(), the runtime source of Check private host names in files, commit diffs and identities #934's scan. Fixtures setNATIVE_AGENT_HOST_NAMES_JSON.LANDING_PROHIBITED_NAMESinstead, and skips without names, as in CI.LEGACY_SITESfreezes 106 sites by path, key and digest prefix, with a count assertion (LEGACY_COUNT = 106):output_sha256values inevidence/hostsreceipts recorded before 2026-09-29, append-only since Host-receipt recorder: output_sha256 digests the published excerpt only #492;test_the_frozen_list_only_shrinksfails without names once a listed digest is gone from its file, so a fixed site leaves the list and the list only shrinks.origin/mainhashes that receipt's current bytes (ReadinessPinTests);SOTA sources
7b76a88c3e669dac328a8e05018ef0ccc029fd8f:scripts/host_receipts.py:1012-1020is the basis comment: output_sha256 binds the published bytes; receipts before 2026-09-29 hash the raw output;scripts/host_receipts.py:1029ishashlib.sha256(excerpt.encode("utf-8", "surrogateescape")).hexdigest().c0ca46d1294ea2b286f629aa9550a7cae3be9e6b(Host-receipt recorder: output_sha256 digests the published excerpt only #492), whose message keeps older receipts' digests "(append-only)".scripts/host_name_scan.py:43host_names(), with theNATIVE_AGENT_HOST_NAMES_JSONoverride at:21;docs/decisions/2026-10-09-host-name-scan.md(Check private host names in files, commit diffs and identities #934);scripts/git-hooks/pre-push's runner and itsgithooks(5)pre-push protocol (https://git-scm.com/docs/githooks#_pre_push).scripts/host_receipts.py:710register_fileat the same commit. Thenscripts/evidence_manifest.py --writeand--check.5c1961e49b89dd56ef5626950a5448735caabe4c(Fix Codex post-merge findings: wider rtk blob exclusion, TOML-parsed bootstrap reminder, blind-packet leak, retained markitdown evidence #314) updated the qualification receipts'provenance[]sha256 whenresults.jsonchanged.evidence/artifactsandmanifestsat 7b76a88 and found 8 sites. Its residual list overevidence/hostsandblueprintsfound 98. The probe put back~as the home directory and<user>as the account, read only files named in the digest's own object, and printed only file:line, field and a Boolean.readiness_chain.pyrebuilt each pre-change receipt from head bytes and a guessed name. It matched the readiness pin at 7a03593 and does not match after this change.probe_d.pychecked every tracked file and JSON string, with Windows profile prefixes. It found 145 unique sites, which the Residual section covers.Evidence-class table
output_excerpt)python3 -m unittest tests.test_published_digest_privacy(test_the_fixed_sites_hash_the_published_bytes)git archive 7b76a88cextract and on this branchReadinessPinTests, on a 7a03593 worktree and on this branch; the reader'sreadiness_chain.py(True → False)python3 -m unittest tests.test_pre_push_gate<host-home>/<home>/$HOMEand Windows-profile/account/host cases, and passes the recorder's digestSyntheticOracleTests(9 tests)scripts/host_receipts.py:1012-1029at 7b76a88Local commands run
Names were sourced from the host-local env file without printing them.
hostmode useshost_names(), as the pre-push hook does.Round 0's receipts at 7a03593 are unchanged:
Decision record
None. The scope decisions came from the command center (correction #161):
evidence/hostsuntouched;Round 1 follows the CC adjudication of #1010 at 7a03593:
Residual
output_sha256values inevidence/hostsreceipts recorded before 2026-09-29 stay. Host-receipt recorder: output_sha256 digests the published excerpt only #492 left those receipts append-only. Git history keeps every old value.probe_d.py: every tracked file and JSON string, Windows profile prefixes, capitalized names) finds 145 unique sites at 7a03593:as_run_bytes,private_original.bytes) still reveal the masked name's length. This PR does not change them.Follow-ups
A CC follow-up PR comes right after this one lands, ahead of other privacy work.
run_copy_sha256sites, 5 prefixes and 21 occurrences, in two files:evidence/artifacts/sota-refresh-20260925/headroom-039/out/run-outputs.json;evidence/artifacts/sota-refresh-20260925/headroom-039/verifier/run-outputs.json.evidence/artifacts/skills-trials-20261009/: 12 pairs, 12 each innative/native-results.jsonandpublication-redaction.json;omniroute-routing-20260928: 5, in four evidence artifacts and one blueprint;docs/decisions/2026-10-08-memory-roles-live-host.json: 2.FILE_KEYS;ReadinessPinTestschecks;catalogs/,docs/,tools/and files that are not JSON.%USERPROFILE%and<user-home>are now in the mask set.scripts/git-hooks/pre-push).LEGACY_SITESis a subset of the merge base's list, so a new entry fails instead of relying on review.blueprints/trials-20260926/README.md:59, thewithdrawn_host_receiptclass row, still says "kept byte-for-byte". Line 73 andbyterover-cli/README.mdrecord the exception; that row does not.retained-outputs.jsonentry 48 conflicts with the file'ssanitization_policyclause, which says each private original's "name, byte count and sha256 are recorded here". Entry 48'sprivate_original.sha256is now the published bytes' sha256, a deliberate choice explained in the entry's sanitization rule. The clause needs an exception or a reword.scripts/git-hooks/pre-push:157, reproduced by the CC's confirmation micro at42519c9a). An oracle added and then removed within one push passes (rc 0), because the guard runs on each pushed tip. Scan every new commit in the pushed range instead, matching the same hook's name scan, which already covers each ref's range with--scan-history. The CC's follow-up PR above carries it, with a two-commit push test that fails first.tests/test_published_digest_privacy.py:240). The guard puts one name into every mask, so text that holds two different identities (<user>and<hostname>) is missed. Synthetic two-value cases give 0 findings, against 1 for the single-value controls. A whole-tree probe with independent names over all 7 names finds 0 tracked sites. It goes into F3 with a regression.evidence/artifacts/sota-refresh-20260925/markitdown/results.json:72). The field holds the published hash in round-0 content. The record'scorrections[]entry discloses the change, and no code readsrun_copy_sha256. Relabel the field when the record is next revised; nothing changes here.ReadinessPinTestslacksmaxDiff = None, so a failure prints "Diff is 1105 characters long" instead of the stale pins.The guard found these 10 sites outside the audit. They existed at 7b76a88 and stay frozen in
OUTSIDE_THE_AUDITuntil their owners fix them. Each fix removes its entry and lowersLEGACY_COUNT.Skills lane (gela, skills-lifecycle):
evidence/artifacts/native-skill-lifecycle-20260930/receipt.json:1010final_sha256cc707baf(<home>inreturned_final).evidence/artifacts/skills-trials-20261009/publication-redaction.json,original_sha256(<host-home>in the named file), 6 sites::39ea4e2998:48c8b28445:57c4a6249b:8655b5ad93:969db79be8:352f7fa1723evidence/artifacts/skills-trials-20261009/native/native-results.json, artifactsha256(<host-home>), 2 sites::31755b5ad93:5399db79be8publication-redaction.jsonpublishes private-original digests by design: itsnative_artifact_hashessays "native-results.json artifact entries refer private original bytes".PREREGISTRATION.md.Trials follow-up:
blueprints/trials-20260926/byterover-cli/retained-outputs.json:544private_original.sha256549e503b(oclif-autoupdate.log,~, with the path in the enclosing object).Host evidence
No file under
evidence/hosts/changes.Checklist
version comment (no floating tags). (none changed)
permissions: {}and grant each jobonly what it needs (
contents: read, or an explicitly justified addition). (none changed)added without a documented owner.
moved or overwritten).
🤖 Generated with Claude Code