From cec109b5bc1854dae75a35346f094db157851708 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 26 Oct 2026 17:09:09 +1100 Subject: [PATCH] Verify one fixed nearest-contact prerequisite on PR5678 without new kappa --- .../INPUTS.json | 28 + .../p104-nearest-contact-verification/LICENSE | 201 +++++++ .../NOMINATION.json | 43 ++ .../p104-nearest-contact-verification/NOTICE | 13 + .../PORTABLE.json | 129 +++++ .../PROOF.md | 27 + .../README.md | 46 ++ .../SOURCES.json | 87 +++ .../TASK.json | 61 +++ .../VERIFY.json | 30 ++ .../check.py | 340 ++++++++++++ .../evidence/CORE-ADAPTATION.diff | 11 + .../evidence/ORIGINAL-EXECUTION.json | 40 ++ .../evidence/ORIGINAL-REQUEST.json | 66 +++ .../evidence/POST-REVIEW.json | 71 +++ .../evidence/PUBLICATION-CONTEXT.json | 20 + .../evidence/RESULT-normal.json | 1 + .../evidence/RESULT-optimized.json | 1 + .../evidence/STATIC-REVIEW.json | 21 + .../evidence/original-check.py | 340 ++++++++++++ .../source/NOTICE | 42 ++ .../source/PROOF.md | 111 ++++ .../source/RESULT.json | 481 +++++++++++++++++ .../source/SOURCES.json | 43 ++ .../source/WITNESS.json | 501 ++++++++++++++++++ .../source/WORD-CUSTODY.json | 6 + .../source/WORD.json.gz | Bin 0 -> 120135 bytes .../source/construct.py | 147 +++++ .../source/local-grammar.py | 208 ++++++++ .../verify.py | 78 +++ 30 files changed, 3193 insertions(+) create mode 100644 research/p104-nearest-contact-verification/INPUTS.json create mode 100644 research/p104-nearest-contact-verification/LICENSE create mode 100644 research/p104-nearest-contact-verification/NOMINATION.json create mode 100644 research/p104-nearest-contact-verification/NOTICE create mode 100644 research/p104-nearest-contact-verification/PORTABLE.json create mode 100644 research/p104-nearest-contact-verification/PROOF.md create mode 100644 research/p104-nearest-contact-verification/README.md create mode 100644 research/p104-nearest-contact-verification/SOURCES.json create mode 100644 research/p104-nearest-contact-verification/TASK.json create mode 100644 research/p104-nearest-contact-verification/VERIFY.json create mode 100644 research/p104-nearest-contact-verification/check.py create mode 100644 research/p104-nearest-contact-verification/evidence/CORE-ADAPTATION.diff create mode 100644 research/p104-nearest-contact-verification/evidence/ORIGINAL-EXECUTION.json create mode 100644 research/p104-nearest-contact-verification/evidence/ORIGINAL-REQUEST.json create mode 100644 research/p104-nearest-contact-verification/evidence/POST-REVIEW.json create mode 100644 research/p104-nearest-contact-verification/evidence/PUBLICATION-CONTEXT.json create mode 100644 research/p104-nearest-contact-verification/evidence/RESULT-normal.json create mode 100644 research/p104-nearest-contact-verification/evidence/RESULT-optimized.json create mode 100644 research/p104-nearest-contact-verification/evidence/STATIC-REVIEW.json create mode 100644 research/p104-nearest-contact-verification/evidence/original-check.py create mode 100644 research/p104-nearest-contact-verification/source/NOTICE create mode 100644 research/p104-nearest-contact-verification/source/PROOF.md create mode 100644 research/p104-nearest-contact-verification/source/RESULT.json create mode 100644 research/p104-nearest-contact-verification/source/SOURCES.json create mode 100644 research/p104-nearest-contact-verification/source/WITNESS.json create mode 100644 research/p104-nearest-contact-verification/source/WORD-CUSTODY.json create mode 100644 research/p104-nearest-contact-verification/source/WORD.json.gz create mode 100644 research/p104-nearest-contact-verification/source/construct.py create mode 100644 research/p104-nearest-contact-verification/source/local-grammar.py create mode 100644 research/p104-nearest-contact-verification/verify.py diff --git a/research/p104-nearest-contact-verification/INPUTS.json b/research/p104-nearest-contact-verification/INPUTS.json new file mode 100644 index 0000000000..73f2c98d68 --- /dev/null +++ b/research/p104-nearest-contact-verification/INPUTS.json @@ -0,0 +1,28 @@ +{ + "files": { + "NOMINATION.json": "4b9d8416befd5a82e46cfdcbe90c1460f02286f6682d661d61990b3041de9483", + "source/NOTICE": "e8e0cabef6cf40d63f3cea3b6403dfd1af8727e40df03f09b2932718bcddc1b0", + "source/PROOF.md": "a599f482ec35ddf84b1ddf72da92a6edbb77b9c4eccab6ffe31fdece2419f099", + "source/RESULT.json": "ab036dc5fd6c1b19255d03007a858325a18bb7de12843687db74d85f146f5020", + "source/SOURCES.json": "d87d48095d56bdc26a2f86e05760915b2b341000e53c1f877d6348331f66dded", + "source/WITNESS.json": "0753bc9933fbb954ec79b3d054b4f60bb3ee5c97801f426d4104da5fc5bc38b3", + "source/WORD-CUSTODY.json": "da8001e3fccfdc040aa87ce4562c0883508719c509087a02cdbd79872b282964", + "source/WORD.json.gz": "b56281a67f84832198be2f2ad36d87b75244d424f1e0a6f4dda2df74f20cc08d", + "source/construct.py": "ab9b0e00e67caac137477c0b8e646ba5604d02a7a0a297c4e3fce9e20105812e", + "source/local-grammar.py": "716d01a342467f87b14d67853d8de30740f9f2fa881afe271db0df5ef8b19697" + }, + "git_blobs": { + "source/NOTICE": "fa0bd1401f5775f4351cfa23b08f3998dba6129e", + "source/PROOF.md": "77ef428c1ad8bc20690edecee92d8dd16c28ba52", + "source/RESULT.json": "d5a73ee8eceab0b4ac6850c06bca7152d3d6800e", + "source/SOURCES.json": "5c13f25a07882c22c7e5ede4f1aaa5cfc94928da", + "source/WITNESS.json": "d3554cd80f0d7534c07b76dd64eadfb228c0c8d6", + "source/construct.py": "ff4d7701fc1eaa7e31a9b937ac7f6c732c6634a9", + "source/local-grammar.py": "e72cb02dba9b68d3bd5934371b5d25a44589c482" + }, + "grammar_scope": "Authenticated declared public grammar, not archive-member or full runtime equality. No source module imported.", + "source_result": "source/RESULT.json", + "witness": "source/WITNESS.json", + "word": "source/WORD.json.gz", + "word_custody": "source/WORD-CUSTODY.json" +} diff --git a/research/p104-nearest-contact-verification/LICENSE b/research/p104-nearest-contact-verification/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/research/p104-nearest-contact-verification/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/p104-nearest-contact-verification/NOMINATION.json b/research/p104-nearest-contact-verification/NOMINATION.json new file mode 100644 index 0000000000..08cfe66f05 --- /dev/null +++ b/research/p104-nearest-contact-verification/NOMINATION.json @@ -0,0 +1,43 @@ +{ + "fixed_anchors": { + "R": { + "instruction": [ + "ADD", + 140, + 438, + "-1/2", + 794 + ] + }, + "Y": { + "instruction": [ + "ADD", + 144, + 438, + "-1/2", + 911 + ] + } + }, + "missing_anchors": { + "P": { + "required_prefix": [ + "ADD", + 144, + 140, + "1" + ] + }, + "Q": { + "required_prefix": [ + "ADD", + 144, + 140, + "-1" + ] + } + }, + "source": { + "head": "af814f6f3c477fdd13b8f04380a33cf32004966b" + } +} diff --git a/research/p104-nearest-contact-verification/NOTICE b/research/p104-nearest-contact-verification/NOTICE new file mode 100644 index 0000000000..1f04855435 --- /dev/null +++ b/research/p104-nearest-contact-verification/NOTICE @@ -0,0 +1,13 @@ +P104 fixed nearest-contact verification. Apache-2.0; see LICENSE. + +Ali Romman's public paid interior bases, block certificates, author-side +verification and released screening work are credited. Full original notices +are preserved verbatim in source/NOTICE and in the vendored source files. +The source-word, private-reuse, controller, native, compiler, precision and +analytic lineage retains all predecessor credit named there. The elementary +compensated-update identity and binary subspace methods are classical. + +Chris R (Clear1nsight)'s bounded qualification, separate static review and +portable verification packaging used substantial OpenAI Codex assistance. +The scientific core is unchanged except for its package-root assignment. +No source module is imported; no new construction or kappa is claimed. diff --git a/research/p104-nearest-contact-verification/PORTABLE.json b/research/p104-nearest-contact-verification/PORTABLE.json new file mode 100644 index 0000000000..50a1321ee5 --- /dev/null +++ b/research/p104-nearest-contact-verification/PORTABLE.json @@ -0,0 +1,129 @@ +{ + "core_adaptation": "Exactly ROOT=HERE.parents[2] becomes ROOT=HERE. All scientific logic unchanged.", + "inventory_scope": "All package payloads except this inventory and verifier, avoiding self-reference. Those are bound by root publication request and committed-byte checks.", + "original_checker_sha256": "2c747e340f4818a1064608323a877d693b5885bd58a1774e9b82315033649525", + "original_result_sha256": "18dac3a5092667ab5f5118ed6e953d65d558a8d11066e95cc728a069ec01f50f", + "payloads": { + "INPUTS.json": { + "bytes": 1764, + "sha256": "d0a54e640750d418b3be43f19128886e99678372a3c6fb26fe5379de426ae379" + }, + "LICENSE": { + "bytes": 11357, + "sha256": "c71d239df91726fc519c6eb72d318ec65820627232b2f796219e87dcf35d0ab4" + }, + "NOMINATION.json": { + "bytes": 578, + "sha256": "4b9d8416befd5a82e46cfdcbe90c1460f02286f6682d661d61990b3041de9483" + }, + "NOTICE": { + "bytes": 808, + "sha256": "5e45c5dc13a50fba74266169d9a4b5fa5d1fd95d44a4e3ed29b039bcd7cb4c9c" + }, + "PROOF.md": { + "bytes": 2725, + "sha256": "c5f2f8d3d5b2ccd59b1694c8eb604f14f861d472217928945ca3099fa71db038" + }, + "README.md": { + "bytes": 7037, + "sha256": "c08fcf008a16fc9d2b69cb80de772184de99b08dbb5ea984cec7fa78d5709b39" + }, + "SOURCES.json": { + "bytes": 5228, + "sha256": "2af14419c467a50054a4876a33509c3b83925d5680f5d143b2360be8ddcd2c48" + }, + "TASK.json": { + "bytes": 4888, + "sha256": "f2bc4526829cc31491ba61df0bac7815d60fa3a4e42922ffbbdbab571426b419" + }, + "VERIFY.json": { + "bytes": 1081, + "sha256": "5410b0faf5219ae8aed6c0d3f569493b97f588af1b97b2a2bb6e92b86c71c0d3" + }, + "check.py": { + "bytes": 20751, + "sha256": "1218dac4b1ab3fa5d9b143b68a7398cfd2960377df3330744198e626933bf6cb" + }, + "evidence/CORE-ADAPTATION.diff": { + "bytes": 327, + "sha256": "52e4e4dab3e4bd9d8fc95a395f52cb22ae1ba2b19882b3036a082b7adda1ddf1" + }, + "evidence/ORIGINAL-EXECUTION.json": { + "bytes": 1843, + "sha256": "0c0391411d859bc23ab6cfa8d58b31c9edbb9929d6fbe0c0bd4cf624d3b0bf10" + }, + "evidence/ORIGINAL-REQUEST.json": { + "bytes": 1951, + "sha256": "42538882b3ece2d350bc37dbf1d94c95b88ab02a278ca050dced007ab75213cf" + }, + "evidence/POST-REVIEW.json": { + "bytes": 2693, + "sha256": "57fc8e72c5e2fbb27c07bdca1446f23c7aa2e234ed00671413765efde56f74f3" + }, + "evidence/PUBLICATION-CONTEXT.json": { + "bytes": 1341, + "sha256": "efa718513b94666662dc120861ab02e025607a970fc174b6240418ecd4435e38" + }, + "evidence/RESULT-normal.json": { + "bytes": 3233, + "sha256": "18dac3a5092667ab5f5118ed6e953d65d558a8d11066e95cc728a069ec01f50f" + }, + "evidence/RESULT-optimized.json": { + "bytes": 3233, + "sha256": "18dac3a5092667ab5f5118ed6e953d65d558a8d11066e95cc728a069ec01f50f" + }, + "evidence/STATIC-REVIEW.json": { + "bytes": 914, + "sha256": "4ea712eadaa501778c1ae5cbce240e04340e23227f583935ebf9198b1d2752d1" + }, + "evidence/original-check.py": { + "bytes": 20762, + "sha256": "2c747e340f4818a1064608323a877d693b5885bd58a1774e9b82315033649525" + }, + "source/NOTICE": { + "bytes": 2179, + "git_blob": "fa0bd1401f5775f4351cfa23b08f3998dba6129e", + "sha256": "e8e0cabef6cf40d63f3cea3b6403dfd1af8727e40df03f09b2932718bcddc1b0" + }, + "source/PROOF.md": { + "bytes": 5043, + "git_blob": "77ef428c1ad8bc20690edecee92d8dd16c28ba52", + "sha256": "a599f482ec35ddf84b1ddf72da92a6edbb77b9c4eccab6ffe31fdece2419f099" + }, + "source/RESULT.json": { + "bytes": 14703, + "git_blob": "d5a73ee8eceab0b4ac6850c06bca7152d3d6800e", + "sha256": "ab036dc5fd6c1b19255d03007a858325a18bb7de12843687db74d85f146f5020" + }, + "source/SOURCES.json": { + "bytes": 2028, + "git_blob": "5c13f25a07882c22c7e5ede4f1aaa5cfc94928da", + "sha256": "d87d48095d56bdc26a2f86e05760915b2b341000e53c1f877d6348331f66dded" + }, + "source/WITNESS.json": { + "bytes": 7815, + "git_blob": "d3554cd80f0d7534c07b76dd64eadfb228c0c8d6", + "sha256": "0753bc9933fbb954ec79b3d054b4f60bb3ee5c97801f426d4104da5fc5bc38b3" + }, + "source/WORD-CUSTODY.json": { + "bytes": 214, + "sha256": "da8001e3fccfdc040aa87ce4562c0883508719c509087a02cdbd79872b282964" + }, + "source/WORD.json.gz": { + "bytes": 120135, + "git_blob": "8be2b3e1c2d02034d4579bef5d36df7761d826ff", + "sha256": "b56281a67f84832198be2f2ad36d87b75244d424f1e0a6f4dda2df74f20cc08d" + }, + "source/construct.py": { + "bytes": 5439, + "git_blob": "ff4d7701fc1eaa7e31a9b937ac7f6c732c6634a9", + "sha256": "ab9b0e00e67caac137477c0b8e646ba5604d02a7a0a297c4e3fce9e20105812e" + }, + "source/local-grammar.py": { + "bytes": 9392, + "git_blob": "e72cb02dba9b68d3bd5934371b5d25a44589c482", + "sha256": "716d01a342467f87b14d67853d8de30740f9f2fa881afe271db0df5ef8b19697" + } + }, + "schema": "pr5678-nearest-public-payloads/v1" +} diff --git a/research/p104-nearest-contact-verification/PROOF.md b/research/p104-nearest-contact-verification/PROOF.md new file mode 100644 index 0000000000..8950c5edcd --- /dev/null +++ b/research/p104-nearest-contact-verification/PROOF.md @@ -0,0 +1,27 @@ +# The fixed nearest-contact predicate fails + +The public basis construction in Ali Romman's [PR #5678](https://github.com/CrocSwap/integer-mult-bounds/pull/5678), head `af814f6f3c477fdd13b8f04380a33cf32004966b`, supplies the certified scalar anchors + +$$R:\;140\mathrel{+}=-\tfrac12\,438\quad\text{at frame }794,$$ +$$Y:\;144\mathrel{+}=-\tfrac12\,438\quad\text{at frame }911.$$ + +One fixed proposed prerequisite asked whether the two immediately preceding complete semantic contacts of 144 before Y were exactly + +$$P:\;144\mathrel{+}=140,\qquad Q:\;144\mathrel{+}=-140,$$ + +with $P=n,'Public lifetime operation is unsupported/source failure');frame(e[2]) + else: + frame(e[-1]);need(isinstance(e[-2],str) and len(e[-2])<=128,'Bounded exact scalar coefficient') + q=Q(e[-2]);need(q and q.numerator.bit_length()<=256 and q.denominator.bit_length()<=256 and + q.denominator&(q.denominator-1)==0 and abs(q)+1<2**16,'Bounded nonzero dyadic scalar') + if op=='SCALE':need(abs(q.numerator)&(abs(q.numerator)-1)==0,'Dyadic unit SCALE') + else: + need(isint(e[2]) and 0<=e[2]=n,'Public COPY is not the declared grammar') + + +def validate(word,receipt): + need(isinstance(word,dict) and word.get('schema')=='p104-paid-interior-bases/1','Exact emitted source schema') + n,owned=word.get('public'),word.get('owned_fields') + need(n==743 and isint(n) and owned==9 and isint(owned),'Retained public/owned counts') + frames=word.get('frames');need(isinstance(frames,list) and 912<=len(frames)<=4096,'Bounded frame table') + need(all(isinstance(b,list) and len(b)<=9 for b in frames),'Nine-axis frame cap') + spaces=[reduced_basis(b) for b in frames] + need([len(spaces[f]) for f in (794,911,127)]==[6,7,9] and strict(spaces[794],spaces[911]) and strict(spaces[911],spaces[127]),'Published high-pair ordered strict frame chain') + for name in ('initial','final'): + need(isinstance(word.get(name),list) and len(word[name])==n and all(isint(f) and 0<=f=n or (op in ('ADD','COPY') and e[2]>=n):protected.append(e) + if op=='MOVE': + need(current[r]==e[2] and e[4] is (r>=n),'Exact MOVE source/ownership chronology') + need(strict(spaces[e[3]],spaces[e[2]]) if r>=n else strict(spaces[e[2]],spaces[e[3]]),'Typed old MOVE nesting') + current[r]=e[3];continue + semantic.append({'event':i,'instruction':e}) + if op=='INIT': + need(current[r] is None,'Fresh owned lifetime');current[r]=e[2];zero[r-n]=True;life+=1 + peak=max(peak,sum(f is not None for f in current[n:])) + elif op=='CLEAR': + need(current[r]==e[2] and zero[r-n] is not None,'Active owned CLEAR chart');current[r]=None;zero[r-n]=None + else: + need(all(current[a]==e[-1] for a in roles(e)),'Every scalar operand has its declared actual common chart') + if op=='COPY': + need(zero[r-n] is True,'COPY destination proven zero by conservative lifetime bookkeeping') + zero[r-n]=zero[e[2]-n] if e[2]>=n else False + elif op=='ADD' and r>=n: + if e[2]=n,'Public lifetime operation is unsupported/source failure');frame(e[2]) + else: + frame(e[-1]);need(isinstance(e[-2],str) and len(e[-2])<=128,'Bounded exact scalar coefficient') + q=Q(e[-2]);need(q and q.numerator.bit_length()<=256 and q.denominator.bit_length()<=256 and + q.denominator&(q.denominator-1)==0 and abs(q)+1<2**16,'Bounded nonzero dyadic scalar') + if op=='SCALE':need(abs(q.numerator)&(abs(q.numerator)-1)==0,'Dyadic unit SCALE') + else: + need(isint(e[2]) and 0<=e[2]=n,'Public COPY is not the declared grammar') + + +def validate(word,receipt): + need(isinstance(word,dict) and word.get('schema')=='p104-paid-interior-bases/1','Exact emitted source schema') + n,owned=word.get('public'),word.get('owned_fields') + need(n==743 and isint(n) and owned==9 and isint(owned),'Retained public/owned counts') + frames=word.get('frames');need(isinstance(frames,list) and 912<=len(frames)<=4096,'Bounded frame table') + need(all(isinstance(b,list) and len(b)<=9 for b in frames),'Nine-axis frame cap') + spaces=[reduced_basis(b) for b in frames] + need([len(spaces[f]) for f in (794,911,127)]==[6,7,9] and strict(spaces[794],spaces[911]) and strict(spaces[911],spaces[127]),'Published high-pair ordered strict frame chain') + for name in ('initial','final'): + need(isinstance(word.get(name),list) and len(word[name])==n and all(isint(f) and 0<=f=n or (op in ('ADD','COPY') and e[2]>=n):protected.append(e) + if op=='MOVE': + need(current[r]==e[2] and e[4] is (r>=n),'Exact MOVE source/ownership chronology') + need(strict(spaces[e[3]],spaces[e[2]]) if r>=n else strict(spaces[e[2]],spaces[e[3]]),'Typed old MOVE nesting') + current[r]=e[3];continue + semantic.append({'event':i,'instruction':e}) + if op=='INIT': + need(current[r] is None,'Fresh owned lifetime');current[r]=e[2];zero[r-n]=True;life+=1 + peak=max(peak,sum(f is not None for f in current[n:])) + elif op=='CLEAR': + need(current[r]==e[2] and zero[r-n] is not None,'Active owned CLEAR chart');current[r]=None;zero[r-n]=None + else: + need(all(current[a]==e[-1] for a in roles(e)),'Every scalar operand has its declared actual common chart') + if op=='COPY': + need(zero[r-n] is True,'COPY destination proven zero by conservative lifetime bookkeeping') + zero[r-n]=zero[e[2]-n] if e[2]>=n else False + elif op=='ADD' and r>=n: + if e[2]3^t` and `2>2^t`. Thus the complete signed +moment increases by `18 * (7 - 2*2^t - 3^t) > 0` throughout that interval. +The new bill has 66,402 paid calls and rank surplus 760. The local paid rank +mass remains 5,986; the helper rank mass remains 4,266. Their difference is +the 1,664 main progress plus 56 owned descent debt. + +Two rational interval engines verify the full moment and put its unique +raw crossing in `(0.00310815850980, 0.00310815850981)`. The claim is +`0.00310815849`, and the tested saving is `0.003108158495`. + +All scalar changes are priced. The local scalar allowance is 220,290 and +the route allowance is 5,167,000. The retained complete raw ordinary bound +is 184,647,552, below its 1,000,000,000 budget. The power-1024 compiler, +cutoff 17, floor 18, tail parameter 1/5, reserve 10^-12 and decay 39/40 are +unchanged. All 54 strict and four functional outer conditions pass. + +## 5. Verification limits + +The full source archive is authenticated before any retained module is +loaded. The nested predecessor archive is authenticated again before its +local or native checker is loaded. The new checker verifies the source +word and every intermediate complete word. Its separate dense transpose +engine checks 565,504 entries. + +False basis signs, false block coefficients, a missing block certificate, +a missing native transport, a missing owned erasure, an unpaid query and +extra target credit are rejected. The inherited phase, caller and price +controls also run. + +The huge uniform word and rounded multiplier are algorithm-defined and +are not materialized. These are author checks, not independent scientific +acceptance or a proof-kernel theorem. The numerical improvement is small. +No large gain or global optimum is established. diff --git a/research/p104-nearest-contact-verification/source/RESULT.json b/research/p104-nearest-contact-verification/source/RESULT.json new file mode 100644 index 0000000000..d5a73ee8ec --- /dev/null +++ b/research/p104-nearest-contact-verification/source/RESULT.json @@ -0,0 +1,481 @@ +{ + "authenticated_nested_files": 36, + "authenticated_outer_files": 23, + "complete_cost": { + "compiler": { + "H": 80511200000000000, + "N": "2^80511200000000000", + "eta": { + "lower": "0.000000131687557081252595606387", + "upper": "0.000000131687557081252595606388" + }, + "gap": "1/1400000000000", + "integer_test_exponent": 57508, + "logarithm_power": 1024, + "theta": "63/64", + "uniform_saving": "1087855473/350000000000", + "word_materialized": false + }, + "full_forward_calls": 18, + "gain": "34879/25000000000", + "kappa": "310815849/100000000000", + "kappa_decimal": ".00310815849", + "margin_at_previous": { + "lower": "0.338879531362370820661965404439", + "upper": "0.338879531362370820661965404440" + }, + "negative_controls": { + "old_BIT": "Rejected by outer inequalities", + "old_cutoff": "Rejected by completion-tail ratio greater than one" + }, + "nonrecursive": { + "fixed_scalar_growth_bound": "At most 2^(16*26000) before native factors; a declared constant, not an attained norm.", + "local_paid_rank_mass": 5986, + "local_routes": 5167000, + "local_scalar": 220290, + "peak_owned_fields": 2, + "raw_budget": 1000000000, + "raw_scalar_upper": 184647552, + "tensor_native_growth_bound": "Each rank-r Gaussian has row l1 norm at most 2^(rf); use local_paid_rank_mass for the whole word." + }, + "ordinary_BIT": { + "admitted": "17/5000", + "after_cover": "69/20000", + "atom": "1/250", + "before_cover": "3459/1000000", + "ordinary_saving": "8590884599/2500000000000", + "prime_rule": "odd q > 2^26*N^5 avoiding all fixed denominators and rank witnesses" + }, + "outer": { + "functional_checks": { + "actual_new_BIT_stock_sublinear": "348599999999253/350000000000000", + "fixed_halo_explicit_metadata_branch": "26950000000001/350000000000", + "new_BIT_row_stock_sublinear_in_active_group": "1395799999997009/1400000000000000", + "new_semantic_group_guard": "3/1400000000000" + }, + "margins": { + "boundary_algebraic_matrix": "6091990645995648578111/1960000000000000000000000", + "fused_gaussian": "6091990645986945734333/1960000000000000000000000", + "global_coordinate_router": "435142189/140000000000", + "group_bit_router": "609199064738694573433/196000000000000000000000", + "group_scans": "699999999999/700000000000", + "main_transform": "6091990644595648578111/1960000000000000000000000", + "microbox_face_corrections": "26950000000001/350000000000", + "polynomial_products": "1399999999999/1400000000000", + "sparse_union_movement": "802341990645995648578111/1960000000000000000000000" + }, + "parameters": { + "a": "435142189/140000000000", + "b": "4351421891/1400000000000", + "beta": "1399999999997/1400000000000", + "bit_saving": "17/5000", + "cap_xi": "1782341990644595648578111/1960000000000000000000000", + "complex_uniform_saving": "1087855473/350000000000", + "d": "1/1400000000000", + "epsilon": "1399999999999/1400000000000", + "kappa": "310815849/100000000000", + "lambda_": "398756736603/400000000000", + "lambda_prime": "1395648578111/1400000000000", + "layout": "1/1400000000000", + "q": "4351421889/1400000000000", + "r0": "1/14000000000000", + "stop": "1/1400000000000", + "tested_saving": "621631699/200000000000" + }, + "strict_checks": { + "actual_bit_above_effective": "40857811/140000000000", + "actual_logarithmic_gamma_guard": "1/1400000000000", + "actual_logarithmic_group_guard": "177658009357504351421889/980000000000000000000000", + "alpha_logarithm_absorption": "1/14000000000000", + "boundary_algebraic_matrix_above_kappa": "5595648578111/1960000000000000000000000", + "cap_above_band": "802341990644595648578111/1960000000000000000000000", + "cap_below_cell": "177658009354004351421889/1960000000000000000000000", + "cap_below_phase_cell_power": "2137658009355404351421889/1960000000000000000000000", + "complex_above_effective": "1/1400000000000", + "complex_below_one_over_32": "39398578109/1400000000000", + "complex_endpoint": "1/700000000000", + "epsilon_below_one": "1/1400000000000", + "epsilon_positive": "1399999999999/1400000000000", + "fine_prime_halo_umbrella": "7/2", + "fused_gaussian_above_kappa": "5586945734333/1960000000000000000000000", + "gaussian_above_main": "695648578111/980000000000000000000000", + "global_coordinate_router_above_kappa": "1/350000000000", + "global_gamma_power_slack": "9/14000000000000", + "group_below_dimension": "1/700000000000", + "group_bit_router_above_kappa": "698694573433/196000000000000000000000", + "group_gauge_power_slack": "177658009357434351421889/980000000000000000000000", + "group_key_fits_record": "1/700000000000", + "group_positive": "1399999999997/1400000000000", + "group_scans_above_kappa": "21807009033/21875000000", + "halo_covers_generic_inverse_radius": "5", + "improvement_over_user_baseline": "688594035400418148631/500000000000000000000000", + "lambda_above_internal": "1/2800000000000", + "lambda_above_sigma": "3/2800000000000", + "lambda_above_tau": "1/2800000000000", + "lambda_prime_above_lambda": "1/2800000000000", + "lambda_prime_above_leaf": "2795648578109/1960000000000000000000000", + "leaf_saving_above_effective": "1395648578109/1960000000000000000000000", + "main_transform_above_kappa": "4195648578111/1960000000000000000000000", + "membership_arithmetic_fits_record": "1/1400000000000", + "microbox_face_corrections_above_kappa": "53897824289059/700000000000", + "microbox_halo_volume": "110600000000003/1400000000000", + "new_complex_uniform_saving_above_b": "1/1400000000000", + "new_semantic_guard_with_C1_one": "1/1400000000000", + "polynomial_products_above_kappa": "1395648578113/1400000000000", + "positive_layout_slack": "1/1400000000000", + "q_below_effective": "1/1400000000000", + "q_below_internal": "1/1400000000000", + "q_below_leaf": "2795648578109/1960000000000000000000000", + "q_positive": "4351421889/1400000000000", + "short_record_fallback": "1395648578109/1400000000000", + "source_axis_superpolynomial": "1/1400000000000", + "sparse_union_movement_above_kappa": "796250000005595648578111/1960000000000000000000000", + "stop_below_one": "1399999999999/1400000000000", + "stop_positive": "1/1400000000000", + "strassen_integer_power_gap": "1951441519231", + "support_router_span": "3/1400000000000", + "theta_positive_polynomial_power": "2", + "union_header_fits_record": "3/1400000000000", + "union_tag_work_per_visit_fits_record": "3/1400000000000" + } + }, + "paid": { + "1": 40944, + "16": 416, + "2": 8280, + "24": 416, + "3": 8892, + "32": 416, + "4": 1638, + "40": 416, + "48": 416, + "5": 2862, + "56": 416, + "6": 396, + "64": 416, + "7": 270, + "72": 208 + }, + "paid_calls": 66402, + "previous_open_pr5660": "310676333/100000000000", + "productive_fields": 12958, + "query_shears": 15, + "rank_mass_surplus": 760, + "raw_ceiling": { + "derivative_upper": "-739773215192878821828754385468986974565929261970286747281917233/3138550867693340381917894711603833208051177722232017256448", + "interval": [ + "0", + "17/5000" + ] + }, + "raw_headroom": [ + "99/5000000000000", + "1981/100000000000000" + ], + "raw_root_interval": [ + "15540792549/5000000000000", + "310815850981/100000000000000" + ], + "relative_gain_percent": "13951600/310676333", + "strictification": { + "alpha": { + "lower": "0.999999999984953241363199004691", + "upper": "0.999999999984953241363199004692" + }, + "cutoff": 17, + "delta": { + "lower": "0.967532018342092943007295114144", + "upper": "0.967532018342092943007295114145" + }, + "floor": 18, + "gamma": { + "lower": "0.968220587948865237654067176469", + "upper": "0.968220587948865237654067176470" + }, + "normalized_paid_upper": "1048576000976562501/1048576001073741824", + "power": 1024, + "reserve": "1/1000000000000", + "tail_block": 128, + "tail_decay": "39/40", + "tail_offset": "1/5", + "tested": "621631699/200000000000" + }, + "targets": { + "1": 36, + "145": 208, + "17": 416, + "2": 72, + "25": 416, + "33": 416, + "4": 1638, + "41": 416, + "49": 416, + "5": 108, + "57": 416, + "65": 416, + "7": 90, + "73": 208, + "8": 288, + "9": 7398 + }, + "whole_idle_jobs": 3120 + }, + "limits": [ + "The five inherited assumptions and helper endpoint contract remain.", + "The huge uniform word and complete rounded multiplier are not materialized.", + "Author checks do not establish independent scientific acceptance.", + "This gain is small. The requested large gain and a global optimum remain unproved." + ], + "local": { + "endpoint_coefficients": 565504, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "owned_fields": 9, + "owned_lifetimes": 11, + "paid": { + "1": 2188, + "2": 460, + "3": 494, + "4": 91, + "5": 159, + "6": 22, + "7": 15 + }, + "paid_rank_mass": 5986, + "peak_owned_fields": 2, + "public_inputs": 743, + "real_scalar_allowance": 220290 + }, + "local_helper_delta": {}, + "local_paid_delta": { + "1": -7, + "2": 2, + "3": 1 + }, + "native": { + "distinct_maps": 2918, + "helper_normalizers": 1070, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "main_adapters": 208, + "proof": "Every signed Pauli image and exact global phase; frame induction at every positive tensor width", + "recipe_payload_sha256": "b49a78ea62c2a3bae7f5d2d0ae02900ce52bb17870d488d7959dcc4b4f867915", + "wrong_phase_rejected": true + }, + "negative_controls": { + "extra_target": "Every productive helper has a native target", + "missing_central_translation": "Rejected by the complete Laurent endpoint", + "missing_conjugated_block": "Every affected block has a certificate", + "missing_native_transport": "Scalar destination and coefficient", + "missing_owned_erasure": "All public and owned exits", + "unpaid_query": "Complete field and call counts", + "wrong_basis_sign": "Exact conjugation of the complete scalar block", + "wrong_scalar_block": "Exact conjugation of the complete scalar block" + }, + "physical_caller": { + "central_square_columns": 53248, + "full_calls": 18, + "main_targets": { + "145": 208, + "17": 416, + "25": 416, + "33": 416, + "41": 416, + "49": 416, + "57": 416, + "65": 416, + "73": 208 + }, + "new_paid_jobs": 0, + "physical_contacts": 7488, + "ports": 104, + "route_payload_sha256": "7f4f0ca768ffbc4f93dcff575592c4c67411f46b4289e45b73f715a2ad47b142", + "tensor_rule": "Factorwise native maps; scalar signs stay outside the tensor power.", + "whole_idle_jobs": { + "16": 416, + "24": 416, + "32": 416, + "40": 416, + "48": 416, + "56": 416, + "64": 416, + "72": 208 + }, + "wrapper_sites": [ + 1, + 3, + 5, + 7, + 9, + 11, + 13, + 15, + 17, + 19, + 21, + 23, + 25, + 27, + 29, + 31 + ] + }, + "separate_columns": { + "arithmetic": "Dense integer rows with binary denominators; reverse chronology", + "coefficients": 565504, + "columns": 752 + }, + "source_commit": "3b0b4f37d5005f381ed9cfcccebfbe1ab35c71aa", + "source_local": { + "endpoint_coefficients": 565504, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "owned_fields": 9, + "owned_lifetimes": 11, + "paid": { + "1": 2195, + "2": 458, + "3": 493, + "4": 91, + "5": 159, + "6": 22, + "7": 15 + }, + "paid_rank_mass": 5986, + "peak_owned_fields": 2, + "public_inputs": 743, + "real_scalar_allowance": 220220 + }, + "status": "PASS_P104_PAID_INTERIOR_BASES_KAPPA_00310815849", + "steps": [ + { + "endpoint_coefficients": 565504, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "owned_fields": 9, + "owned_lifetimes": 11, + "paid": { + "1": 2194, + "2": 457, + "3": 494, + "4": 91, + "5": 159, + "6": 22, + "7": 15 + }, + "paid_rank_mass": 5986, + "peak_owned_fields": 2, + "public_inputs": 743, + "real_scalar_allowance": 220224 + }, + { + "endpoint_coefficients": 565504, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "owned_fields": 9, + "owned_lifetimes": 11, + "paid": { + "1": 2192, + "2": 458, + "3": 494, + "4": 91, + "5": 159, + "6": 22, + "7": 15 + }, + "paid_rank_mass": 5986, + "peak_owned_fields": 2, + "public_inputs": 743, + "real_scalar_allowance": 220246 + }, + { + "endpoint_coefficients": 565504, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "owned_fields": 9, + "owned_lifetimes": 11, + "paid": { + "1": 2190, + "2": 459, + "3": 494, + "4": 91, + "5": 159, + "6": 22, + "7": 15 + }, + "paid_rank_mass": 5986, + "peak_owned_fields": 2, + "public_inputs": 743, + "real_scalar_allowance": 220268 + }, + { + "endpoint_coefficients": 565504, + "helpers": { + "1": 2, + "2": 4, + "4": 91, + "5": 6, + "7": 5, + "8": 16, + "9": 411 + }, + "owned_fields": 9, + "owned_lifetimes": 11, + "paid": { + "1": 2188, + "2": 460, + "3": 494, + "4": 91, + "5": 159, + "6": 22, + "7": 15 + }, + "paid_rank_mass": 5986, + "peak_owned_fields": 2, + "public_inputs": 743, + "real_scalar_allowance": 220290 + } + ] +} diff --git a/research/p104-nearest-contact-verification/source/SOURCES.json b/research/p104-nearest-contact-verification/source/SOURCES.json new file mode 100644 index 0000000000..5c13f25a07 --- /dev/null +++ b/research/p104-nearest-contact-verification/source/SOURCES.json @@ -0,0 +1,43 @@ +{ + "schema_version": 1, + "base_commit": "df0137efd35e11b4445734bf612bdd4c7ebc330c", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "581f8d87008354eb5b869f7ed9de1317ad837ce8", + "sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "f126dd2e2dad2b669e75d1d0d0bd05c600725602", + "sha256": "f7a48bfa2659b88378282a8eee7d9fe52cdf505594124c4d1686b58510fffd72" + }, + { + "path": "research/p104-paid-interior-bases/inputs/pr5660-source.tar", + "usage": "input", + "pin": "head:89c7e069d6b93b7802f946d01886d92970303f86:research/p104-paid-interior-bases/inputs/pr5660-source.tar", + "git_blob": "5b84cf23231082376660b7295744b64655039d8c", + "sha256": "397b1f99061f670ed904198d0458808769c0a8693394bee0d9648f1f280d88d3" + } + ], + "source_export": { + "commit": "3b0b4f37d5005f381ed9cfcccebfbe1ab35c71aa", + "files": 23, + "git_blob": "5b84cf23231082376660b7295744b64655039d8c", + "sha256": "397b1f99061f670ed904198d0458808769c0a8693394bee0d9648f1f280d88d3", + "local_path": "inputs/pr5660-source.tar", + "package": "research/p104-contact-rewrite", + "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/5660" + }, + "predecessors": { + "PR5627": "ed4dc88a09a7d201971f6603b8c2074e95dd9c32", + "PR5643": "a3ff5c628bfc8825553d62d913f3e91f75d6825f", + "PR5644": "c5871955d89bf73506fd68b0a5bf1cf2b3153c02", + "PR5650": "7916490124ac946704339a6a332bb76f06e5db5c", + "PR5651": "853192167b27d44aea0d4bc2b0d52d695fadc7c6", + "PR5660": "3b0b4f37d5005f381ed9cfcccebfbe1ab35c71aa" + }, + "attribution": "PR5660 supplies the complete input word and retains the P104, helper, scalar, native, caller and compiler source chain. Four paid interior basis changes and their exact certificates are new work by Ali Romman with substantial OpenAI Codex assistance. No subagents." +} diff --git a/research/p104-nearest-contact-verification/source/WITNESS.json b/research/p104-nearest-contact-verification/source/WITNESS.json new file mode 100644 index 0000000000..d3554cd80f --- /dev/null +++ b/research/p104-nearest-contact-verification/source/WITNESS.json @@ -0,0 +1,501 @@ +[ + { + "a": 438, + "b": 733, + "coefficient": "-4", + "start_block": 1090, + "end_block": 1314, + "entry_frame": 794, + "exit_frame": 127, + "blocks": [ + { + "index": 1090, + "before": [ + [ + "ADD", + 140, + 733, + "2", + 794 + ], + [ + "ADD", + 140, + 438, + "-1/2", + 794 + ] + ], + "after": [ + [ + "ADD", + 140, + 438, + "-1/2", + 794 + ] + ] + }, + { + "index": 1313, + "before": [ + [ + "ADD", + 160, + 451, + "-1/2", + 911 + ], + [ + "ADD", + 144, + 733, + "2", + 911 + ], + [ + "ADD", + 144, + 438, + "-1/2", + 911 + ] + ], + "after": [ + [ + "ADD", + 160, + 451, + "-1/2", + 911 + ], + [ + "ADD", + 144, + 438, + "-1/2", + 911 + ] + ] + } + ] + }, + { + "a": 119, + "b": 125, + "coefficient": "-1", + "start_block": 703, + "end_block": 705, + "entry_frame": 3, + "exit_frame": 602, + "blocks": [ + { + "index": 703, + "before": [ + [ + "ADD", + 119, + 706, + "2", + 594 + ], + [ + "ADD", + 125, + 706, + "2", + 594 + ], + [ + "ADD", + 128, + 706, + "2", + 594 + ], + [ + "ADD", + 139, + 706, + "2", + 594 + ], + [ + "ADD", + 213, + 706, + "2", + 594 + ] + ], + "after": [ + [ + "ADD", + 213, + 706, + "2", + 594 + ], + [ + "ADD", + 139, + 706, + "2", + 594 + ], + [ + "ADD", + 128, + 706, + "2", + 594 + ], + [ + "ADD", + 125, + 706, + "2", + 594 + ] + ] + }, + { + "index": 704, + "before": [ + [ + "ADD", + 119, + 708, + "-2", + 602 + ], + [ + "ADD", + 125, + 708, + "2", + 602 + ], + [ + "ADD", + 127, + 708, + "2", + 602 + ], + [ + "ADD", + 128, + 708, + "-2", + 602 + ], + [ + "ADD", + 139, + 708, + "2", + 602 + ], + [ + "ADD", + 154, + 708, + "-2", + 602 + ] + ], + "after": [ + [ + "ADD", + 119, + 125, + "1", + 602 + ], + [ + "ADD", + 119, + 708, + "-2", + 602 + ], + [ + "ADD", + 125, + 708, + "2", + 602 + ], + [ + "ADD", + 127, + 708, + "2", + 602 + ], + [ + "ADD", + 128, + 708, + "-2", + 602 + ], + [ + "ADD", + 139, + 708, + "2", + 602 + ], + [ + "ADD", + 154, + 708, + "-2", + 602 + ], + [ + "ADD", + 119, + 125, + "-1", + 602 + ] + ] + } + ] + }, + { + "a": 125, + "b": 128, + "coefficient": "-1", + "start_block": 703, + "end_block": 705, + "entry_frame": 3, + "exit_frame": 602, + "blocks": [ + { + "index": 703, + "before": [ + [ + "ADD", + 119, + 125, + "-1", + 3 + ] + ], + "after": [ + [ + "ADD", + 125, + 128, + "1", + 3 + ], + [ + "ADD", + 119, + 125, + "-1", + 3 + ], + [ + "ADD", + 125, + 128, + "-1", + 3 + ] + ] + }, + { + "index": 704, + "before": [ + [ + "ADD", + 213, + 706, + "2", + 594 + ], + [ + "ADD", + 139, + 706, + "2", + 594 + ], + [ + "ADD", + 128, + 706, + "2", + 594 + ], + [ + "ADD", + 125, + 706, + "2", + 594 + ] + ], + "after": [ + [ + "ADD", + 213, + 706, + "2", + 594 + ], + [ + "ADD", + 139, + 706, + "2", + 594 + ], + [ + "ADD", + 128, + 706, + "2", + 594 + ] + ] + } + ] + }, + { + "a": 128, + "b": 139, + "coefficient": "-1", + "start_block": 703, + "end_block": 705, + "entry_frame": 3, + "exit_frame": 602, + "blocks": [ + { + "index": 703, + "before": [ + [ + "ADD", + 125, + 128, + "-1", + 3 + ], + [ + "ADD", + 125, + 128, + "1", + 3 + ], + [ + "ADD", + 119, + 125, + "-1", + 3 + ], + [ + "ADD", + 125, + 128, + "-1", + 3 + ] + ], + "after": [ + [ + "ADD", + 128, + 139, + "1", + 3 + ], + [ + "ADD", + 125, + 128, + "-1", + 3 + ], + [ + "ADD", + 125, + 128, + "1", + 3 + ], + [ + "ADD", + 119, + 125, + "-1", + 3 + ], + [ + "ADD", + 125, + 128, + "-1", + 3 + ], + [ + "ADD", + 128, + 139, + "-1", + 3 + ] + ] + }, + { + "index": 704, + "before": [ + [ + "ADD", + 213, + 706, + "2", + 594 + ], + [ + "ADD", + 139, + 706, + "2", + 594 + ], + [ + "ADD", + 128, + 706, + "2", + 594 + ] + ], + "after": [ + [ + "ADD", + 213, + 706, + "2", + 594 + ], + [ + "ADD", + 139, + 706, + "2", + 594 + ] + ] + } + ] + } +] diff --git a/research/p104-nearest-contact-verification/source/WORD-CUSTODY.json b/research/p104-nearest-contact-verification/source/WORD-CUSTODY.json new file mode 100644 index 0000000000..31bac5c57d --- /dev/null +++ b/research/p104-nearest-contact-verification/source/WORD-CUSTODY.json @@ -0,0 +1,6 @@ +{ + "bytes": 120135, + "git_blob": "8be2b3e1c2d02034d4579bef5d36df7761d826ff", + "head": "af814f6f3c477fdd13b8f04380a33cf32004966b", + "sha256": "b56281a67f84832198be2f2ad36d87b75244d424f1e0a6f4dda2df74f20cc08d" +} diff --git a/research/p104-nearest-contact-verification/source/WORD.json.gz b/research/p104-nearest-contact-verification/source/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..8be2b3e1c2d02034d4579bef5d36df7761d826ff GIT binary patch literal 120135 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 BX9xfQ literal 0 HcmV?d00001 diff --git a/research/p104-nearest-contact-verification/source/construct.py b/research/p104-nearest-contact-verification/source/construct.py new file mode 100644 index 0000000000..ff4d7701fc --- /dev/null +++ b/research/p104-nearest-contact-verification/source/construct.py @@ -0,0 +1,147 @@ +"""Apply four checked changes of the public register basis. + +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +""" +from copy import deepcopy +from fractions import Fraction as Q +from sources import need + + +def blocks(word): + result, block, frame = [], [], None + for event in word['program']: + if event[0] == 'MOVE': + continue + if event[0] in ('INIT', 'CLEAR'): + if block: + result.append(block) + result.append([event]) + block, frame = [], None + elif frame != event[-1]: + if block: + result.append(block) + block, frame = [event], event[-1] + else: + block.append(event) + if block: + result.append(block) + return result + + +def add(dst, src, coefficient): + for column, value in tuple(src.items()): + value = dst.get(column, Q(0)) + coefficient * value + if value: + dst[column] = value + else: + dst.pop(column, None) + + +def matrix(events, roles, frame): + rows = {r: {r: Q(1)} for r in roles} + for event in events: + op, r = event[:2] + need(op in ('ADD', 'SCALE') and event[-1] == frame, + 'One ordinary scalar block at one chart') + coefficient = Q(event[-2]) + need(r in roles and coefficient != 0, 'Declared scalar destination') + if op == 'SCALE': + rows[r] = {j: coefficient * value for j, value in rows[r].items()} + else: + need(event[2] in roles and event[2] != r, 'Declared scalar source') + add(rows[r], rows[event[2]], coefficient) + return rows + + +def protected(word): + n = word['public'] + return [e for e in word['program'] if e[1] >= n + or (e[0] in ('ADD', 'COPY') and e[2] >= n)] + + +def rebuild(word, scalar): + result = deepcopy(word) + frames = word['initial'][:] + [None] * word['owned_fields'] + program = [] + + def move(r, frame): + if frames[r] != frame: + need(frames[r] is not None, 'Live transport source') + program.append(['MOVE', r, frames[r], frame, r >= word['public']]) + frames[r] = frame + + for event in scalar: + op, r = event[:2] + if op == 'INIT': + need(frames[r] is None, 'Unused owned field') + frames[r] = event[2] + elif op == 'CLEAR': + move(r, event[2]) + frames[r] = None + else: + move(r, event[-1]) + if op in ('ADD', 'COPY'): + move(event[2], event[-1]) + program.append(event[:]) + for r in range(word['public']): + move(r, word['final'][r]) + result['program'] = program + return result + + +def step(word, witness, local): + source = blocks(word) + a, b, q = witness['a'], witness['b'], Q(witness['coefficient']) + start, end = witness['start_block'], witness['end_block'] + entry, exit_frame = witness['entry_frame'], witness['exit_frame'] + need(0 <= a < word['public'] and 0 <= b < word['public'] and a != b, + 'Two distinct public fields') + need(q and q.denominator & (q.denominator - 1) == 0, 'Nonzero dyadic basis') + need(0 < start < end < len(source), 'Internal interval of scalar blocks') + need(0 <= entry < len(word['frames']) and 0 <= exit_frame < len(word['frames']), + 'Declared basis charts') + replacements = {row['index']: row for row in witness['blocks']} + need(len(replacements) == len(witness['blocks']), 'Distinct replacement blocks') + expected = set() + scalar = [] + for index, block in enumerate(source): + if index == start: + scalar.append(['ADD', a, b, str(q), entry]) + roles = {e[1] for e in block} | { + e[2] for e in block if e[0] in ('ADD', 'COPY')} + if start <= index < end and roles & {a, b}: + expected.add(index) + need(index in replacements, 'Every affected block has a certificate') + row = replacements[index] + need(block == row['before'], 'Exact preceding scalar block') + frame = block[0][-1] + roles |= {a, b} + roles |= {e[1] for e in row['after']} | { + e[2] for e in row['after'] if e[0] == 'ADD'} + original = matrix(block, roles, frame) + # R = I + q E_ab. The two operations form R M R^-1. + add(original[a], original[b], q) + for vector in original.values(): + add(vector, {b: Q(1)}, -q * vector.get(a, 0)) + need(matrix(row['after'], roles, frame) == original, + 'Exact conjugation of the complete scalar block') + scalar.extend(row['after']) + else: + scalar.extend(block) + if index + 1 == end: + scalar.append(['ADD', a, b, str(-q), exit_frame]) + need(set(replacements) == expected, 'No extra replacement certificate') + result = rebuild(word, scalar) + need(protected(result) == protected(word), 'Every owned instruction and transport stays fixed') + need(result['initial'] == word['initial'] and result['final'] == word['final'], + 'All public boundaries stay fixed') + return result, local.replay(result) + + +def construct(source, witnesses, local): + word, receipts = source, [] + for witness in witnesses: + word, receipt = step(word, witness, local) + receipts.append(receipt) + word['schema'] = 'p104-paid-interior-bases/1' + return word, receipts diff --git a/research/p104-nearest-contact-verification/source/local-grammar.py b/research/p104-nearest-contact-verification/source/local-grammar.py new file mode 100644 index 0000000000..e72cb02dba --- /dev/null +++ b/research/p104-nearest-contact-verification/source/local-grammar.py @@ -0,0 +1,208 @@ +"""Check the complete P104 word with an independent helper inventory. + +Adapted from Ali Romman's PR5544/5545. David Arias supplied the word; +Cinna Davis supplied private reuse; Gareth Davidson supplied composition. +Prepared by Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +""" +from collections import Counter +from fractions import Fraction as Q +from functools import lru_cache +from hashlib import sha256 +from pathlib import Path +import gzip +import importlib.util +import json +import sys + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parents[1] + +def need(ok, why): + if not ok: + raise ValueError(why) + +def read(path): + raw = path.read_bytes() + return json.loads(gzip.decompress(raw) if path.suffix == '.gz' else raw) + +def load(path, name): + spec = importlib.util.spec_from_file_location(name, path) + module = importlib.util.module_from_spec(spec) + sys.modules[name] = module + spec.loader.exec_module(module) + return module + +def add(dst, src, q): + for k, v in tuple(src.items()): + value = dst.get(k, 0) + q*v + if value: + dst[k] = value + else: + dst.pop(k, None) + +def span(basis): + out = {0} + for v in basis: + need(type(v) is int and 0 < v < 512 and v not in out, 'Independent binary basis') + out |= {x ^ v for x in tuple(out)} + return frozenset(out) + +def replay(w): + public = w['public'] + owned = w.get('owned_fields', 8) + need(type(owned) is int and 8 <= owned <= 9, 'Owned inventory bound') + need(type(public) is int and 735 <= public <= 750, 'Public inventory bound') + need(len(w['initial']) == len(w['final']) == public, 'Public boundary size') + need(len(w['program']) < 26000, 'Fixed operation bound') + frames = [span(x) for x in w['frames']] + rows = [{r:Q(1)} for r in range(public+owned)] + current = list(w['initial']) + [None]*owned + paid, scalar, live_owned, peak = Counter(), 0, set(), 0 + lifetimes = 0 + for e in w['program']: + op, r = e[:2] + need(0 <= r < public+owned, 'Role index') + if op == 'MOVE': + _, r, a, b, private = e + need(current[r] == a and (r in live_owned) == private, 'Transport source and ownership') + need(frames[b] < frames[a] if private else frames[a] < frames[b], 'Nested chronological transport') + paid[abs(len(w['frames'][b])-len(w['frames'][a]))] += 1 + current[r] = b + elif op == 'INIT': + need(r >= public and r not in live_owned, 'Owned initialization') + live_owned.add(r) + lifetimes += 1 + peak = max(peak, len(live_owned)) + rows[r] = {} + current[r] = e[2] + scalar += 2 + elif op == 'CLEAR': + need(r in live_owned and current[r] == e[2], 'Owned erasure at declared frame') + rows[r] = {} + current[r] = None + live_owned.remove(r) + scalar += 2 + else: + q, f = Q(e[-2]), e[-1] + need(q and current[r] == f, 'Scalar destination and coefficient') + n, d = abs(q.numerator), q.denominator + need(d & (d-1) == 0, 'Dyadic scalar coefficient') + need(abs(q)+1 < 2**16, 'Fixed scalar growth bound') + if op == 'SCALE': + need(n & (n-1) == 0, 'Dyadic unit SCALE') + rows[r] = {k:q*x for k,x in rows[r].items()} + scalar += 2*(abs(n.bit_length()-d.bit_length()) + int(q < 0)) + else: + s = e[2] + need(s != r and 0 <= s < public+owned and current[s] == f, 'Common scalar chart') + if op == 'COPY': + need(r in live_owned and not rows[r], 'COPY into cleared owned field') + rows[r] = {k:q*x for k,x in rows[s].items()} + else: + need(op == 'ADD', 'Scalar opcode') + add(rows[r], rows[s], q) + scalar += 2*(3+n.bit_length()-1+n.bit_count()+d.bit_length()-1) + need(not live_owned and 0 < peak <= 2 and current[:public] == w['final'], 'All public and owned exits') + live = set(w['live']) + for r,row in enumerate(rows): + expected = {r:Q(1)} if r < public else {} + if r-112 in live: + expected[r-112] = Q(1) + need(row == expected, 'All public and owned rows') + main = live | {r+112 for r in live} + helpers = Counter(len(w['frames'][w['final'][r]])-len(w['frames'][w['initial'][r]]) for r in range(public) if r not in main) + need(len(live) == len(w['ports']) == 104 and len(main) == 208 and min(helpers) > 0, 'Independent productive inputs') + return {'paid':dict(paid), 'helpers':dict(helpers), 'public_inputs':public, 'owned_fields':owned, 'owned_lifetimes':lifetimes, + 'peak_owned_fields':peak, 'real_scalar_allowance':scalar, 'endpoint_coefficients':(public+owned)*(public+owned), + 'paid_rank_mass':sum(r*count for r,count in paid.items())} + +def reverse_columns(w): + """Check the transpose with dense dyadic rows and the reverse chronology.""" + public = w['public'] + n = public+w.get('owned_fields', 8) + rows = [[int(i == j) for j in range(n)] for i in range(n)] + exponents = [0]*n + for e in reversed(w['program']): + op,r = e[:2] + if op == 'MOVE': + continue + if op in ('INIT','CLEAR'): + rows[r] = [0]*n + exponents[r] = 0 + continue + q = Q(e[-2]) + qe = q.denominator.bit_length()-1 + if op == 'SCALE': + rows[r] = [q.numerator*x for x in rows[r]] + exponents[r] += qe + else: + s = e[2] + level = max(exponents[s], exponents[r]+qe) + a, b = 1 << (level-exponents[s]), q.numerator << (level-exponents[r]-qe) + rows[s] = [a*x+b*y for x,y in zip(rows[s],rows[r])] + exponents[s] = level + if op == 'COPY': + rows[r] = [0]*n + exponents[r] = 0 + r = s + while exponents[r] and not any(x & 1 for x in rows[r]): + rows[r] = [x//2 for x in rows[r]] + exponents[r] -= 1 + for r,row in enumerate(rows): + expected = [0]*n + if r < public: + expected[r] = 1 << exponents[r] + if r in w['live']: + expected[r+112] = 1 << exponents[r] + need(row == expected, 'Independent dense transpose columns') + return {'columns':n, 'coefficients':n*n, 'arithmetic':'Dense integer rows with binary denominators; reverse chronology'} + +def native(w): + n = w['public'] + C = load(ROOT/'research/p104-native-channel/vendor/clifford_exact.py', 'p104_productive_clifford') + V = load(ROOT/'research/p104-native-channel/vendor/native_verify.py', 'p104_productive_gaussian') + @lru_cache(None) + def chart(i): + return C.canonical_frame(9, tuple(w['frames'][i])) + recipes = {} + def check(a,b): + if (a,b) not in recipes: + recipe,_ = C.lower_child(chart(a).adjoint().then(chart(b))) + expected = V.adjoint(V.frame(w['frames'][a],9)) + V.frame(w['frames'][b],9) + V.equal(V.recipe(recipe),expected,'Native chart change and exact global phase') + need(recipe['rank'] == abs(len(w['frames'][a])-len(w['frames'][b])), 'Native boundary rank') + recipes[a,b] = recipe + return recipes[a,b] + for e in w['program']: + if e[0] == 'MOVE': + check(e[2],e[3]) + main = set(w['live']) | {r+112 for r in w['live']} + helper_profile = Counter() + for r in range(n): + if r not in main: + helper_profile[check(w['initial'][r],w['final'][r])['rank']] += 1 + adapters = [] + for r,q in zip(w['live'],w['ports']): + need(w['frames'][w['initial'][r]] == [q], 'Literal central port') + need(span(w['frames'][w['final'][r+112]]) == frozenset(x for x in range(512) if not (x&q).bit_count()%2), 'Literal output hyperplane') + tests = [ + (C.cgate(9,q,1).adjoint().then(chart(w['initial'][r])), V.adjoint((('C',q,1),))+V.frame(w['frames'][w['initial'][r]],9)), + (chart(w['final'][r+112]).adjoint().then(C.cgate(9,q,-1).then(C.fourier(9))), V.adjoint(V.frame(w['frames'][w['final'][r+112]],9))+(('C',q,-1),)+V.fourier(9))] + for actual,expected in tests: + recipe,_ = C.lower_child(actual) + need(recipe['rank'] == 0, 'Free intrinsic main adapter') + V.equal(V.recipe(recipe),expected,'Main endpoint phase') + adapters.append(recipe) + bad = json.loads(json.dumps(next(iter(recipes.values())))) + bad['left']['phase'] = (bad['left']['phase']+1)%4 + a,b = next(iter(recipes)) + try: + V.equal(V.recipe(bad),V.adjoint(V.frame(w['frames'][a],9))+V.frame(w['frames'][b],9),'Wrong phase control') + except ValueError: + pass + else: + raise ValueError('Wrong native phase accepted') + payload = [[a,b,recipes[a,b]] for a,b in sorted(recipes)] + adapters + return {'distinct_maps':len(recipes),'main_adapters':len(adapters),'helper_normalizers':2*sum(helper_profile.values()), + 'helpers':dict(helper_profile),'recipe_payload_sha256':sha256(json.dumps(payload,sort_keys=True,separators=(',',':')).encode()).hexdigest(), + 'wrong_phase_rejected':True, 'proof':'Every signed Pauli image and exact global phase; frame induction at every positive tensor width'} diff --git a/research/p104-nearest-contact-verification/verify.py b/research/p104-nearest-contact-verification/verify.py new file mode 100644 index 0000000000..7e51f21e49 --- /dev/null +++ b/research/p104-nearest-contact-verification/verify.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 +"""Replay one fixed PR5678 nearest-contact falsifier. Apache-2.0.""" +import hashlib +import json +import os +from pathlib import Path, PurePosixPath +import subprocess +import sys +import tempfile +HERE=Path(__file__).resolve().parent +EXPECTED='18dac3a5092667ab5f5118ed6e953d65d558a8d11066e95cc728a069ec01f50f' +ORIGINAL_CORE='2c747e340f4818a1064608323a877d693b5885bd58a1774e9b82315033649525' +WORD_SHA='b56281a67f84832198be2f2ad36d87b75244d424f1e0a6f4dda2df74f20cc08d' +WORD_BLOB='8be2b3e1c2d02034d4579bef5d36df7761d826ff' + +def need(ok,message): + if not ok:raise ValueError(message) +def sha(raw):return hashlib.sha256(raw).hexdigest() +def safe(name): + p=PurePosixPath(name);need(not p.is_absolute() and '..' not in p.parts and p.as_posix()==name,'Canonical local payload path') + f=HERE + for bit in p.parts:f=f/bit;need(not f.is_symlink(),'No payload symlink') + need(f.is_file(),'Missing payload '+name);return f + +def check_bytes(raw,row): + need(len(raw)==row['bytes'] and sha(raw)==row['sha256'],'Payload size/SHA256') + if 'git_blob' in row:need(hashlib.sha1(b'blob '+str(len(raw)).encode()+b'\0'+raw).hexdigest()==row['git_blob'],'Payload Git blob') + +def rejected(action): + try:action() + except ValueError:return 'rejected' + raise ValueError('Integrity control accepted altered bytes') + +def main(): + inventory=json.loads((HERE/'PORTABLE.json').read_bytes()) + need(inventory['original_result_sha256']==EXPECTED and inventory['original_checker_sha256']==ORIGINAL_CORE,'Original evidence binding') + for name,row in inventory['payloads'].items():check_bytes(safe(name).read_bytes(),row) + old=safe('evidence/original-check.py').read_bytes();core=safe('check.py').read_bytes() + need(sha(old)==ORIGINAL_CORE and old.count(b'ROOT=HERE.parents[2]')==1 and old.replace(b'ROOT=HERE.parents[2]',b'ROOT=HERE')==core,'Exactly one ROOT adaptation; scientific core otherwise unchanged') + normal=safe('evidence/RESULT-normal.json').read_bytes() + need(sha(normal)==EXPECTED and normal==safe('evidence/RESULT-optimized.json').read_bytes(),'Entire original result pair') + word=safe('source/WORD.json.gz').read_bytes();row=inventory['payloads']['source/WORD.json.gz'] + need(row['bytes']==120135 and row['sha256']==WORD_SHA and row['git_blob']==WORD_BLOB,'Exact published compressed WORD') + controls={'corrupt_compressed_bytes':rejected(lambda:check_bytes(word[:-1]+bytes([word[-1]^1]),row)), + 'corrupt_scientific_core':rejected(lambda:check_bytes(core+b'\n',inventory['payloads']['check.py']))} + with tempfile.TemporaryDirectory(prefix='pr5678-nearest-cache-') as cache: + command=[sys.executable,'-I','-B','-X','pycache_prefix='+cache] + if sys.flags.optimize:command.append('-O' if sys.flags.optimize==1 else '-OO') + command.append(str(HERE/'check.py'));env=dict(os.environ);env.pop('PYTHONOPTIMIZE',None) + done=subprocess.run(command,cwd=HERE,env=env,capture_output=True,timeout=55,check=False) + need(done.returncode==0 and not done.stderr,'Core must complete without source/binding/resource failure') + need(sha(done.stdout)==EXPECTED,'Entire scientific result must match original SHA256, no excluded fields') + value=json.loads(done.stdout) + need(value['status']=='COMPLETED_FIXED_NEAREST_CONTACT_FALSIFIER' and value['nearest_predicate']['status']=='NEAREST_MISMATCH','Strict completed nearest-contact falsifier') + expected=[{'access':['write'],'event':13344,'instruction':['ADD',144,317,'1',356]}, + {'access':['write'],'event':13463,'instruction':['ADD',144,530,'1',1035]}] + need(value['nearest_predicate']['nearest_144_contacts']==expected,'Exact two immediately preceding semantic contacts') + bound=value['unique_published_context'] + need(bound['R']=={'event':14893,'instruction':['ADD',140,438,'-1/2',794]} and + bound['Y']=={'event':15473,'instruction':['ADD',144,438,'-1/2',911]},'Unique exact published R/Y contexts') + need(value['complete_affected_route_extraction_performed'] is False and value['candidate_paid_invoice'] is None and + value['pricing_or_numeric_powers_evaluated'] is False and value['new_kappa'] is None and + value['changed_full_word_emitted'] is False and value['other_contact_pairs_queried'] is False,'Stop before corridor/routes/prices/construction or another pair') + need('affected_role_routes' not in value and 'signed_affected_local_rank_histogram' not in value,'No conditional route branch ran') + need(value['instruction_count']==25453 and value['decompressed_hard_cap']==16777216,'Exact corpus count and original abort cap') + c=value['controls'];need(len(c)==10 and c['valid_synthetic_conditional_pattern']['outcome']=='accepted' and + c['valid_synthetic_conditional_pattern']['exact_identity'] is True and + all(v=='rejected' for k,v in c.items() if k!='valid_synthetic_conditional_pattern'),'Nine original rejections and exact positive semantic/algebra case') + print(json.dumps({'status':'PASS_PR5678_FIXED_NEAREST_CONTACT_VERIFICATION','scientific_status':value['status'], + 'source_head':value['source_head'],'complete_scientific_output_sha256':sha(done.stdout),'nearest_contacts':expected, + 'core_executions':1,'original_negative_controls_rejected':9,'original_positive_control_accepted':True, + 'portable_integrity_controls':controls,'candidate_paid_invoice':None,'new_kappa':None, + 'core_adaptation':'One ROOT assignment only; source modules never imported.'},sort_keys=True,separators=(',',':'))) + +if __name__=='__main__': + try:main() + except Exception as error: + print(json.dumps({'status':'FAIL_PR5678_NEAREST_CONTACT_REPLAY','failure':type(error).__name__+': '+str(error)},sort_keys=True,separators=(',',':')));sys.exit(1)