From 4323518ffa8a8a9885bd1d81df6f3dae2dd3f6a9 Mon Sep 17 00:00:00 2001 From: ross Date: Tue, 20 Oct 2026 23:11:31 +1100 Subject: [PATCH] Audit signed R429 integer range and atomic error sensitivity --- research/r429-signed-range/CONTROLS.json | 482 ++++++++++ research/r429-signed-range/CORE-SNAPSHOT.json | 327 +++++++ research/r429-signed-range/EVIDENCE-INDEX.md | 51 ++ research/r429-signed-range/FROZEN-SHA256.json | 27 + research/r429-signed-range/LICENSE | 201 +++++ research/r429-signed-range/ORIGINS.json | 121 +++ research/r429-signed-range/PROOF-INTEGER.md | 252 ++++++ research/r429-signed-range/PROOF-RANGE.md | 271 ++++++ research/r429-signed-range/README.md | 143 +++ research/r429-signed-range/RELATED-WORK.json | 48 + research/r429-signed-range/REVIEW-INTEGER.md | 110 +++ research/r429-signed-range/REVIEW-RANGE.md | 127 +++ .../r429-signed-range/REVIEW-VERIFICATION.md | 162 ++++ research/r429-signed-range/SOURCES.json | 48 + research/r429-signed-range/TASK.json | 90 ++ research/r429-signed-range/VERIFY.json | 60 ++ research/r429-signed-range/controls.py | 358 ++++++++ .../frozen/candidate/GROWTH.json | 72 ++ .../frozen/candidate/RESULT.json | 109 +++ .../frozen/candidate/WORD.json.gz | Bin 0 -> 59544 bytes .../frozen/controller/WORD.json.gz | Bin 0 -> 16510 bytes .../frozen/geometry/MATRICES.json.gz | Bin 0 -> 8765 bytes .../frozen/geometry/WORD.json.gz | Bin 0 -> 42305 bytes .../frozen/historical/REPLAY.json | 177 ++++ .../frozen/old/bit_cap_copy_local.py | 162 ++++ .../frozen/old/bit_prune_audit.py | 160 ++++ .../frozen/old/bit_pruned_growth.py | 102 +++ .../frozen/old/bit_signed_audit.py | 237 +++++ .../frozen/old/signed_quotient_search.py | 92 ++ .../frozen/parent/GROWTH.json.gz | Bin 0 -> 38095 bytes .../frozen/parent/WORD.json.gz | Bin 0 -> 59514 bytes .../frozen/reviews/integer/CHECKS.json.gz | Bin 0 -> 17009 bytes .../reviews/integer/SOURCE-DEPENDENCIES.json | 147 +++ .../reviews/integer/VALIDATION-RUN.json | 31 + .../frozen/reviews/integer/VALIDATION.json | 78 ++ .../frozen/reviews/integer/VALIDATION.md | 52 ++ .../frozen/reviews/integer/check_integer.py | 770 ++++++++++++++++ .../frozen/reviews/range/CHECKS.json.gz | Bin 0 -> 286198 bytes .../reviews/range/SOURCE-DEPENDENCIES.json | 125 +++ .../reviews/range/VALIDATION-RESULT.json | 39 + .../frozen/reviews/range/VALIDATION.md | 77 ++ .../frozen/reviews/range/check_range.py | 851 ++++++++++++++++++ research/r429-signed-range/verify.py | 245 +++++ 43 files changed, 6404 insertions(+) create mode 100644 research/r429-signed-range/CONTROLS.json create mode 100644 research/r429-signed-range/CORE-SNAPSHOT.json create mode 100644 research/r429-signed-range/EVIDENCE-INDEX.md create mode 100644 research/r429-signed-range/FROZEN-SHA256.json create mode 100644 research/r429-signed-range/LICENSE create mode 100644 research/r429-signed-range/ORIGINS.json create mode 100644 research/r429-signed-range/PROOF-INTEGER.md create mode 100644 research/r429-signed-range/PROOF-RANGE.md create mode 100644 research/r429-signed-range/README.md create mode 100644 research/r429-signed-range/RELATED-WORK.json create mode 100644 research/r429-signed-range/REVIEW-INTEGER.md create mode 100644 research/r429-signed-range/REVIEW-RANGE.md create mode 100644 research/r429-signed-range/REVIEW-VERIFICATION.md create mode 100644 research/r429-signed-range/SOURCES.json create mode 100644 research/r429-signed-range/TASK.json create mode 100644 research/r429-signed-range/VERIFY.json create mode 100644 research/r429-signed-range/controls.py create mode 100644 research/r429-signed-range/frozen/candidate/GROWTH.json create mode 100644 research/r429-signed-range/frozen/candidate/RESULT.json create mode 100644 research/r429-signed-range/frozen/candidate/WORD.json.gz create mode 100644 research/r429-signed-range/frozen/controller/WORD.json.gz create mode 100644 research/r429-signed-range/frozen/geometry/MATRICES.json.gz create mode 100644 research/r429-signed-range/frozen/geometry/WORD.json.gz create mode 100644 research/r429-signed-range/frozen/historical/REPLAY.json create mode 100644 research/r429-signed-range/frozen/old/bit_cap_copy_local.py create mode 100644 research/r429-signed-range/frozen/old/bit_prune_audit.py create mode 100644 research/r429-signed-range/frozen/old/bit_pruned_growth.py create mode 100644 research/r429-signed-range/frozen/old/bit_signed_audit.py create mode 100644 research/r429-signed-range/frozen/old/signed_quotient_search.py create mode 100644 research/r429-signed-range/frozen/parent/GROWTH.json.gz create mode 100644 research/r429-signed-range/frozen/parent/WORD.json.gz create mode 100644 research/r429-signed-range/frozen/reviews/integer/CHECKS.json.gz create mode 100644 research/r429-signed-range/frozen/reviews/integer/SOURCE-DEPENDENCIES.json create mode 100644 research/r429-signed-range/frozen/reviews/integer/VALIDATION-RUN.json create mode 100644 research/r429-signed-range/frozen/reviews/integer/VALIDATION.json create mode 100644 research/r429-signed-range/frozen/reviews/integer/VALIDATION.md create mode 100644 research/r429-signed-range/frozen/reviews/integer/check_integer.py create mode 100644 research/r429-signed-range/frozen/reviews/range/CHECKS.json.gz create mode 100644 research/r429-signed-range/frozen/reviews/range/SOURCE-DEPENDENCIES.json create mode 100644 research/r429-signed-range/frozen/reviews/range/VALIDATION-RESULT.json create mode 100644 research/r429-signed-range/frozen/reviews/range/VALIDATION.md create mode 100644 research/r429-signed-range/frozen/reviews/range/check_range.py create mode 100644 research/r429-signed-range/verify.py diff --git a/research/r429-signed-range/CONTROLS.json b/research/r429-signed-range/CONTROLS.json new file mode 100644 index 0000000000..deef7b2aa9 --- /dev/null +++ b/research/r429-signed-range/CONTROLS.json @@ -0,0 +1,482 @@ +{ + "full_word_or_search_replayed": false, + "no_new_kappa": true, + "runs": [ + { + "complete_real_receipts": [ + { + "mutated_nested_path": [ + "forward", + "counts", + "0" + ], + "receipt": "frozen/candidate/RESULT.json", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/candidate/RESULT.json" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/candidate/RESULT.json" + } + ], + "sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20" + }, + { + "mutated_nested_path": [ + "whole_controller", + "local_stage_checkpoints", + 0, + "prefix_upper_bits" + ], + "receipt": "frozen/candidate/GROWTH.json", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/candidate/GROWTH.json" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/candidate/GROWTH.json" + } + ], + "sha256": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9" + }, + { + "mutated_nested_path": [ + "baseline", + "whole_controller", + "local_stage_checkpoints", + 0, + "prefix_upper_bits" + ], + "receipt": "frozen/historical/REPLAY.json", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/historical/REPLAY.json" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/historical/REPLAY.json" + } + ], + "sha256": "22bf26867c054dbc44a86aa2ea072b9a0b4675345ec3f76c71178795e78d8399" + }, + { + "mutated_nested_path": [ + "all_sign_family_transfer", + "quotients", + "parent", + "forward", + "matrix", + 0, + 0 + ], + "receipt": "frozen/reviews/integer/CHECKS.json.gz", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/reviews/integer/CHECKS.json.gz" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/reviews/integer/CHECKS.json.gz" + } + ], + "sha256": "b1710a496352872a80ed97271ddf2bfbf304cd009d45b345f2211561bfb5527e" + }, + { + "mutated_nested_path": [ + "candidate", + "suffix", + "forward", + "aggregate_attainment_witnesses", + "all_events", + "forward_output_sparse", + 0, + 0 + ], + "receipt": "frozen/reviews/range/CHECKS.json.gz", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/reviews/range/CHECKS.json.gz" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/reviews/range/CHECKS.json.gz" + } + ], + "sha256": "0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780" + } + ], + "compressed_original_binding": { + "equivalent_storage_with_same_original_accepted": true, + "rejections": [ + { + "name": "changed_compressed_bytes", + "reason": "frozen input changed: frozen/original.json.gz" + }, + { + "name": "changed_decompressed_original", + "reason": "compressed original bytes changed: frozen/original.json.gz" + } + ] + }, + "mathematical_controls": { + "actual_authenticated_function": "bit_signed_audit.code", + "arbitrary_source_columns": 111, + "deleted_named_check_detected": true, + "positive_prefix_norms": [ + 2, + 3 + ], + "rejections": [ + { + "name": "self_source_add", + "reason": "source code not inplace" + }, + { + "name": "source_coordinate_outside_bank", + "reason": "source code not inplace" + }, + { + "name": "inverse_subtraction_replaced_by_addition", + "reason": "signed source-code literal inverse" + }, + { + "name": "independent_control_rejects_unrelated_exception", + "reason": "negative control reached an unintended gate: unrelated_fixture: UNRELATED_GATE" + } + ] + }, + "parent_optimization": 0, + "receipt_contract": { + "deleted_named_check_detected": true, + "rejections": [ + { + "name": "boolean_for_integer", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "float_for_integer", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "integer_for_boolean", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "nested_omission", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "list_reordering", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "list_truncation", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "missing_fixed_receipt", + "reason": "[Errno 2] No such file or directory: '/private/var/folders/3v/9244hdf12cj1k9jjspv9wh2h0000gn/T/b04-controls-84b3ciee/receipt/frozen/receipt.json'" + } + ] + }, + "source_selection": { + "imports_top_level_and_main_excluded": true, + "rejections": [ + { + "name": "direct_runtime_gate_under_parent_flags", + "reason": "DIRECT_RUNTIME_GATE" + }, + { + "name": "extracted_assert_under_parent_flags", + "reason": "EXTRACTED_ASSERT" + }, + { + "name": "nested_assert_under_parent_flags", + "reason": "NESTED_ASSERT" + }, + { + "name": "authenticated_module_assert_under_parent_flags", + "reason": "MODULE_ASSERT" + }, + { + "name": "changed_authenticated_module", + "reason": "frozen input changed: frozen/module.py" + }, + { + "name": "missing_named_definition", + "reason": "function selection changed" + }, + { + "name": "duplicate_source_definition", + "reason": "function selection changed" + }, + { + "name": "duplicate_requested_name", + "reason": "function selection changed" + }, + { + "name": "unregistered_source", + "reason": "unregistered frozen input: frozen/unknown.py" + }, + { + "name": "changed_authenticated_source", + "reason": "frozen input changed: frozen/source.py" + }, + { + "name": "missing_registered_source", + "reason": "[Errno 2] No such file or directory: '/private/var/folders/3v/9244hdf12cj1k9jjspv9wh2h0000gn/T/b04-controls-84b3ciee/source/frozen/source.py'" + } + ] + }, + "verifier_sha256": "9654fb97c9163dc04970e43e1f4c03a49279bc2983b5131f2d6134ce243fb6cc" + }, + { + "complete_real_receipts": [ + { + "mutated_nested_path": [ + "forward", + "counts", + "0" + ], + "receipt": "frozen/candidate/RESULT.json", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/candidate/RESULT.json" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/candidate/RESULT.json" + } + ], + "sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20" + }, + { + "mutated_nested_path": [ + "whole_controller", + "local_stage_checkpoints", + 0, + "prefix_upper_bits" + ], + "receipt": "frozen/candidate/GROWTH.json", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/candidate/GROWTH.json" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/candidate/GROWTH.json" + } + ], + "sha256": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9" + }, + { + "mutated_nested_path": [ + "baseline", + "whole_controller", + "local_stage_checkpoints", + 0, + "prefix_upper_bits" + ], + "receipt": "frozen/historical/REPLAY.json", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/historical/REPLAY.json" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/historical/REPLAY.json" + } + ], + "sha256": "22bf26867c054dbc44a86aa2ea072b9a0b4675345ec3f76c71178795e78d8399" + }, + { + "mutated_nested_path": [ + "all_sign_family_transfer", + "quotients", + "parent", + "forward", + "matrix", + 0, + 0 + ], + "receipt": "frozen/reviews/integer/CHECKS.json.gz", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/reviews/integer/CHECKS.json.gz" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/reviews/integer/CHECKS.json.gz" + } + ], + "sha256": "b1710a496352872a80ed97271ddf2bfbf304cd009d45b345f2211561bfb5527e" + }, + { + "mutated_nested_path": [ + "candidate", + "suffix", + "forward", + "aggregate_attainment_witnesses", + "all_events", + "forward_output_sparse", + 0, + 0 + ], + "receipt": "frozen/reviews/range/CHECKS.json.gz", + "rejections": [ + { + "name": "real_nested_field_mutation", + "reason": "complete receipt mismatch: frozen/reviews/range/CHECKS.json.gz" + }, + { + "name": "real_nested_field_omission", + "reason": "complete receipt mismatch: frozen/reviews/range/CHECKS.json.gz" + } + ], + "sha256": "0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780" + } + ], + "compressed_original_binding": { + "equivalent_storage_with_same_original_accepted": true, + "rejections": [ + { + "name": "changed_compressed_bytes", + "reason": "frozen input changed: frozen/original.json.gz" + }, + { + "name": "changed_decompressed_original", + "reason": "compressed original bytes changed: frozen/original.json.gz" + } + ] + }, + "mathematical_controls": { + "actual_authenticated_function": "bit_signed_audit.code", + "arbitrary_source_columns": 111, + "deleted_named_check_detected": true, + "positive_prefix_norms": [ + 2, + 3 + ], + "rejections": [ + { + "name": "self_source_add", + "reason": "source code not inplace" + }, + { + "name": "source_coordinate_outside_bank", + "reason": "source code not inplace" + }, + { + "name": "inverse_subtraction_replaced_by_addition", + "reason": "signed source-code literal inverse" + }, + { + "name": "independent_control_rejects_unrelated_exception", + "reason": "negative control reached an unintended gate: unrelated_fixture: UNRELATED_GATE" + } + ] + }, + "parent_optimization": 1, + "receipt_contract": { + "deleted_named_check_detected": true, + "rejections": [ + { + "name": "boolean_for_integer", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "float_for_integer", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "integer_for_boolean", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "nested_omission", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "list_reordering", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "list_truncation", + "reason": "complete receipt mismatch: frozen/receipt.json" + }, + { + "name": "missing_fixed_receipt", + "reason": "[Errno 2] No such file or directory: '/private/var/folders/3v/9244hdf12cj1k9jjspv9wh2h0000gn/T/b04-controls-17w082fs/receipt/frozen/receipt.json'" + } + ] + }, + "source_selection": { + "imports_top_level_and_main_excluded": true, + "rejections": [ + { + "name": "direct_runtime_gate_under_parent_flags", + "reason": "DIRECT_RUNTIME_GATE" + }, + { + "name": "extracted_assert_under_parent_flags", + "reason": "EXTRACTED_ASSERT" + }, + { + "name": "nested_assert_under_parent_flags", + "reason": "NESTED_ASSERT" + }, + { + "name": "authenticated_module_assert_under_parent_flags", + "reason": "MODULE_ASSERT" + }, + { + "name": "changed_authenticated_module", + "reason": "frozen input changed: frozen/module.py" + }, + { + "name": "missing_named_definition", + "reason": "function selection changed" + }, + { + "name": "duplicate_source_definition", + "reason": "function selection changed" + }, + { + "name": "duplicate_requested_name", + "reason": "function selection changed" + }, + { + "name": "unregistered_source", + "reason": "unregistered frozen input: frozen/unknown.py" + }, + { + "name": "changed_authenticated_source", + "reason": "frozen input changed: frozen/source.py" + }, + { + "name": "missing_registered_source", + "reason": "[Errno 2] No such file or directory: '/private/var/folders/3v/9244hdf12cj1k9jjspv9wh2h0000gn/T/b04-controls-17w082fs/source/frozen/source.py'" + } + ] + }, + "verifier_sha256": "9654fb97c9163dc04970e43e1f4c03a49279bc2983b5131f2d6134ce243fb6cc" + } + ], + "source_hashes": { + "FROZEN-SHA256.json": "cffff97339b54903d6ae821ff5242a6506765e920975c81087de665d35ea4044", + "ORIGINS.json": "44c0671914f8991786bcb5654cb286aec029900f3470a3ce98026b060dfa2d3c", + "verify.py": "9654fb97c9163dc04970e43e1f4c03a49279bc2983b5131f2d6134ce243fb6cc" + }, + "status": "PASS_B04_COMPACT_SOURCE_AND_MATHEMATICAL_GATES" +} diff --git a/research/r429-signed-range/CORE-SNAPSHOT.json b/research/r429-signed-range/CORE-SNAPSHOT.json new file mode 100644 index 0000000000..0287327f06 --- /dev/null +++ b/research/r429-signed-range/CORE-SNAPSHOT.json @@ -0,0 +1,327 @@ +{ + "compact_controls": [ + { + "check_deletion_tests": 2, + "full_real_receipts": 5, + "intended_rejections": 34, + "optimization": 0 + }, + { + "check_deletion_tests": 2, + "full_real_receipts": 5, + "intended_rejections": 34, + "optimization": 1 + } + ], + "controls_receipt_sha256": "14fa6c2a9b5565be15748fe2f1a4b76371b6fac2c19f55c517a92000390ffa7f", + "core_sha256": "2dee81002aa7b327642ab08fd09df5732f404ebebace356e2c278e1e15990e2d", + "decompressed_original_bindings": [ + "frozen/controller/WORD.json.gz", + "frozen/geometry/MATRICES.json.gz", + "frozen/parent/GROWTH.json.gz", + "frozen/reviews/integer/CHECKS.json.gz" + ], + "file_count": 41, + "files": { + "EVIDENCE-INDEX.md": { + "bytes": 4229, + "sha256": "85be6b4295f287c21eeab54b6bc84481fa9ed53cd42e99324c956f3269704029" + }, + "FROZEN-SHA256.json": { + "bytes": 2700, + "sha256": "96df3452750366628ddf3c957654a60ca7e42f0ff8315efddc40dfade2437e11" + }, + "LICENSE": { + "bytes": 11357, + "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" + }, + "ORIGINS.json": { + "bytes": 8525, + "sha256": "25056f8eeab027f756a5b293b5f32e4f7da4df3b3c72b65fcb08615a2df4c26a" + }, + "PROOF-INTEGER.md": { + "bytes": 10687, + "sha256": "ed3adb5a955956a4bb1b24d38250fb18b8b1b3740010d3d0d987309fbbe743c9" + }, + "PROOF-RANGE.md": { + "bytes": 13072, + "sha256": "af5f7408119dd2ef8a17a97c0e025d24651081294ee9134d139cce4fa27b080f" + }, + "README.md": { + "bytes": 7673, + "sha256": "47667a24e139b69b7ddc10fbdc8264700b905fd41553cff52113d5a3514d9a95" + }, + "RELATED-WORK.json": { + "bytes": 1908, + "sha256": "0a1f45ac46da31fb9ff2339e6fb56aea6128053dce35f90591e93d8fe4e9347d" + }, + "REVIEW-INTEGER.md": { + "bytes": 5756, + "sha256": "5ecd25ee53bf04991848add1be87b95aadc489d74fdda45c4224a0ddb6cbd707" + }, + "REVIEW-RANGE.md": { + "bytes": 6855, + "sha256": "bcb8b0ccb3e48e2e2f276bcb3a237b615735df01754a96814d9002e37e303b50" + }, + "REVIEW-VERIFICATION.md": { + "bytes": 9350, + "sha256": "f40976abf21d2a78fb150329bc7cbbc837e8e487b3f9acc13306fa52304783da" + }, + "SOURCES.json": { + "bytes": 1825, + "sha256": "8bba7fd6b2fe4c7d567f9077c4b2b98720a780548077ca275fe14b960f20ca59" + }, + "TASK.json": { + "bytes": 6523, + "sha256": "7a67372964750dea14362660ddbc8fa26af849871b69fce041fd6e0407245d59" + }, + "VERIFY.json": { + "bytes": 1684, + "sha256": "e8253a2ed943c3b16c07c126b4d5ebb3eea8ed7e8936e5ed8f91049e91f46be7" + }, + "controls.py": { + "bytes": 15545, + "sha256": "f60feee719769a8c6ab6e0adc6ce3ee31bfd1391977fd66730b71343eb345e49" + }, + "frozen/candidate/GROWTH.json": { + "bytes": 2053, + "sha256": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9" + }, + "frozen/candidate/RESULT.json": { + "bytes": 1648, + "sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20" + }, + "frozen/candidate/WORD.json.gz": { + "bytes": 59544, + "sha256": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949" + }, + "frozen/controller/WORD.json.gz": { + "bytes": 16510, + "sha256": "ff50e2df9b5a0ecb5e4a3aa24a5b93ac49f7c2b4fd3d28295e6d5a8f6154027f" + }, + "frozen/geometry/MATRICES.json.gz": { + "bytes": 8765, + "sha256": "0919f9b758078a5a1b51a9d550f607fd17c3adfddf55ace306b23f2108d57e7f" + }, + "frozen/geometry/WORD.json.gz": { + "bytes": 42305, + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + }, + "frozen/historical/REPLAY.json": { + "bytes": 5096, + "sha256": "22bf26867c054dbc44a86aa2ea072b9a0b4675345ec3f76c71178795e78d8399" + }, + "frozen/old/bit_cap_copy_local.py": { + "bytes": 7588, + "sha256": "6e9ca1eb905d769716c009904f45d6849b225e48cd119f18b50c0379f35313cb" + }, + "frozen/old/bit_prune_audit.py": { + "bytes": 8758, + "sha256": "d284714fd65054279c180454b73eb717382e402669d5a04e3f373d0d7f54bc06" + }, + "frozen/old/bit_pruned_growth.py": { + "bytes": 5429, + "sha256": "9c59a9a521e0d0124df6b7686f76e0308c13678306f5efc53eb6e865757f8636" + }, + "frozen/old/bit_signed_audit.py": { + "bytes": 11946, + "sha256": "376356696663021693c0e2c9adf37f371675fe8837fb88232b8767a8b90793e8" + }, + "frozen/old/signed_quotient_search.py": { + "bytes": 4124, + "sha256": "fc9fce83d0fa613e8a442f44f0548fb82913b50ba901de89973eb11ff3311a16" + }, + "frozen/parent/GROWTH.json.gz": { + "bytes": 38095, + "sha256": "8e31256b3b4df6de4576d030fbe8ca6006d41565698e1eed245538cf25f5e92e" + }, + "frozen/parent/WORD.json.gz": { + "bytes": 59514, + "sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870" + }, + "frozen/reviews/integer/CHECKS.json.gz": { + "bytes": 17009, + "sha256": "b1710a496352872a80ed97271ddf2bfbf304cd009d45b345f2211561bfb5527e" + }, + "frozen/reviews/integer/SOURCE-DEPENDENCIES.json": { + "bytes": 8535, + "sha256": "4f6bc94a650c238dccd1e7e80e254373ec57071089968972b48860b71bfbeedf" + }, + "frozen/reviews/integer/VALIDATION-RUN.json": { + "bytes": 1794, + "sha256": "7310a204b8feb75ac3fa8be0ef438486e4a9ae7e7505470eaddd5cfd158f7853" + }, + "frozen/reviews/integer/VALIDATION.json": { + "bytes": 3383, + "sha256": "3dc24bdaf215887ca5aef5152259108aceed78f9662225eb466db4a85ed52e97" + }, + "frozen/reviews/integer/VALIDATION.md": { + "bytes": 2485, + "sha256": "229705bf1a97d65c63d25dbf54ad2cc90ba7c1093ee238f71fd6cf1f3247bad7" + }, + "frozen/reviews/integer/check_integer.py": { + "bytes": 39485, + "sha256": "96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522" + }, + "frozen/reviews/range/CHECKS.json.gz": { + "bytes": 286198, + "sha256": "0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780" + }, + "frozen/reviews/range/SOURCE-DEPENDENCIES.json": { + "bytes": 6381, + "sha256": "14f317713ab4ebd39269966d3edf1b7f31a31077422e64c0f8b4fc8c15207a8d" + }, + "frozen/reviews/range/VALIDATION-RESULT.json": { + "bytes": 2853, + "sha256": "89653166a2d880b24f1ec5f92bf1849299b710acfdcd035953a51aedb7b5d67b" + }, + "frozen/reviews/range/VALIDATION.md": { + "bytes": 3393, + "sha256": "ea2b056ec7738e9af75bc09706855d7fc1f0653bf4e65c1a4004ed7b5e0291e2" + }, + "frozen/reviews/range/check_range.py": { + "bytes": 41189, + "sha256": "4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5" + }, + "verify.py": { + "bytes": 11827, + "sha256": "9654fb97c9163dc04970e43e1f4c03a49279bc2983b5131f2d6134ce243fb6cc" + } + }, + "frozen_tree_exactly_registered": true, + "independent_source_closure": { + "integer": { + "imports": [ + "argparse", + "collections", + "gzip", + "hashlib", + "itertools", + "json", + "math", + "pathlib" + ], + "sha256": "96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522", + "source": "frozen/reviews/integer/check_integer.py" + }, + "range": { + "imports": [ + "argparse", + "collections", + "gzip", + "hashlib", + "json", + "pathlib", + "sys" + ], + "sha256": "4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5", + "source": "frozen/reviews/range/check_range.py" + } + }, + "no_new_kappa": true, + "no_precision_or_supplier_admission": true, + "origin_entries_exactly_registered": true, + "package": "research/r429-signed-range", + "post_control_required_heading_refresh": { + "after_heading": "## Open next questions", + "after_sha256": "47667a24e139b69b7ddc10fbdc8264700b905fd41553cff52113d5a3514d9a95", + "all_other_snapshot_files_unchanged": true, + "before_heading": "## Limits and next obligation", + "before_sha256": "c9c461b1a3db8ce0764a45da6f7dc368aa19dfcf36e41a417bca7b64bb0e7b00", + "file": "README.md", + "gate_fix": "The repository package gate requires the exact README heading ## Open next questions. The existing limits and next-obligation section was renamed without changing its content.", + "gate_outcome_from_parent": "Previous package gate stopped before mathematical replay; final registered replay follows this heading fix.", + "mathematical_or_compact_replay_run_by_this_refresh": false, + "prior_core_sha256": "c56f88096a87bc19a4c8a96a996661e4dacae056e70894102b2c2f54b052a4c3", + "prior_readme_exactly_reconstructed_and_authenticated": true + }, + "post_control_whitespace_refresh": { + "all_other_snapshot_files_unchanged": true, + "compact_controls_replayed": false, + "control_code_and_scientific_code_receipts_unchanged": true, + "controls_receipt_scope": "Existing normal/-O execution precedes this whitespace-only documentation and matching manifest update; all scientific sources, complete scientific receipts and acceptance code are unchanged.", + "document_delta": { + "PROOF-INTEGER.md": { + "after_sha256": "ed3adb5a955956a4bb1b24d38250fb18b8b1b3740010d3d0d987309fbbe743c9", + "before_sha256": "cdd26a4e40df980dfd8d12b8da87e2ddcdc61b3d89586c618cbb07bc9a671e21", + "removed_LF_bytes": 1 + }, + "REVIEW-INTEGER.md": { + "after_sha256": "5ecd25ee53bf04991848add1be87b95aadc489d74fdda45c4224a0ddb6cbd707", + "before_sha256": "652b7aa528281c5205a163b63f33d5005655805e03a4b1f70788b5b467baac0b", + "removed_LF_bytes": 1 + }, + "frozen/reviews/integer/VALIDATION.md": { + "after_sha256": "229705bf1a97d65c63d25dbf54ad2cc90ba7c1093ee238f71fd6cf1f3247bad7", + "before_sha256": "624cf3c4dda6ad27903350afa1e42edc68a4482518e17edd89d7e94ed348bf50", + "removed_LF_bytes": 1 + } + }, + "manifest_delta": "Only frozen/reviews/integer/VALIDATION.md sha256 changed in each of FROZEN-SHA256.json and ORIGINS.json; exact prior serialized manifests reconstructed and authenticated.", + "original_current_run_validation_matches": true, + "prior_core_sha256": "de46386af42e7db363f65595a6d2bbeeaf2eff2954ab798307da9fd8c938a539" + }, + "registered_commands": [ + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py", + "--stage", + "historical" + ], + "checks": "Fixed 23-sign witness: exact declared record differences, retained complete integer/F2 replays, both original signed receipts and full new range summary; no sign search.", + "timeout_seconds": 120 + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py", + "--stage", + "integer" + ], + "checks": "Independent dense all 651-column integer/F2/frame/COPY audit, both roundtrips, attained prefix norms, exact fixed-transfer proof for all 2^47 signs and intended-gate controls.", + "timeout_seconds": 180 + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py", + "--stage", + "range" + ], + "checks": "Independent sparse range reconstruction, selected arbitrary-code schedule, all ordered controller factors and complete adjoint/dual/forward defect checks for both actual 651-input words.", + "timeout_seconds": 180 + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/controls.py", + "--package", + "{package}" + ], + "checks": "Normal and optimized source-selection/module assertions, compression bindings, all five full typed receipts, semantic inverse-sign control and deleted-check sensitivity.", + "timeout_seconds": 60 + } + ], + "registered_frozen_inputs": 25, + "reviewer_replayed_full_math_stages": false, + "schema": "b04-source-verification-core-snapshot-v1", + "snapshot_excluded_receipt_names": [ + "CONTROLS.json", + "CORE-SNAPSHOT.json", + "REVIEW-CONTROLS.json", + "REVIEW-CORE-SNAPSHOT.json" + ], + "status": "PASS_SCOPED_SOURCE_AND_CONTROL_REVIEW" +} diff --git a/research/r429-signed-range/EVIDENCE-INDEX.md b/research/r429-signed-range/EVIDENCE-INDEX.md new file mode 100644 index 0000000000..c2aecd0b50 --- /dev/null +++ b/research/r429-signed-range/EVIDENCE-INDEX.md @@ -0,0 +1,51 @@ +# Claims, source bindings and coverage + +| Claim | Evidence | Boundary | +| --- | --- | --- | +| Fixed 23-sign witness and unchanged records/boundaries | `verify.py --stage historical` compares every parent/candidate field and executes named retained functions | No repetition of the historical randomized sign search; no optimum claimed. | +| Complete original signed result and growth receipts | Same stage compares `frozen/candidate/RESULT.json` and `GROWTH.json` in full | The old parent growth receipt is retained as provenance; fresh parent ranges appear in the new complete replay receipt. | +| New retained-function summary | Same stage compares `frozen/historical/REPLAY.json` in full | Explicit selected scalar code instantiation; not the legacy controller code. | +| Every integer/F2 column, physical frame and COPY lifetime | Independent integer checker, with complete receipt and semantic controls | All 651 public inputs, both directions and roundtrips; native ADDRESS child implementations remain inherited. | +| Whole sign-family block restriction | Written prefix–quotient–suffix proof and exact fixed-transfer reconstruction | Rank bounds hold under the stated fixed prefix/suffix and nine-coordinate quotient replacement; exact ranks 9 and 3 describe this witness. | +| Local prefix range | Independent dense integer and sparse range implementations, plus retained functions | Exact scalar row norms with attaining inputs; native-vector use needs the specified isometry premise. | +| Ordered global range | Independent selected-code extraction, free noncommuting schedule check and full bank recurrence | Includes 63 selected code factors and encoded dirty magnitudes. It does not replay the artifact's different legacy integer code. | +| Atomic defect constants | Full adjoint scan for both actual 651-input words in each direction | Exact scalar assignment model with explicit eligible events and COPY/ERASE premise. | +| Sharpness and defect controls | Separate scalar dual-row recurrence, forward impulses and simultaneous sign-aligned errors | Completed output only; no perturbed-prefix, relative-error or native child-interior theorem. | +| Acceptance mechanism | Compact normal/optimized controls, including deliberate check deletion | Source authenticity and full typed comparison are separate from mathematical validity. | + +## Exact source execution + +The historical stage extracts only these unchanged original function definitions: + +- `bit_cap_copy_local.py`: `need`, `canonical`, `rank`; +- `bit_signed_audit.py`: `identity`, `add`, `row_weights`, `parity`, + `block_norms`, `code`, `global_bound`; +- `bit_prune_audit.py`: `execute`; +- `bit_pruned_growth.py`: `coefficients`; +- `signed_quotient_search.py`: `score`. + +Dependencies are explicitly supplied standard-library objects and the preceding +functions. Original imports, filesystem constants, entrypoints and search loops +are excluded. Each selected definition must occur exactly once. The exact +authenticated bytes are parsed and compiled with `dont_inherit=True,optimize=0`; +no mathematical expression, coefficient, domain or loop is patched. + +The independent integer and range programs import no producer implementation. +Their complete source files are authenticated and compiled with assertions +enabled. They write only fresh external temporary results during verification, +which are compared with the separately frozen complete receipts. Missing fixed +evidence fails; it is not regenerated into the package. + +The compressed controller retains all ordered events and its legacy code list. +The unused legacy code is explicitly examined as a differing source contract. +The retained original suffix program is not a runtime input: it concerns a +different 660-input word, and the fresh adjoint checker supplies the relevant +651-input calculation. + +## Distinct validation stages + +Committed-byte and source-history checks establish publication provenance. +The registered replay verifies the stated finite claims and controls. A +read-only Git-free export checks portability. Automatic hosted CI is reported +separately on the PR's actual head. None of these is a formal-kernel proof, +human acceptance, physical rounded implementation or supplier admission. diff --git a/research/r429-signed-range/FROZEN-SHA256.json b/research/r429-signed-range/FROZEN-SHA256.json new file mode 100644 index 0000000000..e13e34ea6c --- /dev/null +++ b/research/r429-signed-range/FROZEN-SHA256.json @@ -0,0 +1,27 @@ +{ + "frozen/parent/WORD.json.gz": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870", + "frozen/candidate/WORD.json.gz": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949", + "frozen/candidate/RESULT.json": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20", + "frozen/candidate/GROWTH.json": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9", + "frozen/old/bit_prune_audit.py": "d284714fd65054279c180454b73eb717382e402669d5a04e3f373d0d7f54bc06", + "frozen/old/bit_signed_audit.py": "376356696663021693c0e2c9adf37f371675fe8837fb88232b8767a8b90793e8", + "frozen/old/bit_cap_copy_local.py": "6e9ca1eb905d769716c009904f45d6849b225e48cd119f18b50c0379f35313cb", + "frozen/old/signed_quotient_search.py": "fc9fce83d0fa613e8a442f44f0548fb82913b50ba901de89973eb11ff3311a16", + "frozen/old/bit_pruned_growth.py": "9c59a9a521e0d0124df6b7686f76e0308c13678306f5efc53eb6e865757f8636", + "frozen/geometry/WORD.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "frozen/controller/WORD.json.gz": "ff50e2df9b5a0ecb5e4a3aa24a5b93ac49f7c2b4fd3d28295e6d5a8f6154027f", + "frozen/geometry/MATRICES.json.gz": "0919f9b758078a5a1b51a9d550f607fd17c3adfddf55ace306b23f2108d57e7f", + "frozen/parent/GROWTH.json.gz": "8e31256b3b4df6de4576d030fbe8ca6006d41565698e1eed245538cf25f5e92e", + "frozen/historical/REPLAY.json": "22bf26867c054dbc44a86aa2ea072b9a0b4675345ec3f76c71178795e78d8399", + "frozen/reviews/range/check_range.py": "4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5", + "frozen/reviews/range/CHECKS.json.gz": "0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780", + "frozen/reviews/range/SOURCE-DEPENDENCIES.json": "14f317713ab4ebd39269966d3edf1b7f31a31077422e64c0f8b4fc8c15207a8d", + "frozen/reviews/range/VALIDATION.md": "ea2b056ec7738e9af75bc09706855d7fc1f0653bf4e65c1a4004ed7b5e0291e2", + "frozen/reviews/range/VALIDATION-RESULT.json": "89653166a2d880b24f1ec5f92bf1849299b710acfdcd035953a51aedb7b5d67b", + "frozen/reviews/integer/check_integer.py": "96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522", + "frozen/reviews/integer/SOURCE-DEPENDENCIES.json": "4f6bc94a650c238dccd1e7e80e254373ec57071089968972b48860b71bfbeedf", + "frozen/reviews/integer/VALIDATION.json": "3dc24bdaf215887ca5aef5152259108aceed78f9662225eb466db4a85ed52e97", + "frozen/reviews/integer/VALIDATION-RUN.json": "7310a204b8feb75ac3fa8be0ef438486e4a9ae7e7505470eaddd5cfd158f7853", + "frozen/reviews/integer/CHECKS.json.gz": "b1710a496352872a80ed97271ddf2bfbf304cd009d45b345f2211561bfb5527e", + "frozen/reviews/integer/VALIDATION.md": "229705bf1a97d65c63d25dbf54ad2cc90ba7c1093ee238f71fd6cf1f3247bad7" +} diff --git a/research/r429-signed-range/LICENSE b/research/r429-signed-range/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/r429-signed-range/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/research/r429-signed-range/ORIGINS.json b/research/r429-signed-range/ORIGINS.json new file mode 100644 index 0000000000..11a918e832 --- /dev/null +++ b/research/r429-signed-range/ORIGINS.json @@ -0,0 +1,121 @@ +{ + "frozen/parent/WORD.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/root-pruned-code/BIT-PRUNED-WORD.json.gz", + "sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870" + }, + "frozen/candidate/WORD.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/root-pruned-code/BIT-SIGNED-QUOTIENT-WORD.json.gz", + "sha256": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949" + }, + "frozen/candidate/RESULT.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/root-pruned-code/SIGNED-QUOTIENT-RESULT.json", + "sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20" + }, + "frozen/candidate/GROWTH.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/root-pruned-code/SIGNED-QUOTIENT-GROWTH.json", + "sha256": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9" + }, + "frozen/old/bit_prune_audit.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/bit_prune_audit.py", + "sha256": "d284714fd65054279c180454b73eb717382e402669d5a04e3f373d0d7f54bc06" + }, + "frozen/old/bit_signed_audit.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/bit_signed_audit.py", + "sha256": "376356696663021693c0e2c9adf37f371675fe8837fb88232b8767a8b90793e8" + }, + "frozen/old/bit_cap_copy_local.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/bit_cap_copy_local.py", + "sha256": "6e9ca1eb905d769716c009904f45d6849b225e48cd119f18b50c0379f35313cb" + }, + "frozen/old/signed_quotient_search.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/root-pruned-code/signed_quotient_search.py", + "sha256": "fc9fce83d0fa613e8a442f44f0548fb82913b50ba901de89973eb11ff3311a16" + }, + "frozen/old/bit_pruned_growth.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/bit_pruned_growth.py", + "sha256": "9c59a9a521e0d0124df6b7686f76e0308c13678306f5efc53eb6e865757f8636" + }, + "frozen/geometry/WORD.json.gz": { + "original_path": "/Users/ross/git/math/integer-mult-bounds/research/bit-r438-transport-rehost/words/r438-t154.json.gz", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + }, + "frozen/controller/WORD.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/BIT-NATIVE-CONTROLLER-WORD.json", + "original_sha256": "859cdd2a87ea6ce58eb0ccdf2ca675e77c7134d6a7bbc7d450493d1abb108271", + "storage": "gzip of unchanged original bytes; mtime=0", + "sha256": "ff50e2df9b5a0ecb5e4a3aa24a5b93ac49f7c2b4fd3d28295e6d5a8f6154027f" + }, + "frozen/geometry/MATRICES.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/BIT-THREE-ROW-INPUT.json", + "original_sha256": "e5edb9e4e738192f98bd520ae6c1e8f1ddb19a0074ee9a1044e309b81e39c979", + "storage": "gzip of unchanged original bytes; mtime=0", + "sha256": "0919f9b758078a5a1b51a9d550f607fd17c3adfddf55ace306b23f2108d57e7f" + }, + "frozen/parent/GROWTH.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/kappa-3605-successor-20261018T0940Z/major-frontier/recursive/BIT-PRUNED-GROWTH.json", + "original_sha256": "ccacefa32cf6edfe7a26ab5661ed14530f28dcba2d2150fff052c6f0f8f27d1b", + "storage": "gzip of unchanged original bytes; mtime=0", + "sha256": "8e31256b3b4df6de4576d030fbe8ca6006d41565698e1eed245538cf25f5e92e" + }, + "frozen/historical/REPLAY.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/B04-HISTORICAL.json", + "sha256": "22bf26867c054dbc44a86aa2ea072b9a0b4675345ec3f76c71178795e78d8399", + "role": "New complete retained-function replay receipt, generated from fixed original inputs with no search." + }, + "frozen/reviews/range/check_range.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-range-review/check_range.py", + "sha256": "4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5", + "role": "New independent range/defect review output; source and full receipt preserved unchanged." + }, + "frozen/reviews/range/CHECKS.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-range-review/FULL-RECEIPT.json.gz", + "sha256": "0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780", + "role": "New independent range/defect review output; source and full receipt preserved unchanged." + }, + "frozen/reviews/range/SOURCE-DEPENDENCIES.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-range-review/SOURCE-DEPENDENCIES.json", + "sha256": "14f317713ab4ebd39269966d3edf1b7f31a31077422e64c0f8b4fc8c15207a8d", + "role": "New independent range/defect review output; source and full receipt preserved unchanged." + }, + "frozen/reviews/range/VALIDATION.md": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-range-review/VALIDATION.md", + "sha256": "ea2b056ec7738e9af75bc09706855d7fc1f0653bf4e65c1a4004ed7b5e0291e2", + "role": "New independent range/defect review output; source and full receipt preserved unchanged." + }, + "frozen/reviews/range/VALIDATION-RESULT.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-range-review/VALIDATION-RESULT.json", + "sha256": "89653166a2d880b24f1ec5f92bf1849299b710acfdcd035953a51aedb7b5d67b", + "role": "New independent range/defect review output; source and full receipt preserved unchanged." + }, + "frozen/reviews/integer/check_integer.py": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/check_integer.py", + "sha256": "96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522", + "role": "New independent integer audit output, preserved unchanged." + }, + "frozen/reviews/integer/SOURCE-DEPENDENCIES.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/SOURCE-DEPENDENCIES.json", + "sha256": "4f6bc94a650c238dccd1e7e80e254373ec57071089968972b48860b71bfbeedf", + "role": "New independent integer audit output, preserved unchanged." + }, + "frozen/reviews/integer/VALIDATION.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/VALIDATION.json", + "sha256": "3dc24bdaf215887ca5aef5152259108aceed78f9662225eb466db4a85ed52e97", + "role": "New independent integer audit output, preserved unchanged." + }, + "frozen/reviews/integer/VALIDATION-RUN.json": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/VALIDATION-RUN.json", + "sha256": "7310a204b8feb75ac3fa8be0ef438486e4a9ae7e7505470eaddd5cfd158f7853", + "role": "New independent integer audit output, preserved unchanged." + }, + "frozen/reviews/integer/CHECKS.json.gz": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/CHECKS.json", + "sha256": "b1710a496352872a80ed97271ddf2bfbf304cd009d45b345f2211561bfb5527e", + "original_sha256": "c887cf32e5640221e038e4358df6422fbc1f32d3f3c5b6ab3b14cc1723bce1fd", + "storage": "gzip of unchanged independent receipt bytes; mtime=0" + }, + "frozen/reviews/integer/VALIDATION.md": { + "original_path": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/VALIDATION.md", + "sha256": "229705bf1a97d65c63d25dbf54ad2cc90ba7c1093ee238f71fd6cf1f3247bad7", + "role": "Independent integer validation report." + } +} diff --git a/research/r429-signed-range/PROOF-INTEGER.md b/research/r429-signed-range/PROOF-INTEGER.md new file mode 100644 index 0000000000..cd0a5fac63 --- /dev/null +++ b/research/r429-signed-range/PROOF-INTEGER.md @@ -0,0 +1,252 @@ +# The fixed signed quotient and its entire sign family + +This is a written proof using finite, exact prefix and suffix certificates. +The specific signed word is independently replayed over the integers and F2. +The family statement below follows from a linear factorization; it is not an +enumeration of its \(2^{47}\) members or a formal-kernel proof. + +## Domain and inherited contract + +There are 111 sources \(x\), 111 arbitrary targets \(y\), 429 arbitrary dirty +helpers \(h\), and one private register. The public order is \(x,y,h\), with +global indices \(0,\ldots,650\); private register 651 enters and exits at zero. +Every public coordinate is independent. All COPY episodes require a cleared +private register, an immutable physical source and an ERASE of that original +snapshot at its own cut. + +The parent is [PR3645](https://github.com/CrocSwap/integer-mult-bounds/pull/3645) +at `99b901c9b5ac70cf441b3d7e585cc7b8744b5359`. Its original R438 input is pinned +at `12fa8c5c844be21bfefb38a19503fbd867a11244`, with identical bytes at scientific +base `20ecf2891d80b5acf18d980b2164fb44ea7faa90`. +The exact source identities are in +[SOURCE-DEPENDENCIES.json](frozen/reviews/integer/SOURCE-DEPENDENCIES.json). +The complete parent construction ancestry and native copied-total ADDRESS +interface remain inherited, with their stated limits. + +The checker rederives \(R\) from the actual retained source coefficients after +raw phases D and A, and \(K\) from the actual raw scatter lists. It checks these +against the frozen matrix input. Let \(W\) equal \(K\) with physical rows 0,1,2 +zeroed. Then + +\[ + A=I+WR,\qquad \operatorname{rank}_{\mathbb F_2}(A-I)=9. +\] + +Both binary inverse identities are checked. The binary contract is + +\[ + (x,y,h)\longmapsto(Ax,y+Ax,h),\qquad + (x,y,h)\longmapsto(A^{-1}x,y+x,h) +\] + +in the forward and literal inverse orientations. + +## The fixed signed endpoint + +The candidate differs from the parent in exactly 23 coefficients, each changed +from \(+1\) to \(-1\), among its 47 phase-23 source ADDs. Every other record and +every boundary field agrees. Both words have 16,102 records, 13,223 ADDs, 2,873 +MOVEs, and three COPY/ERASE pairs. Their complete paid profile is + +\[ + \{1:1298,\ 2:1342,\ 3:79,\ 4:44,\ 5:93,\ 6:11,\ 7:9\}, +\] + +with 2,876 paid children and rank mass 4,989. Coefficient changes alone do not +improve this invoice. + +The independently computed integer endpoint is + +\[ + F(x,y,h)=(A_{\mathbb Z}x,\ y+T_{\mathbb Z}x+E_{\mathbb Z}h,\ h). +\] + +Every helper is restored literally. The source has no target or helper +dependence; the target self block is identity. Reduction modulo two gives +\(A_{\mathbb Z}\bmod2=T_{\mathbb Z}\bmod2=A\) and \(E_{\mathbb Z}\bmod2=0\). +The inverse is + +\[ + F^{-1}(x,y,h)= + (A_{\mathbb Z}^{-1}x,\ + y-T_{\mathbb Z}A_{\mathbb Z}^{-1}x-E_{\mathbb Z}h,\ + h). +\] + +This formula follows from the displayed triangular form and the checked +two-sided integer roundtrip; it does not identify the integer target map with +the binary map. + +In particular, the signed word has +\(A_{\mathbb Z}[0,0]=-23\), \(T_{\mathbb Z}[0,0]=-125\), and +\(E_{\mathbb Z}[0,4]=2\). Taking \(x=y=0\) and \(h=e_4\) therefore changes +target 0 by 2 while restoring that dirty helper. It is not an integer pure +source shear. The parent values in the first two entries are \(-21,-121\); +its entire \(E_{\mathbb Z}\) is unchanged by the sign variant. + +The dense integer endpoint hashes, including the zero private output row, +are: + +| Word and orientation | SHA256 | +|---|---| +| Parent forward | `fb1a055931d7344c66e958e8a73a18b6fdcaa48eac97dada7bcfd204c5847d4c` | +| Parent inverse | `f40e143c64a0a04c93643d2f910b35321e496c59fb3a37f84c16bd0ec6771214` | +| Signed forward | `e153a170456b6aa06022234ccb1d7cdbed64a6703b8e6ed3257cd794d299b079` | +| Signed inverse | `de9764a5d03a609ff8f71cbda97c74cb713bfc8cd1c29bea00843c39d1852eba` | + +Each hash encodes 652 rows of 651 signed decimal entries, comma separated, +with LF after every row. Full block hashes and entry witnesses are retained +in [CHECKS.json.gz](frozen/reviews/integer/CHECKS.json.gz); the checker can +emit every nonzero endpoint entry with `--endpoint-out`. + +## A fixed transfer certificate for all quotient signs + +The 47 phase-23 records form the contiguous interval +`[15228,15275)`, in zero-based indexing. Thus the fixed prefix has 15,228 +records and the fixed suffix has 827. The nine quotient coordinates are + +\[ + p=(0,1,2,4,8,9,14,30,59). +\] + +Let \(U:\mathbb Z^9\to\mathbb Z^{111}\) embed these coordinates, and let +\(P_3:\mathbb Z^3\to\mathbb Z^{111}\) embed target rows 0,1,2. +Let \(Q_\varepsilon\) be the integer 9-by-9 product of the existing 47 ordered +elementary ADDs with coefficients \(\varepsilon_i\in\{-1,+1\}\). +Every such \(Q_\varepsilon\) has determinant one, an integer inverse, and the +same reduction modulo two. + +Two exact certificates describe the fixed context. + +1. At the prefix cut, the nine quotient values are \(Bx\), for an explicit + integer matrix \(B\) of shape 9-by-111. There is no target or helper + dependence. Its columns at the nine selected positions satisfy + \(BU=I_9\). +2. Propagating a nine-dimensional perturbation on those coordinates through + the complete fixed suffix gives source perturbation \(U\), target + perturbation \(P_3L\), and zero perturbation on all helpers and the private + register, where + +\[ + L= + \begin{pmatrix} + 1&0&0&0&1&1&1&1&1\\ + 0&1&0&1&1&1&1&1&0\\ + 0&0&1&1&1&0&1&0&0 + \end{pmatrix}. +\] + +The first three columns of \(L\) form \(I_3\). +The complete reader \(B\), both transfer hashes, and the determinant-one +minor of \(L\) are retained in the receipt. The suffix transfer was computed +on all nine independent perturbation columns. It explicitly verifies each +COPY and original-snapshot ERASE, including zero private values at both cuts. +The full word independently verifies every frame and snapshot lifetime. + +Take any two quotient choices \(Q_0,Q_1\), and put +\(\Delta Q=Q_1-Q_0\). Immediately after the quotient, their difference is +\(\widehat U\Delta QBx\), with \(\widehat U\) embedding the source coordinates +in the full public/private state. Applying the fixed suffix certificate gives + +\[ + \boxed{ + \Delta A_{\mathbb Z}=U\Delta QB,\qquad + \Delta T_{\mathbb Z}=P_3L\Delta QB,\qquad + \Delta E_{\mathbb Z}=0. + } +\] + +All other public blocks are unchanged. These are integer matrix identities, +so they hold over every commutative ring by interpretation of the coefficients. +The legal snapshot conditions also hold for every choice: the fixed suffix +never mutates an open snapshot source or the private copy, and the transfer +identities preserve its zero/restore cuts. + +This proves the following for the entire \(2^{47}\)-member sign family: + +- Every source depends only on \(x\); source differences are supported on the + nine selected source rows. +- Target differences are supported on physical target rows 0,1,2. +- The target self block remains identity; \(E_{\mathbb Z}\) is unchanged and + even; all 429 arbitrary helpers and the private boundary are restored. +- Every quotient, hence the source code, is an invertible integer + elementary-matrix product. Reduction modulo two preserves the parent's + complete binary contract. +- The ordered gate destinations, frame paths, immutable snapshots and paid + histogram are unchanged. + +Over \(\mathbb Q\), injectivity of \(U,P_3\) and the right inverse \(BU=I_9\) +give the exact identities + +\[ + \operatorname{rank}(\Delta A_{\mathbb Z}) + =\operatorname{rank}(\Delta Q)\le9,\qquad + \operatorname{rank}(\Delta T_{\mathbb Z}) + =\operatorname{rank}(L\Delta Q)\le3. +\] + +For the particular signed witness versus its parent, +\(\det(\Delta Q)=1024\). Thus its source delta has rank 9. Since \(\Delta Q\) +is invertible over \(\mathbb Q\) and \(L\) has rank 3, its target delta has +rank 3. Those exact ranks apply to this pair; another sign pair can have +smaller rank, including zero. + +The same difference formula describes any substituted 9-by-9 integer +quotient matrix. Its invertibility, binary endpoint and implementation cost +would require their own hypotheses; that algebraic extension does not supply +a 47-ADD circuit for arbitrary matrices. + +## Exact scalar prefix norms and attaining inputs + +For a fixed orientation let \(M_t\) be the 652-by-651 integer coefficient +matrix after prefix \(t\), with the private input fixed at zero. MOVE preserves +scalar values, ADD applies its signed row operation, COPY duplicates the +source row, and a validated ERASE clears the private row. Induction gives the +exact scalar operator at every cut. + +For real scalar inputs, + +\[ + \|M_t\|_{\infty\to\infty} + =\max_i\sum_j |(M_t)_{ij}|. +\] + +The upper inequality is the triangle inequality. For a row attaining the +maximum, choose input \(u_j=\operatorname{sgn}((M_t)_{ij})\), with zero for a +zero coefficient. Then \(\|u\|_\infty=1\) and the selected output equals the +row's sum of absolute coefficients. The receipt supplies the entire concrete +sign vector and selected coefficient row, and a separate scalar replay +checks attainment. + +| Word | Forward maximum | Literal inverse maximum | +|---|---:|---:| +| Parent | 34,285 | 5,839,860 | +| Signed quotient | 80,639 | 239,014 | + +For the signed forward word, global register 1 after record 15,885 attains +80,639. For the signed inverse, global register 220 after processing original +record 5,651 in reverse order attains 239,014. Every record index is zero +based. All four parent/candidate maxima have complete attaining witnesses. + +The isolated quotient maxima are 442 forward / 75 inverse for the parent +and 7 forward / 9 inverse for the signed quotient. Improvement of that small +block does not imply that both complete-word maxima improve: the complete +forward maximum increases. + +## Coverage and open implications + +The finite computation reconstructs every integer and F2 public input column +in both orientations, two integer roundtrips for each word, all helper and +target blocks, every frame visit, all paid children, and exact snapshot cuts. +Unbounded Python integers and exact integer rank operations are used. +The all-sign theorem is the written linear consequence of the finite fixed +prefix/suffix certificates. + +The scalar cancellation bound is not a bound for an unproved native vector +realization with address-dependent operators. No theorem on native child +errors, rounded cleanup, precision reserves, physical ownership, source +access, storage, tape costs, terminal decoding, recursive callers or joint +outer assembly follows here. The historical PR589 precision formulas have +not been transferred to this changed source interface. No new supplier or +kappa admission, unrestricted sign optimum, or formal-kernel verification +is claimed. diff --git a/research/r429-signed-range/PROOF-RANGE.md b/research/r429-signed-range/PROOF-RANGE.md new file mode 100644 index 0000000000..d3f6df4eb4 --- /dev/null +++ b/research/r429-signed-range/PROOF-RANGE.md @@ -0,0 +1,271 @@ +# Conditional range and atomic-defect theorem for the two pinned 651-input words + +This note separates an exact finite calculation from the general linear-algebra +argument that gives it an all-input interpretation. It does not prove a native +rounded supplier, a finite-precision implementation, or a new multiplication +bound. There is no formal-kernel proof. + +## 1. Exact model and source domain + +There are 651 public scalar coordinates and a private coordinate `p=651`. +The public entrance coordinates are partitioned into source `0..110`, target +`111..221`, and 429 arbitrary dirty helpers `222..650`. The private entrance is +zero. Arithmetic is over the integers for the finite calculation and over the +reals for the range/error theorems. + +Both pinned words have 16,102 records. Their normalized atomic interpretations +are: + +* `ADD(d,s,c)`: `z_d <- z_d+c z_s`, with `c=+1` or `-1`; +* `MOVE(d)`: identity on normalized coefficients, with the recorded paid rank; +* `COPY(s)`: `z_p <- z_s`; +* `ERASE`: `z_p <- 0`. + +The literal reverse reads records backward, negates each ADD coefficient, and +exchanges COPY with ERASE. It is an inverse only on the appropriate ideal +reachable states. COPY and ERASE are noninvertible linear assignments on the +extended state space. + +For every ideal prefix the checker proves that a copied source is unchanged +until its paired erasure and that the private value equals that source at +erasure. It proves zero private return and literal restoration of all 429 +helpers. These ideal facts do **not** imply rounded cleanup. In particular, +setting the additive defect of ERASE to zero below still presupposes the +abstract zero assignment. It does not permit deleting a small physical residual. + +The normalization assumes that native frame changes give precisely this scalar +model. Native child interiors, frame implementation, scratch, actual rounding +rules, finite exponent limits, and physical zero-return are outside the theorem. + +## 2. Exact local prefix range + +Let `R_t` be the matrix from the 651 public entrance coordinates to all 652 +coordinates after the first `t` events, with the private entrance fixed to zero. +For a row `r` write + +`a(r)=sum_source |r_j|`, `b(r)=sum_target |r_j|`, +`c(r)=sum_helpers |r_j|`. + +The checker starts with the public identity rows and a zero private row, updates +the changed row under every event, and records every triple `(a,b,c)`. Unchanged +rows were already recorded. Consequently the saved set is the complete set of +block row norms over every row and prefix, including COPY values. It is not a +claim that every triple is a distinct exposed face of a minimal envelope. + +For entrance block bounds `||x||_infinity<=X`, `||y||_infinity<=Y`, +`||h||_infinity<=H`, every ideal prefix coordinate is bounded by + +`max_(a,b,c in envelope) (a X+b Y+c H)`. + +This follows by the triangle inequality on each exact row. For `X=Y=H=1`, the +maximum is exactly `max_t ||R_t||_infinity`: choosing the entrance signs of a +maximizing row attains its row L1 norm. The saved maximizing row and signs are +independently replayed by scalar forward evaluation. + +| Word | Forward exact maximum | Literal reverse exact maximum | +| --- | ---: | ---: | +| Parent, gzip `1a6841fc...` | 34,285 | 5,839,860 | +| Candidate, gzip `e8026111...` | 80,639 | 239,014 | + +Thus the forward maximum increases. Only the literal reverse maximum decreases. + +The exact endpoint has the integer form + +`(x,y,h) -> (A x, y+T x+E h, h)`. + +The checker verifies the source/target support and the identity target self +block before using it. The largest absolute row sums of the indicated blocks +are: + +| Word/direction | `A` | `T` | `E` | +| --- | ---: | ---: | ---: | +| Parent forward | 12,711 | 26,235 | 224 | +| Parent reverse | 136,165 | 5,839,659 | 224 | +| Candidate forward | 15,675 | 70,795 | 224 | +| Candidate reverse | 5,521 | 238,823 | 224 | + +`T=A` is not asserted over the integers. Helper leakage is even but need not be +zero over the integers. + +## 3. Source code and controller binding + +The source code is the actual subsequence of ADD records in phases 21 through +24: respectively 474, 504, 47, and 474 ADDs, for 1,499 total. Its endpoint equals +the full local word's source endpoint in each direction. Reversing these ADDs +and negating their coefficients gives the exact inverse on all 111 columns. + +| Word | Source forward prefix / endpoint | Source reverse prefix / endpoint | +| --- | ---: | ---: | +| Parent | 22,961 / 12,711 | 136,165 / 136,165 | +| Candidate | 15,675 / 15,675 | 5,521 / 5,521 | + +The controller file has a historical 6,372-gate `inplace_code_CNOTs` list. Its +binary endpoint differs from the selected 1,499-gate code in nine rows. Therefore +the calculation is **a new source-selected instantiation of its abstract +ordered schedule**, not a replay of that historical gate list. Both endpoints +and the first mismatch are recorded. + +The reason the schedule still applies in the binary VALUE model is independent +of that historical list. Write `Abar` for the selected source matrix modulo two. +The full local coefficient calculation verifies, on all columns, + +`F_Abar(x,y,h)=(Abar x,y+Abar x,h)`, + +and its literal inverse is + +`F_Abar^-1(x,y,h)=(Abar^-1 x,y+x,h)`. + +At a reverse stage the controller supplies source `Y` and target `X`. Thus its +abstract pair updates, with `G_s=Abar` at an even stage and `G_s=Abar^-1` at an +odd stage, are + +`forward: (X,Y) -> (G_s X,Y+G_s X)`, + +`reverse: (X,Y) -> (X+Y,G_s Y)`. + +Code sweeps left-multiply their selected bank by the listed generators. Bridges +are the two prescribed binary bank shears. Idle endpoints preserve normalized +values and advance the native chart; the terminal exchange swaps each pair. + +The checker evaluates every prefix on eight independent formal bank variables +in the free noncommuting polynomial algebra over GF(2). Its final diagonal is +`G_8 G_7 ... G_0` on all eight variables. Polynomial evaluation proves that this +identity holds for any linear maps substituted for the generators; no +commutation assumption is made. The stage updates above bind the selected +local word to this identity. Native chart/owner implementation and a physical +supplier remain separate premises. The identity is binary, and does not +replace the different integer `T` and `E` blocks in a range calculation. + +## 4. The complete ordered range recurrence + +Maintain nonnegative bounds `n[p][side]` for the eight DATA banks, initially one. +Suppose all completed native frame, idle, address and owner maps preserve the +chosen norm, hosted helpers restore literally, and the actual source-selected +codes are available at the scheduled charts. + +For a source code with exact prefix norm `P` and endpoint norm `U`, update + +`global_prefix <- max(global_prefix, P n)`, `n <- U n`. + +For a local call, let `x,y` be the current source and target bank bounds and let +`h=max_(all current banks) n`. Use its complete envelope to enlarge the running +prefix bound by `max(a x+b y+c h)`. With its exact endpoint block bounds +`U,T,E`, update the source to `U x` and target to `y+T x+E h`. Other bank +endpoints are unchanged because helpers restore. Using `h=1` would be +unjustified: hosted helpers may be in banks already enlarged by code sweeps. + +Each ordinary bridge has coefficient `+1` or `-1`. The triangle inequalities +give `n[d][X] += n[s][X]` and `n[s][Y] += n[d][Y]`. These two sources are not the +two just-modified destinations. Exchange only permutes the bounds. + +Induction over all 56 ordered controller events proves the saved bound. +The receipt lists every intermediate bank bound, all 35 forward and 28 reverse +source-code factors, five forward and four reverse local calls, 18 bridge +shears, ten isometric idle events and the exchange. No factor is inferred from +an endpoint-only norm. + +The resulting coefficient upper bounds have bit lengths 458 and 401. These +are valid upper bounds under the stated scalar instantiation and isometry +premises, not exact global maxima. + +For an additional per-bank inverse decode of `G_8...G_0`, there are five reverse +and four forward source-code factors. Every source prefix norm is at least one. +Hence the product `P_forward^4 P_reverse^5` bounds each prefix of that decode. +Multiplying the running bound by it gives bit lengths 601 and 519. The eight +bank decodes are independent; multiplying this factor eight times would be +unnecessary. Any additional normalization wrappers are assumed isometries. +This is a range bound for that conditional sequence, not a proof of terminal +decoder correctness or admission. + +The reported 64-bit block ceilings are respectively 512 to 448 and 640 to 576. +They are ceilings of coefficient-growth bit lengths. Actual signed storage +width also depends on input magnitude, errors, fractional grids, scaling and +internal native prefixes; no concrete precision saving follows here. + +## 5. Exact atomic additive-defect constants + +The following argument applies to every finite real linear word, including +noninvertible assignments. Number its matrices `M_0,...,M_(m-1)` and let + +`S_i=M_(m-1)...M_(i+1)`, with `S_(m-1)=I`. + +Use matched ideal and perturbed entrances. An independent scalar defect +`delta_i` is added to the single destination coordinate `d_i` immediately after +event `i`. Linearity and induction give the identity + +`error_final = sum_i S_i e_(d_i) delta_i`. + +This identity holds for every real entrance and defect choice. The receipt's +domain is the fixed two 652-coordinate words, with their chosen assignment +extension. It does not infer any actual rounding rule or independent-error +behavior of a native implementation. + +For any subset `I` of defect locations and `|delta_i|<=epsilon` there, +with other defects zero, define + +`C_I=max_output_r sum_(i in I) |(S_i)_(r,d_i)|`. + +Then `||error_final||_infinity <= C_I epsilon`. This constant is exact for the +stated independent-error model: choose a maximizing output row `r*` and +`delta_i=epsilon sign((S_i)_(r*,d_i))`. That output equals `C_I epsilon`. +This sharpness does not assert that these errors can be generated by rounding +while satisfying physical copy/erase preconditions. + +The commonly used `sum_i max_r |(S_i)_(r,d_i)|` is a generally looser bound. +The checker retains the row sums before taking the maximum. For groups with +different uniform allowances, the exact constant is +`max_r sum_g epsilon_g sum_(i in group_g) |(S_i)_(r,d_i)|` for a disjoint +partition. Saved per-group row vectors permit this calculation; overlapping +summary groups must not be counted twice. + +The sparse-column reverse recurrence is: + +* ADD `d<-d+c s`: column `s <- column s+c column d`; +* COPY `p<-s`: column `s <- column s+column p`, then column `p <- 0`; +* ERASE: column `p <- 0`; +* MOVE: unchanged. + +These formulas are right multiplication `S <- S M_i`. They include the +assignment's destruction of an old private value. Each destination column is +read **before** this update because the error is injected after that event. +The complete ordered destination-column stream is hashed. + +The reported exact aggregate uses every ADD, MOVE and COPY, with ERASE defects +zero but the abstract ERASE assignment still assumed: + +| Word/direction | Exact `C_I` | Loose sum of per-event maxima | +| --- | ---: | ---: | +| Parent forward | 880,068 | 965,052 | +| Candidate forward | 1,081,994 | 1,099,680 | +| Parent reverse | 34,848,225 | 34,872,847 | +| Candidate reverse | 1,255,309 | 1,289,381 | + +Allowing defects after ERASE leaves these four aggregate maxima unchanged, +although it adds a private-coordinate row and raises each loose sum by one. + +If only MOVE and COPY have defects, the exact forward constants are 383,045 +and 479,557; the reverse constant is 1,239 for both. Every reverse paid-rank +group is unchanged. Therefore the large reverse all-event improvement concerns +ADD-defect sensitivity; it is not a reduction of this MOVE/COPY aggregate. + +## 6. Finite witnesses and limits + +All four full scans cover every record and every paid rank. Peak single-defect +influences are 3,457 / 86,476 for the parent forward/reverse words and +3,935 / 4,366 for the candidate. Each saved peak impulse is independently +propagated forward. For each aggregate, a separate scalar-adjoint pass produces +the attaining error signs, and direct forward evaluation of all simultaneous +errors attains the claimed constant. Local range peaks and maximum suffix row +norms also have directly evaluated sign witnesses. + +Source-specific negative controls detect a wrong adjoint direction, reversed +suffix order, ignoring a real COPY, and replacing the required error signs by +all-positive errors. These execute after source authentication and operate on +the actual source events. + +The all-input arguments above are written linear-algebra proofs. The reported +numbers, symbolic schedule identity and witnesses are finite exhaustive exact +computations for the pinned words. They do not establish an all-size native +precision theorem, a formal-kernel result, physically legal rounded cleanup, +error propagation through the 63 global code factors, general sign optimality, +or an improved supplier/exponent. diff --git a/research/r429-signed-range/README.md b/research/r429-signed-range/README.md new file mode 100644 index 0000000000..503be260c9 --- /dev/null +++ b/research/r429-signed-range/README.md @@ -0,0 +1,143 @@ +# A signed R429 lift: lower range, mixed error sensitivity + +Changing 23 of the 47 quotient ADD coefficients in the published R429 word +preserves its complete binary map, arbitrary integer helper restoration and +paid rank mass 4989. It changes the integer lift. The selected scalar controller +has a smaller normalized range bound, but forward additive-error sensitivity +increases. This is a fixed witness and conditional scalar-network calculation, +not a precision-admitted supplier. + +The immediate parent is [PR3645](https://github.com/CrocSwap/integer-mult-bounds/pull/3645), +head `99b901c9b5ac70cf441b3d7e585cc7b8744b5359`. Parent gzip SHA256 is +`1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870`; +the signed witness is +`e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949`. +The unchanged `parent_word_gzip_sha256` field inside both artifacts names +their earlier support-code ancestor, not this immediate sign-variant parent. + +## Exact local contract + +There are 111 source fields, 111 target fields, 429 arbitrary dirty helpers +and one private field initially zero. Both words have 16,102 records, +2,873 MOVEs, 13,223 ADDs and three immutable COPY/ERASE pairs. +The independent integer checker covers every public input column in both +directions and both integer roundtrips. It derives the binary source matrix +from the original R438 word, rather than assuming the saved matrix. + +The binary interface is `(x,y,h) -> (Ax,y+Ax,h)`. Over the integers the +interface is `(A_Z x, y+T_Z x+E_Z h, h)`, with its literal inverse and exact +private return. The even dirty block need not vanish. For the signed witness, +`A_Z[0,0]=-23`, `T_Z[0,0]=-125` and `E_Z[0,4]=2`; it is not an integer +pure shear. All native frame and copied-source lifetimes are retained. + +The fixed prefix–quotient–suffix factorization explains the whole sign family. +Its nine-dimensional changed block cannot change integer helper leakage; +forward target changes are confined to three rows. The current forward witness +has source delta rank 9 and target delta rank 3. The universal bounds and their exact +premises are proved in [PROOF-INTEGER.md](PROOF-INTEGER.md). + +## Range and error are different comparisons + +| Quantity | Parent | Signed witness | +| --- | ---: | ---: | +| Exact forward scalar prefix row norm | 34,285 | 80,639 | +| Exact inverse scalar prefix row norm | 5,839,860 | 239,014 | +| Selected controller scalar upper-bound bit length | 458 | 401 | +| With the specified terminal scalar code sweeps | 601 | 519 | +| Historical 64-bit block allowance for controller range | 512 | 448 | +| Corresponding allowance with terminal scalar sweeps | 640 | 576 | + +The local scalar maxima have explicit attaining unit-box inputs. The global +numbers are sufficient upper bounds, not exact maxima or minimal word widths. +They include all 63 selected source-code factors, all nine local calls, +all 18 ordinary bank shears and the current encoded helper magnitudes. +Sign storage, initial input scale, native child interiors and physical access +are separate obligations. + +The controller artifact also contains an older 6,372-gate code. Its binary +endpoint differs from the selected 1,499-ADD source code. This package uses +only its ordered abstract schedule, instantiating every sweep with the actual +selected code or its literal inverse. An independent calculation in the free +noncommuting polynomial algebra over GF(2) checks the schedule identity. +Its interpretation here uses the selected invertible stage codes. +No claim is made that the artifact's older code listing is the new integer word. + +For a scalar defect of magnitude at most one at the destination immediately +after each eligible atomic event, the exact completed-output constant is +`J=max_j sum_i |(S_i e_dst(i))_j|`, where `S_i` is the suffix after that event. +Every event and all output coordinates are covered. Independent dual-row and +forward executions attain the reported constants. + +| Eligible defect locations; exact scalar J | Parent | Signed witness | +| --- | ---: | ---: | +| Forward, all events except exact ERASE | 880,068 | 1,081,994 | +| Inverse, all events except exact ERASE | 34,848,225 | 1,255,309 | +| Forward, MOVE and COPY only | 383,045 | 479,557 | +| Inverse, MOVE and COPY only | 1,239 | 1,239 | + +Thus the inverse all-event improvement comes from ADD sensitivity; the inverse +MOVE/COPY aggregate is unchanged. The forward bounds worsen. These are exact +constants of the stated normalized scalar assignment model, not an analysis +of arbitrary native child defects. COPY and ERASE use their exact abstract +assignments; physical copied-workspace cleanup under perturbations is not +proved by an assignment that simply clears a coordinate. + +The earlier saved suffix receipt concerned a different 660-input, six-copy +word. Its values are not transferred here. Both actual 651-input words are +recomputed in [PROOF-RANGE.md](PROOF-RANGE.md) and the new complete receipt. + +## Verification + +Use CPython 3.12 from the repository root: + +```sh +python3.12 -B scripts/check_research_commit.py --package research/r429-signed-range --check-source-history +python3.12 -B scripts/research_package.py --package research/r429-signed-range +``` + +[VERIFY.json](VERIFY.json) registers the bounded checks. +[EVIDENCE-INDEX.md](EVIDENCE-INDEX.md) separates the retained original functions, +two independent implementations, written proofs and acceptance controls. +No sign search is repeated. The fixed historical signed receipts and all new +receipts are compared completely, preserving JSON scalar types and list order. + +Original bytes are pinned in [ORIGINS.json](ORIGINS.json) and +[FROZEN-SHA256.json](FROZEN-SHA256.json). Large unchanged JSON inputs and full +receipts are gzip-compressed for storage; decompressed original hashes are +checked separately. Retained functions are selected from authenticated ASTs; +their imports and original entrypoints are not executed. Complete independent +checkers are also compiled from authenticated bytes, with assertions enabled +under optimized parent Python. + +[REVIEW-INTEGER.md](REVIEW-INTEGER.md), [REVIEW-RANGE.md](REVIEW-RANGE.md) +and [REVIEW-VERIFICATION.md](REVIEW-VERIFICATION.md) are separate AI reviews, +not independent human acceptance or formal-kernel proofs. + +## Open next questions + +No optimality of the 23-sign witness or of any width allowance is claimed. +The paid rank profile is unchanged. The scalar controller bounds do not +repair the terminal/owner deficit in +[PR4185](https://github.com/CrocSwap/integer-mult-bounds/pull/4185). +No selected frontier file is changed and no new kappa is claimed. + +The next precision obligation must specify the input lattice, native child +interiors, permitted defects, internal storage and exact copied-state return. +The completed-word atomic constants do not bound all perturbed prefixes or +state-relative feedback. A favorable range calculation alone cannot discharge +those obligations. + +## Sources and credit + +The R438 word lineage is due to Ali Romman/PR1043, with transport and rehosting +from Sagar Thakrar/PR2423 and the prior PR1307 geometry ancestry. +The source-code word is Ross Richardson's PR3645; original source headers, +notices and exact bytes are retained. The fixed signed witness, independent +mathematical checks, added proofs and publication were prepared by Ross +Richardson with substantial OpenAI Codex assistance. Apache-2.0. + +Scientific source artifacts retain their original +`20ecf2891d80b5acf18d980b2164fb44ea7faa90` context; publication guidance and +catalogue revision 7 are pinned at +`12fa8c5c844be21bfefb38a19503fbd867a11244`. +[RELATED-WORK.json](RELATED-WORK.json) records overlap scope and exact heads. diff --git a/research/r429-signed-range/RELATED-WORK.json b/research/r429-signed-range/RELATED-WORK.json new file mode 100644 index 0000000000..38b4a5607c --- /dev/null +++ b/research/r429-signed-range/RELATED-WORK.json @@ -0,0 +1,48 @@ +{ + "checked_at": "2026-10-20T11:59:32.201558+00:00", + "coverage": { + "open_prs": { + "fetched_at": "2026-10-20T11:57:54.361602+00:00", + "complete_pagination": true, + "records": 306 + }, + "discussions": { + "fetched_at": "2026-10-20T11:58:51.337749+00:00", + "complete_pagination": true, + "records": 2701 + }, + "closed_prs": { + "fetched_at": "2026-10-20T11:59:31.848484+00:00", + "complete_pagination": true, + "records": 3540 + } + }, + "limits": "Remote PR scope includes open and closed/merged titles and bodies, with separate coverage and timestamps. State changes are deduplicated by latest PR update; snapshots are not atomic. No code diffs or arbitrary package files are searched. Recheck relevant heads before submission.", + "related": [ + { + "pr": 3645, + "head": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "role": "Immediate 651-input parent word and binary local contract; the new witness changes23 integer coefficients, leaving F2 and paid rank unchanged." + }, + { + "pr": 4185, + "head": "86aa870336c05404855befe51bc0a5155cbc2252", + "role": "Returned-owner accounting and generic alternating-controller obstruction. This package neither improves its paid profile nor removes its coded endpoint." + }, + { + "pr": 1043, + "head": "e309e17f83f5759b1ea1fa24a76f24838784cb4d", + "role": "Ali Romman R438 word and local boundary ancestry." + }, + { + "pr": 2423, + "head": "13cd273dc13c98244b1f9bcf588b6e828cbc0347", + "role": "Sagar Thakrar transport/rehosted raw word." + } + ], + "old_suffix_receipt": { + "gzip_sha256": "33d5c73fc6012da643a6d498dcacccfe70470fd76d0ee327a85f9ac6381dabcd", + "scope": "660-public/438-helper six-copy word, distinct from both actual651-input words here; no receipt values transferred." + }, + "search_does_not_certify_novelty": true +} diff --git a/research/r429-signed-range/REVIEW-INTEGER.md b/research/r429-signed-range/REVIEW-INTEGER.md new file mode 100644 index 0000000000..a6edda3164 --- /dev/null +++ b/research/r429-signed-range/REVIEW-INTEGER.md @@ -0,0 +1,110 @@ +# Independent mathematical review of B04 + +**Disposition: pass for a narrow fixed-witness audit and the stated +all-sign-family transfer theorem.** No precision, native-vector, supplier or +kappa admission is established. + +The reviewed word is the unchanged historical +`BIT-SIGNED-QUOTIENT-WORD.json.gz`, SHA256 +`e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949`. +Its immediate parent is the exact word published by PR3645 at +`99b901c9b5ac70cf441b3d7e585cc7b8744b5359`, SHA256 +`1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870`. +Their 23 changed coefficients are all phase-23 \(+1\)-to-\(-1\) changes. +All other records, metadata apart from the format name, and boundary arrays +are identical. + +The candidate's historical `parent_word_gzip_sha256` field still names the +support-code ancestor `6e4e79c3...`; it was inherited unchanged. The immediate +sign-variant parent is authenticated separately, as above. + +## Independent method and results + +[check_integer.py](frozen/reviews/integer/check_integer.py) is a fresh +standard-library implementation using dense integer coefficient rows and a +parallel F2 bit-row interpreter. It does not import or execute the original +producer, optimizer, sparse integer replayer or native checker. Those sources +and the exact PR3645 proof were read to establish the intended contract. + +The checker authenticates all four explicit inputs, derives R and K directly +from the original R438 D/A/scatter data, derives \(A=I+WR\), and checks its +two-sided binary inverse. It rederives rational frame ranks using exact integer +elimination and checks actual entrance-line/target-cap bindings. + +The full replay establishes: + +- Every one of the 651 arbitrary public input columns in both rings and both + orientations; 429 literal integer helper restorations and identity target + self blocks; closed private snapshots. +- Both forward-then-inverse and inverse-then-forward integer roundtrips for + both parent and signed words. +- The complete profile with rank mass 4,989, including all 2,873 MOVEs and + all three rank-one COPY children; unchanged costs and frame paths. +- Exact scalar prefix maxima 80,639 / 239,014 for the candidate versus + 34,285 / 5,839,860 for the parent, each with a concrete attaining input. +- The actual integer endpoint, with nonzero even helper leakage. In + particular \(A_{\mathbb Z}[0,0]=-23\), \(T_{\mathbb Z}[0,0]=-125\), and + \(E_{\mathbb Z}[0,4]=2\); the integer target is not \(y+A_{\mathbb Z}x\). + +The useful expansion is a finite prefix/suffix transfer certificate and its +written proof. For every assignment of the 47 existing quotient signs, + +\[ + \Delta A_{\mathbb Z}=U\Delta QB,\quad + \Delta T_{\mathbb Z}=P_3L\Delta QB,\quad + \Delta E_{\mathbb Z}=0, +\] + +with \(BU=I_9\), and \(L\) a displayed rank-three 3-by-9 matrix. Thus source +changes are confined to the nine pivots, target changes to rows 0,1,2, dirty +leakage is unchanged, and helpers remain literally restored. The ranks are +at most 9 and 3 throughout the family. For this particular pair, +\(\det(\Delta Q)=1024\), giving exact ranks 9 and 3. +[PROOF-INTEGER.md](PROOF-INTEGER.md) proves the distinction between those +universal bounds and the current pair's exact ranks. + +## Controls that reach mathematical failure gates + +All mutations are applied to in-memory records after valid inputs have passed +authentication. Four exception controls require their exact intended error; +an unrelated exception or ineffective control fails the audit. + +| Mutation | Mathematical detection | +|---|---| +| Stale private COPY value | ERASE differs from original unchanged snapshot | +| Mutate physical copied source | Immutable-source lifetime violation | +| Write to the private snapshot | Immutable-private destination violation | +| Wrong MOVE rank | Exact frame-containment/rank violation | +| Wrong inverse ADD sign | F2 roundtrip stays identity; integer roundtrip has coefficient \(-58\) at row 0, column 59 | +| Flip one quotient sign | F2 endpoint stays fixed; integer source changes at row 0, column 59 | +| Wrong helper-cleanup sign | F2 stays fixed; helper 222 gains \(2x_0\) | +| Source code reads dirty helper 222 | Source 0 acquires coefficient 1 of that arbitrary helper | +| Omit one compensation term | Target 111 has odd coefficient 1 of dirty input 226 | + +The complete deterministic receipt is +[CHECKS.json.gz](frozen/reviews/integer/CHECKS.json.gz). +Source hashes and inherited obligations are in +[SOURCE-DEPENDENCIES.json](frozen/reviews/integer/SOURCE-DEPENDENCIES.json). +Actual local command and portability evidence are in +[VALIDATION.md](frozen/reviews/integer/VALIDATION.md). + +## Covered domain and remaining obligations + +The fixed integer identities cover every integer input and, by coefficient +identities, every module over a commutative ring, with the private register +initially zero. The F2 endpoint is stated only modulo two. The exact induced +infinity norms cover the scalar lift on real inputs. + +The family theorem covers all \(2^{47}\) sign assignments in the existing +ordered quotient alphabet. It does not establish a sign optimum, common +prefix bound for the whole family, or equal costs for arbitrary coefficient +or arbitrary matrix substitutions. + +The original native ADDRESS/copied-total interface and full parent +construction ancestry are inherited under their precise PR3645 assumptions. +The current audit does not rerun the parent's complete reconstruction. +Its scalar prefix bounds do not admit a native vector implementation or +charged precision theorem. Global decoder, source access, dirty ownership, +storage, tape, recursive caller and complex/BIT assembly obligations remain +open. This is independent AI-assisted mathematical work, not human review or +formal-kernel verification. diff --git a/research/r429-signed-range/REVIEW-RANGE.md b/research/r429-signed-range/REVIEW-RANGE.md new file mode 100644 index 0000000000..4e1987b48f --- /dev/null +++ b/research/r429-signed-range/REVIEW-RANGE.md @@ -0,0 +1,127 @@ +# Independent B04 range and atomic-defect review + +The selected sign change lowers the conditional controller range upper bound, +but worsens forward local range and forward additive-error amplification. The +inverse improvement is substantial for ADD defects. It gives no improvement +to the exact inverse MOVE/COPY aggregate in this atomic model. + +The frozen parent and candidate each have 651 public inputs, 429 dirty helpers, +one private coordinate, 16,102 records, three COPY/ERASE pairs, and paid rank +mass 4,989. The candidate changes exactly 23 of the 47 phase-23 ADD signs. +No sign search is performed by this review. + +| Exact local quantity | Parent forward | Candidate forward | Parent reverse | Candidate reverse | +| --- | ---: | ---: | ---: | ---: | +| Maximum prefix row L1 | 34,285 | 80,639 | 5,839,860 | 239,014 | +| Maximum suffix row L1 | 136,729 | 138,976 | 7,658,958 | 324,924 | +| Maximum single destination impulse | 3,457 | 3,935 | 86,476 | 4,366 | +| Exact aggregate, ADD+MOVE+COPY | 880,068 | 1,081,994 | 34,848,225 | 1,255,309 | +| Loose sum of individual maxima | 965,052 | 1,099,680 | 34,872,847 | 1,289,381 | +| Exact aggregate, MOVE+COPY only | 383,045 | 479,557 | 1,239 | 1,239 | + +The aggregate is `max_output sum_event |suffix_entry|`, not +`sum_event max_output |suffix_entry|`. It is exact for arbitrary independent +scalar additive defects after the indicated atomic operations. Each aggregate +has a saved simultaneous-error sign witness and a direct forward attainment +check. + +All assignments are interpreted literally in the extended linear model: +COPY overwrites the private coordinate with the source and ERASE assigns zero. +In the main aggregate ERASE defects are zero. **This entire assignment premise +is conditional:** zero ERASE defect does not prove that an actual rounded +private register has returned to an erasable zero state. Actual rounding rules, +native-child error support, interior prefixes and physical cleanup are absent. + +The per-event comparison is also mixed. In the forward word, 1,556 corresponding +single-destination weights increase, 667 decrease and 13,879 are equal. In the +reverse word, 842 decrease and 15,260 are equal; none increases. All reverse +MOVE/COPY rank-group constants are unchanged. + +The controller calculation independently reconstructs complete local block +prefix envelopes and follows all 56 controller events, including every one +of the 63 additional code factors. Hosted helper entrance magnitudes are +bounded by the largest **current encoded bank** magnitude. + +| Conditional coefficient upper bound | Parent | Candidate | +| --- | ---: | ---: | +| Ordered controller bit length | 458 | 401 | +| Ceiling to a multiple of 64 | 512 | 448 | +| With nine inverse-code factors per terminal bank | 601 | 519 | +| Terminal ceiling to a multiple of 64 | 640 | 576 | + +These are coefficient-growth upper bounds under admitted isometric native +charts and exact restoration. They are not finite-precision guard counts, +physical register sizes, exact global maxima, or supplier admission. + +## Source binding found during review + +The current words have a selected source code of 1,499 actual ADD records in +phases 21–24. The controller JSON retains a historical 6,372-gate binary code. +The two binary endpoints differ in nine source rows. Therefore its stored gate +list cannot be used as the implementation underlying the new range numbers. + +The checker instead binds every abstract sweep to the selected local source +code or its literal inverse. It verifies that the local binary interfaces are +`(x,y,h)->(A x,y+A x,h)` and `(x,y,h)->(A^-1 x,y+x,h)`. It independently evaluates +the complete abstract schedule on eight formal bank columns in the free +noncommuting polynomial algebra over GF(2), obtaining the common endpoint +`diag(G8...G0)`. This justifies replacing the abstract source maps in the binary +VALUE schedule. Native physical charts, ownership and integer terminal identity +are separate obligations. + +The older `root-rounding/SUFFIX-WEIGHTS.json` belongs to the different +660-public-input, 438-helper, six-copy word with gzip digest `33d5c73f...`. +None of its weights is reused. All four present suffix calculations are fresh +and bind to the exact 651-input source bytes. + +## What the checker establishes + +`frozen/reviews/range/check_range.py` uses only the Python standard library and imports no producer +code. It authenticates both words and the decoded controller bytes; JSON and +gzip JSON controller transport are supported. It then: + +1. Reconstructs exact sparse block-prefix envelopes, endpoint blocks and source + code matrices, including literal inverse and ideal private/helper cleanup. +2. Replays every ordered controller factor with full bank bounds and records + every intermediate recurrence value. +3. Scans every atomic suffix with correct COPY/ERASE adjoints, saving every + individual influence, opcode/rank row-sum vector, full-column-stream digest, + exact aggregate and attaining witness. +4. Cross-checks source-specific peak impulses, range/suffix sign witnesses and + simultaneous-error witnesses by forward scalar propagation. +5. Detects wrong-adjoint, reversed-order, ignored-COPY and error-sign controls + after authentication, on the actual source events. + +The full receipt is deterministic and compressed without timestamps. It +contains complete operation/rank coverage, all block-envelope triples, all +16,102 individual weights per orientation, aggregate rows and witnesses. +`frozen/reviews/range/SOURCE-DEPENDENCIES.json` records exact source and historical +receipt hashes. `frozen/reviews/range/VALIDATION.md` gives the executed commands +and outcomes. The complete receipt is `frozen/reviews/range/CHECKS.json.gz`. + +The calculation covers the two pinned finite words, all real entrance values +in the stated scalar model, and every independent additive-defect choice in +that model. The proof of the error formula and exact aggregate is all-input +linear algebra. The constants are finite exhaustive integer computations. +No formal-kernel proof is supplied. + +## Reproduction + +From the package root: + +```sh +python3.12 frozen/reviews/range/check_range.py \ + --parent-word frozen/parent/WORD.json.gz \ + --candidate-word frozen/candidate/WORD.json.gz \ + --controller frozen/controller/WORD.json.gz \ + --verify frozen/reviews/range/CHECKS.json.gz +``` + +Use `--output NEW-RECEIPT.json.gz` to write a fresh deterministic receipt. +Transport digests are included, so a receipt made from raw controller JSON +differs in its transport digest from one made from the unchanged compressed +controller. The decoded controller digest and all mathematical results agree. + +There is no new sign optimization, general optimality claim, global defect +constant, concrete rounded implementation, tape/stock invoice, terminal +correctness admission, or new multiplication exponent. diff --git a/research/r429-signed-range/REVIEW-VERIFICATION.md b/research/r429-signed-range/REVIEW-VERIFICATION.md new file mode 100644 index 0000000000..45998dc868 --- /dev/null +++ b/research/r429-signed-range/REVIEW-VERIFICATION.md @@ -0,0 +1,162 @@ +# B04 source binding and verification review + +**Disposition: pass for the stated fixed-witness and conditional scalar +claims, at the version identified in `CORE-SNAPSHOT.json`.** + +This review covers the fixed signed R429 witness, its authenticated historical +replay, the two new independent checkers, and the complete receipt acceptance +mechanism. It was prepared separately with substantial OpenAI Codex assistance. +It is neither human acceptance nor a formal-kernel proof. + +The reviewed package is bounded to one concrete 23-sign change among 47 +quotient ADDs and the stated consequences of its fixed prefix and suffix. +The local integer interface, binary interface, scalar range and scalar defect +model are distinct claims. No sign search, native rounded supplier, general +sign optimum, improved paid rank profile or new multiplication exponent is +established. + +## Source and receipt boundary + +`verify.py` authenticates each registered input before returning its bytes. +Historical replay parses those same bytes and compiles only the explicitly +named top-level function definitions. The original imports, filesystem +constants, entrypoints and search loops are excluded. The selected definitions +were inspected: none uses a decorator or default expression to reintroduce +excluded original execution. Dependencies are explicitly supplied standard +library values and preceding authenticated functions. Function multiplicities +are checked, so missing and duplicate definitions or duplicate requests fail. + +Compilation uses `dont_inherit=True, optimize=0`. Assertions inside extracted +functions and their nested functions remain active under an optimized parent +interpreter. New independent programs are executed from their authenticated +source bytes with `__name__="authenticated_review"` and their actual package +source path. Their main guards do not run during loading; the wrapper explicitly +calls `main` with declared inputs and a fresh external temporary output. +These programs import no producer implementation. There is no frozen module +import or bytecode-cache selection path. + +Compression preserves two different bindings where an original uncompressed +input was wrapped for storage: the manifest authenticates compressed bytes and +`ORIGINS.json` separately authenticates the decompressed original bytes. +Neither a transport hash nor an unchanged JSON value alone substitutes for +the original byte binding. + +The fixed scientific comparison set consists of: + +1. `frozen/candidate/RESULT.json`; +2. `frozen/candidate/GROWTH.json`; +3. `frozen/historical/REPLAY.json`; +4. `frozen/reviews/integer/CHECKS.json.gz`; +5. `frozen/reviews/range/CHECKS.json.gz`. + +Each fresh result is compared in full by canonical JSON serialization. This +retains integer/Boolean/float distinctions, list order and every nested field. +It does not select a convenient subset or compare only a status. Each stage +also requires its exact expected comparison set. A missing fixed receipt +fails; replay writes only a fresh temporary result and never regenerates the +fixed evidence. Root-level manifests, scripts and documentation are covered by +the separate core snapshot and repository publication checks. + +## Mathematical coverage inspected + +Both words have 651 public inputs: 111 sources, 111 targets and 429 arbitrary +dirty helpers. The private coordinate starts at zero. The independent integer +checker evaluates every public coefficient in both orientations and both +roundtrips. It reconstructs the binary source map from the original R438 word, +checks exact MOVE containment and rank, preserves physical endpoint frames, +and enforces immutable copied-source and private-snapshot lifetimes. +ERASE requires literal equality to the original unchanged copied value. + +Thus the integer conclusion is the actual block map +`(x,y,h) -> (A_Z x, y+T_Z x+E_Z h, h)`, with private return and literal inverse. +The even helper block need not vanish and `T_Z` need not equal `A_Z`. +The binary reduction is separately the specified +`(x,y,h) -> (A x, y+A x, h)`. + +The all-sign extension uses an exact forward prefix–quotient–suffix certificate. +The 47 ADD quotient lies on nine coordinates. Its fixed prefix reader `B` +contains no target or dirty columns and has an identity pivot minor; its +fixed suffix transfer is supported only on the nine source rows and three +target rows. The private coordinate is closed at both cuts. Consequently +`Delta A = U Delta Q B`, `Delta T = P3 L Delta Q B` and `Delta E = 0`. +The forward source and target rank bounds are at most 9 and 3 for the same fixed +47-gate sign family. The current determinant `det(Delta Q)=1024` and the +checked minors give exact forward ranks 9 and 3 for this witness. This is a written +linear-algebra implication of finite exact transfer data; it is not an +enumeration of all `2^47` assignments or an optimality theorem. + +The range checker independently reconstructs the full sparse prefix rows and +all suffix destination columns of both actual 651-input words. Scalar sign +witnesses attain the local prefix maxima and the completed-output defect +constants. The controller uses the selected 1,499 ADD source code and its +literal inverse. Its historical 6,372-gate code has a different binary endpoint +and is not substituted into the range calculation. The abstract schedule is +checked on all eight formal bank columns in the free noncommuting polynomial +algebra over GF(2). + +Every ordered controller factor and the current encoded helper magnitudes +enter the scalar recurrence. These are conditional coefficient upper bounds. +The exact atomic defect constant is +`max_r sum_i |(S_i e_dst(i))_r|`, which differs from summing per-event maxima. +COPY and ERASE use their stated linear assignment extension, including +`private <- 0` at ERASE. Setting the ERASE defect to zero does not prove +physically legal rounded cleanup. Native child interiors, error support, +perturbed prefixes, input lattices and finite-precision storage remain separate. + +The comparison is mixed: forward prefix range and forward defect amplification +increase, while the inverse quantities decrease. The inverse MOVE/COPY +aggregate remains 1,239. Only the specified conditional controller range bound +and its stated terminal code extension improve; no global precision admission +follows. + +## Controls and resolved review finding + +Compact controls load the actual verifier and original selected functions. +Disposable fixture files live in external system temporary directories. They +cover changed and missing source, function selection, direct and nested +assertions, whole-module assertion retention, original-main exclusion, +compressed/original byte binding, typed receipts, list order and nested +omissions. The full five real receipts are positively compared, then each +undergoes a nested value mutation and omission. + +The arithmetic control authenticates the original source first and executes +a noncommuting two-ADD source word on all 111 source columns. Replacing inverse +subtraction by addition reaches and fails the real +`signed source-code literal inverse` gate. It is not a hash rejection. +Removing that named gate makes the control fail because the faulty computation +is then accepted. An analogous check-deletion control tests the complete +receipt comparator. Unexpected acceptance is raised outside the caught +rejection branch. + +Review found that the initial integer negative-control helper accepted any +`ValueError`. A failure while preparing a stale snapshot could therefore have +been counted as the intended ERASE rejection. This was corrected before the +final receipt: each exception control now requires its exact intended semantic +error. The compact controls positively check this helper and verify that an +unrelated exception fails its contract. + +The integer checker also supplies actual-word faults for stale COPY state, +live source mutation, private mutation, wrong MOVE rank, inverse-sign error, +changed quotient sign, failed helper restoration, dirty-source contamination +and omitted compensation. The range checker supplies actual-event controls +for the adjoint direction, suffix order, COPY influence and error signs. +All mathematical mutations are applied after input authentication. +The reviewers' receipts identify the corresponding witnesses; transport +authentication failures are not counted as mathematical controls. + +## Evidence and remaining integration boundary + +`CONTROLS.json` records fresh compact execution under normal and optimized +CPython: 34 intended rejections and two check-deletion sensitivity tests in +each mode. Both runs positively compare all five fixed scientific receipts. +`CORE-SNAPSHOT.json` identifies the exact final package files inspected and the +control receipt digest. The compact suite deliberately does not rerun +the historical search or either complete independent mathematical replay. +Those full runs belong to their independent reviewer receipts and to the +parent's registered package verification. + +The snapshot binds the integrated independent sources, receipts, documentation +and registered command manifest. Any change to those bytes requires a scope +refresh; receipt files that contain the snapshot itself are explicitly excluded +to avoid circular hashes. Repository source-history checks, read-only Git-free +export, publication and hosted CI remain separately reported by the parent. diff --git a/research/r429-signed-range/SOURCES.json b/research/r429-signed-range/SOURCES.json new file mode 100644 index 0000000000..a02cfc3f72 --- /dev/null +++ b/research/r429-signed-range/SOURCES.json @@ -0,0 +1,48 @@ +{ + "schema_version": 1, + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "files": [ + { + "path": "certificates/selected-result.json", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129", + "usage": "provenance" + }, + { + "path": "docs/research/agent-task-catalog.json", + "git_blob": "64bfc5af6709ed9811171e0a2108f05e1219cb65", + "sha256": "352a6184713b8843d96fd2c2071eb7aeaa655906b7c51d45ad444912666c8a96", + "usage": "provenance" + }, + { + "path": "docs/research/research-family-status.md", + "git_blob": "abdd2792e6a5596b3fa6be3dc9db882bd8e3ef89", + "sha256": "0e61c47dfbc6f16e5f64594fcc7d907d4187568e38dddf10d473f0992419c44f", + "usage": "provenance" + }, + { + "path": "research/bit-r438-source-code/README.md", + "git_blob": "e501165027be66b75c60b13ed93377c4a58c1d0c", + "sha256": "f1033297e1156f9fb154a4319bee394a82476195cd2a53d01d93ef7332536d27", + "usage": "provenance" + }, + { + "path": "research/bit-r438-source-code/PROOF.md", + "git_blob": "1fbd2cad0e2d14b8fa6432fb5dd9b535882ab2b2", + "sha256": "ebcc91e74938b525b28e46bf03ec09d42d24ab02070dc96f4f0a51cee2cfb83d", + "usage": "provenance" + }, + { + "path": "research/bit-r438-source-code/WORD.json.gz", + "git_blob": "672c41534608d0d812b8020e496177d7c41c8527", + "sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870", + "usage": "provenance" + }, + { + "path": "research/bit-r438-transport-rehost/words/r438-t154.json.gz", + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "usage": "provenance" + } + ] +} diff --git a/research/r429-signed-range/TASK.json b/research/r429-signed-range/TASK.json new file mode 100644 index 0000000000..264755fe67 --- /dev/null +++ b/research/r429-signed-range/TASK.json @@ -0,0 +1,90 @@ +{ + "schema_version": 1, + "task_id": "joint-query-controller", + "priority_revision": 7, + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "original_card": { + "id": "joint-query-controller", + "question": "Can the installed QQ16 caller win a complete matched protocol bill, or can a changed demand eliminate actual paid work?", + "starting_points": [ + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "research/qq16-caller-install/README.md" + ], + "methods": [ + "Derive the matched whole-caller physical bill for installed and baseline protocols.", + "Change the actual demanded observations and prove a cheaper legal producer/consumer contract." + ], + "acceptance_gate": "Name the changed premise of the fixed F0/B1 observation obstruction. Show exactly which query is recovered, legal native reads and restoration, and a full favorable budget including cover maps, helpers and endpoints. Local inverse identities alone do not close the global controller. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read #4166 COST.md and ADMISSION.json. An actual caller connection is now proposed. Its native-component profile loses; parent park/restore versus external-call costs remain unresolved. Retain the producer and recovery lineage rather than rebuild it.", + "scope": "Source-binding orientation only; no scientific replay, theorem acceptance or supplier admission. Budget any heavy replay separately." + }, + "first_experiment": "At the actual installed cut, compare matched complete parent park/restore and external input/return protocols at the same bank/packet geometry, including every later root call and service cost. Alternatively pin both bridge observations and derive a genuinely smaller source-compatible demand. Stop if the complete necessary inequality fails or an essential cost is unknown; no larger decoder scan from a local tape-action saving.", + "bottleneck_link": "The native local words exist; retained query information and its physical access are the missing link to a composed recursive interface.", + "allowed_variations": [ + "One paid query, one changed first pair, or one precisely specified affine helper state.", + "A counterexample or lower bound for that exact proposed repair.", + "One unresolved obligation of a newer local decoder, with exact source heads and a distinct claim/domain." + ], + "scope_change_triggers": [ + "Retaining the fixed first pair and ordinary schedule while allowing only homogeneous selected-only control, already excluded by the witness.", + "Treating cover-map counts as zero-cost physical address operations.", + "Recreating the pending complete local decoder or early-record/output-bank coalescing already under investigation without a distinct audit or changed premise.", + "Treating a completed-output defect inequality as a producer-interior, dirty-range or physical-cost certificate.", + "Recreating completed-output recovery or caller wiring already supplied by #4166 without new independent coverage.", + "Dropping retained later root calls or claiming native-profile dominance from the isolated publication saving." + ], + "overlap_terms": [ + "QQ16", + "joint-query", + "changing-chart controller", + "selected observation", + "1969", + "2540", + "early record", + "output-bank retention", + "complete native decoder", + "2965", + "producer defect", + "dirty-helper range", + "F17 consumer", + "4166", + "qq16-caller-install" + ], + "existing_checks": [ + { + "scope": "PR #4166: author-checked installed producer/service/return/bridge connection; native-component comparison loses.", + "evidence": "research/qq16-caller-install/README.md", + "remaining": "Complete matched physical protocol bill, or changed source-compatible demand/circuit; no affordable supplier yet.", + "status": "author-checked", + "source_commit": "0b082d22a0e9a442d264ab0633e35ef26c790630", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Audit the fixed 23-sign R429 quotient lift, its complete arbitrary-input integer/F2 map and normalized scalar range/atomic-defect bounds for a precisely selected controller instantiation.", + "scope_change_reason": "Explicit donor assignment to finish unpublished B04 and develop its promising range calculation. This is a finite signed-lift and conditional scalar-network result, not the current QQ16 supplier target.", + "bottleneck_link": "A better integer range envelope does not establish rounded-child stability, exact COPY cleanup under perturbations, or an affordable complete supplier.", + "budget_minutes": 240, + "stop_rule": "Use the saved sign witness only. Bind every result to its actual 651-input word, examine the ordered controller contract and complete atomic suffix weights; no optimization or native precision-admission search.", + "outcome": "partial", + "evidence": "Complete signed receipts, two independent implementations, fixed-prefix/suffix proof and full typed acceptance controls.", + "author": "Ross Richardson", + "ai_assistance": "Substantial OpenAI Codex assistance in original construction, independent mathematical checking contexts and publication. AI review is not human or formal-kernel acceptance.", + "open_questions": [ + { + "question": "Can the signed lift be given a complete rounded native implementation with exact copied-workspace return?", + "why_it_matters": "The forward atomic error constant worsens while the scalar range bound improves. Abstract COPY/ERASE assignments cannot certify physical exact cleanup.", + "first_step": "Specify the admitted input lattice and native child error contract, then prove internal range/grid and exact zero return at every COPY/ERASE cut.", + "blocked_by": "No native child-interior, physical source-access or all-size precision theorem is provided." + } + ] +} diff --git a/research/r429-signed-range/VERIFY.json b/research/r429-signed-range/VERIFY.json new file mode 100644 index 0000000000..a50b76c20e --- /dev/null +++ b/research/r429-signed-range/VERIFY.json @@ -0,0 +1,60 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py", + "--stage", + "historical" + ], + "timeout_seconds": 120, + "checks": "Fixed 23-sign witness: exact declared record differences, retained complete integer/F2 replays, both original signed receipts and full new range summary; no sign search." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py", + "--stage", + "integer" + ], + "timeout_seconds": 180, + "checks": "Independent dense all 651-column integer/F2/frame/COPY audit, both roundtrips, attained prefix norms, exact fixed-transfer proof for all 2^47 signs and intended-gate controls." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-B", + "{package}/verify.py", + "--stage", + "range" + ], + "timeout_seconds": 180, + "checks": "Independent sparse range reconstruction, selected arbitrary-code schedule, all ordered controller factors and complete adjoint/dual/forward defect checks for both actual 651-input words." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/controls.py", + "--package", + "{package}" + ], + "timeout_seconds": 60, + "checks": "Normal and optimized source-selection/module assertions, compression bindings, all five full typed receipts, semantic inverse-sign control and deleted-check sensitivity." + } + ] +} diff --git a/research/r429-signed-range/controls.py b/research/r429-signed-range/controls.py new file mode 100644 index 0000000000..05cfb826c4 --- /dev/null +++ b/research/r429-signed-range/controls.py @@ -0,0 +1,358 @@ +#!/usr/bin/env python3 +"""Compact B04 source-selection and acceptance controls. + +No historical search or complete word replay is run here. +Prepared for Ross with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +import copy +import gzip +import hashlib +import json +from pathlib import Path +import subprocess +import sys +import tempfile +import types + + +HERE = Path(__file__).resolve().parent + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")) + + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + + +def load_verifier(package): + path = package / "verify.py" + raw = path.read_bytes() + module = types.ModuleType("b04_control_verifier") + module.__file__ = str(path) + exec(compile(raw, str(path), "exec", dont_inherit=True, optimize=0), module.__dict__) + return module, sha(raw) + + +def reject(name, action, expected, records): + try: + action() + except (ValueError, AssertionError, FileNotFoundError) as error: + need(expected in str(error), f"wrong rejection for {name}: {error}") + records.append({"name": name, "reason": str(error)}) + else: + raise ValueError("control accepted: " + name) + + +def fixture(directory, entries, original=None): + root = Path(directory).resolve() + root.mkdir(parents=True) + hashes, origins = {}, {} + for name, raw in entries.items(): + target = root / name + target.parent.mkdir(parents=True, exist_ok=True) + target.write_bytes(raw) + hashes[name] = sha(raw) + origins[name] = {"sha256": sha(raw)} + if original and name in original: + origins[name]["original_sha256"] = sha(original[name]) + (root / "FROZEN-SHA256.json").write_text(json.dumps(hashes)) + (root / "ORIGINS.json").write_text(json.dumps(origins)) + return root + + +def source_checks(v, temporary): + source = ( + b'import a_module_that_does_not_exist\n' + b'raise RuntimeError("ORIGINAL_TOP_LEVEL_RAN")\n' + b'def chosen(x=3):\n return x + 4\n' + b'def assertion():\n assert False, "EXTRACTED_ASSERT"\n' + b'def nested():\n def inner():\n assert False, "NESTED_ASSERT"\n' + b' return inner()\n' + b'def main():\n raise RuntimeError("ORIGINAL_MAIN_RAN")\n' + b'if __name__ == "__main__":\n main()\n' + ) + root = fixture(temporary / "source", { + "frozen/source.py": source, + "frozen/duplicate.py": b"def duplicate():\n return 1\n" + b"def duplicate():\n return 2\n", + "frozen/module.py": b'assert False, "MODULE_ASSERT"\n', + "frozen/module_main.py": b'VALUE = 7\n' + b'if __name__ == "__main__":\n' + b' raise RuntimeError("ORIGINAL_MAIN_RAN")\n', + }) + f = v.Frozen(root) + f.check_all() + chosen = f.functions("frozen/source.py", ["chosen"], {}) + need(chosen.chosen() == 7 and set(vars(chosen)) == {"chosen"}, + "only declared functions should be exported") + need(f.executed == {"frozen/source.py": ["chosen"]}, "selected-source receipt") + rejected = [] + reject("direct_runtime_gate_under_parent_flags", + lambda: v.need(False, "DIRECT_RUNTIME_GATE"), "DIRECT_RUNTIME_GATE", rejected) + reject("extracted_assert_under_parent_flags", + lambda: f.functions("frozen/source.py", ["assertion"], {}).assertion(), + "EXTRACTED_ASSERT", rejected) + reject("nested_assert_under_parent_flags", + lambda: f.functions("frozen/source.py", ["nested"], {}).nested(), + "NESTED_ASSERT", rejected) + reject("authenticated_module_assert_under_parent_flags", + lambda: f.module("frozen/module.py"), "MODULE_ASSERT", rejected) + module = f.module("frozen/module_main.py") + need(module["VALUE"] == 7 and module["__name__"] == "authenticated_review", + "independent module main exclusion") + (root / "frozen/module.py").write_bytes(b"VALUE = 99\n") + reject("changed_authenticated_module", + lambda: f.module("frozen/module.py"), "frozen input changed", rejected) + reject("missing_named_definition", + lambda: f.functions("frozen/source.py", ["absent"], {}), + "function selection changed", rejected) + reject("duplicate_source_definition", + lambda: f.functions("frozen/duplicate.py", ["duplicate"], {}), + "function selection changed", rejected) + reject("duplicate_requested_name", + lambda: f.functions("frozen/source.py", ["chosen", "chosen"], {}), + "function selection changed", rejected) + reject("unregistered_source", + lambda: f.functions("frozen/unknown.py", ["chosen"], {}), + "unregistered frozen input", rejected) + (root / "frozen/source.py").write_bytes(b"def chosen():\n return 99\n") + reject("changed_authenticated_source", + lambda: f.functions("frozen/source.py", ["chosen"], {}), + "frozen input changed", rejected) + (root / "frozen/source.py").unlink() + reject("missing_registered_source", + lambda: f.functions("frozen/source.py", ["chosen"], {}), + "source.py", rejected) + return {"imports_top_level_and_main_excluded": True, "rejections": rejected} + + +def receipt_checks(v, temporary): + value = {"integer": 1, "boolean": True, "nested": {"ordered": [1, 2, 3]}} + root = fixture(temporary / "receipt", { + "frozen/receipt.json": json.dumps(value).encode(), + }) + f = v.Frozen(root) + f.check_all() + f.compare("frozen/receipt.json", copy.deepcopy(value)) + rejected = [] + mutations = { + "boolean_for_integer": dict(value, integer=True), + "float_for_integer": dict(value, integer=1.0), + "integer_for_boolean": dict(value, boolean=1), + "nested_omission": dict(value, nested={}), + "list_reordering": dict(value, nested={"ordered": [1, 3, 2]}), + "list_truncation": dict(value, nested={"ordered": [1, 2]}), + } + for name, altered in mutations.items(): + reject(name, lambda altered=altered: f.compare("frozen/receipt.json", altered), + "complete receipt mismatch", rejected) + (root / "frozen/receipt.json").unlink() + reject("missing_fixed_receipt", lambda: f.compare("frozen/receipt.json", value), + "receipt.json", rejected) + need(not (root / "frozen/receipt.json").exists(), "missing receipt was regenerated") + (root / "frozen/receipt.json").write_bytes(json.dumps(value).encode()) + saved = v.need + try: + v.need = lambda ok, message: ( + None if message.startswith("complete receipt mismatch") else saved(ok, message)) + try: + reject("disabled_receipt_gate", + lambda: f.compare("frozen/receipt.json", mutations["boolean_for_integer"]), + "complete receipt mismatch", []) + except ValueError as error: + need(str(error) == "control accepted: disabled_receipt_gate", + "receipt check deletion sensitivity") + else: + raise ValueError("receipt mutation survived deletion of its target check") + finally: + v.need = saved + return {"rejections": rejected, "deleted_named_check_detected": True} + + +def compression_checks(v, temporary): + plain = b'{"all":"original bytes","ordered":[1,2,3]}\n' + name = "frozen/original.json.gz" + root = fixture(temporary / "compression", + {name: gzip.compress(plain, mtime=0)}, {name: plain}) + f = v.Frozen(root) + f.check_all() + need(f.decoded(name) == plain, "complete decompression") + rejected = [] + changed = gzip.compress(b'{"all":"different bytes","ordered":[1,2,3]}\n', mtime=0) + (root / name).write_bytes(changed) + reject("changed_compressed_bytes", f.check_all, "frozen input changed", rejected) + # Advance only the storage digest in this disposable fixture. The + # unchanged original digest must independently detect altered payload. + f.hashes[name] = sha(changed) + reject("changed_decompressed_original", f.check_all, + "compressed original bytes changed", rejected) + equivalent = gzip.compress(plain, mtime=17) + (root / name).write_bytes(equivalent) + f.hashes[name] = sha(equivalent) + f.check_all() + need(f.decoded(name) == plain, "equivalent compression rejected") + return {"rejections": rejected, "equivalent_storage_with_same_original_accepted": True} + + +def mathematical_checks(v, package): + frozen = v.Frozen(package) + frozen.check_all() + _, scalar, _, _, _ = v.retained_functions(frozen) + word = [[1, 0, 1, 1, 0, 23], [1, 1, 2, 1, 0, 23]] + records, rows, prefix, norms = scalar.code(word) + need(records == word and prefix == [2, 3] and norms == [2, 3], + "two-ADD source-code positive control") + need(rows[0][0] == {0: 1, 1: 1} and rows[1][0] == {0: 1, 1: -1, 2: 1}, + "noncommuting fixture endpoints") + rejected = [] + reject("self_source_add", lambda: scalar.code([[1, 0, 0, 1, 0, 23]]), + "source code not inplace", rejected) + reject("source_coordinate_outside_bank", lambda: scalar.code([[1, 0, 111, 1, 0, 23]]), + "source code not inplace", rejected) + namespace = scalar.code.__globals__ + saved_add, saved_need = namespace["add"], namespace["need"] + try: + # Source authentication has completed. This is an arithmetic defect + # injected into the executed primitive, not a modified pinned file. + namespace["add"] = lambda a, b, coefficient: saved_add(a, b, abs(coefficient)) + reject("inverse_subtraction_replaced_by_addition", lambda: scalar.code(word), + "signed source-code literal inverse", rejected) + namespace["need"] = lambda ok, message: ( + None if message == "signed source-code literal inverse" else saved_need(ok, message)) + try: + reject("disabled_inverse_gate", lambda: scalar.code(word), + "signed source-code literal inverse", []) + except ValueError as error: + need(str(error) == "control accepted: disabled_inverse_gate", + "mathematical check deletion sensitivity") + else: + raise ValueError("inverse mutation survived deletion of its target check") + finally: + namespace["add"], namespace["need"] = saved_add, saved_need + independent = frozen.module("frozen/reviews/integer/check_integer.py") + def fail(message): + raise ValueError(message) + intended = independent["rejected"]( + "intended_fixture", "INTENDED_GATE", lambda: fail("INTENDED_GATE")) + need(intended["expected_semantic_gate_matched"] is True, + "independent control intended-gate acceptance") + reject("independent_control_rejects_unrelated_exception", + lambda: independent["rejected"]( + "unrelated_fixture", "INTENDED_GATE", lambda: fail("UNRELATED_GATE")), + "negative control reached an unintended gate", rejected) + return {"actual_authenticated_function": "bit_signed_audit.code", + "arbitrary_source_columns": 111, "positive_prefix_norms": prefix, + "rejections": rejected, "deleted_named_check_detected": True} + + +def real_receipts(v, package): + frozen = v.Frozen(package) + names = [ + "frozen/candidate/RESULT.json", + "frozen/candidate/GROWTH.json", + "frozen/historical/REPLAY.json", + "frozen/reviews/integer/CHECKS.json.gz", + "frozen/reviews/range/CHECKS.json.gz", + ] + result = [] + + def leaves(value, path=()): + if isinstance(value, dict): + for key in sorted(value): + yield from leaves(value[key], path + (key,)) + elif isinstance(value, list): + for key, item in enumerate(value): + yield from leaves(item, path + (key,)) + else: + yield path, value + + for name in names: + value = frozen.data(name) + frozen.compare(name, copy.deepcopy(value)) + need(type(value) is dict and len(value) > 1, "real receipt structure") + changed = copy.deepcopy(value) + path, old = max(leaves(value), key=lambda item: len(item[0])) + need(len(path) > 1, "real receipt nested coverage") + parent = changed + for key in path[:-1]: + parent = parent[key] + if type(old) is bool: + parent[path[-1]] = not old + elif type(old) is int: + parent[path[-1]] = old + 1 + elif type(old) is str: + parent[path[-1]] = old + "-MUTATED" + else: + parent[path[-1]] = {"mutated": True} + rejected = [] + reject("real_nested_field_mutation", + lambda: frozen.compare(name, changed), "complete receipt mismatch", rejected) + omitted = copy.deepcopy(value) + parent = omitted + for key in path[:-1]: + parent = parent[key] + del parent[path[-1]] + reject("real_nested_field_omission", + lambda: frozen.compare(name, omitted), "complete receipt mismatch", rejected) + result.append({"receipt": name, "sha256": sha(frozen.raw(name)), + "mutated_nested_path": list(path), "rejections": rejected}) + return result + + +def child(package): + v, verifier_hash = load_verifier(package) + with tempfile.TemporaryDirectory(prefix="b04-controls-") as temp: + temporary = Path(temp).resolve() + result = { + "source_selection": source_checks(v, temporary), + "receipt_contract": receipt_checks(v, temporary), + "compressed_original_binding": compression_checks(v, temporary), + "mathematical_controls": mathematical_checks(v, package), + "complete_real_receipts": real_receipts(v, package), + } + return {"parent_optimization": sys.flags.optimize, "verifier_sha256": verifier_hash, **result} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--package", type=Path, required=True) + parser.add_argument("--output", type=Path) + parser.add_argument("--child", action="store_true") + args = parser.parse_args() + package = args.package.resolve() + if args.child: + print(canonical(child(package))) + return + before = {name: sha((package / name).read_bytes()) + for name in ("verify.py", "FROZEN-SHA256.json", "ORIGINS.json")} + results = [] + for optimized in (False, True): + command = [sys.executable, "-I", "-B"] + if optimized: + command.append("-O") + command += [str(Path(__file__).resolve()), "--package", str(package), "--child"] + proc = subprocess.run(command, capture_output=True, text=True) + need(proc.returncode == 0, proc.stderr + proc.stdout) + results.append(json.loads(proc.stdout)) + need(all(sha((package / name).read_bytes()) == expected for name, expected in before.items()), + "verification core changed during compact controls") + need(all(x["verifier_sha256"] == before["verify.py"] for x in results), + "mixed verifier versions") + report = {"status": "PASS_B04_COMPACT_SOURCE_AND_MATHEMATICAL_GATES", + "source_hashes": before, "runs": results, + "full_word_or_search_replayed": False, "no_new_kappa": True} + if args.output: + args.output.write_text(json.dumps(report, sort_keys=True, indent=2) + "\n") + print(canonical(report)) + + +if __name__ == "__main__": + main() diff --git a/research/r429-signed-range/frozen/candidate/GROWTH.json b/research/r429-signed-range/frozen/candidate/GROWTH.json new file mode 100644 index 0000000000..c66a6de5be --- /dev/null +++ b/research/r429-signed-range/frozen/candidate/GROWTH.json @@ -0,0 +1,72 @@ +{ + "status": "NORMALIZED_SIGN_VARIANT_GROWTH_ONLY_NO_NATIVE_CHILD_ERROR_ADMISSION", + "word_canonical_sha256": "127f48ecae91547e90bd2e64769f222cb17601ab36edcfdfdb0fce6f2d1bd9b7", + "local_prefix": [ + 80639, + 239014 + ], + "code_prefix": [ + 15675, + 5521 + ], + "code_endpoint_norm": [ + 15675, + 5521 + ], + "whole_controller": { + "ordered_extra_code_counts": { + "forward_code": 35, + "inverse_code": 28, + "local_forward": 5, + "local_inverse": 4, + "scalar_bridge_shears": 18 + }, + "all63_code_factors_included": true, + "encoded_hosted_helper_inputs_bounded": true, + "weighted_global_prefix_upper": "4397932634265163211032730652944159284930493151000948442490115944709633826750504698384173944667730137152495901661848717130", + "weighted_global_prefix_upper_bits": 401, + "charge_rounded_up_to_64_bits": 448, + "crude_product_prefix_upper_bits": 1007, + "after_easy_completed_bank_decode_upper_bits": 519, + "local_stage_checkpoints": [ + { + "stage": 0, + "prefix_upper_bits": 87 + }, + { + "stage": 1, + "prefix_upper_bits": 105 + }, + { + "stage": 2, + "prefix_upper_bits": 134 + }, + { + "stage": 3, + "prefix_upper_bits": 221 + }, + { + "stage": 4, + "prefix_upper_bits": 249 + }, + { + "stage": 5, + "prefix_upper_bits": 310 + }, + { + "stage": 6, + "prefix_upper_bits": 339 + }, + { + "stage": 7, + "prefix_upper_bits": 373 + }, + { + "stage": 8, + "prefix_upper_bits": 401 + } + ], + "norm_proof": "owner/address permutations are isometries; each hosted helper is bounded by the largest current encoded DATA-bank norm. Use exact local block-prefix envelopes, exact source code prefix norm, endpoint block norms and triangle inequalities at actual bridges", + "limits": "terminal hole decoder omitted; tape, native child interior defect and all-size rounded-interface theorem remain separate" + } +} diff --git a/research/r429-signed-range/frozen/candidate/RESULT.json b/research/r429-signed-range/frozen/candidate/RESULT.json new file mode 100644 index 0000000000..5fd8b6ae38 --- /dev/null +++ b/research/r429-signed-range/frozen/candidate/RESULT.json @@ -0,0 +1,109 @@ +{ + "status": "PASS_LOCAL_INTEGER_SIGN_VARIANT_SAME_F2_AND_RANK_NO_PRECISION_ADMISSION", + "parent_sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870", + "word_sha256": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949", + "word_canonical_sha256": "127f48ecae91547e90bd2e64769f222cb17601ab36edcfdfdb0fce6f2d1bd9b7", + "original_small_score": [ + 442, + 33150, + 517, + 517 + ], + "new_small_score": [ + 9, + 63, + 16, + 13 + ], + "quotient_signs": [ + -1, + 1, + 1, + -1, + -1, + -1, + 1, + -1, + 1, + -1, + -1, + 1, + 1, + 1, + 1, + -1, + 1, + -1, + -1, + 1, + -1, + -1, + 1, + 1, + -1, + -1, + 1, + 1, + -1, + 1, + -1, + 1, + 1, + 1, + 1, + -1, + -1, + 1, + -1, + -1, + 1, + -1, + 1, + -1, + 1, + -1, + 1 + ], + "changed_gates": 23, + "forward": { + "prefix_row_l1": 80639, + "profile": { + "1": 1298, + "2": 1342, + "3": 79, + "4": 44, + "5": 93, + "6": 11, + "7": 9 + }, + "rank_mass": 4989, + "copies": 3, + "counts": { + "0": 2873, + "1": 13223, + "2": 3, + "3": 3 + } + }, + "inverse": { + "prefix_row_l1": 239014, + "profile": { + "1": 1298, + "2": 1342, + "3": 79, + "4": 44, + "5": 93, + "6": 11, + "7": 9 + }, + "rank_mass": 4989, + "copies": 3, + "counts": { + "0": 2873, + "1": 13223, + "2": 3, + "3": 3 + } + }, + "scope": "47fixedbinaryquotientgates only; all651integer/F2columns andhelpers. Notthepublishedword; no globalprecision/stock/controller/tape or kappa." +} diff --git a/research/r429-signed-range/frozen/candidate/WORD.json.gz b/research/r429-signed-range/frozen/candidate/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..b03a46ddf94ac255af3587cff58196e27a61003f GIT binary patch literal 59544 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 literal 0 HcmV?d00001 diff --git a/research/r429-signed-range/frozen/geometry/WORD.json.gz b/research/r429-signed-range/frozen/geometry/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8 GIT binary patch literal 42305 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%0D#o{m4v0S^lXMc!B^5s|rQj}G= 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 literal 0 HcmV?d00001 diff --git a/research/r429-signed-range/frozen/historical/REPLAY.json b/research/r429-signed-range/frozen/historical/REPLAY.json new file mode 100644 index 0000000000..f8d3ff2509 --- /dev/null +++ b/research/r429-signed-range/frozen/historical/REPLAY.json @@ -0,0 +1,177 @@ +{ + "status": "PASS_FIXED_SIGNED_WITNESS_AND_NORMALIZED_RANGE", + "baseline": { + "local_prefix": [ + 34285, + 5839860 + ], + "code_prefix": [ + 22961, + 136165 + ], + "code_endpoint_norm": [ + 12711, + 136165 + ], + "whole_controller": { + "ordered_extra_code_counts": { + "forward_code": 35, + "inverse_code": 28, + "local_forward": 5, + "local_inverse": 4, + "scalar_bridge_shears": 18 + }, + "all63_code_factors_included": true, + "encoded_hosted_helper_inputs_bounded": true, + "weighted_global_prefix_upper": "447400096150467723888121001604673621387130019890534559258613673060855207829528430254137867461796135911414112813000628304725960515036268750", + "weighted_global_prefix_upper_bits": 458, + "charge_rounded_up_to_64_bits": 512, + "crude_product_prefix_upper_bits": 1168, + "after_easy_completed_bank_decode_upper_bits": 601, + "local_stage_checkpoints": [ + { + "stage": 0, + "prefix_upper_bits": 100 + }, + { + "stage": 1, + "prefix_upper_bits": 123 + }, + { + "stage": 2, + "prefix_upper_bits": 155 + }, + { + "stage": 3, + "prefix_upper_bits": 254 + }, + { + "stage": 4, + "prefix_upper_bits": 287 + }, + { + "stage": 5, + "prefix_upper_bits": 355 + }, + { + "stage": 6, + "prefix_upper_bits": 388 + }, + { + "stage": 7, + "prefix_upper_bits": 426 + }, + { + "stage": 8, + "prefix_upper_bits": 458 + } + ], + "norm_proof": "owner/address permutations are isometries; each hosted helper is bounded by the largest current encoded DATA-bank norm. Use exact local block-prefix envelopes, exact source code prefix norm, endpoint block norms and triangle inequalities at actual bridges", + "limits": "terminal hole decoder omitted; tape, native child interior defect and all-size rounded-interface theorem remain separate" + }, + "terminal_64_bit_reserve": 640 + }, + "candidate": { + "local_prefix": [ + 80639, + 239014 + ], + "code_prefix": [ + 15675, + 5521 + ], + "code_endpoint_norm": [ + 15675, + 5521 + ], + "whole_controller": { + "ordered_extra_code_counts": { + "forward_code": 35, + "inverse_code": 28, + "local_forward": 5, + "local_inverse": 4, + "scalar_bridge_shears": 18 + }, + "all63_code_factors_included": true, + "encoded_hosted_helper_inputs_bounded": true, + "weighted_global_prefix_upper": "4397932634265163211032730652944159284930493151000948442490115944709633826750504698384173944667730137152495901661848717130", + "weighted_global_prefix_upper_bits": 401, + "charge_rounded_up_to_64_bits": 448, + "crude_product_prefix_upper_bits": 1007, + "after_easy_completed_bank_decode_upper_bits": 519, + "local_stage_checkpoints": [ + { + "stage": 0, + "prefix_upper_bits": 87 + }, + { + "stage": 1, + "prefix_upper_bits": 105 + }, + { + "stage": 2, + "prefix_upper_bits": 134 + }, + { + "stage": 3, + "prefix_upper_bits": 221 + }, + { + "stage": 4, + "prefix_upper_bits": 249 + }, + { + "stage": 5, + "prefix_upper_bits": 310 + }, + { + "stage": 6, + "prefix_upper_bits": 339 + }, + { + "stage": 7, + "prefix_upper_bits": 373 + }, + { + "stage": 8, + "prefix_upper_bits": 401 + } + ], + "norm_proof": "owner/address permutations are isometries; each hosted helper is bounded by the largest current encoded DATA-bank norm. Use exact local block-prefix envelopes, exact source code prefix norm, endpoint block norms and triangle inequalities at actual bridges", + "limits": "terminal hole decoder omitted; tape, native child interior defect and all-size rounded-interface theorem remain separate" + }, + "terminal_64_bit_reserve": 576 + }, + "full_signed_receipts_compared": [ + "frozen/candidate/GROWTH.json", + "frozen/candidate/RESULT.json" + ], + "executed_original_functions": { + "frozen/old/bit_cap_copy_local.py": [ + "need", + "canonical", + "rank" + ], + "frozen/old/bit_signed_audit.py": [ + "identity", + "add", + "row_weights", + "parity", + "block_norms", + "code", + "global_bound" + ], + "frozen/old/bit_prune_audit.py": [ + "execute" + ], + "frozen/old/bit_pruned_growth.py": [ + "coefficients" + ], + "frozen/old/signed_quotient_search.py": [ + "score" + ] + }, + "search_repeated": false, + "controller_contract": "Instantiate each abstract ordered code sweep with this word's actual 1499 source ADDs or their literal inverse; legacy inplace_code_CNOTs are not the selected integer code.", + "no_precision_admission": true +} diff --git a/research/r429-signed-range/frozen/old/bit_cap_copy_local.py b/research/r429-signed-range/frozen/old/bit_cap_copy_local.py new file mode 100644 index 0000000000..679be90ff9 --- /dev/null +++ b/research/r429-signed-range/frozen/old/bit_cap_copy_local.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 +"""Local-only exact native cap-copy audit, independent of any controller. + +Inputs are the pinned R438 word and frozen signed six-copy local word. The +16-column ADDRESS identities hold over every odd field where dyadic entries +are interpreted. Scalar integer cleanup and rounded child errors are separate. +Apache-2.0; substantial OpenAI Codex assistance. +""" + +import argparse +from collections import Counter +from fractions import Fraction as Q +import gzip +from hashlib import sha256 +import json +from pathlib import Path + +HERE = Path(__file__).resolve().parent +RAW = Path('/Users/ross/git/math/integer-mult-bounds/research/bit-r438-transport-rehost/words/r438-t154.json.gz') +RAW_SHA = 'a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022' + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(',', ':')).encode() + + +def rank(rows): + basis = {} + for row in rows: + row = list(map(Q, row)) + for j, old in sorted(basis.items()): + c = row[j] + row = [x-c*y for x,y in zip(row,old)] + j = next((j for j,x in enumerate(row) if x), None) + if j is not None: + c = row[j] + basis[j] = [x/c for x in row] + return len(basis) + + +def identity(n): + return [[Q(i == j) for j in range(n)] for i in range(n)] + + +def multiply(a, b): + return [[sum(x*y for x,y in zip(row,col)) for col in zip(*b)] for row in a] + + +def exchange(u): + c = [[Q(i == j)-u[i][j] for j in range(8)] for i in range(8)] + return [c[i]+u[i] for i in range(8)]+[u[i]+c[i] for i in range(8)] + + +def address_identities(word): + ident = identity(8) + out = [] + for p, q in enumerate(word['lines']): + need(sum(x*x for x in q) == 4, 'actual E8 root norm') + start = [word['lines'][j] for j in word['frames'][word['start'][p]]] + cap = [word['lines'][j] for j in word['frames'][word['final'][111+p]]] + need(rank(start) == 1 and all(all(4*x == sum(a*b for a,b in zip(row,q))*y + for x,y in zip(row,q)) for row in start), 'actual entrance is not P_p') + need(rank(cap) == 7 and all(sum(x*y for x,y in zip(row,q)) == 0 for row in cap), + 'actual target cap is not K_p') + proj = [[Q(x*y,4) for y in q] for x in q] + complement = [[ident[i][j]-proj[i][j] for j in range(8)] for i in range(8)] + need(multiply(proj,proj) == proj and rank(proj) == 1, 'actual P_p projector') + need(multiply(exchange(ident),exchange(proj)) == exchange(complement), + 'D_I D_P differs from D_K') + need(multiply(exchange(proj),exchange(proj)) == identity(16), 'D_P squared differs from I') + encoded = [[[v.numerator,v.denominator] for v in row] for row in proj] + out.append(sha256(canonical(encoded)).hexdigest()) + need(len(out) == 111, 'actual punctured root count') + return out + + +def frame_replay(word, program, backward=False, fault=None): + dims = [rank(word['lines'][j] for j in f) for f in word['frames']] + masks = [sum(1 << j for j in f) for f in word['frames']] + need(dims[1] == 8, 'named FULL is not full') + frames = (word['final'] if backward else word['start'])[:]+[None] + open_source, copies, erases = None, [], 0 + paid = Counter() + rows = list(reversed(program['records'])) if backward else program['records'] + for raw in rows: + op,x,y,c,f,phase = raw + if op == 0: + old,new = (c,y) if backward else (y,c) + lo,hi = (new,old) if backward else (old,new) + need(frames[x] == old, 'MOVE source frame') + need(not masks[lo] & ~masks[hi] and dims[hi]-dims[lo] == f > 0, 'MOVE rank or containment') + frames[x] = new + paid[f] += 1 + elif op == 1: + need(x < 660 and x != y and frames[x] == frames[y] == f, 'ADD common frame') + need(open_source != x, 'immutable copied source changed') + elif op == (3 if backward else 2): + need(open_source is None and y == 660 and frames[660] is None, 'COPY fresh private field') + if fault == 'copy_to_full': + f = 1 + need(frames[x] == c == 1 and not masks[f] & ~masks[c], 'COPY source FULL and target nested') + need(dims[c]-dims[f] == 1, 'COPY does not use rank-one cap descent') + frames[660],open_source = f,x + copies.append({'source':x,'source_frame':c,'private_frame':f,'rank':1}) + paid[1] += 1 + else: + need(op == (2 if backward else 3), 'unknown native opcode') + need(open_source == x and y == 660 and frames[x] == c and frames[660] == f, + 'ERASE original snapshot source/frame') + frames[660],open_source = None,None + erases += 1 + need(open_source is None and frames[:660] == (word['start'] if backward else word['final']), 'native endpoint') + need(len(copies) == erases == 6, 'six closed immutable snapshots') + return {'copies':copies,'literal_erases':erases,'paid_profile':dict(sorted(paid.items())), + 'maximum_simultaneous_private_snapshots':1} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--write', action='store_true') + args = parser.parse_args() + raw = RAW.read_bytes() + need(sha256(raw).hexdigest() == RAW_SHA, 'R438 source pin') + word = json.loads(gzip.decompress(raw)) + meta = json.loads((HERE/'BIT-SIGNED-INPUT.json').read_bytes()) + packed = (HERE/'BIT-SIGNED-INPUT-WORD.json.gz').read_bytes() + decoded = gzip.decompress(packed) + need(sha256(packed).hexdigest() == meta['word_gzip_sha256'] and + sha256(decoded).hexdigest() == meta['word_canonical_sha256'], 'frozen signed word pin') + program = json.loads(decoded) + need(program['start'] == word['start'] and program['final'] == word['final'], 'retained native boundaries') + projectors = address_identities(word) + forward,backward = frame_replay(word,program),frame_replay(word,program,True) + try: + frame_replay(word,program,fault='copy_to_full') + except ValueError as error: + negative = str(error) + else: + raise ValueError('rank-zero FULL copy mutation escaped') + receipt = {'status':'PASS_LOCAL_SIX_CAP_COPY_NATIVE_CONTRACT', + 'raw_R438_gzip_sha256':RAW_SHA,'signed_word_canonical_sha256':meta['word_canonical_sha256'], + 'actual_port_count':111,'actual_entrance_and_target_frames':222, + 'projector_sha256':projectors,'address_identity_columns':3552, + 'forward':forward,'literal_inverse':backward,'negative_control':negative, + 'domain':'Exact dyadic projectors and ADDRESS matrices; every odd modulus where their dyadic coefficients are interpreted. VALUE scalar identity and native recursive child errors are separate.', + 'source_role_rule':'COPY may read an actual source field or an arbitrary helper, provided the physical source stays unchanged until ERASE. No helper-only restriction is used.', + 'limits':['local native/frame contract only','no global controller, endpoint decoder, owner allocation, precision theorem, tape bound or kappa claim']} + path = HERE/'BIT-CAP-COPY-LOCAL.json' + if args.write: + path.write_text(json.dumps(receipt,sort_keys=True,indent=2)+'\n') + else: + need(json.loads(path.read_bytes()) == json.loads(canonical(receipt)), 'complete cap-copy receipt differs') + print(receipt['status']) + + +if __name__ == '__main__': + main() diff --git a/research/r429-signed-range/frozen/old/bit_prune_audit.py b/research/r429-signed-range/frozen/old/bit_prune_audit.py new file mode 100644 index 0000000000..3d8f7ec651 --- /dev/null +++ b/research/r429-signed-range/frozen/old/bit_prune_audit.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Independent deletion of unread R438 factory leaves, complete651-column audit. + +The discarded physical families are not retained with wrong endpoint frames. +Every surviving record is the literal projected support-code signed word. +Apache-2.0; substantial OpenAI Codex assistance. +""" + +import argparse +from collections import Counter +import gzip +from hashlib import sha256 +import json +from pathlib import Path +import sys + +sys.dont_write_bytecode = True +sys.path.insert(0,str(Path(__file__).resolve().parent)) +import bit_cap_copy_local as cap +import bit_signed_audit as scalar +import bit_raw_defect as algebra + +HERE = Path(__file__).resolve().parent +need = cap.need + + +def projected(program): + dead = [h for h in range(222,660) + if all(not(op == 1 and s == h or op in (2,3) and d == h) + for op,d,s,c,f,p in program['records'])] + need(dead == list(range(471,480)),'unread physical helper classification') + dead_set = set(dead) + keep = [p for p in range(660) if p not in dead_set] + mapping = {old:new for new,old in enumerate(keep)} + mapping[660] = len(keep) + records = [] + removed = Counter() + for op,d,s,c,f,p in program['records']: + if d in dead_set: + need(op in (0,1),'discarded helper has an owned snapshot role') + if op == 0: + removed[f] += 1 + continue + need(op == 0 or s not in dead_set,'remaining record reads discarded input') + records.append([op,mapping[d],s if op == 0 else mapping[s],c,f,p]) + return keep,records,dict(sorted(removed.items())) + + +def execute(word,keep,records,backward=False,initial=None): + n = len(keep) + rows = ([{i:1} for i in range(n)]+[{}]) if initial is None else [r.copy() for r in initial] + frames = [word['final' if backward else 'start'][i] for i in keep]+[None] + dims = [cap.rank(word['lines'][j] for j in f) for f in word['frames']] + masks = [sum(1 << j for j in f) for f in word['frames']] + opened,copies,prefix = None,0,1 + profile,counts = Counter(),Counter() + for op,d,s,c,f,p in reversed(records) if backward else records: + counts[op] += 1 + if op == 0: + old,new = (c,s) if backward else (s,c) + lo,hi = (new,old) if backward else (old,new) + need(frames[d] == old and not masks[lo] & ~masks[hi] and dims[hi]-dims[lo] == f > 0,'projected MOVE frame/rank') + frames[d] = new + profile[f] += 1 + elif op == 1: + need(d < n and d != s and frames[d] == frames[s] == f and d != opened,'projected common-frame ADD or snapshot source mutation') + rows[d] = scalar.add(rows[d],rows[s],-c if backward else c) + prefix = max(prefix,sum(abs(v) for v in rows[d].values())) + elif op == (3 if backward else 2): + need(opened is None and s == n and not rows[n] and frames[n] is None,'projected fresh private field') + need(d < 111 and frames[d] == c == 1 and not masks[f] & ~masks[c] and dims[c]-dims[f] == 1,'projected actual source cap COPY') + rows[n],frames[n],opened = rows[d].copy(),f,d + profile[1] += 1 + copies += 1 + else: + need(op == (2 if backward else 3) and opened == d and s == n and rows[n] == rows[d] and frames[d] == c and frames[n] == f,'projected immutable snapshot ERASE') + rows[n],frames[n],opened = {},None,None + need(opened is None and not rows[n] and frames[n] is None and copies == 3,'projected private endpoint') + need(frames[:n] == [word['start' if backward else 'final'][i] for i in keep],'retained physical endpoint frames') + need(profile == Counter({1:1298,2:1342,3:79,4:44,5:93,6:11,7:9}),'projected paid profile') + need(counts == Counter({0:2873,1:13223,2:3,3:3}),'projected literal record counts') + return rows,{'prefix_row_l1':prefix,'profile':dict(sorted(profile.items())), + 'rank_mass':sum(k*v for k,v in profile.items()),'copies':copies, + 'counts':dict(sorted(counts.items()))} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--write',action='store_true') + args = parser.parse_args() + packed = (HERE/'BIT-SUPPORT-INPUT-WORD.json.gz').read_bytes() + need(sha256(packed).hexdigest() == '6e4e79c3d4fc9f8d01e3c2429d6794c057214f5bae9f8ab86c03d549f01922f1','frozen support-code word pin') + program = json.loads(gzip.decompress(packed)) + raw = cap.RAW.read_bytes() + need(sha256(raw).hexdigest() == cap.RAW_SHA,'raw R438 source pin') + word = json.loads(gzip.decompress(raw)) + keep,records,removed = projected(program) + need(len(keep) == 651 and removed == {1:27,5:9},'physical family/paid removal') + frozen = json.loads((HERE/'BIT-THREE-ROW-INPUT.json').read_bytes())['matrices'] + w = frozen['K'][:] + for p in (0,1,2): + w[p] = 0 + a = [r ^ (1 << p) for p,r in enumerate(algebra.product(w,frozen['R']))] + ainv = algebra.inverse(a) + code_records,code_rows,code_prefix,code_norm = scalar.code(records) + need(len(code_records) == 1499 and scalar.parity(code_rows[0]) == a and scalar.parity(code_rows[1]) == ainv,'projected exact source code') + receipts,outputs = [],[] + for backward in (False,True): + rows,receipt = execute(word,keep,records,backward) + need(rows[:111] == code_rows[int(backward)],'source has dirt/target dependence') + expected = [1 << p for p in range(651)]+[0] + for p in range(111): + expected[p] = ainv[p] if backward else a[p] + expected[111+p] ^= (1 << p) if backward else a[p] + need(rows[111+p].get(111+p) == 1 and all(j < 111 or j == 111+p or j >= 222 for j in rows[111+p]),'integer target self block') + need(all(not c & 1 for j,c in rows[111+p].items() if j >= 222),'integer odd helper leakage') + need(scalar.parity(rows) == expected,'all651 arbitrary binary input columns') + for h in range(222,651): + need(rows[h] == {h:1},'all429 arbitrary dirty helpers restored over Z') + outputs.append(rows) + receipts.append(receipt) + roundtrip,_ = execute(word,keep,records,True,outputs[0]) + need(roundtrip == [{i:1} for i in range(651)]+[{}],'full651-column integer roundtrip') + # A surviving target read of a removed leaf would invalidate the structural + # proof before any projected algebra could be evaluated. + bad = dict(program) + bad['records'] = program['records']+[[1,111,471,1,0,99]] + try: + projected(bad) + except ValueError as error: + control = str(error) + else: + raise ValueError('restored dead-leaf read mutation escaped') + receipt = {'status':'PASS_INDEPENDENT_NINE_DEAD_HELPER_REMOVAL_651_COLUMNS_LOCAL_ONLY', + 'input_support_word_sha256':sha256(gzip.decompress(packed)).hexdigest(), + 'projected_records_sha256':sha256(cap.canonical(records)).hexdigest(), + 'projected_start_sha256':sha256(cap.canonical([word['start'][p] for p in keep])).hexdigest(), + 'projected_final_sha256':sha256(cap.canonical([word['final'][p] for p in keep])).hexdigest(), + 'discarded_old_physical_families':list(range(471,480)), + 'retained_old_physical_families':keep,'new_public_families':651,'new_dirty_helpers':429, + 'removed_profile':removed,'removed_rank_mass':72, + 'saved_rank_mass_from_R438':132,'remaining_profile_mass':4989, + 'forward':receipts[0],'literal_inverse':receipts[1], + 'all651_integer_roundtrip':True,'source_code_exact_prefix':code_prefix, + 'source_code_endpoint_norm':code_norm,'negative_control':control, + 'owner_scope':'Restricting an old legal owner assignment to surviving helper occurrences preserves all old owner windows; no stronger rehosting or terminal-child allocation is asserted.', + 'limits':['the nine physical families are deleted, so their former0-to-FULL endpoints are no longer requested', + 'exact native cap identities inherited from separately audited actual111 root projectors', + 'terminal decoder, new stock recurrence, rounded child errors, source/tape work and joint kappa admission remain open']} + path = HERE/'BIT-PRUNE-AUDIT.json' + if args.write: + path.write_text(json.dumps(receipt,sort_keys=True,indent=2)+'\n') + else: + need(json.loads(path.read_bytes()) == json.loads(cap.canonical(receipt)),'complete pruned local receipt differs') + print(receipt['status']) + print('helpers429; localmass4989; saving132; exact prefixes',receipts[0]['prefix_row_l1'],receipts[1]['prefix_row_l1']) + + +if __name__ == '__main__': + main() diff --git a/research/r429-signed-range/frozen/old/bit_pruned_growth.py b/research/r429-signed-range/frozen/old/bit_pruned_growth.py new file mode 100644 index 0000000000..1dc21eaa8f --- /dev/null +++ b/research/r429-signed-range/frozen/old/bit_pruned_growth.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +"""Normalized coefficient growth for the429-helper common-code controller. + +All63 added codes and encoded hosted-helper magnitudes are included. Native +child interiors, rounding defects and physical tape work remain separate. +Apache-2.0; substantial OpenAI Codex assistance. +""" + +import argparse +import gzip +from hashlib import sha256 +import json +from pathlib import Path +import sys + +sys.dont_write_bytecode = True +sys.path.insert(0,str(Path(__file__).resolve().parent)) +import bit_cap_copy_local as cap +import bit_prune_audit as prune +import bit_signed_audit as scalar + +HERE = Path(__file__).resolve().parent +need = cap.need + + +def coefficients(records,backward=False): + rows = [{i:1} for i in range(651)]+[{}] + prefix = 1 + envelope = {(1,0,0),(0,1,0),(0,0,1)} + for op,d,s,c,f,p in reversed(records) if backward else records: + if op == 1: + rows[d] = scalar.add(rows[d],rows[s],-c if backward else c) + weights = scalar.row_weights(rows[d]) + envelope.add(weights) + prefix = max(prefix,sum(weights)) + elif op == (3 if backward else 2): + rows[651] = rows[d].copy() + elif op == (2 if backward else 3): + rows[651] = {} + return rows,prefix,envelope + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--write',action='store_true') + args = parser.parse_args() + packed = (HERE/'BIT-SUPPORT-INPUT-WORD.json.gz').read_bytes() + need(sha256(packed).hexdigest() == '6e4e79c3d4fc9f8d01e3c2429d6794c057214f5bae9f8ab86c03d549f01922f1','support input pin') + program = json.loads(gzip.decompress(packed)) + keep,records,_ = prune.projected(program) + need(len(keep) == 651,'pruned word arity') + f,F,ef = coefficients(records) + r,R,er = coefficients(records,True) + codes,code_rows,code_prefix,code_norm = scalar.code(records) + need(len(codes) == 1499 and [F,R] == [34285,5839860],'local literal word changed') + ordered_path = HERE/'BIT-NATIVE-CONTROLLER-WORD.json' + ordered = json.loads(ordered_path.read_bytes())['ordered_controller'] + bound = scalar.global_bound(ordered,[scalar.block_norms(f),scalar.block_norms(r)], + [F,R],[ef,er],code_prefix,code_norm) + # Each terminal DATA bank gets exactly the same nine inverse G factors. + # N is an isometry under the normalized native permutation contract, so + # adding the two physical N wrappers does not enlarge this external scalar + # row bound. This deliberately does not bound a child's internal lift. + terminal = bound['after_easy_completed_bank_decode_upper_bits'] + owner = json.loads((HERE/'BIT-OWNER-PRUNE.json').read_bytes()) + excess = owner['pruned_plus_two_N_mass']-64*28416 + need(excess == 864,'complete terminal rank mass') + data = {'status':'PASS_PRUNED_CONTROLLER_NORMALIZED_GROWTH_TWO_N_COST_FAILS', + 'input_support_word_sha256':sha256(gzip.decompress(packed)).hexdigest(), + 'projected_records_sha256':sha256(cap.canonical(records)).hexdigest(), + 'ordered_common_code_controller_sha256':sha256(ordered_path.read_bytes()).hexdigest(), + 'source_code_ADDs':len(codes),'source_code_exact_prefix':code_prefix, + 'source_code_endpoint_norm':code_norm,'local_exact_prefix':[F,R], + 'local_block_norms':[scalar.block_norms(f),scalar.block_norms(r)], + 'local_prefix_envelopes':[sorted(ef),sorted(er)], + 'whole63_code_controller':bound, + 'with_all8_terminal_bank_decodes_normalized_prefix_bits':terminal, + 'terminal_normalized_round_up_to64_bits':64*((terminal+63)//64), + 'literal_scalar_ADDs_per_nine_call_replica':{ + 'nine_complete_local_words':9*13223, + '63_extra_source_codes':63*1499, + '18_ordinary_bank_shears_over111_ports':18*111, + '72_terminal_bank_code_factors':72*1499, + 'total_including_terminal':9*13223+63*1499+18*111+72*1499}, + 'terminal_rank1_children_per_replica':888, + 'whole_rank_mass_exceeds64W_at_beta0_by':excess, + 'all_nonnegative_exponent_failure_proof':'Every complete child tariff is at least its rank for beta>=0. The included local, restricted-owner idle and888-per-replica terminal children already have rank mass64W+864, before fallback. Thus this particular two-N completion cannot pass the modern recurrence at any beta>=0.', + 'limits':['601-bit terminal upper and640-bit reserve cover normalized external scalar coefficients only', + 'native child internal amplification, rounded MOVE/COPY defects, exact COPY reuse and all-size precision admission are not supplied', + 'physical source/address access and finite tape return are still paid obligations', + 'two-N mass failure concerns this complete W28416 construction, not every terminal decoder or changed recursive interface']} + path = HERE/'BIT-PRUNED-GROWTH.json' + if args.write: + path.write_text(json.dumps(data,sort_keys=True,indent=2)+'\n') + else: + need(json.loads(path.read_bytes()) == json.loads(cap.canonical(data)),'complete pruned growth receipt differs') + print(data['status']) + print('common controller458bits; terminal601bits normalized; rankmass exceeds64W by864') + + +if __name__ == '__main__': + main() diff --git a/research/r429-signed-range/frozen/old/bit_signed_audit.py b/research/r429-signed-range/frozen/old/bit_signed_audit.py new file mode 100644 index 0000000000..b147c4c6e9 --- /dev/null +++ b/research/r429-signed-range/frozen/old/bit_signed_audit.py @@ -0,0 +1,237 @@ +#!/usr/bin/env python3 +"""Independent exact signed local replay and whole added-code growth bound. + +The original-window controller is proved over binary VALUES. The integer +program is its literal signed lift, with no assertion that its global integer +endpoint is the binary identity. Prefix row-norms give a separate bound valid +under isometric owner/address permutations. No endpoint decoder is assumed. +Apache-2.0; substantial OpenAI Codex assistance. +""" + +import argparse +from collections import Counter +import gzip +from hashlib import sha256 +import json +from pathlib import Path + + +HERE = Path(__file__).resolve().parent +N, V = 660, 111 + + +def need(ok, message): + if not ok: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(',', ':')).encode() + + +def identity(n): + return [{i: 1} for i in range(n)] + [{}] + + +def add(a, b, c): + output = a.copy() + for j, value in b.items(): + output[j] = output.get(j, 0) + c * value + if not output[j]: + del output[j] + return output + + +def row_weights(row): + return tuple(sum(abs(c) for j,c in row.items() if low <= j < high) + for low,high in ((0,V),(V,2*V),(2*V,N))) + + +def replay(records, backward=False, initial=None): + rows = [row.copy() for row in (identity(N) if initial is None else initial)] + open_source = None + prefix = 1 + envelope = {(1,0,0),(0,1,0),(0,0,1)} + copies = 0 + for op, dst, src, c, frame, phase in reversed(records) if backward else records: + if op == 1: + need(open_source is None or dst != open_source, 'integer snapshot source mutated') + rows[dst] = add(rows[dst], rows[src], -c if backward else c) + weights = row_weights(rows[dst]) + envelope.add(weights) + prefix = max(prefix, sum(weights)) + elif op == (3 if backward else 2): + need(open_source is None and src == N and not rows[N], 'integer COPY overwrites private') + rows[N] = rows[dst].copy() + open_source = dst + copies += 1 + elif op == (2 if backward else 3): + need(open_source == dst and rows[N] == rows[dst], 'integer ERASE original snapshot') + rows[N], open_source = {}, None + else: + need(op == 0, 'integer record opcode') + need(open_source is None and not rows[N] and copies == 6, 'integer private endpoint') + return rows, prefix, envelope + + +def parity(rows): + return [sum(1 << j for j,c in row.items() if c & 1) for row in rows] + + +def dense_digest(rows, n): + # Producer's documented signed-matrix digest is one comma-delimited row + # per line, distinct from its canonical JSON word digest. + h = sha256() + for row in rows: + h.update((','.join(str(row.get(j,0)) for j in range(n)) + '\n').encode()) + return h.hexdigest() + + +def block_norms(rows): + src = max(sum(abs(c) for c in row.values()) for row in rows[:V]) + target_x = max(row_weights(row)[0] for row in rows[V:2*V]) + target_h = max(row_weights(row)[2] for row in rows[V:2*V]) + return {'source_endpoint_row_norm': src, + 'target_source_block_row_norm': target_x, + 'target_helper_block_row_norm': target_h} + + +def code(records): + records = [r for r in records if r[0] == 1 and 21 <= r[5] <= 24] + output, prefixes = [], [] + for backward in (False, True): + rows = [{i: 1} for i in range(V)] + prefix = 1 + for _, d, s, c, f, phase in reversed(records) if backward else records: + need(d < V and s < V and d != s, 'source code not inplace') + rows[d] = add(rows[d], rows[s], -c if backward else c) + prefix = max(prefix, sum(abs(c) for c in rows[d].values())) + output.append(rows) + prefixes.append(prefix) + rows = [row.copy() for row in output[0]] + for _, d, s, c, f, phase in reversed(records): + rows[d] = add(rows[d], rows[s], -c) + need(rows == [{i: 1} for i in range(V)], 'signed source-code literal inverse') + norms = [max(sum(abs(c) for c in row.values()) for row in a) for a in output] + return records, output, prefixes, norms + + +def global_bound(ordered, local, local_prefix, envelopes, code_prefix, code_norm): + norms = [[1,1] for _ in range(4)] + maximum = 1 + checkpoints = [] + counts = Counter() + for event in ordered: + op = event.get('op') + if op == 'code sweep': + p, side = event['pair'], int(event['side'] == 'Y') + for s in event['stages']: + reverse = s % 2 + counts['inverse_code' if reverse else 'forward_code'] += 1 + maximum = max(maximum, code_prefix[reverse] * norms[p][side]) + norms[p][side] *= code_norm[reverse] + elif op == 'complete local coded call': + p, reverse = event['pair'], int(event['reverse']) + src_side = 1 if reverse else 0 + dst_side = 1 - src_side + x, y = norms[p][src_side], norms[p][dst_side] + # Hosted helpers may live in an already preloaded idle DATA bank. + # Their normalized coefficients are therefore bounded by the + # largest current bank norm, rather than by fresh independent1. + h = max(n for pair in norms for n in pair) + maximum = max(maximum, max(a*x + b*y + c*h for a,b,c in envelopes[reverse])) + endpoint = local[reverse] + norms[p][src_side] = endpoint['source_endpoint_row_norm'] * x + norms[p][dst_side] = y + endpoint['target_source_block_row_norm'] * x + endpoint['target_helper_block_row_norm'] * h + counts['local_inverse' if reverse else 'local_forward'] += 1 + checkpoints.append({'stage': event['stage'], 'prefix_upper_bits': maximum.bit_length()}) + elif event.get('kind') == 'bridge': + d, s = event['dst'], event['src'] + norms[d][0] += norms[s][0] + norms[s][1] += norms[d][1] + maximum = max(maximum, *(n for pair in norms for n in pair)) + counts['scalar_bridge_shears'] += 2 + elif event.get('kind') == 'exchange': + norms = [[y,x] for x,y in norms] + need(counts == Counter(forward_code=35, inverse_code=28, local_forward=5, + local_inverse=4, scalar_bridge_shears=18), 'whole added-code count') + crude = (1 << 18) * local_prefix[0]**5 * local_prefix[1]**4 * code_prefix[0]**35 * code_prefix[1]**28 + need(maximum <= crude, 'weighted global bound exceeds product upper') + # Completing the easy four FULL banks applies the nine inverse G factors + # independently on each bank; the maximum norm multiplies by one such + # sequence, not its fourth power. + completed_decode = code_prefix[0]**4 * code_prefix[1]**5 + return {'ordered_extra_code_counts': dict(counts), + 'all63_code_factors_included': True, + 'encoded_hosted_helper_inputs_bounded': True, + 'weighted_global_prefix_upper': str(maximum), + 'weighted_global_prefix_upper_bits': maximum.bit_length(), + 'charge_rounded_up_to_64_bits': 64*((maximum.bit_length()+63)//64), + 'crude_product_prefix_upper_bits': crude.bit_length(), + 'after_easy_completed_bank_decode_upper_bits': (maximum*completed_decode).bit_length(), + 'local_stage_checkpoints': checkpoints, + 'norm_proof': 'owner/address permutations are isometries; each hosted helper is bounded by the largest current encoded DATA-bank norm. Use exact local block-prefix envelopes, exact source code prefix norm, endpoint block norms and triangle inequalities at actual bridges', + 'limits': 'terminal hole decoder omitted; tape, native child interior defect and all-size rounded-interface theorem remain separate'} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument('--write', action='store_true') + args = parser.parse_args() + meta = json.loads((HERE/'BIT-SIGNED-INPUT.json').read_bytes()) + compressed = (HERE/'BIT-SIGNED-INPUT-WORD.json.gz').read_bytes() + raw = gzip.decompress(compressed) + need(sha256(compressed).hexdigest() == meta['word_gzip_sha256'] and + sha256(raw).hexdigest() == meta['word_canonical_sha256'], 'actual signed producer word hashes') + program = json.loads(raw) + frozen = json.loads((HERE/'BIT-THREE-ROW-INPUT.json').read_bytes()) + records, matrices = program['records'], frozen['matrices'] + forward, f, ef = replay(records) + inverse, r, er = replay(records, True) + roundtrip, _, _ = replay(records, True, forward) + need(roundtrip == identity(N), 'full signed inverse roundtrip') + need(f == meta['prefix_F'] and r == meta['prefix_R'], 'independent exact prefix discrepancy') + source_code, source_rows, source_prefix, source_norm = code(records) + for direction, rows in enumerate((forward, inverse)): + for p in range(V): + need(rows[p] == source_rows[direction][p], 'integer source interface has dirt/target dependence') + need(rows[V+p].get(V+p) == 1 and all(j < V or j == V+p or j >= 2*V for j in rows[V+p]), + 'integer target self block') + need(all(not c & 1 for j,c in rows[V+p].items() if j >= 2*V), 'odd helper leakage') + for h in range(2*V,N): + need(rows[h] == {h:1}, 'integer helper not literally restored') + expected = [1 << i for i in range(N)] + [0] + for p in range(V): + expected[p] = matrices['Hinv' if direction else 'H'][p] + expected[V+p] ^= (1 << p) if direction else matrices['H'][p] + need(parity(rows) == expected, 'integer lift is not actual all-column BIT code') + need(dense_digest(source_rows[0],V) == meta['source_integer_matrix_sha256'] and + dense_digest(source_rows[1],V) == meta['source_integer_inverse_sha256'], 'source code digest') + ordered = json.loads((HERE/'BIT-NATIVE-CONTROLLER-WORD.json').read_bytes())['ordered_controller'] + bound = global_bound(ordered, [block_norms(forward),block_norms(inverse)], + [f,r], [ef,er], source_prefix, source_norm) + result = {'status':'PASS_INDEPENDENT_SIGNED_BIT_LIFT_AND_ALL63_CODE_GROWTH_ENDPOINT_OPEN', + 'signed_word_canonical_sha256':meta['word_canonical_sha256'], + 'all_integer_columns_each_orientation':N, 'literal_helpers_restored':438, + 'full_forward_inverse_roundtrip':True, 'local_exact_prefix':[f,r], + 'local_old_formula_bits':[(64*f**3*r**2).bit_length(),((1<<18)*f**5*r**4).bit_length()], + 'source_code_ADDs':len(source_code), 'source_code_exact_prefix':source_prefix, + 'source_code_endpoint_norm':source_norm, + 'local_endpoint_block_norms':[block_norms(forward),block_norms(inverse)], + 'global_controller_growth':bound, + 'integer_scope':'The source is A_Z x, helpers exactly restored, target self identity and even helper leakage. The desired coded target identity is over F2; no integer identity substitution is made.', + 'limits':['exact signed scalar normalization and copied snapshots, not internal native child errors', + 'no global restored endpoint or terminal N E^-1 N implementation', + 'new charged precision theorem, physical source/tape invoice and modern all-size release not supplied', + 'no supplier or conditional kappa claim']} + if args.write: + (HERE/'BIT-SIGNED-AUDIT.json').write_text(json.dumps(result,sort_keys=True,indent=2)+'\n') + else: + need(json.loads((HERE/'BIT-SIGNED-AUDIT.json').read_bytes()) == json.loads(canonical(result)), + 'complete signed/controller growth receipt differs') + print(result['status']) + print('local norms',f,r,'all63 bridge prefix bits',bound['weighted_global_prefix_upper_bits']) + + +if __name__ == '__main__': + main() diff --git a/research/r429-signed-range/frozen/old/signed_quotient_search.py b/research/r429-signed-range/frozen/old/signed_quotient_search.py new file mode 100644 index 0000000000..2f0da1ca27 --- /dev/null +++ b/research/r429-signed-range/frozen/old/signed_quotient_search.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Optimize integer signs of the same47 binary quotient gates. + +The native rank profile and F2 source code are fixed. This is a new integer +lift, not the already published frozen local word or an admitted precision law. +""" +from pathlib import Path +import gzip +import hashlib +import json +import random +import sys +sys.dont_write_bytecode=True +HERE=Path(__file__).resolve().parent +sys.path.insert(0,str(HERE.parent/'recursive')) +import bit_signed_audit as sa +import bit_prune_audit as pa +import bit_cap_copy_local as cap + + +def score(gates, signs): + maxima=[] + endpoints=[] + for inverse in (False,True): + rows=[[int(i==j) for j in range(9)] for i in range(9)] + m=1 + seq=list(zip(gates,signs)) + for (d,s),c in reversed(seq) if inverse else seq: + c=-c if inverse else c + rows[d]=[x+c*y for x,y in zip(rows[d],rows[s])] + m=max(m,sum(map(abs,rows[d]))) + maxima.append(m) + endpoints.append(max(sum(map(abs,row)) for row in rows)) + return (max(maxima),maxima[0]*maxima[1],sum(maxima),sum(endpoints)) + + +def main(): + packed=(HERE/'BIT-PRUNED-WORD.json.gz').read_bytes() + cap.need(hashlib.sha256(packed).hexdigest()=='1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870','fixed ancestry') + program=json.loads(gzip.decompress(packed)) + records=program['records'] + positions=[i for i,r in enumerate(records) if r[0]==1 and r[5]==23] + pivots=sorted({records[i][j] for i in positions for j in (1,2)}) + index={p:i for i,p in enumerate(pivots)} + gates=[(index[records[i][1]],index[records[i][2]]) for i in positions] + cap.need(len(gates)==47 and len(pivots)==9,'quotient alphabet') + start=[1]*47 + best=(score(gates,start),start) + rng=random.Random(3605) + for restart in range(24): + signs=start[:] if restart==0 else [rng.choice((-1,1)) for _ in start] + current=score(gates,signs) + for sweep in range(8): + changed=False + order=list(range(47));rng.shuffle(order) + for i in order: + signs[i]*=-1 + value=score(gates,signs) + if valueVkJ~pbJvLM8TG{I%M@Ekh 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
  • K_h2#l(8 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

    q_V!^G2pb`8%%8O#)sms+W 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 literal 0 HcmV?d00001 diff --git a/research/r429-signed-range/frozen/reviews/integer/CHECKS.json.gz b/research/r429-signed-range/frozen/reviews/integer/CHECKS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..90eedc836c51bed77a4acb42cb88a85a6d341680 GIT binary patch literal 17009 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 ISwj&504}}-vj6}9 literal 0 HcmV?d00001 diff --git a/research/r429-signed-range/frozen/reviews/integer/SOURCE-DEPENDENCIES.json b/research/r429-signed-range/frozen/reviews/integer/SOURCE-DEPENDENCIES.json new file mode 100644 index 0000000000..cc0f8e882d --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/integer/SOURCE-DEPENDENCIES.json @@ -0,0 +1,147 @@ +{ + "attribution": "R438 source lineage and PR3645 source-coding construction retain their original contributors; fixed sign witness by Ross Richardson with substantial OpenAI Codex assistance. This independent audit and all-sign transfer proof are AI-assisted mathematical research, not human or formal-kernel review.", + "canonical_raw_source_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "git_object_authentication": [ + { + "bytes": 59514, + "commit": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "git_blob": "672c41534608d0d812b8020e496177d7c41c8527", + "path": "research/bit-r438-source-code/WORD.json.gz", + "sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870" + }, + { + "bytes": 10999, + "commit": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "git_blob": "1fbd2cad0e2d14b8fa6432fb5dd9b535882ab2b2", + "path": "research/bit-r438-source-code/PROOF.md", + "sha256": "ebcc91e74938b525b28e46bf03ec09d42d24ab02070dc96f4f0a51cee2cfb83d" + }, + { + "bytes": 5013, + "commit": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "git_blob": "e501165027be66b75c60b13ed93377c4a58c1d0c", + "path": "research/bit-r438-source-code/README.md", + "sha256": "f1033297e1156f9fb154a4319bee394a82476195cd2a53d01d93ef7332536d27" + }, + { + "bytes": 12427, + "commit": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "git_blob": "9da42bb5ff0da578b8ed2e04a674ab2706b60fc1", + "path": "research/bit-r438-source-code/check.py", + "sha256": "110f0eaa897b83daa223aec038f7ef40ff785e9fb730eeb8d670b5b95132ea5e" + }, + { + "bytes": 1084, + "commit": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "git_blob": "716a784d2104da9828a5cf52e1b51444090ed7d9", + "path": "research/bit-r438-source-code/SOURCES.json", + "sha256": "adaa3aa444f224590ba152fe16dd76ccd8ff8bd8a0b19477076c4d79ce4b94cb" + }, + { + "bytes": 42305, + "commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "path": "research/bit-r438-transport-rehost/words/r438-t154.json.gz", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + }, + { + "bytes": 42305, + "commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "path": "research/bit-r438-transport-rehost/words/r438-t154.json.gz", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + } + ], + "historical_source_run": "kappa-3605-successor-20261018T0940Z", + "historical_sources_consulted": [ + { + "bytes": 4124, + "preserved_run_relative_path": "major-frontier/root-pruned-code/signed_quotient_search.py", + "sha256": "fc9fce83d0fa613e8a442f44f0548fb82913b50ba901de89973eb11ff3311a16", + "usage": "Read as historical specification/provenance only; never imported or executed by this checker." + }, + { + "bytes": 1648, + "preserved_run_relative_path": "major-frontier/root-pruned-code/SIGNED-QUOTIENT-RESULT.json", + "sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20", + "usage": "Read as historical specification/provenance only; never imported or executed by this checker." + }, + { + "bytes": 8758, + "preserved_run_relative_path": "major-frontier/recursive/bit_prune_audit.py", + "sha256": "d284714fd65054279c180454b73eb717382e402669d5a04e3f373d0d7f54bc06", + "usage": "Read as historical specification/provenance only; never imported or executed by this checker." + }, + { + "bytes": 11946, + "preserved_run_relative_path": "major-frontier/recursive/bit_signed_audit.py", + "sha256": "376356696663021693c0e2c9adf37f371675fe8837fb88232b8767a8b90793e8", + "usage": "Read as historical specification/provenance only; never imported or executed by this checker." + }, + { + "bytes": 7588, + "preserved_run_relative_path": "major-frontier/recursive/bit_cap_copy_local.py", + "sha256": "6e9ca1eb905d769716c009904f45d6849b225e48cd119f18b50c0379f35313cb", + "usage": "Read as historical specification/provenance only; never imported or executed by this checker." + }, + { + "bytes": 28228, + "preserved_run_relative_path": "major-frontier/recursive/BIT-THREE-ROW-INPUT.json", + "sha256": "e5edb9e4e738192f98bd520ae6c1e8f1ddb19a0074ee9a1044e309b81e39c979", + "usage": "Read as historical specification/provenance only; never imported or executed by this checker." + } + ], + "immediate_parent": { + "contract": "111 sources,111 arbitrary targets,429 arbitrary helpers; F2 forward(Ax,y+Ax,h), inverse(A^-1x,y+x,h); integer source A_Z, target y+T_Zx+E_Zh with even E_Z; three immutable actual-source cap copies; complete local profile4989.", + "head": "99b901c9b5ac70cf441b3d7e585cc7b8744b5359", + "pull_request": "https://github.com/CrocSwap/integer-mult-bounds/pull/3645", + "word_sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870" + }, + "independence": "Fresh dense integer coefficient interpreter and parallel bit-row F2 interpreter. No original producer/replayer import. Binary R,K derived again from raw D/A/scatter; exact integer frame ranks derived again. Source scripts and PR3645 prose were read to identify the mathematical contract.", + "inherited_not_reproved": [ + "Full PR3645 construction ancestry and nine-family deletion theorem are inherited from its pinned word/proof; the immediate word and projected boundaries are authenticated.", + "Exact native ADDRESS/copied-total interface and physical compiler admission are not inferred from scalar transfer.", + "No native-vector prefix bound, precision law, recursive supplier, ownership/storage/tape theorem, or new kappa." + ], + "metadata_ancestry_caveat": "The signed word retains parent_word_gzip_sha256=6e4e79c3d4fc9f8d01e3c2429d6794c057214f5bae9f8ab86c03d549f01922f1 from the support-code ancestor. This inherited metadata is not the immediate sign-variant parent; the immediate parent is pinned separately above. Historical source_word strings are data, not paths followed at runtime.", + "runtime_inputs": [ + { + "container_bytes": 59514, + "container_sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870", + "decoded_bytes": 304990, + "decoded_sha256": "ebc33ee086f610c1fd540fa56bb99b2b96a768e4aed4a18defcb0e1f507fca89", + "published_package_relative_path": "frozen/parent/WORD.json.gz", + "role": "parent_word", + "runtime_policy": "Pass explicit path; no Git or historical checkout needed. Matrices authenticate original decoded bytes, all other inputs authenticate frozen gzip bytes." + }, + { + "container_bytes": 59544, + "container_sha256": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949", + "decoded_bytes": 305012, + "decoded_sha256": "127f48ecae91547e90bd2e64769f222cb17601ab36edcfdfdb0fce6f2d1bd9b7", + "published_package_relative_path": "frozen/candidate/WORD.json.gz", + "role": "signed_word", + "runtime_policy": "Pass explicit path; no Git or historical checkout needed. Matrices authenticate original decoded bytes, all other inputs authenticate frozen gzip bytes." + }, + { + "container_bytes": 42305, + "container_sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "decoded_bytes": 200598, + "decoded_sha256": "7aad486877b8c03866b8f1e6f909d12085da347d86aaae891f86f4e2dbc550d1", + "published_package_relative_path": "frozen/geometry/WORD.json.gz", + "role": "raw_word", + "runtime_policy": "Pass explicit path; no Git or historical checkout needed. Matrices authenticate original decoded bytes, all other inputs authenticate frozen gzip bytes." + }, + { + "container_bytes": 8765, + "container_sha256": "0919f9b758078a5a1b51a9d550f607fd17c3adfddf55ace306b23f2108d57e7f", + "decoded_bytes": 28228, + "decoded_sha256": "e5edb9e4e738192f98bd520ae6c1e8f1ddb19a0074ee9a1044e309b81e39c979", + "published_package_relative_path": "frozen/geometry/MATRICES.json.gz", + "role": "matrices", + "runtime_policy": "Pass explicit path; no Git or historical checkout needed. Matrices authenticate original decoded bytes, all other inputs authenticate frozen gzip bytes." + } + ], + "schema": "b04-fixed-signed-quotient-source-dependencies-v1", + "scientific_base_commit": "20ecf2891d80b5acf18d980b2164fb44ea7faa90" +} diff --git a/research/r429-signed-range/frozen/reviews/integer/VALIDATION-RUN.json b/research/r429-signed-range/frozen/reviews/integer/VALIDATION-RUN.json new file mode 100644 index 0000000000..135982f5d4 --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/integer/VALIDATION-RUN.json @@ -0,0 +1,31 @@ +{ + "checker_sha256": "96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522", + "command": [ + "/Users/ross/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-I", + "-O", + "-B", + "-Werror", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/check_integer.py", + "--parent-word", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/parent/WORD.json.gz", + "--signed-word", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/candidate/WORD.json.gz", + "--raw-word", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/geometry/WORD.json.gz", + "--matrices", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/geometry/MATRICES.json.gz", + "--out", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/CHECKS.json", + "--endpoint-out", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/ENDPOINTS.json" + ], + "elapsed_seconds": 5.489738, + "exit_code": 0, + "python_version": "3.12.14", + "receipt_sha256": "c887cf32e5640221e038e4358df6422fbc1f32d3f3c5b6ab3b14cc1723bce1fd", + "stderr": "", + "stdout": "{\"negative_controls\": 9, \"no_new_kappa\": true, \"parent_prefixes\": [34285, 5839860], \"signed_prefixes\": [80639, 239014], \"status\": \"PASS_FIXED_SIGNED_QUOTIENT_ALL_COLUMNS_LOCAL_ONLY\"}\n", + "timeout_seconds": 60, + "working_directory": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review" +} diff --git a/research/r429-signed-range/frozen/reviews/integer/VALIDATION.json b/research/r429-signed-range/frozen/reviews/integer/VALIDATION.json new file mode 100644 index 0000000000..413fbb5bf7 --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/integer/VALIDATION.json @@ -0,0 +1,78 @@ +{ + "complete_endpoint_export_digests": { + "parent_forward": "fb1a055931d7344c66e958e8a73a18b6fdcaa48eac97dada7bcfd204c5847d4c", + "parent_inverse": "f40e143c64a0a04c93643d2f910b35321e496c59fb3a37f84c16bd0ec6771214", + "signed_forward": "e153a170456b6aa06022234ccb1d7cdbed64a6703b8e6ed3257cd794d299b079", + "signed_inverse": "de9764a5d03a609ff8f71cbda97c74cb713bfc8cd1c29bea00843c39d1852eba" + }, + "final_run": { + "checker_sha256": "96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522", + "command": [ + "/Users/ross/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-I", + "-O", + "-B", + "-Werror", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/check_integer.py", + "--parent-word", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/parent/WORD.json.gz", + "--signed-word", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/candidate/WORD.json.gz", + "--raw-word", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/geometry/WORD.json.gz", + "--matrices", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-staging/frozen/geometry/MATRICES.json.gz", + "--out", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/CHECKS.json", + "--endpoint-out", + "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review/ENDPOINTS.json" + ], + "elapsed_seconds": 5.489738, + "exit_code": 0, + "python_version": "3.12.14", + "receipt_sha256": "c887cf32e5640221e038e4358df6422fbc1f32d3f3c5b6ab3b14cc1723bce1fd", + "stderr": "", + "stdout": "{\"negative_controls\": 9, \"no_new_kappa\": true, \"parent_prefixes\": [34285, 5839860], \"signed_prefixes\": [80639, 239014], \"status\": \"PASS_FIXED_SIGNED_QUOTIENT_ALL_COLUMNS_LOCAL_ONLY\"}\n", + "timeout_seconds": 60, + "working_directory": "/Users/ross/git/math/.research-automation/runs/unpublished-round2-20261020T1106Z/b04-integer-review" + }, + "git_free_portability": { + "all_inputs_compressed": true, + "command": [ + "/Users/ross/.cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3", + "-I", + "-O", + "-B", + "-Werror", + "checker.py", + "--parent-word", + "parent.gz", + "--signed-word", + "signed.gz", + "--raw-word", + "raw.gz", + "--matrices", + "matrices.gz" + ], + "cwd_has_git": false, + "elapsed_seconds": 3.958536, + "exit_code": 0, + "input_paths_have_spaces": true, + "isolated_optimized_no_bytecode_warnings_as_errors": true, + "optional_out_omitted": true, + "receipt_byte_identical": true, + "stdout_sha256": "c887cf32e5640221e038e4358df6422fbc1f32d3f3c5b6ab3b14cc1723bce1fd" + }, + "not_run": [ + "No sign optimization", + "No native-vector/precision/controller/supplier replay", + "No formal-kernel proof", + "No hosted CI" + ], + "schema": "b04-independent-integer-validation-v1", + "tampered_input_authentication": { + "detected": true, + "exit_code": 1, + "expected_error": "authentication: signed_word" + } +} diff --git a/research/r429-signed-range/frozen/reviews/integer/VALIDATION.md b/research/r429-signed-range/frozen/reviews/integer/VALIDATION.md new file mode 100644 index 0000000000..d04c181ce2 --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/integer/VALIDATION.md @@ -0,0 +1,52 @@ +# Local validation of the independent integer audit + +The final independent checker ran on the package's four frozen inputs with +bundled Python 3.12.14, standard library only: +`-I -O -B -Werror`. It passed in 5.490 seconds under a 60-second process cap. +This run included all four complete parent/candidate orientation replays, both +integer roundtrips for each word, the all-sign transfer certificate, all four +attaining prefix witnesses, and nine semantic negative controls. + +A second execution copied only the checker and its four compressed inputs +into a Git-free directory whose path contains spaces. It omitted the optional +`--out`, used relative explicit input paths, and produced a byte-identical +receipt on stdout in 3.959 seconds. In particular the compressed matrix input +was accepted by its unchanged decoded-byte hash. + +A separately recompressed, scientifically changed candidate input was +rejected with `authentication: signed_word`. This authentication check is +separate from the nine post-authentication semantic controls. + +The optional complete endpoint export was decoded independently into its four +652-by-651 dense integer matrices. Every matrix digest agreed with the final +receipt; no endpoint export needs to be bundled because the checker regenerates +it from the frozen inputs. + +From the package root, reproduce with: + +```sh +python3.12 -I -O -B -Werror \ + frozen/reviews/integer/check_integer.py \ + --parent-word frozen/parent/WORD.json.gz \ + --signed-word frozen/candidate/WORD.json.gz \ + --raw-word frozen/geometry/WORD.json.gz \ + --matrices frozen/geometry/MATRICES.json.gz \ + --out /tmp/b04-integer-receipt.json \ + --endpoint-out /tmp/b04-integer-endpoints.json +``` + +`--out` and `--endpoint-out` are optional file outputs; choose external fresh +paths. Without `--out`, the complete deterministic JSON receipt goes to stdout. +No Git checkout, source optimizer, network access or third-party package is +needed. + +The final local checker SHA256 is +`96e6fe96e72111e691dac904fc3991b2ddca440509ffaf5bf4a990d27c33e522`. +The uncompressed deterministic receipt SHA256 is +`c887cf32e5640221e038e4358df6422fbc1f32d3f3c5b6ab3b14cc1723bce1fd`. +The compressed receipt preserves exactly those decoded bytes. +The reviewer also retains machine-readable local evidence in `VALIDATION.json`. + +These are local package checks. No sign search, native-vector or precision +replay, recursive supplier audit, formal-kernel proof or hosted CI was run +by this independent reviewer. diff --git a/research/r429-signed-range/frozen/reviews/integer/check_integer.py b/research/r429-signed-range/frozen/reviews/integer/check_integer.py new file mode 100644 index 0000000000..daf62b0f8d --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/integer/check_integer.py @@ -0,0 +1,770 @@ +#!/usr/bin/env python3 +"""Independent dense exact audit of the fixed R429 signed-quotient witness. + +Python 3.12 standard library only. No producer or historical replayer import. +The input word is authenticated before semantic mutation controls are made. +All paths are explicit; no checkout, Git, home directory, or network is used. +Apache-2.0. Substantial OpenAI Codex assistance; not formal-kernel evidence. +""" + +import argparse +from collections import Counter +import gzip +import hashlib +from itertools import combinations +import json +from math import gcd +from pathlib import Path + +V, N = 111, 651 +PINS = { + "parent_word": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870", + "signed_word": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949", + "raw_word": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + # The original uncompressed JSON bytes, allowing a lossless gzip wrapper. + "matrices": "e5edb9e4e738192f98bd520ae6c1e8f1ddb19a0074ee9a1044e309b81e39c979", +} +PROFILE = {1: 1298, 2: 1342, 3: 79, 4: 44, 5: 93, 6: 11, 7: 9} +COUNTS = {0: 2873, 1: 13223, 2: 3, 3: 3} + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + + +def digest(value): + return hashlib.sha256(value).hexdigest() + + +def read_pinned(path, label): + packed = path.read_bytes() + decoded = gzip.decompress(packed) if packed.startswith(b"\x1f\x8b") else packed + authenticated = decoded if label == "matrices" else packed + require(digest(authenticated) == PINS[label], "authentication: " + label) + value = json.loads(decoded) + # For matrices the compression wrapper is intentionally not proof-relevant. + return value, { + "authenticated_sha256": digest(authenticated), + "decoded_bytes_sha256": digest(decoded), + "canonical_json_sha256": digest(canonical(value)), + "authenticated_representation": "decoded original JSON bytes" + if label == "matrices" else "frozen gzip bytes", + } + + +def integer_rank(matrix): + """Exact rational rank by fraction-free row elimination and gcd reduction.""" + pivots = {} + for original in matrix: + row = original[:] + for p, basis in sorted(pivots.items()): + if row[p]: + a, b = basis[p], row[p] + row = [a * x - b * y for x, y in zip(row, basis)] + common = 0 + for x in row: + common = gcd(common, x) + if common: + row = [x // common for x in row] + p = next((j for j, x in enumerate(row) if x), None) + if p is not None: + common = 0 + for x in row: + common = gcd(common, x) + if row[p] < 0: + common = -common + pivots[p] = [x // common for x in row] + return len(pivots) + + +def binary_rank(matrix): + basis = {} + for value in matrix: + while value: + p = value.bit_length() - 1 + if p not in basis: + basis[p] = value + break + value ^= basis[p] + return len(basis) + + +def binary_product(left, right): + result = [] + for mask in left: + row = 0 + for j, value in enumerate(right): + if mask & (1 << j): + row ^= value + result.append(row) + return result + + +def binary_inverse(matrix): + n = len(matrix) + left, right = matrix[:], [1 << j for j in range(n)] + for p in range(n): + q = next((j for j in range(p, n) if left[j] & (1 << p)), None) + require(q is not None, "binary code singular") + left[p], left[q] = left[q], left[p] + right[p], right[q] = right[q], right[p] + for j in range(n): + if j != p and left[j] & (1 << p): + left[j] ^= left[p] + right[j] ^= right[p] + require(left == [1 << j for j in range(n)], "binary inverse reduction") + return right + + +def dense_identity(n=N, private=True): + rows = [[int(i == j) for j in range(n)] for i in range(n)] + return rows + [[0] * n] if private else rows + + +def parity(rows): + return [sum((x & 1) << j for j, x in enumerate(row)) for row in rows] + + +def matrix_digest(rows): + """SHA256 of each dense signed decimal row, comma-separated, then LF.""" + h = hashlib.sha256() + for row in rows: + h.update((",".join(map(str, row)) + "\n").encode()) + return h.hexdigest() + + +def first_difference(left, right): + for i, (a, b) in enumerate(zip(left, right)): + for j, (x, y) in enumerate(zip(a, b)): + if x != y: + return {"output_row": i, "input_column": j, "expected": y, "actual": x} + return None + + +def integer_product(left, right): + columns = list(zip(*right)) + return [[sum(x * y for x, y in zip(row, column)) for column in columns] for row in left] + + +def determinant(matrix): + """Bareiss determinant, with every claimed integer division checked.""" + a = [r[:] for r in matrix] + n, previous, sign = len(a), 1, 1 + for p in range(n - 1): + q = next((j for j in range(p, n) if a[j][p]), None) + if q is None: + return 0 + if p != q: + a[p], a[q], sign = a[q], a[p], -sign + pivot = a[p][p] + for i in range(p + 1, n): + for j in range(p + 1, n): + numerator = pivot * a[i][j] - a[i][p] * a[p][j] + require(numerator % previous == 0, "Bareiss exact division") + a[i][j] = numerator // previous + a[i][p] = 0 + previous = pivot + return sign * a[-1][-1] + + +def value_segment(records, rows): + """Linear transfer for a complete-snapshot segment, any column width.""" + rows = [row[:] for row in rows] + width, source, snapshot = len(rows[0]), None, None + for op, d, s, c, f, phase in records: + if op == 1: + require(d < N and d != source, "segment immutable source/private") + rows[d] = [x + c * y for x, y in zip(rows[d], rows[s])] + elif op == 2: + require(source is None and s == N and not any(rows[N]), "segment fresh COPY") + source, snapshot = d, rows[d][:] + rows[N] = snapshot[:] + elif op == 3: + require(source == d and s == N and rows[N] == rows[d] == snapshot, + "segment immutable ERASE") + rows[N], source, snapshot = [0] * width, None, None + else: + require(op == 0, "segment opcode") + require(source is None and not any(rows[N]), "segment private boundary") + return rows + + +def quotient_matrix(records, pivots): + index = {p: j for j, p in enumerate(pivots)} + result = [] + for backward in (False, True): + rows = dense_identity(9, private=False) + peak = 1 + for op, d, s, c, f, phase in reversed(records) if backward else records: + require(op == 1 and d in index and s in index and f == 1 and phase == 23, + "quotient nine-coordinate alphabet") + c = -c if backward else c + dst, src = index[d], index[s] + rows[dst] = [x + c * y for x, y in zip(rows[dst], rows[src])] + peak = max(peak, sum(map(abs, rows[dst]))) + require(determinant(rows) == 1, "quotient elementary determinant") + result.append({"matrix": rows, "prefix_row_l1": peak, + "endpoint_row_l1": max(sum(map(abs, row)) for row in rows), + "determinant": 1, "sha256": matrix_digest(rows)}) + require(integer_product(result[0]["matrix"], result[1]["matrix"]) == + dense_identity(9, private=False), "quotient integer inverse") + return {"forward": result[0], "inverse": result[1]} + + +def sign_family_transfer(parent, signed, parent_endpoint, signed_endpoint): + positions = [i for i, r in enumerate(signed) if r[0] == 1 and r[5] == 23] + start, stop = positions[0], positions[-1] + 1 + require(positions == list(range(start, stop)), "quotient block must be contiguous") + pivots = sorted({signed[i][j] for i in positions for j in (1, 2)}) + require(pivots == [0, 1, 2, 4, 8, 9, 14, 30, 59], "nine actual quotient source coordinates") + require(parent[:start] == signed[:start] and parent[stop:] == signed[stop:], + "fixed literal prefix/suffix") + prefix = value_segment(signed[:start], dense_identity()) + reader_full = [prefix[p] for p in pivots] + require(all(not any(row[V:]) for row in reader_full), "quotient reader has dirty/target dependence") + reader = [row[:V] for row in reader_full] + require([[row[p] for p in pivots] for row in reader] == dense_identity(9, private=False), + "prefix reader does not have the selected-coordinate right inverse") + embedding = [[int(i == p) for p in pivots] for i in range(N + 1)] + transfer = value_segment(signed[stop:], embedding) + require(transfer[:V] == embedding[:V], "suffix source transfer is not the coordinate embedding") + require(all(not any(row) for row in transfer[V + 3:]), "suffix variation escapes repaired targets") + ell = transfer[V:V + 3] + require(integer_rank(ell) == 3, "three-target transfer rank") + minor_columns = next(c for c in combinations(range(9), 3) + if determinant([[row[j] for j in c] for row in ell])) + minor_det = determinant([[row[j] for j in minor_columns] for row in ell]) + quotients = {"parent": quotient_matrix(parent[start:stop], pivots), + "signed": quotient_matrix(signed[start:stop], pivots)} + dq = [[x - y for x, y in zip(a, b)] for a, b in zip( + quotients["signed"]["forward"]["matrix"], quotients["parent"]["forward"]["matrix"])] + delta_readers = integer_product(dq, reader) + predicted = integer_product(transfer, delta_readers) + require([[x - y for x, y in zip(a, b)] for a, b in zip(signed_endpoint, parent_endpoint)] == + [row + [0] * (N - V) for row in predicted], "full endpoint difference factorization") + require(determinant(dq) != 0, "current nine-dimensional quotient difference rank") + return { + "cut": {"prefix_records": start, "quotient_start_zero_based": start, + "quotient_stop_exclusive": stop, "quotient_records": stop - start, + "suffix_records": len(signed) - stop}, + "pivot_source_indices": pivots, + "prefix_reader_B": reader, "prefix_reader_B_full_sha256": matrix_digest(reader_full), + "prefix_reader_has_no_target_or_dirty_columns": True, + "B_on_pivot_columns_equals_I9": True, + "suffix_transfer_sha256": matrix_digest(transfer), + "suffix_source_transfer_equals_embedding_U": True, + "suffix_target_transfer_L": ell, + "L_full_rank_minor_columns": list(minor_columns), "L_full_rank_minor_determinant": minor_det, + "suffix_other_targets_helpers_and_private_transfer_zero": True, + "quotients": quotients, + "current_delta_Q": dq, + "current_delta_Q_determinant": determinant(dq), + "current_delta_Q_rank": 9, + "universal_difference_law": "Delta A_Z = U * Delta Q * B; " + "Delta T_Z = P_3 * L * Delta Q * B; Delta E_Z=0; other public blocks unchanged.", + "universal_rank_laws_over_Q": "rank(Delta A_Z)=rank(Delta Q)<=9; " + "rank(Delta T_Z)=rank(L*Delta Q)<=3, since B has the displayed right inverse.", + "universal_source_delta_support": pivots, + "universal_target_delta_support_subset": [0, 1, 2], + "all_sign_assignments": 1 << 47, + "family_scope": "All 2^47 choices of +/-1 coefficients in the existing ordered 47 ADDs. " + "Each quotient is an integer determinant-one product; all have the same reduction mod2. " + "The finite prefix/transfer certificate plus linear factorization proves the family law; " + "the sign assignments are not enumerated.", + "family_integer_restoration": "Every assignment restores all 429 arbitrary helpers, " + "has source depending only on x, target self block I, unchanged even E_Z, and closed private " + "snapshots. The same frame paths and paid profile are retained.", + "general_matrix_scope": "The difference formula also holds for any substituted 9x9 " + "integer Q. Invertibility and F2 endpoint require separate conditions on Q. Such a " + "substitution is not asserted to have the same 47-gate implementation or cost.", + "not_universal": "Current exact delta ranks9 and3, and all prefix/endpoint norms, are " + "facts of the two fixed witnesses, not constants throughout the sign family.", + } + + +def raw_binary_code(raw, frozen): + require(raw["v"] == V and raw["R"] == 438, "raw register dimensions") + rows = [1 << j for j in range(660)] + for phase in ("D", "A"): + for frame, dst, sources in raw[phase]: + require(0 <= dst < 660, "raw destination") + for src in sources: + require(0 <= src < 660 and src != dst, "raw source") + rows[dst] ^= rows[src] + source_mask = (1 << V) - 1 + target_mask = source_mask << V + require(all(not rows[j] & target_mask for j in raw["ret"]), "raw retained target dependence") + r = [rows[j] & source_mask for j in raw["ret"]] + k = [] + for subset in raw["scatter"]: + require(len(set(subset)) == len(subset), "duplicate raw scatter") + require(all(0 <= j < 9 for j in subset), "raw scatter index") + k.append(sum(1 << j for j in subset)) + require(r == frozen["matrices"]["R"] and k == frozen["matrices"]["K"], + "frozen R/K differs from direct raw derivation") + require(len(r) == 9 and len(k) == V, "R/K dimensions") + w = [0, 0, 0] + k[3:] + a = [(1 << j) ^ row for j, row in enumerate(binary_product(w, r))] + ai = binary_inverse(a) + ident = [1 << j for j in range(V)] + require(binary_product(a, ai) == binary_product(ai, a) == ident, "two-sided binary inverse") + jmat = [(1 << j) ^ row for j, row in enumerate(binary_product(k, r))] + require(binary_rank(r) == 9 and binary_rank(jmat) == 108, "raw R/J ranks") + require(binary_rank([x ^ y for x, y in zip(a, ident)]) == 9, "rank(A-I)") + return a, ai, { + "derivation": "Raw D then A on all 660 F2 columns; retained source rows give R; " + "raw scatter gives K; W equals K with rows 0,1,2 zero; A=I+WR.", + "R_rows": r, "K_rows": k, "A_rows": a, "A_inverse_rows": ai, + "rank_R": 9, "rank_J": 108, "rank_A_minus_I": 9, + "A_sha256": digest(canonical(a)), "A_inverse_sha256": digest(canonical(ai)), + } + + +class Geometry: + def __init__(self, raw, word): + roots, frames = raw["lines"], raw["frames"] + require(len(roots) == V and all(len(r) == 8 for r in roots), "actual root dimensions") + require(all(sum(x * x for x in r) == 4 for r in roots), "actual root norms") + self.masks = [] + self.ranks = [] + for f in frames: + require(f == sorted(set(f)) and all(0 <= j < V for j in f), "frame label set") + self.masks.append(sum(1 << j for j in f)) + self.ranks.append(integer_rank([roots[j] for j in f])) + require(self.ranks[0] == 0 and self.ranks[1] == 8, "zero/FULL ranks") + keep = [j for j in range(660) if j not in range(471, 480)] + self.start = [raw["start"][j] for j in keep] + self.final = [raw["final"][j] for j in keep] + require(word["start"] == self.start and word["final"] == self.final, + "projected native boundary arrays") + for p, root in enumerate(roots): + start = self.start[p] + cap = self.final[V + p] + require(self.ranks[start] == 1 and self.ranks[cap] == 7, "actual port line/cap ranks") + for j in frames[start]: + dot = sum(x * y for x, y in zip(roots[j], root)) + require(all(4 * x == dot * y for x, y in zip(roots[j], root)), "actual entrance line") + require(all(sum(x * y for x, y in zip(roots[j], root)) == 0 + for j in frames[cap]), "actual target cap") + self.receipt = { + "frames": len(frames), "ambient_dimension": 8, + "rank_method": "exact integer fraction-free elimination, with gcd reduction", + "frame_ranks_sha256": digest(canonical(self.ranks)), + "start_sha256": digest(canonical(self.start)), + "final_sha256": digest(canonical(self.final)), + "actual_line_cap_bindings": 222, + "native_ADDRESS_identity": "Inherited from pinned PR3645; no physical compiler or " + "native-vector prefix bound is established by this scalar audit.", + } + + +def authenticate_variant(parent, signed): + require(set(parent) == set(signed), "top-level metadata keys") + for key in parent: + if key not in ("records", "format"): + require(parent[key] == signed[key], "changed metadata: " + key) + require(parent["format"] == "coded-r429-pruned-three-source-copy-v1", "parent format") + require(signed["format"] == "coded-r429-signed-quotient-variant-v1", "signed format") + require(signed["public_registers"] == signed["private_register"] == N, "public/private sizes") + require(signed["deleted_public_families"] == list(range(471, 480)), "deleted families") + before, after = parent["records"], signed["records"] + require(len(before) == len(after) == 16102, "word lengths") + changed, quotient = [], [] + for i, (a, b) in enumerate(zip(before, after)): + require(len(b) == 6 and all(type(x) is int for x in b), "literal record schema") + if b[0] == 1 and b[5] == 23: + quotient.append(i) + if a != b: + require(a[:3] + a[4:] == b[:3] + b[4:] and + a[0] == 1 and a[3] == 1 and b[3] == -1 and a[5] == 23, + "mutation outside permitted quotient signs") + changed.append(i) + require(len(quotient) == 47 and len(changed) == 23, "47 gates / 23 sign changes") + return {"records": 16102, "quotient_ADDs": 47, "changed_signs": 23, + "changed_record_indices_zero_based": changed, + "quotient_signs": [after[i][3] for i in quotient], + "all_other_records_and_boundaries_identical": True} + + +def replay(records, geo, backward=False, initial=None, track=True, fault=None): + rows = dense_identity() if initial is None else [r[:] for r in initial] + bits = parity(rows) + frames = (geo.final if backward else geo.start)[:] + [None] + opened, original_snapshot = None, None + profile, counts = Counter(), Counter() + copies, paths = [], [[f] for f in frames] + prefix = max(sum(map(abs, row)) for row in rows) if track else 0 + maximum = None + moves = [] + order = range(len(records) - 1, -1, -1) if backward else range(len(records)) + for step, index in enumerate(order): + op, d, s, c, f, phase = records[index] + counts[op] += 1 + require(0 <= d <= N, "register destination range") + if op == 0: + require(d < N and 0 <= s < len(geo.ranks) and 0 <= c < len(geo.ranks), + "MOVE operands") + old, new = (c, s) if backward else (s, c) + lo, hi = (s, c) + require(phase == 0 and frames[d] == old, "MOVE current frame") + require(not (geo.masks[lo] & ~geo.masks[hi]) and + geo.ranks[hi] - geo.ranks[lo] == f > 0, "MOVE containment/rank") + frames[d] = new + paths[d].append(new) + profile[f] += 1 + moves.append([index, d, old, new, f]) + elif op == 1: + require(d < N, "immutable private field is an ADD destination") + require(0 <= s <= N and d != s and c in (-1, 1), "ADD operands") + require(frames[d] == frames[s] == f, "ADD common frame") + require(d != opened, "copied source changed during snapshot lifetime") + sign = -c if backward else c + if fault == ("inverse_sign", index): + require(backward, "inverse fault direction") + sign = c + a, b = rows[d], rows[s] + rows[d] = [x + y for x, y in zip(a, b)] if sign == 1 else [ + x - y for x, y in zip(a, b)] + bits[d] ^= bits[s] + if track: + size = sum(map(abs, rows[d])) + if size > prefix: + prefix = size + maximum = {"record_index_zero_based": index, "execution_step_zero_based": step, + "register": d, "row": rows[d][:]} + elif op == (3 if backward else 2): + require(opened is None and s == N and not any(rows[N]) and + bits[N] == 0 and frames[N] is None, "COPY requires fresh zero private field") + require(0 <= d < V and frames[d] == c == 1 and + not (geo.masks[f] & ~geo.masks[c]) and + geo.ranks[c] - geo.ranks[f] == 1, "COPY actual FULL-to-cap rank") + require(phase == (0 if backward else 1), "COPY rank tag") + original_snapshot = rows[d][:] + rows[N], bits[N], frames[N], opened = rows[d][:], bits[d], f, d + if fault == ("stale_snapshot", index): + stale = [int(j == d) for j in range(N)] + require(stale != rows[N], "stale snapshot control is ineffective") + rows[N], bits[N] = stale, 1 << d + paths[N].append(f) + profile[1] += 1 + copies.append({"copy_record_index_zero_based": index, "source": d, + "source_frame": c, "private_frame": f, "paid_rank": 1, + "snapshot_row_sha256": matrix_digest([original_snapshot])}) + elif op == (2 if backward else 3): + require(opened == d and s == N and frames[d] == c and frames[N] == f, + "ERASE original physical source/frame") + require(rows[N] == rows[d] == original_snapshot and bits[N] == bits[d], + "ERASE private value is not its original unchanged snapshot") + require(phase == (1 if backward else 0), "ERASE tag") + copies[-1]["erase_record_index_zero_based"] = index + rows[N], bits[N], frames[N], opened, original_snapshot = [0] * N, 0, None, None, None + paths[N].append(None) + else: + raise ValueError("unknown opcode") + require(opened is None and not any(rows[N]) and not bits[N] and frames[N] is None, + "private endpoint is not zero/closed") + require(frames[:N] == (geo.start if backward else geo.final), "public endpoint frames") + require(parity(rows) == bits, "independent integer / F2 replay disagrees") + result = { + "prefix_row_l1": prefix, "record_counts": dict(sorted(counts.items())), + "paid_profile": dict(sorted(profile.items())), + "paid_children": sum(profile.values()), "rank_mass": sum(k * v for k, v in profile.items()), + "copies": copies, "maximum_simultaneous_private_snapshots": 1, + "MOVE_events_sha256": digest(canonical(moves)), + "all_register_frame_paths_sha256": digest(canonical(paths)), + "integer_endpoint_sha256": matrix_digest(rows), + "binary_endpoint_sha256": digest(canonical(bits)), + } + return rows, result, maximum + + +def source_code(records, backward=False): + code = [r for r in records if r[0] == 1 and r[5] in (21, 22, 23, 24)] + require(len(code) == 1499, "source-code length") + rows = dense_identity(V, private=False) + for _, d, s, c, frame, phase in reversed(code) if backward else code: + require(0 <= d < V and 0 <= s < V and d != s and frame == 1, "source-only code grammar") + c = -c if backward else c + rows[d] = [x + c * y for x, y in zip(rows[d], rows[s])] + return rows + + +def endpoints(rows, code, binary_source, backward=False): + require(rows[:V] == [r + [0] * (N - V) for r in code], "exact source-only integer block") + for h in range(2 * V, N): + require(rows[h] == [int(j == h) for j in range(N)], "arbitrary dirty helper restoration") + for p in range(V): + require(rows[V + p][V:2 * V] == [int(j == p) for j in range(V)], + "target identity block") + require(all(x % 2 == 0 for x in rows[V + p][2 * V:]), "odd target helper leakage") + want = [1 << j for j in range(N)] + [0] + for p in range(V): + want[p] = binary_source[p] + want[V + p] ^= (1 << p) if backward else binary_source[p] + require(parity(rows) == want, "complete all-column binary boundary") + + +def block_summary(rows): + source = [r[:V] for r in rows[:V]] + target = [r[:V] for r in rows[V:2 * V]] + leakage = [r[2 * V:] for r in rows[V:2 * V]] + result = {} + for label, matrix in (("A_Z", source), ("T_Z", target), ("E_Z", leakage)): + coefficients = [x for row in matrix for x in row if x] + common = 0 + for x in coefficients: + common = gcd(common, x) + result[label] = { + "shape": [len(matrix), len(matrix[0])], "sha256": matrix_digest(matrix), + "nonzero_entries": len(coefficients), "coefficient_gcd": common, + "maximum_entry_abs": max(map(abs, coefficients), default=0), + "maximum_row_l1": max(sum(map(abs, row)) for row in matrix), + } + result["source_not_identity_witness"] = first_difference(source, dense_identity(V, private=False)) + result["target_not_A_Z_witness"] = first_difference(target, source) + result["nonzero_even_helper_witness"] = first_difference(leakage, [[0] * (N - 2 * V) for _ in range(V)]) + return result + + +def attain_prefix(records, backward, maximum, expected): + row = maximum["row"] + chosen = [(x > 0) - (x < 0) for x in row] + require(max(map(abs, chosen)) == 1, "attaining input must have unit infinity norm") + values = chosen[:] + [0] + measured, attained = 1, None + order = range(len(records) - 1, -1, -1) if backward else range(len(records)) + for index in order: + op, d, s, c, f, phase = records[index] + if op == 1: + values[d] += (-c if backward else c) * values[s] + elif op == (3 if backward else 2): + values[N] = values[d] + elif op == (2 if backward else 3): + require(values[N] == values[d], "scalar witness ERASE") + values[N] = 0 + measured = max(measured, abs(values[d]), abs(values[N])) + if index == maximum["record_index_zero_based"]: + attained = values[maximum["register"]] + require(attained == measured == expected and sum(map(abs, row)) == expected, + "prefix maximum not attained by direct scalar replay") + return {key: value for key, value in maximum.items() if key != "row"} | { + "prefix_norm": expected, "attained_value": attained, + "public_input_signs": chosen, + "maximizing_row_sparse": [[j, x] for j, x in enumerate(row) if x], + "maximizing_row_sha256": matrix_digest([row]), + "direct_scalar_replay_maximum": measured, + "domain": "scalar lifted word, arbitrary real public inputs with infinity norm <= 1, private=0", + } + + +def rejected(label, expected_message, operation): + try: + operation() + except ValueError as error: + require(str(error) == expected_message, + "negative control reached an unintended gate: " + label + ": " + str(error)) + return {"name": label, "detected": True, "reason": str(error), + "expected_semantic_gate_matched": True, + "authentication_bypassed_only_after_valid_inputs_loaded": True} + raise ValueError("semantic negative control escaped: " + label) + + +def negative_controls(records, geo, good, signed_change): + results = [] + copy_index = next(i for i, r in enumerate(records) if r[0] == 2) + results.append(rejected("stale_private_snapshot_at_legal_COPY", + "ERASE private value is not its original unchanged snapshot", + lambda: replay(records, geo, track=False, + fault=("stale_snapshot", copy_index)))) + altered = [r[:] for r in records] + pivot = altered[copy_index][1] + altered.insert(copy_index + 1, [1, pivot, (pivot + 1) % V, 1, 1, 99]) + results.append(rejected("mutate_copied_source_before_ERASE", + "copied source changed during snapshot lifetime", + lambda: replay(altered, geo, track=False))) + altered = [r[:] for r in records] + cap = altered[copy_index][4] + altered.insert(copy_index + 1, [1, N, V + pivot, 1, cap, 99]) + results.append(rejected("mutate_private_copy_before_ERASE", + "immutable private field is an ADD destination", + lambda: replay(altered, geo, track=False))) + altered = [r[:] for r in records] + move_index = next(i for i, r in enumerate(altered) if r[0] == 0) + altered[move_index][4] += 1 + results.append(rejected("wrong_paid_MOVE_rank", "MOVE containment/rank", + lambda: replay(altered, geo, track=False))) + wrong, _, _ = replay(records, geo, backward=True, initial=good, track=False, + fault=("inverse_sign", signed_change)) + identity = dense_identity() + require(parity(wrong) == parity(identity) and wrong != identity, + "wrong inverse sign control did not separate Z from F2") + results.append({"name": "wrong_integer_inverse_sign", "detected": True, + "binary_roundtrip_still_identity": True, + "integer_roundtrip_failure": first_difference(wrong, identity)}) + altered = [r[:] for r in records] + altered[signed_change][3] *= -1 + wrong, _, _ = replay(altered, geo, track=False) + require(parity(wrong) == parity(good) and wrong[:V] != good[:V], + "wrong quotient coefficient control did not change integer source") + results.append({"name": "wrong_quotient_coefficient_same_F2", "detected": True, + "binary_endpoint_unchanged": True, + "integer_endpoint_failure": first_difference(wrong, good)}) + altered = [r[:] for r in records] + cleanup = max(i for i, r in enumerate(altered) if r[0] == 1 and r[5] == 5 and r[1] >= 2 * V) + altered[cleanup][3] *= -1 + wrong, _, _ = replay(altered, geo, track=False) + difference = first_difference(wrong[2 * V:N], good[2 * V:N]) + require(difference is not None and parity(wrong) == parity(good), + "dirty restoration sign control ineffective") + difference["output_row"] += 2 * V + results.append({"name": "dirty_helper_cleanup_wrong_integer_sign", "detected": True, + "binary_endpoint_unchanged": True, "integer_helper_failure": difference}) + altered = [r[:] for r in records] + # A legal FULL-frame source write reads a formerly arbitrary dirty input. + altered[signed_change][2] = 2 * V + wrong, _, _ = replay(altered, geo, track=False) + leakage = next(((i, j, row[j]) for i, row in enumerate(wrong[:V]) + for j in range(2 * V, N) if row[j]), None) + require(leakage is not None, "dirty source dependence control ineffective") + results.append({"name": "source_code_reads_arbitrary_dirty_helper", "detected": True, + "witness": {"source_output": leakage[0], "dirty_input": leakage[1], + "coefficient": leakage[2]}}) + altered = [r[:] for r in records] + # Remove an actual zero-frame compensation term, keeping every gate legal. + compensation = next(i for i, r in enumerate(altered) if r[0] == 1 and r[5] == 10) + removed = altered.pop(compensation) + wrong, _, _ = replay(altered, geo, track=False) + leakage = next(((i, j, row[j]) for i, row in enumerate(wrong[V:2 * V]) + for j in range(2 * V, N) if row[j] & 1), None) + require(leakage is not None, "odd dirty target control ineffective") + results.append({"name": "omitted_dirty_compensation", "detected": True, + "removed_record": removed, + "witness": {"target_output": V + leakage[0], "dirty_input": leakage[1], + "odd_coefficient": leakage[2]}}) + return results + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--parent-word", type=Path, required=True) + parser.add_argument("--signed-word", type=Path, required=True) + parser.add_argument("--raw-word", type=Path, required=True) + parser.add_argument("--matrices", type=Path, required=True) + parser.add_argument("--out", type=Path, help="optional deterministic JSON receipt") + parser.add_argument("--endpoint-out", type=Path, help="optional complete sparse integer endpoint JSON") + args = parser.parse_args() + inputs, authentication = {}, {} + for label in PINS: + inputs[label], authentication[label] = read_pinned(getattr(args, label), label) + parent, signed, raw, frozen = (inputs[k] for k in PINS) + variant = authenticate_variant(parent, signed) + a, ai, binary = raw_binary_code(raw, frozen) + geo = Geometry(raw, signed) + all_rows, runs = {}, {} + for name, program in (("parent", parent), ("signed", signed)): + directions, summary = [], {} + for backward in (False, True): + rows, invoice, maximum = replay(program["records"], geo, backward) + require(invoice["record_counts"] == COUNTS and invoice["paid_profile"] == PROFILE, + "complete literal invoice") + code = source_code(program["records"], backward) + endpoints(rows, code, ai if backward else a, backward) + invoice["endpoint_blocks"] = block_summary(rows) + invoice["prefix_attainment"] = attain_prefix( + program["records"], backward, maximum, invoice["prefix_row_l1"]) + direction = "inverse" if backward else "forward" + summary[direction], all_rows[name + "_" + direction] = invoice, rows + directions.append(rows) + for backward, initial in ((True, directions[0]), (False, directions[1])): + roundtrip, _, _ = replay(program["records"], geo, backward, initial, track=False) + require(roundtrip == dense_identity(), "all-column integer two-sided roundtrip") + summary["both_integer_roundtrips_on_all_651_columns"] = True + runs[name] = summary + require([runs["parent"][d]["prefix_row_l1"] for d in ("forward", "inverse")] == [34285, 5839860], + "parent exact prefixes") + require([runs["signed"][d]["prefix_row_l1"] for d in ("forward", "inverse")] == [80639, 239014], + "signed exact prefixes") + pf, sf, si = (all_rows[k] for k in ("parent_forward", "signed_forward", "signed_inverse")) + delta_source = [[x - y for x, y in zip(r[:V], s[:V])] for r, s in zip(sf[:V], pf[:V])] + delta_target = [[x - y for x, y in zip(r[:V], s[:V])] for r, s in zip(sf[V:2 * V], pf[V:2 * V])] + require(all(x % 2 == 0 for row in delta_source + delta_target for x in row), "odd lift difference") + require([r[2 * V:] for r in sf[V:2 * V]] == [r[2 * V:] for r in pf[V:2 * V]], + "forward helper leakage changed") + require([r[2 * V:] for r in si[V:2 * V]] == + [[-x for x in r[2 * V:]] for r in sf[V:2 * V]], "inverse leakage is not negative E_Z") + changed_targets = [i for i, row in enumerate(delta_target) if any(row)] + require(changed_targets == [0, 1, 2], "target lift change outside three repaired rows") + changes = { + "source_delta_rank_over_Q": integer_rank(delta_source), + "target_delta_rank_over_Q": integer_rank(delta_target), + "target_source_block_changed_rows": changed_targets, + "source_delta_sha256": matrix_digest(delta_source), + "target_delta_sha256": matrix_digest(delta_target), + "forward_E_Z_identical_to_parent": True, + "integer_endpoint_difference_witness": first_difference(sf, pf), + } + family = sign_family_transfer(parent["records"], signed["records"], pf, sf) + controls = negative_controls(signed["records"], geo, sf, + variant["changed_record_indices_zero_based"][0]) + receipt = { + "schema": "fixed-r429-signed-quotient-independent-integer-audit-v1", + "status": "PASS_FIXED_SIGNED_QUOTIENT_ALL_COLUMNS_LOCAL_ONLY", + "no_new_kappa": True, + "authentication": authentication, "variant": variant, + "registers": {"sources": V, "arbitrary_targets": V, "arbitrary_dirty_helpers": 429, + "public_independent_columns": N, "private_register": N, + "private_initial_and_final_value": 0}, + "binary_contract": binary, + "geometry": geo.receipt, + "runs": runs, "changed_integer_endpoint": changes, + "all_sign_family_transfer": family, + "controls_after_authentication": controls, + "matrix_digest_encoding": "Dense signed decimal entries separated by comma, LF after " + "every row; full endpoint includes 652 output rows and 651 public input columns.", + "integer_contract": { + "forward": "(x,y,h) -> (A_Z*x, y+T_Z*x+E_Z*h, h)", + "inverse": "(x,y,h) -> (A_Z^-1*x, y-T_Z*A_Z^-1*x-E_Z*h, h)", + "binary_forward": "(x,y,h) -> (A*x,y+A*x,h)", + "binary_inverse": "(x,y,h) -> (A^-1*x,y+x,h)", + "A_Z_mod_2_and_T_Z_mod_2": "A", + "E_Z_mod_2": 0, + "domain": "Every integer, rational, or real public input; every commutative ring " + "by the same integer-polynomial identities, with a cleared private field. " + "The binary identity is over F2. Prefix l-infinity equalities concern real scalars.", + }, + "scope": [ + "Fixed witness and its pinned parent; no sign optimization or optimality claim. " + "The checked prefix/suffix factorization also proves the stated entire-sign-family law.", + "All integer and F2 input columns, both orientations, and both roundtrips are exact.", + "Scalar prefix row norms are exact induced l-infinity norms, with attained inputs.", + "Native ADDRESS action, native vector cancellations, rounded child defects, precision, " + "owner allocation, source access, storage, recursive supplier and outer kappa admission " + "are not proved by this scalar calculation.", + "No formal-kernel proof; separately authored dense standard-library implementation.", + ], + } + if args.endpoint_out: + payload = { + "schema": "sparse-integer-endpoint-rows-v1", "shape": [N + 1, N], + "indexing": "Rows and columns zero-based; absent entries zero; pairs sorted by column.", + "matrices": {name: [[[j, x] for j, x in enumerate(row) if x] for row in rows] + for name, rows in all_rows.items()}, + } + args.endpoint_out.write_text(json.dumps(payload, sort_keys=True, separators=(",", ":")) + "\n") + if args.out: + args.out.write_text(json.dumps(receipt, sort_keys=True, indent=2) + "\n") + else: + print(json.dumps(receipt, sort_keys=True, indent=2)) + if args.out: + print(json.dumps({"status": receipt["status"], "signed_prefixes": [80639, 239014], + "parent_prefixes": [34285, 5839860], + "negative_controls": len(controls), "no_new_kappa": True}, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/r429-signed-range/frozen/reviews/range/CHECKS.json.gz b/research/r429-signed-range/frozen/reviews/range/CHECKS.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..bcc1d49053220acb95e42d6730c26d474313d2d8 GIT binary patch literal 286198 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%0D?%Dj)hshNm#KN$_`T-QVS6(K@vMGig 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

    } zjtSY&kqP|@mC^gfh}Hh=hsj`k@v_tYs_2Eq(h^D{X(}o7I;s4FUy9?E%JQd~f$v&r zyVLdVt`hAU#)e~NjWuRvC3KBP8ErLfktAf%Sj2&iO*sl(YZ+YZ5FWDo1dh0f^Krd` zNw4VNFQNE>|Hw?;sOT=W#bjT@4xHg7I6GsWX1DytVJ&)jfTUm4b)zFOiwGVUg27EA zzGcUwGYzq#a|Etfo+7ugywSPBa*GE%d8?=N&s{bBsSS`)TGPlIGg^&qQfn6+?W_PG z?E;FV0fqUs9iNNK;Nw1Qc0N!!NkLJGC?TIWjJKo9N)moYlN!$DzEaZkCa?%uMJ8Z) zFm?i5yp-a#D)qZXP%xdx9@(^!2)g&V)o+~9X*tY8R}Z|!*KQ1pE&kdHzF(%a*&GsiIahHT|F*4y;>|dNiDiybX9^Fh zO*V_&Z%(&r6WO3gzQX7+ihY3|!~>!c%eDrq+0>`B#Jt1Z2gC5TVE!`d$V%|HBx39O zgY79PJ0FNVD8wN1;eS@pySgULGobB@hc>R|S^qIjG}P<`f&8Lcy7qbt&x6@KT`I5x zH3O^InGr~1puP4a3)`CvZwN6qi=L_pmoM{Qg`$*x|+&lRmtY8V|F6}~CW znw`gg!`PCHnjF^Z4YJE_POlv8wS@(@g|ceU+}a)MYR9Al1}p+cj0@3{ZvzNp@S@mZ z>q;?*cHLhb%yoM7Rl`og^eBunP9T#A)Sfz&*T~!>K#*_$L-W2LL!NcDm4JB-27dqh zKCeWH``N%o>XO-u&rNth!=6sWj^Nrt9Pd`N*7^1^Zv_e`^?h~kX>>+O?KSRMWq8!q zZ|xUgGkbwGE%$tQkDuTUphwgu6C?J@a7i1;sr(uZ=*8GvtVzuvyU8Q!Hco#f;f{LD zgKobZ1YpH2CasA1{aE=*K)1!h^Wy?-8h-9Act%@M1JKXP9TPlQ03)4!f&^xAh~0RmaI^7a zWQghvSIiTZ_qSXh+UsS06tV8V`Ap#gr5$ji(f^;Lj~ZCZ=ea?5bu)i0gs0aO{V$ zIG6m0rr*tS$KSY>Qm?W6-`^bnpRFGSI~YOfg7$2Oslc~3g4Gt+y0lpI%&yf`)u9s{ z|BAD~3l@hd7JE6JnkYBv_3pX)RKtB^%u4cY;(GXmbA7?`QN1L~A!RO4{El%#ePMV5 zt@|$uYy2anq3F5Z)*GP93EcaD{$lIxqv7gA$FR9My9JcRz_W2rksLGU`{IQ+d7h>N zlhHXnwm|Fx|D4YWnYTNaP+@5>BwnJXT$t_PI%{gCFIF8{eN#yA3B)=Ls+H4B)ouPZ z)8_B96SJ$-6<;-=Y}1*~Ba|iu<40&HN_=*1%+|Znnzbd~^={8sO1Qfwiu_!2AvEMC zDth*OR`C3?%7!7lF0W$3blc{2B2#ADd2Dk6eZ8gVuZQC2u=7wC_0)AvtSB`Jj>+yyDd8ebwQud)sgQekpJn89{arXm5in_r@u#w8oOV1~O9S1b)Q0`h1 zUf~Y}82-x(wX}w^RdQWuq^8D+dkQ}Lc@#fdYG0R4x2hlEftv0=!eURrT95LcELYb@ z(G(ziVPK=cp8N7)wGR0&x=UI<(dDWgM-U#lPOeA1+hlBHzUD?j8DUm2>_fu4L(}vH zrY?oce8KaBk$!|&p;5v+vsr9G^+fi;h`TvRC)hG*6Cw=!Q z^XpuCu#$U6GnGHc8A6XQl5cnTJFIi}R_2{-d$ZU5FqY6MdLQ#}G9SC^F&i4iF#z+S zJo2X`t!v@eIvhhFz7@O2h2N5)dpkZw0V`n3@>tc9$uIBI)0%Ra%*hR=?t^VNGw8qo zbJE7(p-h!OIH)VXn}AsAICk8le$Rk3_40L-{p&iH$_^)JYg_QGV{l)-j!a*~j*K!* Pg~lgp$$DHUi8}RPT78x8 literal 0 HcmV?d00001 diff --git a/research/r429-signed-range/frozen/reviews/range/SOURCE-DEPENDENCIES.json b/research/r429-signed-range/frozen/reviews/range/SOURCE-DEPENDENCIES.json new file mode 100644 index 0000000000..35504f8b8e --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/range/SOURCE-DEPENDENCIES.json @@ -0,0 +1,125 @@ +{ + "artifacts": { + "frozen/reviews/range/CHECKS.json.gz": { + "decoded_bytes": 10824873, + "decoded_sha256": "a12dcd0e33f4f3a3728ff76373ce00ce312cc0f53b147cb5c608c6b6de9f8f6c", + "transport_bytes": 286198, + "transport_sha256": "0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780" + }, + "frozen/reviews/range/check_range.py": { + "decoded_bytes": 41189, + "decoded_sha256": "4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5", + "transport_bytes": 41189, + "transport_sha256": "4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5" + } + }, + "excluded_old_suffix_word_gzip_sha256": "33d5c73fc6012da643a6d498dcacccfe70470fd76d0ee327a85f9ac6381dabcd", + "execution_imports": "Python standard library only; no historical producer module is imported.", + "historical_read_only_sources": { + "major-frontier/recursive/BIT-PRUNED-GROWTH.json": { + "decoded_bytes": 613964, + "decoded_sha256": "ccacefa32cf6edfe7a26ab5661ed14530f28dcba2d2150fff052c6f0f8f27d1b", + "required_to_reproduce": false, + "role": "Historical parent range claims/envelopes, independently matched above.", + "transport_bytes": 613964, + "transport_sha256": "ccacefa32cf6edfe7a26ab5661ed14530f28dcba2d2150fff052c6f0f8f27d1b" + }, + "major-frontier/recursive/bit_native_controller.py": { + "decoded_bytes": 25018, + "decoded_sha256": "e08adc1483c5bc75f40da1f7b62a7d1d5eb058615c5dfe6db6c38350348ff288", + "required_to_reproduce": false, + "role": "Historical abstract schedule explanation; independently evaluated in a free noncommuting GF2 algebra.", + "transport_bytes": 25018, + "transport_sha256": "e08adc1483c5bc75f40da1f7b62a7d1d5eb058615c5dfe6db6c38350348ff288" + }, + "major-frontier/recursive/bit_pruned_growth.py": { + "decoded_bytes": 5429, + "decoded_sha256": "9c59a9a521e0d0124df6b7686f76e0308c13678306f5efc53eb6e865757f8636", + "required_to_reproduce": false, + "role": "Historical source-code and terminal prefix convention; read, never imported.", + "transport_bytes": 5429, + "transport_sha256": "9c59a9a521e0d0124df6b7686f76e0308c13678306f5efc53eb6e865757f8636" + }, + "major-frontier/recursive/bit_signed_audit.py": { + "decoded_bytes": 11946, + "decoded_sha256": "376356696663021693c0e2c9adf37f371675fe8837fb88232b8767a8b90793e8", + "required_to_reproduce": false, + "role": "Historical global range recurrence and helper-magnitude convention; read, never imported.", + "transport_bytes": 11946, + "transport_sha256": "376356696663021693c0e2c9adf37f371675fe8837fb88232b8767a8b90793e8" + }, + "major-frontier/root-pruned-code/SIGNED-QUOTIENT-GROWTH.json": { + "decoded_bytes": 2053, + "decoded_sha256": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9", + "required_to_reproduce": false, + "role": "Historical candidate range claims, independently matched above.", + "transport_bytes": 2053, + "transport_sha256": "f932fc1ab6efb6b261e4774beb9771b7abf5f9d247343f79d78e1955cb2d8cb9" + }, + "major-frontier/root-pruned-code/SIGNED-QUOTIENT-RESULT.json": { + "decoded_bytes": 1648, + "decoded_sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20", + "required_to_reproduce": false, + "role": "Historical local sign-variant claim; not imported.", + "transport_bytes": 1648, + "transport_sha256": "2ae84cc4cf6965832faf6c552f80f914820f53408e7d24cdb476dd7d87adaa20" + }, + "major-frontier/root-rounding/SUFFIX-WEIGHTS.json": { + "decoded_bytes": 4682, + "decoded_sha256": "3577f7115fe1c5c6f3f0aa0c68c17d8f141d0e735521e870c531fb00b4dd4818", + "required_to_reproduce": false, + "role": "Historical excluded suffix receipt; not evidence for either current word.", + "transport_bytes": 4682, + "transport_sha256": "3577f7115fe1c5c6f3f0aa0c68c17d8f141d0e735521e870c531fb00b4dd4818" + }, + "major-frontier/root-rounding/suffix_weights.py": { + "decoded_bytes": 7458, + "decoded_sha256": "1941834c673c0b420741d049d16427a0e13b82b2abe2aa79cc3df3bc47995be5", + "required_to_reproduce": false, + "role": "Older660-public,438-helper,six-copy audit; no numerical result reused.", + "transport_bytes": 7458, + "transport_sha256": "1941834c673c0b420741d049d16427a0e13b82b2abe2aa79cc3df3bc47995be5" + } + }, + "independently_matched_historical_range_fields": { + "candidate": { + "exact_ordered_integer_upper": true, + "local_prefix": true, + "ordered_bits": true, + "source_code_prefix": true, + "terminal_bits": true + }, + "parent": { + "complete_prefix_envelopes_with_zero_row": true, + "exact_ordered_integer_upper": true, + "local_prefix": true, + "ordered_bits": true, + "source_code_prefix": true, + "terminal_bits": true + } + }, + "proof_kind": "Finite exhaustive exact integer calculation and written all-input conditional linear-algebra proof; no formal-kernel proof.", + "receipt_canonical_sha256": "eff9d7a72677d9ae67f8257a99efbc67e621488220e3b14f7ba127a4409ec1d4", + "required_frozen_inputs": { + "frozen/candidate/WORD.json.gz": { + "decoded_bytes": 305012, + "decoded_sha256": "127f48ecae91547e90bd2e64769f222cb17601ab36edcfdfdb0fce6f2d1bd9b7", + "transport_bytes": 59544, + "transport_sha256": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949" + }, + "frozen/controller/WORD.json.gz": { + "decoded_bytes": 215137, + "decoded_sha256": "859cdd2a87ea6ce58eb0ccdf2ca675e77c7134d6a7bbc7d450493d1abb108271", + "transport_bytes": 16510, + "transport_sha256": "ff50e2df9b5a0ecb5e4a3aa24a5b93ac49f7c2b4fd3d28295e6d5a8f6154027f" + }, + "frozen/parent/WORD.json.gz": { + "decoded_bytes": 304990, + "decoded_sha256": "ebc33ee086f610c1fd540fa56bb99b2b96a768e4aed4a18defcb0e1f507fca89", + "transport_bytes": 59514, + "transport_sha256": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870" + } + }, + "schema": "b04-range-source-dependencies-v1", + "source_binding_resolution": "The legacy controller6372gate endpoint differs in9rows from the selected1499gate endpoint. Abstract schedule identity and actual selected local binary F_A/inverse interfaces are checked separately; native chart implementation stays conditional." +} diff --git a/research/r429-signed-range/frozen/reviews/range/VALIDATION-RESULT.json b/research/r429-signed-range/frozen/reviews/range/VALIDATION-RESULT.json new file mode 100644 index 0000000000..ff5ac94b4e --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/range/VALIDATION-RESULT.json @@ -0,0 +1,39 @@ +{ + "preliminary_fix": "Receipt equality now compares canonical JSON: decoded lists/string keys correspond to in-memory tuples/integer keys. No mathematical result changed.", + "preliminary_runs": [ + { + "elapsed_seconds": 3.019372, + "exit_code": 0, + "name": "normal_generate", + "python": "3.12.14 (main, Aug 25 2026, 13:50:33) [Clang 22.1.3 ]", + "stderr": "", + "stdout": "PASS_EXACT_RANGE_AND_ATOMIC_DEFECT_CONSTANTS_NO_PRECISION_ADMISSION\nparent range [34285, 5839860] controller bits 458 terminal bits 601\n forward peak impulse 3457 exact aggregate 880068 loose sum 965052\n inverse peak impulse 86476 exact aggregate 34848225 loose sum 34872847\ncandidate range [80639, 239014] controller bits 401 terminal bits 519\n forward peak impulse 3935 exact aggregate 1081994 loose sum 1099680\n inverse peak impulse 4366 exact aggregate 1255309 loose sum 1289381\nreceipt_sha256 88da016107a663d4c6930e49bee832cb4660c262d80c3067ba8f23baa1cabb0b\n" + }, + { + "elapsed_seconds": 3.408473, + "exit_code": 1, + "name": "optimized_verify", + "python": "3.12.14 (main, Aug 25 2026, 13:50:33) [Clang 22.1.3 ]", + "stderr": "FAIL: complete deterministic receipt differs\n", + "stdout": "" + } + ], + "runs": [ + { + "elapsed_seconds": 2.895955, + "exit_code": 0, + "name": "normal_generate", + "python": "3.12.14 (main, Aug 25 2026, 13:50:33) [Clang 22.1.3 ]", + "stderr": "", + "stdout": "PASS_EXACT_RANGE_AND_ATOMIC_DEFECT_CONSTANTS_NO_PRECISION_ADMISSION\nparent range [34285, 5839860] controller bits 458 terminal bits 601\n forward peak impulse 3457 exact aggregate 880068 loose sum 965052\n inverse peak impulse 86476 exact aggregate 34848225 loose sum 34872847\ncandidate range [80639, 239014] controller bits 401 terminal bits 519\n forward peak impulse 3935 exact aggregate 1081994 loose sum 1099680\n inverse peak impulse 4366 exact aggregate 1255309 loose sum 1289381\nreceipt_sha256 eff9d7a72677d9ae67f8257a99efbc67e621488220e3b14f7ba127a4409ec1d4\n" + }, + { + "elapsed_seconds": 2.712904, + "exit_code": 0, + "name": "optimized_verify", + "python": "3.12.14 (main, Aug 25 2026, 13:50:33) [Clang 22.1.3 ]", + "stderr": "", + "stdout": "PASS_EXACT_RANGE_AND_ATOMIC_DEFECT_CONSTANTS_NO_PRECISION_ADMISSION\nparent range [34285, 5839860] controller bits 458 terminal bits 601\n forward peak impulse 3457 exact aggregate 880068 loose sum 965052\n inverse peak impulse 86476 exact aggregate 34848225 loose sum 34872847\ncandidate range [80639, 239014] controller bits 401 terminal bits 519\n forward peak impulse 3935 exact aggregate 1081994 loose sum 1099680\n inverse peak impulse 4366 exact aggregate 1255309 loose sum 1289381\nreceipt_sha256 eff9d7a72677d9ae67f8257a99efbc67e621488220e3b14f7ba127a4409ec1d4\n" + } + ] +} diff --git a/research/r429-signed-range/frozen/reviews/range/VALIDATION.md b/research/r429-signed-range/frozen/reviews/range/VALIDATION.md new file mode 100644 index 0000000000..fe3f877a77 --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/range/VALIDATION.md @@ -0,0 +1,77 @@ +# B04 range-review validation + +The final source was executed with bundled CPython 3.12 on the three unchanged +compressed sources now staged as `frozen/parent/WORD.json.gz`, +`frozen/candidate/WORD.json.gz`, and `frozen/controller/WORD.json.gz`. +Each subprocess had an enforced 60-second timeout. + +From the package root, the equivalent commands are: + +```sh +python3.12 frozen/reviews/range/check_range.py \ + --parent-word frozen/parent/WORD.json.gz \ + --candidate-word frozen/candidate/WORD.json.gz \ + --controller frozen/controller/WORD.json.gz \ + --output frozen/reviews/range/CHECKS.json.gz + +python3.12 -O frozen/reviews/range/check_range.py \ + --parent-word frozen/parent/WORD.json.gz \ + --candidate-word frozen/candidate/WORD.json.gz \ + --controller frozen/controller/WORD.json.gz \ + --verify frozen/reviews/range/CHECKS.json.gz +``` + +Both final executions passed. Receipt generation took 2.896 seconds; optimized +complete receipt verification took 2.713 seconds. All invariants use explicit +exceptions and remain active under `-O`. + +The exact receipt canonical-JSON SHA256 is: + +`eff9d7a72677d9ae67f8257a99efbc67e621488220e3b14f7ba127a4409ec1d4` + +The checker SHA256 is: + +`4aa90c275da461cbcef95b00c6088aa599c72e7b76a6cbf9b8cadb87e45e6df5` + +The compressed full receipt SHA256 is: + +`0e826dec630ab3ab60592d823dd425785add331b97e4b3f1bc84e71e25510780` + +The decoded controller SHA256 is: + +`859cdd2a87ea6ce58eb0ccdf2ca675e77c7134d6a7bbc7d450493d1abb108271` + +The compressed controller transport SHA256 is: + +`ff50e2df9b5a0ecb5e4a3aa24a5b93ac49f7c2b4fd3d28295e6d5a8f6154027f` + +All four range/adjoint scans cover all 16,102 records. Their checks include +every opcode and paid rank; all 651 public entrance columns are represented +in the exact sparse range matrices. The full adjoints operate on 652 extended +coordinates. The controller recurrence covers all 56 events and 63 added +source-code factors. The binary abstract schedule checks all eight independent +formal bank columns. + +After source authentication, each orientation executes actual source-specific +controls for the wrong adjoint, reversed suffix order, ignored COPY and +incorrect uniform error signs. It independently propagates saved impulse, +range-peak and suffix-row witnesses forward. It also directly propagates the +simultaneous error signs that attain the three reported aggregate categories. +Thus these controls test the linear calculation, not merely authentication. + +An independent read-only comparison with the retained historical range JSON +confirmed both exact ordered integer upper bounds, local/source prefix +numbers, controller bit lengths and terminal bit lengths. The complete parent +block envelopes agree after adding the identically zero row, which the older +ADD-only envelope omitted. `SOURCE-DEPENDENCIES.json` records these comparisons +and all source hashes. + +A preliminary verification call exposed a receipt-comparison bug: Python +tuples/integer JSON keys were compared directly against decoded lists/string +keys. Verification was changed to compare canonical JSON. That preliminary +failure and the final successful reruns are retained in +`VALIDATION-RESULT.json`. It did not change any mathematical value. + +This validation is finite exact computation and written conditional proof. It +is not formal-kernel validation, hosted CI, a physical rounding test, a native +child implementation, or supplier admission. diff --git a/research/r429-signed-range/frozen/reviews/range/check_range.py b/research/r429-signed-range/frozen/reviews/range/check_range.py new file mode 100644 index 0000000000..bdd21b2823 --- /dev/null +++ b/research/r429-signed-range/frozen/reviews/range/check_range.py @@ -0,0 +1,851 @@ +#!/usr/bin/env python3 +"""Exact range and atomic additive-defect audit of two pinned BIT words. + +Standard library only; no producer code is imported. This is finite exact +integer computation, not a proof of native-child accuracy or rounded cleanup. +SPDX-License-Identifier: Apache-2.0 +Substantial OpenAI Codex assistance. +""" + +import argparse +from collections import Counter +import gzip +from hashlib import sha256 +import json +from pathlib import Path +import sys + + +PUBLIC = 651 +PORTS = 111 +PRIVATE = 651 +DIM = PUBLIC + 1 +PINS = { + "parent": { + "gzip": "1a6841fccba51fa922993c77b4b296e659c2c538252e5e06113d0438c5edb870", + "decoded": "ebc33ee086f610c1fd540fa56bb99b2b96a768e4aed4a18defcb0e1f507fca89", + "format": "coded-r429-pruned-three-source-copy-v1", + }, + "candidate": { + "gzip": "e802611104c61fc8477837b4ab41abc4f13cf41fbca6ef3de60d0b5e768fb949", + "decoded": "127f48ecae91547e90bd2e64769f222cb17601ab36edcfdfdb0fce6f2d1bd9b7", + "format": "coded-r429-signed-quotient-variant-v1", + }, + "controller_decoded": "859cdd2a87ea6ce58eb0ccdf2ca675e77c7134d6a7bbc7d450493d1abb108271", +} +OPNAMES = {0: "move", 1: "add", 2: "copy", 3: "clear"} + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + + +def digest(value): + return sha256(canonical(value)).hexdigest() + + +def sparse_items(row): + return sorted(row.items()) + + +def read_json(path): + transport = Path(path).read_bytes() + decoded = gzip.decompress(transport) if transport[:2] == b"\x1f\x8b" else transport + return json.loads(decoded), { + "transport_sha256": sha256(transport).hexdigest(), + "decoded_sha256": sha256(decoded).hexdigest(), + } + + +def load_word(path, label): + obj, hashes = read_json(path) + require(hashes["transport_sha256"] == PINS[label]["gzip"], label + " gzip pin") + require(hashes["decoded_sha256"] == PINS[label]["decoded"], label + " decoded pin") + require(obj["format"] == PINS[label]["format"], label + " format") + require(obj["public_registers"] == PUBLIC and obj["private_register"] == PRIVATE, + "651 public coordinates and one private coordinate") + records = obj["records"] + require(len(records) == 16102, "complete record count") + require(Counter(r[0] for r in records) == Counter({0: 2873, 1: 13223, 2: 3, 3: 3}), + "complete operation coverage") + for r in records: + require(len(r) == 6 and all(type(v) is int for v in r), "record schema") + op, dst, src, coefficient, rank, phase = r + require(op in OPNAMES and 0 <= dst < PUBLIC, "public destination") + if op == 1: + require(0 <= src < DIM and src != dst and coefficient in (-1, 1), + "unit signed distinct-coordinate shear") + elif op == 0: + require(1 <= rank <= 7, "MOVE paid rank") + else: + require(src == PRIVATE, "COPY/ERASE private address") + return obj, hashes + + +def events_of(records, reverse=False): + """Tuples (kind, dst, src, coefficient, rank, original_record).""" + out = [] + iterator = reversed(list(enumerate(records))) if reverse else enumerate(records) + for index, (op, dst, src, c, rank, phase) in iterator: + if op == 1: + out.append(("add", dst, src, -c if reverse else c, 0, index)) + elif op == 0: + out.append(("move", dst, -1, 0, rank, index)) + elif op == (3 if reverse else 2): + # Reverse COPY comes from the forward ERASE record; its paid + # rank belongs to the paired COPY, which is 1 in these pins. + out.append(("copy", PRIVATE, dst, 0, 1, index)) + else: + out.append(("clear", PRIVATE, dst, 0, 0, index)) + return out + + +def add_sparse(dst, src, coefficient): + require(dst is not src, "sparse source and destination must differ") + for key, value in src.items(): + result = dst.get(key, 0) + coefficient * value + if result: + dst[key] = result + else: + dst.pop(key, None) + + +def block_l1(row): + totals = [0, 0, 0] + for j, value in row.items(): + totals[0 if j < PORTS else 1 if j < 2 * PORTS else 2] += abs(value) + return tuple(totals) + + +def forward_values(events, values, stop=None, impulses=None, mutation=None): + """Independent scalar simulation, with optional errors after each event.""" + values = list(values) + selected = events if stop is None else events[:stop] + for i, (op, dst, src, c, rank, original) in enumerate(selected): + if op == "add": + if mutation == "transpose_shear": + values[src] += c * values[dst] + else: + values[dst] += c * values[src] + elif op == "copy": + if mutation != "ignore_copy": + values[dst] = values[src] + elif op == "clear": + values[dst] = 0 + else: + require(op == "move", "scalar replay opcode") + if impulses is not None: + values[dst] += impulses[i] + return values + + +def range_audit(events): + rows = [{i: 1} for i in range(PUBLIC)] + [{}] + envelopes = {(1, 0, 0), (0, 1, 0), (0, 0, 1)} + prefix = 1 + peak = {"after_event": -1, "coordinate": 0, "row": {0: 1}} + snapshot = None + copies = 0 + row_trace = sha256() + for i, (op, dst, src, c, rank, original) in enumerate(events): + if op == "add": + require(snapshot is None or dst != snapshot, "immutable snapshot source") + add_sparse(rows[dst], rows[src], c) + elif op == "copy": + require(snapshot is None and not rows[PRIVATE], "private COPY entrance") + rows[PRIVATE] = dict(rows[src]) + snapshot = src + copies += 1 + elif op == "clear": + require(snapshot == src and rows[PRIVATE] == rows[src], + "exact ideal ERASE snapshot return") + rows[PRIVATE] = {} + snapshot = None + else: + require(op == "move", "range opcode") + weights = block_l1(rows[dst]) + envelopes.add(weights) + norm = sum(weights) + if norm > prefix: + prefix = norm + peak = {"after_event": i, "coordinate": dst, "row": dict(rows[dst])} + row_trace.update(canonical([i, dst, sparse_items(rows[dst]), weights]) + b"\n") + require(snapshot is None and not rows[PRIVATE] and copies == 3, "private ideal endpoint") + for j in range(2 * PORTS, PUBLIC): + require(rows[j] == {j: 1}, "all 429 ideal helpers restored") + for j in range(PORTS): + require(all(k < PORTS for k in rows[j]), "source endpoint has only source inputs") + require(rows[PORTS + j].get(PORTS + j) == 1 and + all(k < PORTS or k == PORTS + j or k >= 2 * PORTS + for k in rows[PORTS + j]), "target self block is identity") + endpoints = { + "source_source_l1": max(sum(abs(c) for c in row.values()) for row in rows[:PORTS]), + "target_source_l1": max(block_l1(row)[0] for row in rows[PORTS:2 * PORTS]), + "target_helper_l1": max(block_l1(row)[2] for row in rows[PORTS:2 * PORTS]), + } + signs = [0] * DIM + for j, coefficient in peak["row"].items(): + signs[j] = 1 if coefficient > 0 else -1 + witness = forward_values(events, signs, peak["after_event"] + 1) + require(witness[peak["coordinate"]] == prefix, "range peak forward witness") + return { + "exact_prefix_l1": prefix, + "block_prefix_envelope": sorted(envelopes), + "block_prefix_envelope_sha256": digest(sorted(envelopes)), + "prefix_changed_row_trace_sha256": row_trace.hexdigest(), + "endpoint_blocks": endpoints, + "endpoint_sparse_matrix_sha256": digest([sparse_items(row) for row in rows]), + "ideal_helper_restoration_count": 429, + "ideal_private_copies_and_erases": [copies, copies], + "peak_witness": { + "after_event": peak["after_event"], + "original_record": events[peak["after_event"]][-1], + "coordinate": peak["coordinate"], + "row_sparse": sparse_items(peak["row"]), + "input_signs_sparse": [(j, s) for j, s in enumerate(signs) if s], + "forward_observed_coordinate": witness[peak["coordinate"]], + }, + }, rows + + +def source_code_audit(records, legacy_gates, local_rows): + selected = [(i, r) for i, r in enumerate(records) if r[0] == 1 and 21 <= r[5] <= 24] + require(len(selected) == 1499, "complete source code extraction") + require(Counter(r[5] for i, r in selected) == Counter({21: 474, 22: 504, 23: 47, 24: 474}), + "source code phase coverage") + for i, r in selected: + require(r[1] < PORTS and r[2] < PORTS, "source code support") + output = [] + matrices = [] + for reverse in (False, True): + rows = [{j: 1} for j in range(PORTS)] + prefix = 1 + peak = -1 + iterator = reversed(selected) if reverse else selected + for original, r in iterator: + _, dst, src, c, rank, phase = r + add_sparse(rows[dst], rows[src], -c if reverse else c) + norm = sum(abs(v) for v in rows[dst].values()) + if norm > prefix: + prefix, peak = norm, original + require(rows == local_rows[int(reverse)][:PORTS], + "selected source code equals full local integer source endpoint") + matrices.append(rows) + output.append({ + "exact_prefix_l1": prefix, + "endpoint_l1": max(sum(abs(v) for v in r.values()) for r in rows), + "peak_original_record": peak, + "sparse_matrix_sha256": digest([sparse_items(r) for r in rows]), + }) + # Literal inverse on all 111 integer columns, independently of GF(2). + restored = [dict(row) for row in matrices[0]] + for original, r in reversed(selected): + _, dst, src, c, rank, phase = r + add_sparse(restored[dst], restored[src], -c) + require(restored == [{j: 1} for j in range(PORTS)], "source code literal inverse") + legacy = [1 << j for j in range(PORTS)] + for gate in legacy_gates: + require(len(gate) == 2 and all(type(j) is int and 0 <= j < PORTS for j in gate) + and gate[0] != gate[1], "legacy binary source gate") + dst, src = gate + legacy[dst] ^= legacy[src] + selected_binary = [ + sum(1 << j for j, v in row.items() if v % 2) + for row in matrices[0] + ] + for reverse, local in enumerate(local_rows): + for j in range(PORTS): + row = local[PORTS + j] + binary_source = sum(1 << k for k, v in row.items() if k < PORTS and v % 2) + require(binary_source == (1 << j if reverse else selected_binary[j]), + "actual local binary target fits the selected abstract source code") + require(all(v % 2 == 0 for k, v in row.items() if k >= 2 * PORTS), + "actual local helper leakage vanishes over GF(2)") + differences = [i for i, (a, b) in enumerate(zip(legacy, selected_binary)) if a != b] + require(len(legacy_gates) == 6372 and differences, + "historical controller code is explicitly a different source endpoint") + return { + "source_code_adds": len(selected), + "source_code_record_indices": [i for i, r in selected], + "source_code_records_sha256": digest([r for i, r in selected]), + "phase_counts": dict(sorted(Counter(r[5] for i, r in selected).items())), + "forward": output[0], + "inverse": output[1], + "source_integer_inverse_verified": True, + "actual_local_binary_interfaces_all_columns_verified": True, + "actual_local_binary_interface": + "Forward (x,y,h)->(A x,y+A x,h); literal reverse " + "(x,y,h)->(A^-1 x,y+x,h). The controller uses the reverse " + "interface with source Y and target X.", + "legacy_controller_binary_gate_count": len(legacy_gates), + "legacy_binary_endpoint_sha256": digest(legacy), + "selected_binary_endpoint_sha256": digest(selected_binary), + "legacy_binary_endpoint_equals_selected_source_mod2": False, + "legacy_binary_endpoint_different_rows": differences, + "first_legacy_binary_mismatch": { + "row": differences[0], "legacy_row_bits": legacy[differences[0]], + "selected_row_bits": selected_binary[differences[0]], + }, + "integer_sweep_binding": + "Each abstract sweep uses this word's selected phase21..24 signed code " + "or its literal inverse; the controller's legacy binary gate list is " + "a different endpoint and is not the implementation being bounded.", + } + + +def abstract_schedule_audit(ordered): + """Exact free noncommuting GF(2)-polynomial evaluation of the 8 bank columns.""" + banks = [{((), j)} for j in range(8)] + levels = [-1] * 4 + trace = [] + def encoded(row, stages): + result = row + for stage in stages: + result = {((stage,) + word, column) for word, column in result} + return result + for index, event in enumerate(ordered): + op = event.get("op") + if op == "code sweep": + pair, side = event["pair"], int(event["side"] == "Y") + for stage in event["stages"]: + require((side == 1 and (levels[pair] == -1 or stage > levels[pair])) + or (side == 0 and levels[pair] >= stage), + "abstract sweep native-level side premise") + coordinate = 2 * pair + side + banks[coordinate] = encoded(banks[coordinate], event["stages"]) + elif op == "complete local coded call": + pair, stage = event["pair"], event["stage"] + require(levels[pair] == stage - 1, "abstract local incoming native level") + x, y = banks[2 * pair:2 * pair + 2] + if event["reverse"]: + banks[2 * pair:2 * pair + 2] = [x ^ y, encoded(y, [stage])] + else: + coded_x = encoded(x, [stage]) + banks[2 * pair:2 * pair + 2] = [coded_x, y ^ coded_x] + levels[pair] = stage + elif op == "unchanged idle child": + pair = event["pair"] + require(levels[pair] == event["source_level"], "abstract idle incoming chart") + levels[pair] = event["target_level"] + elif event.get("kind") == "bridge": + d, s = event["dst"], event["src"] + require(levels[d] == levels[s], "abstract bridge common native chart") + banks[2 * d] ^= banks[2 * s] + banks[2 * s + 1] ^= banks[2 * d + 1] + else: + require(event.get("kind") == "exchange" and levels == [8] * 4, + "abstract terminal exchange") + banks = [banks[j ^ 1] for j in range(8)] + trace.append([sorted(row) for row in banks]) + endpoint = [{(tuple(range(8, -1, -1)), j)} for j in range(8)] + require(banks == endpoint, "abstract all-column common-code endpoint") + return { + "coefficient_ring": "free noncommuting polynomial algebra over GF(2)", + "independent_bank_columns": 8, + "generator_labels": list(range(9)), + "all_controller_events": len(ordered), + "all_prefixes_sha256": digest(trace), + "endpoint": "diag(G8 G7 ... G0, ..., G8 G7 ... G0)", + "endpoint_verified": True, + "scope": "Formal binary VALUE model only. Arbitrary substitution of linear " + "maps for G_s is allowed by polynomial evaluation. This does not " + "identify the integer lifted target with that binary local formula.", + } + + +def controller_bound(ordered, local, source): + bank = [[1, 1] for _ in range(4)] + maximum = 1 + counts = Counter() + transcript = [] + local_checkpoints = [] + directions = ["forward", "inverse"] + seen_stages = [] + for index, event in enumerate(ordered): + before = [list(pair) for pair in bank] + op = event.get("op") + entry = {"controller_event": index, "before": before} + if op == "code sweep": + pair = event["pair"] + require(0 <= pair < 4 and event["side"] in ("X", "Y"), "code bank") + side = int(event["side"] == "Y") + factors = [] + for stage in event["stages"]: + require(type(stage) is int and 0 <= stage <= 8, "code stage") + direction = directions[stage % 2] + prefix = source[direction]["exact_prefix_l1"] * bank[pair][side] + maximum = max(maximum, prefix) + bank[pair][side] *= source[direction]["endpoint_l1"] + counts[direction + "_code"] += 1 + factors.append({"stage": stage, "direction": direction, + "prefix_upper": prefix, "endpoint_upper": bank[pair][side]}) + entry.update(kind="code sweep", factors=factors) + elif op == "complete local coded call": + pair = event["pair"] + stage = event["stage"] + reverse = int(event["reverse"]) + require(0 <= pair < 4 and stage % 2 == reverse, "local source orientation") + source_side = reverse + target_side = 1 - reverse + x, y = bank[pair][source_side], bank[pair][target_side] + h = max(v for pair_values in bank for v in pair_values) + direction = directions[reverse] + envelopes = local[direction]["block_prefix_envelope"] + values = [(a * x + b * y + c * h, (a, b, c)) for a, b, c in envelopes] + prefix, maximizing_block = max(values) + maximum = max(maximum, prefix) + endpoint = local[direction]["endpoint_blocks"] + bank[pair][source_side] = endpoint["source_source_l1"] * x + bank[pair][target_side] = ( + y + endpoint["target_source_l1"] * x + endpoint["target_helper_l1"] * h) + counts["local_" + direction] += 1 + seen_stages.append(stage) + entry.update(kind="local", stage=stage, direction=direction, + source_input=x, target_input=y, hosted_helper_input=h, + maximizing_block=maximizing_block, prefix_upper=prefix) + local_checkpoints.append({"stage": stage, "prefix_upper_bits": maximum.bit_length()}) + elif op == "unchanged idle child": + require(0 <= event["pair"] < 4 and + event["rank"] == 7 * (event["target_level"] - event["source_level"]), + "idle chart rank") + counts["isometric_idle_events"] += 1 + entry.update(kind="assumed isometric idle endpoint", rank=event["rank"]) + elif event.get("kind") == "bridge": + d, s = event["dst"], event["src"] + coefficient = event["coefficient"] + require(0 <= d < 4 and 0 <= s < 4 and d != s and coefficient in (-1, 1), + "bridge schema") + bank[d][0] += abs(coefficient) * bank[s][0] + bank[s][1] += abs(coefficient) * bank[d][1] + maximum = max(maximum, *(v for pair in bank for v in pair)) + counts["scalar_bridge_shears"] += 2 + entry.update(kind="two scalar bank shears", coefficient=coefficient) + elif event.get("kind") == "exchange": + bank = [[y, x] for x, y in bank] + counts["exchange"] += 1 + entry.update(kind="exchange") + else: + raise ValueError("uncovered controller event: " + repr(event)) + entry.update(after=[list(pair) for pair in bank], running_prefix_upper=maximum) + transcript.append(entry) + require(len(ordered) == 56 and seen_stages == list(range(9)), "full ordered controller") + require(counts == Counter(forward_code=35, inverse_code=28, local_forward=5, + local_inverse=4, scalar_bridge_shears=18, + isometric_idle_events=10, exchange=1), "all controller counts") + pf, pr = [source[d]["exact_prefix_l1"] for d in directions] + lf, lr = [local[d]["exact_prefix_l1"] for d in directions] + crude = (1 << 18) * lf**5 * lr**4 * pf**35 * pr**28 + require(maximum <= crude, "block-aware bound below full factor product") + decode_factor = pf**4 * pr**5 + terminal = maximum * decode_factor + return { + "counts": dict(counts), + "controller_event_count": len(ordered), + "sweep_instantiation": source["integer_sweep_binding"], + "ordered_scalar_growth_upper": maximum, + "ordered_scalar_growth_upper_bits": maximum.bit_length(), + "block64_reserve_bits": 64 * ((maximum.bit_length() + 63) // 64), + "crude_product_upper": crude, + "crude_product_upper_bits": crude.bit_length(), + "terminal_decode_factor_upper": decode_factor, + "with_per_bank_nine_factor_decode_upper": terminal, + "with_per_bank_nine_factor_decode_upper_bits": terminal.bit_length(), + "terminal_block64_reserve_bits": 64 * ((terminal.bit_length() + 63) // 64), + "local_stage_checkpoints": local_checkpoints, + "full_ordered_recurrence": transcript, + "full_ordered_recurrence_sha256": digest(transcript), + } + + +def row_adjoint_coefficients(events, output, mutation=None): + """Scalar dual recurrence; independent of the sparse-column implementation.""" + row = [0] * DIM + row[output] = 1 + coefficients = [0] * len(events) + for i in range(len(events) - 1, -1, -1): + op, dst, src, c, rank, original = events[i] + coefficients[i] = row[dst] + if op == "add": + if mutation == "wrong_adjoint": + row[dst] += c * row[src] + else: + row[src] += c * row[dst] + elif op == "copy": + row[src] += row[dst] + row[dst] = 0 + elif op == "clear": + row[dst] = 0 + return coefficients + + +def impulse(events, after_event, coordinate, mutation=None): + values = [0] * DIM + values[coordinate] = 1 + suffix = events[after_event + 1:] + if mutation == "wrong_order": + suffix = list(reversed(suffix)) + return forward_values(suffix, values, mutation=mutation) + + +def suffix_row(events, before_event, output): + """One full row of M_last ... M_before_event, by scalar backward recurrence.""" + row = [0] * DIM + row[output] = 1 + for op, dst, src, c, rank, original in reversed(events[before_event:]): + if op == "add": + row[src] += c * row[dst] + elif op == "copy": + row[src] += row[dst] + row[dst] = 0 + elif op == "clear": + row[dst] = 0 + return row + + +def as_sparse(values): + return [(j, v) for j, v in enumerate(values) if v] + + +def suffix_audit(events): + # Column j is S_i e_j, where S_i consists of events strictly after i. + columns = [{j: 1} for j in range(DIM)] + row_norms = [1] * DIM + groups = Counter() + sums_max = Counter() + row_sums = {} + suffix_peak = {"before_event": len(events), "output": 0, "row_l1": 1} + peak = {"after_event": len(events) - 1, "destination": events[-1][1], + "influence": 0, "column": {}} + columns_digest = sha256() + selected_indices = {0, len(events) // 5, len(events) // 2, + 4 * len(events) // 5, len(events) - 1} + selected_indices.update(i for i, event in enumerate(events) if event[0] in ("copy", "clear")) + selected_columns = {} + influences = [0] * len(events) + for i in range(len(events) - 1, -1, -1): + op, dst, src, c, rank, original = events[i] + column = columns[dst] + influence = max((abs(v) for v in column.values()), default=0) + influences[i] = influence + categories = [op, "all_events"] + if op != "clear": + categories.append("exact_clear") + if op in ("move", "copy"): + categories += ["move_and_copy", "paid_rank_" + str(rank)] + for group in categories: + groups[group] += 1 + sums_max[group] += influence + totals = row_sums.setdefault(group, [0] * DIM) + for row, value in column.items(): + totals[row] += abs(value) + if influence > peak["influence"]: + peak = {"after_event": i, "destination": dst, + "influence": influence, "column": dict(column)} + if i in selected_indices: + selected_columns[i] = dict(column) + columns_digest.update(canonical([i, sparse_items(column)]) + b"\n") + # Exact right multiplication S <- S M_i. + if op in ("add", "copy"): + multiplier = c if op == "add" else 1 + target = columns[src] + for row, value in columns[dst].items(): + old = target.get(row, 0) + new = old + multiplier * value + row_norms[row] += abs(new) - abs(old) + if new: + target[row] = new + else: + target.pop(row, None) + if op in ("copy", "clear"): + for row, value in columns[dst].items(): + row_norms[row] -= abs(value) + columns[dst] = {} + candidate = max(row_norms) + if candidate > suffix_peak["row_l1"]: + suffix_peak = {"before_event": i, "output": row_norms.index(candidate), "row_l1": candidate} + independently_summed = [0] * DIM + for column in columns: + for row, value in column.items(): + independently_summed[row] += abs(value) + require(independently_summed == row_norms, "complete final suffix row accounting") + peak_row = suffix_row(events, suffix_peak["before_event"], suffix_peak["output"]) + require(sum(map(abs, peak_row)) == suffix_peak["row_l1"], + "independent scalar adjoint confirms maximum suffix row") + peak_row_signs = [1 if v > 0 else -1 if v < 0 else 0 for v in peak_row] + suffix_output = forward_values(events[suffix_peak["before_event"]:], peak_row_signs) + require(suffix_output[suffix_peak["output"]] == suffix_peak["row_l1"], + "maximum suffix row sign vector forward attainment") + suffix_peak.update(row_sparse=as_sparse(peak_row), + forward_attained_coordinate=suffix_output[suffix_peak["output"]]) + selected_columns[peak["after_event"]] = peak["column"] + impulses = [] + for i, expected in sorted(selected_columns.items()): + observed = impulse(events, i, events[i][1]) + require(dict(as_sparse(observed)) == expected, "forward impulse and reverse adjoint") + impulses.append({"after_event": i, "original_record": events[i][-1], + "destination": events[i][1], "influence": influences[i], + "output_sparse_sha256": digest(as_sparse(observed)), + "nonzero_outputs": len(expected)}) + peak_output = min(j for j, v in peak["column"].items() if abs(v) == peak["influence"]) + witness_coefficients = row_adjoint_coefficients(events, peak_output) + require(witness_coefficients[peak["after_event"]] == peak["column"][peak_output], + "peak scalar adjoint agrees") + wrong_coefficients = row_adjoint_coefficients(events, peak_output, "wrong_adjoint") + wrong_candidates = [i for i, e in enumerate(events) + if wrong_coefficients[i] != witness_coefficients[i]] + require(wrong_candidates, "wrong-adjoint negative control must fail") + bad_i = next((i for i in wrong_candidates if witness_coefficients[i]), wrong_candidates[0]) + direct = impulse(events, bad_i, events[bad_i][1]) + require(direct[peak_output] == witness_coefficients[bad_i] != wrong_coefficients[bad_i], + "source-specific wrong-adjoint control") + correct_peak = impulse(events, peak["after_event"], peak["destination"]) + wrong_order = impulse(events, peak["after_event"], peak["destination"], "wrong_order") + require(wrong_order != correct_peak, "source-specific reversed-order control") + copy_control = None + for i, event in enumerate(events): + if event[0] != "copy": + continue + source_coordinate = event[2] + correct = impulse(events, i - 1, source_coordinate) + ignored = impulse(events, i - 1, source_coordinate, "ignore_copy") + if correct != ignored: + output = next(j for j in range(DIM) if correct[j] != ignored[j]) + copy_control = { + "before_copy_event": i, "injected_coordinate": source_coordinate, + "output_coordinate": output, "correct": correct[output], "ignored_copy": ignored[output], + } + break + require(copy_control is not None, "source-specific ignored-COPY control") + aggregates = {} + for group, sums in sorted(row_sums.items()): + maximum = max(sums) + output = sums.index(maximum) + aggregates[group] = { + "event_count": groups[group], + "exact_linf_defect_constant": maximum, + "maximizing_output": output, + "row_sums": sums, + "loose_sum_of_event_linf_influences": sums_max[group], + } + aggregate_witnesses = {} + for group in ("all_events", "exact_clear", "move_and_copy"): + maximum = aggregates[group]["exact_linf_defect_constant"] + output = aggregates[group]["maximizing_output"] + coefficients = row_adjoint_coefficients(events, output) + admitted = [ + group == "all_events" or group == "exact_clear" and e[0] != "clear" + or group == "move_and_copy" and e[0] in ("move", "copy") + for e in events + ] + signs = [(1 if a > 0 else -1 if a < 0 else 0) if allowed else 0 + for a, allowed in zip(coefficients, admitted)] + require(sum(abs(a) for a, allowed in zip(coefficients, admitted) if allowed) == maximum, + "dual row reproduces exact aggregate") + observed = forward_values(events, [0] * DIM, impulses=signs) + require(observed[output] == maximum and max(map(abs, observed)) == maximum, + "simultaneous signed errors attain aggregate exactly") + all_positive = [int(allowed) for allowed in admitted] + positive_observed = forward_values(events, [0] * DIM, impulses=all_positive) + signed_sum = sum(a for a, allowed in zip(coefficients, admitted) if allowed) + require(positive_observed[output] == signed_sum, "all-positive error replay") + require(abs(signed_sum) < maximum, "error-sign cancellation control is strict") + aggregate_witnesses[group] = { + "output_coordinate": output, "attained": maximum, + "signed_coefficients": coefficients, + "admitted_event_mask_sha256": digest(admitted), + "attaining_error_signs": signs, + "forward_output_sparse": as_sparse(observed), + "all_positive_errors_at_same_output": signed_sum, + "strict_sign_cancellation": True, + } + peak.pop("column") + peak.update(original_record=events[peak["after_event"]][-1], output_coordinate=peak_output, + output_sparse=as_sparse(correct_peak)) + return { + "events": len(events), + "normalized_event_sha256": digest(events), + "per_event_single_destination_influences": influences, + "per_event_single_destination_influences_sha256": digest(influences), + "all_destination_columns_reverse_order_sha256": columns_digest.hexdigest(), + "maximum_suffix_row_l1": suffix_peak["row_l1"], + "maximum_suffix_row_l1_witness": suffix_peak, + "maximum_single_destination_influence": peak["influence"], + "peak_impulse_witness": peak, + "groups": aggregates, + "aggregate_attainment_witnesses": aggregate_witnesses, + "independent_forward_impulse_checks": impulses, + "negative_controls": { + "wrong_adjoint": {"after_event": bad_i, "output": peak_output, + "correct": witness_coefficients[bad_i], + "wrong": wrong_coefficients[bad_i]}, + "wrong_suffix_order": { + "after_event": peak["after_event"], + "correct_output_sha256": digest(correct_peak), + "wrong_order_output_sha256": digest(wrong_order), + "wrong_order_norm": max(map(abs, wrong_order)), + }, + "ignored_copy": copy_control, + "error_signs": "For each aggregate witness, all-positive errors strictly " + "underachieve at the maximizing output; the saved signs " + "attain the exact absolute-coefficient sum.", + }, + } + + +def compare_words(parent, candidate): + result = {} + for direction in ("forward", "inverse"): + a = parent["suffix"][direction] + b = candidate["suffix"][direction] + old = a["per_event_single_destination_influences"] + new = b["per_event_single_destination_influences"] + increased = [i for i, (x, y) in enumerate(zip(old, new)) if y > x] + decreased = [i for i, (x, y) in enumerate(zip(old, new)) if y < x] + equal = [i for i, (x, y) in enumerate(zip(old, new)) if y == x] + require(len(increased) + len(decreased) + len(equal) == 16102, "all defect comparisons") + changes = {} + for group in a["groups"]: + changes[group] = { + "parent_exact_aggregate": a["groups"][group]["exact_linf_defect_constant"], + "candidate_exact_aggregate": b["groups"][group]["exact_linf_defect_constant"], + "parent_loose_sum": a["groups"][group]["loose_sum_of_event_linf_influences"], + "candidate_loose_sum": b["groups"][group]["loose_sum_of_event_linf_influences"], + } + result[direction] = { + "increased_event_count": len(increased), + "decreased_event_count": len(decreased), + "equal_event_count": len(equal), + "increased_events_sha256": digest(increased), + "decreased_events_sha256": digest(decreased), + "first_increase": None if not increased else { + "event": increased[0], "parent": old[increased[0]], "candidate": new[increased[0]]}, + "largest_absolute_increase": None if not increased else ( + lambda i: {"event": i, "parent": old[i], "candidate": new[i]})( + max(increased, key=lambda j: new[j] - old[j])), + "group_comparison": changes, + } + return result + + +def run(parent_path, candidate_path, controller_path): + parent_obj, parent_hashes = load_word(parent_path, "parent") + candidate_obj, candidate_hashes = load_word(candidate_path, "candidate") + controller_obj, controller_hashes = read_json(controller_path) + require(controller_hashes["decoded_sha256"] == PINS["controller_decoded"], + "controller decoded source pin") + abstract_schedule = abstract_schedule_audit(controller_obj["ordered_controller"]) + parent_records, candidate_records = parent_obj["records"], candidate_obj["records"] + changed = [] + for index, (old, new) in enumerate(zip(parent_records, candidate_records)): + if old == new: + continue + require(old[:3] == new[:3] and old[4:] == new[4:] and + old[0] == 1 and old[5] == 23 and old[3] == 1 and new[3] == -1, + "only phase23 signs change") + changed.append(index) + require(len(changed) == 23, "exactly 23 changed signs") + outputs = {} + for label, records, hashes in ( + ("parent", parent_records, parent_hashes), + ("candidate", candidate_records, candidate_hashes)): + normalized = {d: events_of(records, d == "inverse") for d in ("forward", "inverse")} + ranges, rows = {}, [] + suffixes = {} + for direction in ("forward", "inverse"): + ranges[direction], endpoint = range_audit(normalized[direction]) + rows.append(endpoint) + suffixes[direction] = suffix_audit(normalized[direction]) + code = source_code_audit(records, controller_obj["inplace_code_CNOTs"], rows) + controller = controller_bound(controller_obj["ordered_controller"], ranges, code) + paid = Counter() + for op, dst, src, c, rank, phase in records: + if op == 0: + paid[rank] += 1 + elif op == 2: + paid[phase] += 1 + require(sum(rank * count for rank, count in paid.items()) == 4989, "full paid rank mass") + outputs[label] = { + "source": hashes, "record_count": len(records), "public_inputs": PUBLIC, + "helper_inputs": PUBLIC - 2 * PORTS, "private_coordinate": PRIVATE, + "opcode_counts": dict(Counter(OPNAMES[r[0]] for r in records)), + "paid_rank_counts": dict(sorted(paid.items())), + "paid_rank_mass": sum(rank * count for rank, count in paid.items()), + "range": ranges, "source_code": code, "controller": controller, + "suffix": suffixes, + } + return { + "status": "PASS_EXACT_RANGE_AND_ATOMIC_DEFECT_CONSTANTS_NO_PRECISION_ADMISSION", + "schema": "b04-range-and-atomic-defect-review-v1", + "checker_sha256": sha256(Path(__file__).read_bytes()).hexdigest(), + "controller_source": controller_hashes, + "controller_ordered_events_sha256": digest(controller_obj["ordered_controller"]), + "abstract_binary_schedule": abstract_schedule, + "changed_phase23_sign_record_indices": changed, + "parent": outputs["parent"], + "candidate": outputs["candidate"], + "comparison": compare_words(outputs["parent"], outputs["candidate"]), + "scope": { + "arithmetic": "exact unbounded integers; exact normalized atomic operations", + "norm": "maximum absolute scalar coordinate, including the private coordinate", + "defects": "independent scalar additive errors after each admitted event in its " + "single destination; MOVE is the identity in this normalized model", + "copy_extension": "COPY overwrites the private coordinate with its source; " + "ERASE assigns private zero. This noninvertible extension " + "is conditional and does not justify physical cleanup.", + "strict_cleanup": "The exact_clear aggregate sets all ERASE defects to zero; " + "actual rounded copy/zero-return still requires a separate proof.", + "controller": "Conditional on source-selected codes at admitted native charts, " + "isometric frame/owner/address maps and exact helper restoration.", + "excluded": ["native-child internal prefixes and defects", "actual rounding/tie rules", + "overflow or finite machine exponent admission", "relative error feedback", + "tape/storage/work invoice", "general sign optimality", + "global integer BIT identity", "new supplier or kappa"], + "proof_kind": "finite exhaustive integer calculation plus written all-input " + "conditional linear-algebra proof; no formal-kernel proof", + }, + } + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--parent-word", required=True) + parser.add_argument("--candidate-word", required=True) + parser.add_argument("--controller", required=True, + help="pinned JSON or gzip JSON; decoded bytes are bound") + parser.add_argument("--output", help="write deterministic JSON or .gz JSON receipt") + parser.add_argument("--verify", help="require equality with an existing JSON/.gz receipt") + args = parser.parse_args() + result = run(args.parent_word, args.candidate_word, args.controller) + if args.verify: + old, _ = read_json(args.verify) + require(canonical(old) == canonical(result), "complete deterministic receipt differs") + if args.output: + body = (json.dumps(result, sort_keys=True, indent=2) + "\n").encode() + if args.output.endswith(".gz"): + body = gzip.compress(body, mtime=0) + Path(args.output).write_bytes(body) + print(result["status"]) + for label in ("parent", "candidate"): + r = result[label] + print(label, "range", [r["range"][d]["exact_prefix_l1"] for d in ("forward", "inverse")], + "controller bits", r["controller"]["ordered_scalar_growth_upper_bits"], + "terminal bits", r["controller"]["with_per_bank_nine_factor_decode_upper_bits"]) + for d in ("forward", "inverse"): + s = r["suffix"][d] + print(" ", d, "peak impulse", s["maximum_single_destination_influence"], + "exact aggregate", s["groups"]["exact_clear"]["exact_linf_defect_constant"], + "loose sum", s["groups"]["exact_clear"]["loose_sum_of_event_linf_influences"]) + print("receipt_sha256", digest(result)) + + +if __name__ == "__main__": + try: + main() + except (ValueError, KeyError, TypeError) as error: + print("FAIL:", error, file=sys.stderr) + raise SystemExit(1) diff --git a/research/r429-signed-range/verify.py b/research/r429-signed-range/verify.py new file mode 100644 index 0000000000..d9d581477a --- /dev/null +++ b/research/r429-signed-range/verify.py @@ -0,0 +1,245 @@ +#!/usr/bin/env python3 +"""Source-bound replay of a fixed signed lift, without repeating its search. + +Ross Richardson with substantial OpenAI Codex assistance. Apache-2.0. +""" +import argparse +import ast +from collections import Counter +from fractions import Fraction +import gzip +import hashlib +import json +from pathlib import Path +import sys +import tempfile +from types import SimpleNamespace + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=False) + + +class Frozen: + def __init__(self, root): + self.root = Path(root).resolve() + self.hashes = json.loads((self.root / "FROZEN-SHA256.json").read_bytes()) + self.executed = {} + self.compared = set() + + def raw(self, name): + need(name in self.hashes, "unregistered frozen input: " + name) + data = (self.root / name).read_bytes() + need(hashlib.sha256(data).hexdigest() == self.hashes[name], + "frozen input changed: " + name) + return data + + def decoded(self, name): + data = self.raw(name) + return gzip.decompress(data) if data.startswith(b"\x1f\x8b") else data + + def data(self, name): + return json.loads(self.decoded(name)) + + def check_all(self): + for name in self.hashes: + self.raw(name) + origins = json.loads((self.root / "ORIGINS.json").read_bytes()) + for name, row in origins.items(): + if "original_sha256" in row: + need(hashlib.sha256(self.decoded(name)).hexdigest() == row["original_sha256"], + "compressed original bytes changed: " + name) + + def functions(self, name, names, globals_): + """Compile only named original definitions from authenticated bytes.""" + tree = ast.parse(self.raw(name), filename=str(self.root / name)) + nodes = [n for n in tree.body if isinstance(n, ast.FunctionDef) and n.name in names] + need(Counter(n.name for n in nodes) == Counter(names), "function selection changed") + code = compile(ast.Module(body=nodes, type_ignores=[]), str(self.root / name), + "exec", dont_inherit=True, optimize=0) + namespace = dict(globals_) + exec(code, namespace) + self.executed[name] = list(names) + return SimpleNamespace(**{name: namespace[name] for name in names}) + + def compare(self, name, value): + need(canonical(value) == canonical(self.data(name)), "complete receipt mismatch: " + name) + self.compared.add(name) + + def module(self, name): + namespace = {"__name__": "authenticated_review", "__file__": str(self.root / name)} + code = compile(self.raw(name), str(self.root / name), "exec", + dont_inherit=True, optimize=0) + exec(code, namespace) + self.executed[name] = ["complete independent checker"] + return namespace + + +def retained_functions(frozen): + cap = frozen.functions("frozen/old/bit_cap_copy_local.py", ["need", "canonical", "rank"], + {"json": json, "Q": Fraction}) + scalar = frozen.functions( + "frozen/old/bit_signed_audit.py", + ["identity", "add", "row_weights", "parity", "block_norms", "code", "global_bound"], + {"N": 660, "V": 111, "need": need, "Counter": Counter}) + prune = frozen.functions("frozen/old/bit_prune_audit.py", ["execute"], + {"need": need, "cap": cap, "scalar": scalar, "Counter": Counter}) + growth = frozen.functions("frozen/old/bit_pruned_growth.py", ["coefficients"], + {"scalar": scalar}) + scoring = frozen.functions("frozen/old/signed_quotient_search.py", ["score"], {}) + return cap, scalar, prune, growth, scoring + + +def historical(frozen): + cap, scalar, prune, growth, scoring = retained_functions(frozen) + parent = frozen.data("frozen/parent/WORD.json.gz") + candidate = frozen.data("frozen/candidate/WORD.json.gz") + raw = frozen.data("frozen/geometry/WORD.json.gz") + baseline, records = parent["records"], candidate["records"] + need(len(records) == len(baseline) == 16102, "complete literal word length") + positions = [i for i, r in enumerate(baseline) if r[0] == 1 and r[5] == 23] + need(len(positions) == 47 and all(baseline[i][3] == 1 for i in positions), + "fixed binary quotient alphabet") + signs = [records[i][3] for i in positions] + need(all(c in (-1, 1) for c in signs) and signs.count(-1) == 23, + "fixed signed witness") + changed = [r[:] for r in baseline] + for i, c in zip(positions, signs): + changed[i][3] = c + need(candidate == dict(parent, format="coded-r429-signed-quotient-variant-v1", + records=changed), "change outside declared quotient signs") + pivots = sorted({baseline[i][j] for i in positions for j in (1, 2)}) + need(len(pivots) == 9, "quotient register count") + index = {p: i for i, p in enumerate(pivots)} + gates = [(index[baseline[i][1]], index[baseline[i][2]]) for i in positions] + keep = [i for i in range(660) if i not in range(471, 480)] + need(parent["start"] == [raw["start"][i] for i in keep] + and parent["final"] == [raw["final"][i] for i in keep], "physical boundary binding") + forward, fs = prune.execute(raw, keep, records) + inverse, rs = prune.execute(raw, keep, records, True) + roundtrip, _ = prune.execute(raw, keep, records, True, forward) + need(roundtrip == scalar.identity(651), "full signed integer roundtrip") + oldforward, oldfs = prune.execute(raw, keep, baseline) + oldinverse, oldrs = prune.execute(raw, keep, baseline, True) + need(scalar.parity(forward) == scalar.parity(oldforward) + and scalar.parity(inverse) == scalar.parity(oldinverse), + "complete binary endpoints changed") + need(all(forward[i] == inverse[i] == {i: 1} for i in range(222, 651)), + "arbitrary integer helper restoration") + receipt = { + "status": "PASS_LOCAL_INTEGER_SIGN_VARIANT_SAME_F2_AND_RANK_NO_PRECISION_ADMISSION", + "parent_sha256": hashlib.sha256(frozen.raw("frozen/parent/WORD.json.gz")).hexdigest(), + "word_sha256": hashlib.sha256(frozen.raw("frozen/candidate/WORD.json.gz")).hexdigest(), + "word_canonical_sha256": hashlib.sha256(frozen.decoded("frozen/candidate/WORD.json.gz")).hexdigest(), + "original_small_score": list(scoring.score(gates, [1] * 47)), + "new_small_score": list(scoring.score(gates, signs)), + "quotient_signs": signs, "changed_gates": 23, "forward": fs, "inverse": rs, + "scope": "47fixedbinaryquotientgates only; all651integer/F2columns andhelpers. Notthepublishedword; no globalprecision/stock/controller/tape or kappa.", + } + # JSON converts histogram integer keys in the original returned value. + receipt = json.loads(json.dumps(receipt)) + frozen.compare("frozen/candidate/RESULT.json", receipt) + ordered = frozen.data("frozen/controller/WORD.json.gz")["ordered_controller"] + bounds = {} + for label, word, pair in (("parent", parent, [oldfs, oldrs]), + ("candidate", candidate, [fs, rs])): + rows, maxima, envelopes = [], [], [] + for backward in (False, True): + result, maximum, envelope = growth.coefficients(word["records"], backward) + rows.append(result) + maxima.append(maximum) + envelopes.append(envelope) + need(maxima == [r["prefix_row_l1"] for r in pair], "two retained prefix calculations disagree") + code_records, code_rows, code_prefix, code_norm = scalar.code(word["records"]) + need(len(code_records) == 1499 and rows[0][:111] == code_rows[0] + and rows[1][:111] == code_rows[1], "selected source-code interface") + bound = scalar.global_bound( + ordered, [scalar.block_norms(a) for a in rows], maxima, envelopes, + code_prefix, code_norm) + bounds[label] = { + "local_prefix": maxima, "code_prefix": code_prefix, "code_endpoint_norm": code_norm, + "whole_controller": bound, + "terminal_64_bit_reserve": 64 * ((bound["after_easy_completed_bank_decode_upper_bits"] + 63) // 64), + } + signed_growth = { + "status": "NORMALIZED_SIGN_VARIANT_GROWTH_ONLY_NO_NATIVE_CHILD_ERROR_ADMISSION", + "word_canonical_sha256": receipt["word_canonical_sha256"], + **{k: bounds["candidate"][k] for k in + ("local_prefix", "code_prefix", "code_endpoint_norm", "whole_controller")}, + } + frozen.compare("frozen/candidate/GROWTH.json", signed_growth) + return { + "status": "PASS_FIXED_SIGNED_WITNESS_AND_NORMALIZED_RANGE", + "baseline": bounds["parent"], "candidate": bounds["candidate"], + "full_signed_receipts_compared": sorted(frozen.compared), + "executed_original_functions": frozen.executed, + "search_repeated": False, + "controller_contract": "Instantiate each abstract ordered code sweep with this word's actual 1499 source ADDs or their literal inverse; legacy inplace_code_CNOTs are not the selected integer code.", + "no_precision_admission": True, + } + + +def independent(frozen, stage): + names = { + "integer": ("frozen/reviews/integer/check_integer.py", + "frozen/reviews/integer/CHECKS.json.gz"), + "range": ("frozen/reviews/range/check_range.py", + "frozen/reviews/range/CHECKS.json.gz"), + } + source, receipt = names[stage] + module = frozen.module(source) + old_argv = sys.argv + with tempfile.TemporaryDirectory(prefix="signed R429 check ") as tmp: + output = Path(tmp) / "fresh.json" + sys.argv = [str(frozen.root / source), + "--parent-word", str(frozen.root / "frozen/parent/WORD.json.gz")] + if stage == "integer": + sys.argv += [ + "--signed-word", str(frozen.root / "frozen/candidate/WORD.json.gz"), + "--raw-word", str(frozen.root / "frozen/geometry/WORD.json.gz"), + "--matrices", str(frozen.root / "frozen/geometry/MATRICES.json.gz"), + "--out", str(output)] + else: + sys.argv += [ + "--candidate-word", str(frozen.root / "frozen/candidate/WORD.json.gz"), + "--controller", str(frozen.root / "frozen/controller/WORD.json.gz"), + "--output", str(output)] + try: + module["main"]() + frozen.compare(receipt, json.loads(output.read_bytes())) + finally: + sys.argv = old_argv + return {"status": "PASS_INDEPENDENT_SIGNED_R429_" + stage.upper(), + "complete_receipt": receipt, "no_precision_admission": True} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--stage", choices=["historical", "integer", "range"], required=True) + parser.add_argument("--output", type=Path) + args = parser.parse_args() + frozen = Frozen(Path(__file__).resolve().parent) + frozen.check_all() + if args.stage == "historical": + result = historical(frozen) + frozen.compare("frozen/historical/REPLAY.json", result) + expected_receipts = {"frozen/candidate/RESULT.json", "frozen/candidate/GROWTH.json", + "frozen/historical/REPLAY.json"} + else: + result = independent(frozen, args.stage) + expected_receipts = {result["complete_receipt"]} + need(frozen.compared == expected_receipts, "incomplete receipt coverage") + frozen.check_all() + if args.output: + need(not args.output.resolve().is_relative_to(frozen.root), "output must be external") + args.output.write_text(json.dumps(result, indent=2) + "\n") + print(canonical(result)) + + +if __name__ == "__main__": + main()