Dashboard › institutional-transition-lab › Distillation
89052a8d-ae12-4764-92be-71b9413ca3fb["lore_tm_v1_xo2HFhm6C4Qh7aZAoTzeTH_5nuE0R7hvIRTs_TqTemQ","lore_tm_v1_Nte4SEU4A7_ampcmLejUHCAvLAMZn90IacckPPVz524","lore_tm_v1_PUop3mXnDPrEmFP65oneVwe2ZDuMHRnW6zzKsPUmr14","lore_tm_v1_OToWI0Zj4fhEZaxu3vb6F1dHL5oooM7IxD9FVcG7xx8","lore_tm_v1_le6BzrbUtigwMHziBGQHjDB-dz5R0Yf5obweHTR73lA","lore_tm_v1_oEVHaU6PqSjykDakGbMhCfRZwhdhPgR-j25L0NbC-5M","lore_tm_v1_BbdRHI4RG4G8UP2OM1ZwqroMQgnri3I946FtHOrcKZ8","lore_tm_v1_t6HCNNgte-p7EhXyaPdaUsRVr-tSGSvOsp0M7e6TLbE","lore_tm_v1_jZydRoweEbiMJqxUhJVAp0VKxnhDEaDYwLSjYvMo6Tg","lore_tm_v1_-rx0zq5NZRpZ39l9X8VcswvbtIKvinZkuGO5aRHBNjY","lore_tm_v1_UCinfOIJvpPTZQaH5w1cLwZ2fZ2gSL3dpkslv4ZZNfk","lore_tm_v1_3m_gttx80TvQhL4ISORdDklYro5RiydX5mhCaTV9Wyc","lore_tm_v1_t7sYT_iNP6pnazkEMcgrHF_EUMXE0OLsVCA-EZ5k8Rs","lore_tm_v1_9Svw26gt2-_5C4kLNEiZCyWXoP6XHD2x7L1j4M9KjM8","lore_tm_v1_16shqDQzWA2SzuGn9B2gJslOX9gBmaAGrsMBKP9zcaU","lore_tm_v1_KU5SfhYEOn0YVmMrDd4cunk0Zbv5q3WtZ7WbZ4muN24"]
verified_pins["documents_sha256"].”open output.”33063470968 and artifact 9642983578.src/institution_lab/governance_adjudication.py: main() parses documents, coding package, and adjudication schema at lines 721-725 before verify_input_manifest() reopens paths for hashing/ZIP comparison at lines 93-118, while validation uses the earlier objects at lines 735-740. Writable-file, swapped-symlink, or FIFO substitution can therefore make validation consume forged bytes after verification sees pinned bytes.open summary was written.test_cli_never_uses_preverification_bytes: paths return forged bytes before verification and pinned bytes afterward; the command must reject the bundle or pass only objects parsed from pinned bytes. Proposed fix: read each input once into immutable bytes, hash and parse those same bytes, use ZipFile(BytesIO(artifact_bytes)), and return verified parsed values downstream.Path arguments at governance_adjudication.py:710-719 and writes at lines 746-747 allow --summary-json to overwrite documents, protocol, schema, manifest, artifact, or hard-link aliases after successful validation while still exiting successfully.json.loads() at governance_adjudication.py:722 silently accepts duplicate keys, while verify_input_manifest() assumes a dictionary at lines 84-89. An array containing exactly REQUIRED_INPUT_PINS reaches .get() and raises AttributeError; duplicate artifact_sha256 keys with forged first/pinned last are accepted because Python retains the last value.isinstance(manifest, dict) check before set().FROZEN_INPUT_PINS at governance_adjudication.py:35-49 and cases/review/oss-governance-adjudication-v1.inputs.json:2-10 merely repeat locally reviewed assertions. A data-only substitute cannot pass under an immutable verifier, but a patch changing constants, manifest, and bundle together can pass, leaving code review and the eventual Git commit as the sole provenance root.archive.read(member_name) at governance_adjudication.py:104-115 accepts duplicate ZIP members; a synthetic archive with two different documents.json entries passed when Python selected the member matching the durable file.10.89. Its fixed hash currently prevents duplicate-member substitution under stable paths.ValueError.file_sha256() reads until EOF at lines 66-71, the CLI loads full JSON files at lines 721-725, and archive.read() allocates complete members at line 111. A FIFO can block forever and oversized files can consume unbounded time or memory before hash rejection.423,046 bytes and 1,993,647 uncompressed bytes.canonical_sha256() at governance_adjudication.py:61-63 uses default json.dumps() and therefore accepts/re-emits NaN and infinities despite strict JSON forbidding them; object-key ordering was stable, and the pinned raw-file hash prevents substitution of the current documents.allow_nan=False, parser rejection of non-finite constants, and tests covering key-order stability plus rejection of NaN, positive infinity, and negative infinity.schema/governance-adjudication-v1.schema.json:39-68: exactly 9 input pins, positive integer IDs, lowercase 64-character hashes, and no additional properties; corrected probes rejected missing, extra, uppercase-hash, and boolean-ID inputs.tests/test_governance_adjudication.py:689-705 verifies the committed bundle against the current artifact, and manifest-substitution parameterization at lines 564-582 covers every frozen field.test_every_input_pin_is_reverified mutates only artifact_sha256 at lines 547-554; changed durable bytes are tested only for documents at lines 596-639; artifact mismatch only for the documents member at lines 642-686; no CLI coverage existed for read ordering, mutable paths, path aliases, malformed manifest shapes, duplicate JSON keys, duplicate ZIP members, special files, or resource limits.git status --short and git diff found all 4 reviewed files untracked with no tracked diff; narrow pytest result was exactly 16 passed, 28 deselected; additional probes covered artifact hash, ZIP metadata, path type, compression, ambiguity, duplicate manifests, malformed manifests, duplicate ZIPs, stale preloads, direct CLI substitution, and input-pin schema.PointerToNowhere: '/$defs/sha256'; rerunning with root $defs yielded expected results. Canonicalization probes covered object ordering and non-finite numbers./tmp/opencode; governance source records, codings, outcomes, dates, reports, detector output, and active review scopes were not inspected. Audit disposition: DO-NOT-MERGE.governance_adjudication.py = 0c873db5c8a2394150fa35d96694317f6cb2e847bc41919e1ca82992b86e57c0; schema = 6181f5cb60a0462f83be00be301763daa89f11581e68ee1c46a84e8bf4e5be31; tests = 56e1c751ea148495f913995e01f77a2f98ef7cf0d4e86e35a0bae21586f87b1e; manifest = ac47cff1f6a937f932d34f12e86e79d01dc79db21799ec20fa84a2db89454355.src/institution_lab/governance_adjudication.py: canonical_sha256() uses json.dumps(value, sort_keys=True, separators=(",", ":")); file_sha256() streams 1 MiB blocks; verify_input_manifest() hashes files by reopening paths, reads ZIP members from the path, rereads durable member files, and reparses documents; main() parses adjudication/manifest/documents/coding package/schema before verification and writes summary JSON/Markdown directly.tests/test_governance_adjudication.py; existing provenance tests included test_every_input_pin_is_reverified, test_input_manifest_rejects_self_consistent_substitute, test_frozen_input_identifiers_are_reverified, changed-document-byte rejection, artifact documents-member mismatch rejection, committed frozen-manifest verification, partial-fragment validation, malformed record-ID fail-closed behavior, and resolved-record gate opening.tests/test_governance_adjudication.py was modified in 3 successful update operations to add provenance/security regressions.9 failed, 44 deselected, 1 warning in 0.32s; every newly added regression failed against the current implementation.test_cli_validates_the_same_bytes_it_verifies expected ValueError matching changed while being verified, but the stale-byte substitution did not raise.test_cli_rejects_output_aliases_to_frozen_inputs[documents] and [artifact] expected ValueError matching output path aliases an input, but direct aliases were accepted.test_cli_rejects_duplicate_manifest_keys inserted an initial forged and later pinned artifact_sha256; expected ValueError matching duplicate JSON key: artifact_sha256, but no exception was raised.test_input_manifest_rejects_non_object passed []; implementation raised ValueError("input manifest has missing or unexpected keys") instead of controlled ValueError("input manifest must be an object").test_input_manifest_rejects_duplicate_artifact_members expected ValueError matching artifact member is not unique: documents.json, but duplicate documents.json was accepted. Python emitted one UserWarning: Duplicate name: 'documents.json'.test_canonical_sha256_rejects_non_finite_numbers for nan, inf, and -inf expected ValueError matching Out of range float values, but all 3 values were accepted.open report with a closed marker before implementing fixes.