From 2c2b29438773f12b3bb5903723c3bb16f0dcd583 Mon Sep 17 00:00:00 2001 From: ToikY <27568617+ToikY@users.noreply.github.com> Date: Tue, 20 Oct 2026 07:44:07 -0700 Subject: [PATCH 1/3] Preserve minimal PR4200 inputs for the support audit --- .../bit-copy-support-audit/SOURCE-PINS.json | 51 +++ .../source/GEOMETRY.json.gz | Bin 0 -> 42305 bytes .../source/NOTICE.md.txt | 10 + .../source/PR4200-PROOF.md.txt | 314 ++++++++++++++++++ .../source/RELATED-WORK.md.txt | 119 +++++++ .../source/WORD.json.gz | Bin 0 -> 105171 bytes 6 files changed, 494 insertions(+) create mode 100644 research/bit-copy-support-audit/SOURCE-PINS.json create mode 100644 research/bit-copy-support-audit/source/GEOMETRY.json.gz create mode 100644 research/bit-copy-support-audit/source/NOTICE.md.txt create mode 100644 research/bit-copy-support-audit/source/PR4200-PROOF.md.txt create mode 100644 research/bit-copy-support-audit/source/RELATED-WORK.md.txt create mode 100644 research/bit-copy-support-audit/source/WORD.json.gz diff --git a/research/bit-copy-support-audit/SOURCE-PINS.json b/research/bit-copy-support-audit/SOURCE-PINS.json new file mode 100644 index 0000000000..856a38c5f6 --- /dev/null +++ b/research/bit-copy-support-audit/SOURCE-PINS.json @@ -0,0 +1,51 @@ +{ + "schema_version": 1, + "source_head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "exports": [ + { + "path": "source/WORD.json.gz", + "origin_path": "research/bit-copy-path/inputs/WORD.json.gz", + "origin_commit": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "origin_repository": "RossRichardson/integer-mult-bounds", + "git_blob": "aa9ec3c341ad87d7513b9ea6934d5253035b8d30", + "sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "bytes": 105171 + }, + { + "path": "source/GEOMETRY.json.gz", + "origin_path": "research/bit-copy-path/inputs/GEOMETRY.json.gz", + "origin_commit": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "origin_repository": "RossRichardson/integer-mult-bounds", + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "bytes": 42305 + }, + { + "path": "source/PR4200-PROOF.md.txt", + "origin_path": "research/bit-copy-path/construction/PROOF.md", + "origin_commit": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "origin_repository": "RossRichardson/integer-mult-bounds", + "git_blob": "082b804b08bea64114ff7838d66653109fb8e94d", + "sha256": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd", + "bytes": 14738 + }, + { + "path": "source/NOTICE.md.txt", + "origin_path": "research/bit-copy-path/NOTICE.md", + "origin_commit": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "origin_repository": "RossRichardson/integer-mult-bounds", + "git_blob": "67c569b8ab928d536d1d832575e7394855eb7f9c", + "sha256": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea", + "bytes": 450 + }, + { + "path": "source/RELATED-WORK.md.txt", + "origin_path": "research/bit-copy-path/RELATED-WORK.md", + "origin_commit": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "origin_repository": "RossRichardson/integer-mult-bounds", + "git_blob": "dc125ae0b5130e50555f8dd2a9e5fd1109979883", + "sha256": "6cbc0c016897e1a2b65b16b23c8ce69f8d250b7ef612211a410027a5b18b9d5d", + "bytes": 6466 + } + ] +} diff --git a/research/bit-copy-support-audit/source/GEOMETRY.json.gz b/research/bit-copy-support-audit/source/GEOMETRY.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/bit-copy-support-audit/source/NOTICE.md.txt b/research/bit-copy-support-audit/source/NOTICE.md.txt new file mode 100644 index 0000000000..67c569b8ab --- /dev/null +++ b/research/bit-copy-support-audit/source/NOTICE.md.txt @@ -0,0 +1,10 @@ +# Notice + +Prepared for Ross Richardson with substantial OpenAI Codex assistance in +mathematical derivation, implementation, exact checks, and independent +agent review. No human or formal-kernel review is claimed. + +This research contribution is provided under the repository's Apache-2.0 +license. Preserved source excerpts retain their original authorship and +provenance; see `RELATED-WORK.md`, `PREDECESSOR.json`, and the component +source manifests. diff --git a/research/bit-copy-support-audit/source/PR4200-PROOF.md.txt b/research/bit-copy-support-audit/source/PR4200-PROOF.md.txt new file mode 100644 index 0000000000..082b804b08 --- /dev/null +++ b/research/bit-copy-support-audit/source/PR4200-PROOF.md.txt @@ -0,0 +1,314 @@ +# The actual R438 centre cannot be rerouted cheaply through its postscatter suffix + +This is a source-bound obstruction, not a changed supplier. For each of the +nine actual retained totals, replacing its COPY7 by any finite family of +independent snapshots of that **same unchanged total**, delivered during the +postscatter suffix through closed nested private-frame walks, costs at least +seven query ranks, with no reduction of the corresponding unweighted paid +rank moment. This remains true with free public retiming, scalar ADDs and +final source/helper restoration. The proposed private +COPY1 / promote1 / demote1 episode is a valid local operator, but cannot +deliver the whole required centre contribution. + +The result uses exact rational frame geometry and the literal Boolean word. +It does not exclude mixed new query totals, a changed upstream factory, new +public downward queries, or another public source/target interface. It does +not improve the fixed allocation ceiling or establish a new kappa. + +## Actual word and independent inputs + +The input word has compressed SHA256 +`c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c`. +Its geometry has SHA256 +`a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022`. +They are the copied inputs named in `../PREDECESSOR.json`, whose predecessor +commit is `b4ec15cbdb017776c04b0bf369a807f2278113cd`. Code and contextual +source pins are in `SOURCES.json`. + +Order the 660 persistent decoded inputs as 111 sources, 111 arbitrary +targets, and 438 arbitrary dirty helpers. There is one private zero field. +Over F2 the original boundary is `(x,y,h) -> (x,y+x,h)`. +`acquisition_screen.py` replays all 660 independent columns, all nine actual +snapshots, and each actual ERASE equality. No helper is assumed zero. +`walk_certificate.py` additionally checks all original frame events, all +36,005 ADDs, and the complete histogram + +``` +{1:1322, 2:1342, 3:79, 4:39, 5:102, 6:11, 7:18}. +``` + +Its paid rank mass is 5,101. The nine COPY/ERASE intervals run from record +23524 through record 24068, inclusive. At those cuts the actual totals are + +``` +q_j = R_j x + h_(471+j), j=0,...,8. +``` + +Each contains exactly its own independent helper input after the zero-frame +preconditioning. The nine-by-111 matrix R, the 111-by-nine scatter matrix K, +and the nine complete snapshot rows each have binary rank nine. The complete +literal rows are retained in `WALK-CERTIFICATE.json`. + +Let `k_j` denote column j of K. Deleting the j-th original scatter changes +the decoded target by `k_j q_j`. Because `q_j` is an arbitrary input +functional, a replacement that uses only that same total must supply the +coefficient vector `k_j`, not merely match one initialized state. + +The source of `q_j` is register `471+j` at its actual hyperplane +`F_j = frame(510+j)`. The postscatter target-writing suffix is records +`[24069,25768)`. In that interval: + +- Every public MOVE is upward between nested rational frames. +- Every ADD has equal actual source and destination frames. +- There are no COPYs. +- Every retained centre's value and frame are unchanged. + +The checker also verifies that no actual target register is ever an ADD +source, so the literal scatter column `k_j` survives unchanged to the output. + +The final target frame at port p is exactly `K_p = u_p^perp`, where `u_p` +is the actual rational port vector of squared norm four. All 636 catalogue +frames are independently reconstructed over Q, and their supplied live-root +lists are checked to equal their full rational root closures. + +For every j, the roots with `k_j[p]=1` span all of Q^8. Moreover, their +orthogonal projections onto `F_j` span that seven-dimensional frame. +The certificate contains exact rank-eight pivot ports and independent +rational projected-rank checks for all nine centres. These are actual +geometry checks; no abstract rank-nine scatter argument substitutes for +them. + +## The copied-field contract and tariff + +Fix one j and write `F=F_j`, `q=q_j`. A branch copies q from unchanged F +into a private frame `G subset F`, then follows a finite sequence of nested +private MOVE edges, reads into public receivers at equal frames, and returns +to G before its guarded ERASE against the same source q. + +Write + +``` +r = 7 - dim(G), m = sum of private MOVE ranks. +``` + +The charged branch tariff is `r+m`. Every private MOVE in both directions +is included. A rank-zero same-frame copy is granted free for this lower +bound, even if a chosen concrete API does not provide it. Scalar reads, +workspace, source preparation, all public retiming and final cleanup are +also granted free. Charging any of those costs only strengthens the result. + +COPY/ERASE is the inherited exact copied-total pair. The private decoded +value is q throughout its reads, and ERASE sees its original q at G. +`../composition/` supplies the separate exact address-operator derivation +for private promotion. The old fixed private ABI's prohibition of MOVE +inside a snapshot lifetime is not used as a mathematical obstruction here. + +Different branches may copy the same q independently. The theorem does not +permit a branch to become a privately mixed new query total, borrow an +uncounted downward native query, omit its return, or erase against a +different snapshot. + +## A single closed private walk + +Let L be the intersection of every private frame visited by a branch, +including its entrance, every read frame, and its returned frame. An upward +MOVE cannot shrink the running intersection. A downward MOVE of rank d +shrinks it by at most d. Because the private walk is closed, its total +upward and downward ranks are both `m/2`. Therefore + +``` +L subset G subset F, +dim(L) >= dim(G) - m/2 = 7-r-m/2. (1) +``` + +At an ADD from the private field, the public receiver's frame contains L. +The contribution subsequently propagates only through upward public MOVEs +and equal-frame ADDs. Consequently a nonzero contribution from this branch +can reach target p only if + +``` +L subset K_p, equivalently u_p is orthogonal to L. (2) +``` + +This is a support restriction. Cancellations over F2 can remove paths or +output coefficients; they cannot create a coefficient at a target to which +no permitted path exists. Reads at G before the first MOVE or after the +return satisfy the same condition. + +If this one branch supplies all of `k_j`, its recipient roots span Q^8. +Equation (2) forces L=0, and (1) yields + +``` +r + m/2 >= 7, +r + m >= 14-r. (3) +``` + +Thus a strict reduction of the COPY rank to `r<7` requires total branch +tariff at least eight. At r=1 the complete path needs tariff at least +thirteen to supply the full `k_j`, although a rank-three local excursion +can serve a smaller set of targets. + +## Any finite number of independent copies of the same total + +For branch i, let `L_i`, `r_i`, and `m_i` be as above. A recipient root +projects onto F into + +``` +F intersect L_i^perp, +``` + +whose dimension is at most `r_i+m_i/2` by (1). The support of the total +delivered coefficient is contained in the union of the branch supports. +The span of the projections of that union therefore has dimension at +most the sum of these bounds. + +The required `k_j` recipient roots project onto a rank-seven subspace, +namely all of F. Hence + +``` +7 <= sum_i (r_i+m_i/2) <= sum_i (r_i+m_i). (4) +``` + +Direct public reads of q at unchanged F add only roots in `F^perp`; their +projections onto F are zero and do not improve (4). This proves the stated +seven-rank floor even for arbitrarily many independent same-query branches. + +The proof is over rational or real frame geometry. The decoded coefficient +calculation is over F2. No uniform assertion about every odd-characteristic +specialization of intersection dimensions is made. + +## Rank-moment consequence + +Keep the same rank-to-child conversion and the same stock and ownership +premises. For `0 <= b < 1`, define + +``` +Phi_b(r) = 64^b r^(1-b), Phi_b(0) = 0. +``` + +Let `t_l` be the positive integer paid ranks of all replacement COPYs and +private MOVEs. Equation (4) gives `sum_l t_l >= 7`. For `a=1-b` in `(0,1]`, +the function `t^a` is subadditive on the nonnegative reals: writing +`s=x+y>0`, the facts `(x/s)^a >= x/s` and `(y/s)^a >= y/s` give +`x^a+y^a >= s^a`. Repeated application and monotonicity yield + +``` +sum_l Phi_b(t_l) >= Phi_b(sum_l t_l) >= Phi_b(7). +``` + +Thus dividing the same-total path among independent branches cannot save +this paid rank moment either. All extra public retiming costs were granted +free, so pricing them cannot weaken the inequality. This does not compare +different recursive owner allocations, changed helper stock, or different +rank-to-child conversions; those remain separate obligations. + +## A concrete control: the valid rank-three episode is insufficient + +Use actual source frame510, and the final cap of port3. Their orthogonal +normals make their intersection G rank six. COPY to G has rank one; +promotion to the cap and its inverse cost one each. The episode can add q +to port3 and return exactly for ERASE. + +Port2 also belongs to `support(k_0)`, but its root has nonzero projection +onto G. Its cap does not contain G, so that same episode cannot supply the +required port2 contribution through the monotone suffix. The exact checker +verifies both facts using the actual vectors. Omitting the inverse MOVE +leaves the private field in the wrong frame for the original ERASE. + +These controls separate valid local private transport from delivery of the +complete target pattern. They do not reject the local transport identity. + +## Earlier-cut and acquisition screens + +The written postscatter theorem has no downstream COPY. Two separate finite +screens examine changes outside that premise. + +`acquisition_screen.py` deletes each of the nine original COPY episodes in +turn and permits every source-to-helper ADD at an already visited common +frame throughout literal A. Sources remain their original x throughout A; +the helper-helper network and B are fixed. An inserted acquisition +`h += x_i` contributes a computable suffix target vector. For each of the +523 required `(deleted centre, source column)` repairs, the desired missing +column lies outside the span of all such influences. The emitted dual +functional annihilates every candidate influence and detects the missing +column. Failure persists when all partial-helper restoration is granted +free. This is a complete screen of that acquisition class, not a theorem +about changed helper-helper networks or new source frame paths. + +`late_factory_screen.py` starts when each retained centre first becomes its +complete q, through the first COPY cut. The nine cut counts are +`56,49,42,35,28,21,14,8,1`, totalling 254. The eight remaining downstream +COPYs are included in each suffix influence calculation. The screen allows +a new COPY of rank at most four, reads into arbitrary public registers, +and early upward retiming within an existing MOVE after the last old-frame +use, counting COPY and ERASE source reads as uses. It grants all scalar +work, MOVE splitting and inverse cleanup free. +It rejects all 90 catalogue-frame cases. A further nine relaxations allow +a different arbitrary real frame for every receiver and cut, while +retaining the source-hyperplane and existing-next-MOVE constraints; all +nine also fail. Each rejection has an exact binary separator. + +`newcut_screen.py` records the analogous 1,700-cut B screen and its simple +separators. This finite calculation is secondary to (4). It also tests +all 301 rank-six, rank-seven and full catalogue reader frames for a fixed +promoted private reader frame: all 2,709 cases fail. Taking their completely +free union has rank 111 and permits every desired pattern. This is a useful +scope control: changing private frames can enlarge the reachable target +support. Equations (1)--(4), including the required return and every MOVE, +provide the tariff obstruction. Initial COPY rank alone does not price +that arbitrary promoted walk. + +None of the failed screens produces a candidate word. In particular no new +integer lift, inverse cleanup, positive envelope, owner invoice or physical +ABI is silently inferred from a solved scalar equation. + +## Prior work, provenance and reproducibility + +The P111 label-decoder floor 63, including arbitrary numbers of terms, is +prior work of Russell Seligmann, PR757 +`e2ec7d7e719031e8f8b8012a4ab5b20faed074ce`, and Cody Harris, PR761 +`287758702129e6cbca187356b92b311e8a1c843d`, in the PR446 Theorem C pricing +model. `research/bit-orthogonal-pair-decoders/README.md` records those +premises and credit. `direct_scatter.py` is only a separate actual-R438 +binding/corroboration: 512 unit-query subsets plus an exact forced 3x3 +minor. It does not discover a new 63 floor, and its ten-term floor is +weaker than the older P111-specific bound. + +Credit the source word's Ali Romman R438 construction, Sagar Thakrar +transport/rehosting, and DreamingOfClouds/eumemic/PR589/PR555 lineage, retained +in the parent package. The finite-branch projection argument was suggested +by the independent review agent; the root agent supplied the compact +3x3 minor for the secondary direct-scatter corroboration. The caller agent +independently derived the valid private transport law and reviewed (3). +Substantial OpenAI Codex assistance; Apache-2.0. + +From the worktree root, primary replay: + +```sh +python3 -I -B research/bit-copy-path/construction/walk_certificate.py --out /tmp/r438-walk.json +``` + +Scoped finite supplements: + +```sh +python3 -I -B research/bit-copy-path/construction/acquisition_screen.py --all --allow-partial --out /tmp/r438-acquisition.json +python3 -I -B research/bit-copy-path/construction/late_factory_screen.py --out /tmp/r438-late-factory.json +python3 -I -B research/bit-copy-path/construction/newcut_screen.py --out /tmp/r438-newcut.json +python3 -I -B research/bit-copy-path/construction/direct_scatter.py --out /tmp/r438-direct-scatter.json +``` + +Sibling modules execute only their authenticated source bytes using +`compile(..., dont_inherit=True, optimize=0)`. A cached `.pyc` is never used +for these imports. This is finite exact computation plus the written +all-branch argument above, not a formal-kernel proof. + +## Open next questions + +A construction must change a premise to evade this result: acquire a +different useful total before the fixed completed-centre window, change the +helper-helper network or source frame path, introduce and price new public +downward queries, or compose several genuinely different query totals. +The known coded-source construction changes the source endpoint and has a +separate caller/decoder obligation. No source-preserving cheaper actual +word, full compiler admission, precision improvement, or meaningful kappa +improvement is established here. diff --git a/research/bit-copy-support-audit/source/RELATED-WORK.md.txt b/research/bit-copy-support-audit/source/RELATED-WORK.md.txt new file mode 100644 index 0000000000..dc125ae0b5 --- /dev/null +++ b/research/bit-copy-support-audit/source/RELATED-WORK.md.txt @@ -0,0 +1,119 @@ +# Source attribution and the new scope + +The checkout base is `12fa8c5c844be21bfefb38a19503fbd867a11244`, +with research priority revision 7. This package continues the local +full-caller investigation at +`b4ec15cbdb017776c04b0bf369a807f2278113cd`. The exact ten-file dependency +slice is pinned in `PREDECESSOR.json`; the predecessor's full suite is +not claimed as freshly rerun here. + +## Preserved construction and caller premises + +- DreamingOfClouds's PR589 supplier and PR446 Theorem C supply the underlying + BIT word and COPY pricing model. The R438 transport, five partial rank-four + terminals, and their independent geometry checks are retained source + constructions, not discoveries here. Their word and geometry bytes are + copied without alteration. Credit Ali Romman's R438/PR1043 construction + and boundary-persistence work, Sagar Thakrar's transport/rehosting work, + and the DreamingOfClouds/eumemic/PR589/PR555 lineage retained by those sources. +- Ross Richardson's [PR3645](https://github.com/CrocSwap/integer-mult-bounds/pull/3645), + `research/bit-r438-source-code`, supplies the existing + three-pivot repair and 429-helper source-code word. Its scientific source + pin is `20ecf2891d80b5acf18d980b2164fb44ea7faa90`. The local 132-unit + saving and 72-unit owner return were already established there. +- The C511 mutable-source boundary package already distinguishes scalar + closure from physical native closure, and includes the actual order-28 + R429 code and the failed fresh-chart alignment. The frozen source + references and full E8 geometry are in `composition/inputs`. No + order-511 conclusion is transferred to the order-28 code. +- The preceding local full-caller package supplies the complete controller, + ordinary owner inventory, allocation proof, and existing chronological + comparator. Its fixed-word ceiling is not applied to a changed local + histogram. + +The present caller contribution is the actual nine-stage last-pair impulse, +the all-column endpoint audit, and the explicitly bounded paid repair +screens. The general warning about physical noncommutation is prior work. + +## Closest later interface and budget results + +The publication overlap check also inspected Ross Richardson's +[PR4033](https://github.com/CrocSwap/integer-mult-bounds/pull/4033), +[PR4039](https://github.com/CrocSwap/integer-mult-bounds/pull/4039), +[PR4051](https://github.com/CrocSwap/integer-mult-bounds/pull/4051), and +[PR4054](https://github.com/CrocSwap/integer-mult-bounds/pull/4054). They cover, +respectively, binary cold-factor/separate-reader floors, a FULL-target +interface and its caller invoice, the older C511 mutable-source interface, +and kernel encoding at actual native cuts. Their premises and results are +retained. The present main theorem instead fixes one actual completed total +and allows arbitrarily many independent snapshots with paid closed private +frame walks through the monotone continuation. None of those earlier interface +results is claimed as new here. + +Sagar Thakrar's +[PR3948](https://github.com/CrocSwap/integer-mult-bounds/pull/3948) prices +target-scale centre-sharing and BIT levers against the selected PR589 +invoice. The present planning comparisons use the explicitly reconstructed +R438/five-partial-terminal inventory and the predecessor's fractional +owner relaxation, or the separately stated full-helper coded inventory. +Their numerical thresholds belong to those different inventories and +relaxations; they do not correct or replace PR3948's fixed-invoice result. +Both analyses leave the selected complex supplier binding and establish +no new κ. + +## Prior direct-decoder floor + +Russell Seligmann's [PR757](https://github.com/CrocSwap/integer-mult-bounds/pull/757) +(head `e2ec7d7`) and Cody Harris's +[PR761](https://github.com/CrocSwap/integer-mult-bounds/pull/761) +(head `2877587`) established the P111 label-decoder floor of 63. +Joel Pulikkan / GamingPuzzled's +[PR620](https://github.com/CrocSwap/integer-mult-bounds/pull/620) +identified the pairing model and orthogonal-pair opportunities. +`research/bit-orthogonal-pair-decoders` records these premises, the +arbitrary-term floor, other punctures, and the excluded off-pattern class. +Its README is frozen in `bounds/inputs/DIRECT-FLOOR-PRIOR-README.md`. + +The present finite support and basis calculations rebind that floor to +the actual local word. They are a reproduction, not a new decoder-optimality +claim. The new budget consequence is the complete best-histogram +comparison, including returned owners, exact child moments, and its +restricted endpoint ceiling. + +## Actual query changes tested here + +The main new written argument concerns immutable same-total snapshots +following closed private frame paths during a monotone public +continuation. It does not assume one catalogue frame or one private copy. +Exact rank-eight target supports and rank-seven projected supports bind +the argument to all nine actual retained totals. + +The source-acquisition and completed-centre factory-cut screens are +different finite classes. Their exact separators include the actual +downstream scalar dependencies and COPY events. They do not establish +impossibility for altered incomplete totals or a rebuilt factory. + +The entry overlap refresh read all 308 open PRs, 2703 discussion records, +and 5234 local records, with no pagination warnings, as well as discussion +hubs 1163, 1166 and 1167. This is an overlap search, not a novelty proof: +it is not a census of closed remote PRs or every code diff. No public +research claim, discussion post, or PR was made during that original +local-only investigation. + +Before publication, a fresh snapshot on 2026-10-20 covered 314 open PRs, +3540 closed/merged PRs, 2713 discussion records and 5234 local records. +All three remote corpora reported complete pagination and no warnings. +The search included titles, bodies, discussion replies and local package +metadata; it did not inspect every code diff or establish global novelty. +The canonical discussion and submission record are linked from the PR. + +## Evidence boundaries + +The finite independent implementation uses separate binary state and +rational arithmetic code. The continuous frame result is a written +linear-algebra proof checked by separate agents, not a formal-kernel +certificate or independent human review. There is no new physical +compiler, rounded supplier admission, whole-owner construction, or joint +κ claim. + +Apache-2.0. Substantial OpenAI Codex assistance. diff --git a/research/bit-copy-support-audit/source/WORD.json.gz b/research/bit-copy-support-audit/source/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..aa9ec3c341ad87d7513b9ea6934d5253035b8d30 GIT binary patch literal 105171 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 H`HlYziN5}> literal 0 HcmV?d00001 From e77cea5e7998b20fc7126019bd8368d7989fdb33 Mon Sep 17 00:00:00 2001 From: ToikY <27568617+ToikY@users.noreply.github.com> Date: Tue, 20 Oct 2026 07:44:59 -0700 Subject: [PATCH 2/3] Audit BIT COPY support propagation with paired executions --- .../FRAME-RANK-CROSS.json | 26 + .../INDEPENDENT-REVIEW.json | 112 +++ .../INDEPENDENT-REVIEW.md | 21 + .../bit-copy-support-audit/ORACLE-NOTES.txt | 63 ++ .../ORACLE-PROVENANCE.json | 31 + .../bit-copy-support-audit/ORACLE-RESULT.json | 363 ++++++++ .../PACKAGE-REVIEW.json | 88 ++ .../PRIMARY-REVIEW.json | 816 +++++++++++++++++ research/bit-copy-support-audit/PROOF.md | 273 ++++++ research/bit-copy-support-audit/README.md | 102 +++ research/bit-copy-support-audit/RESULT.json | 847 ++++++++++++++++++ .../REVIEW-FILE-MAP.json | 154 ++++ research/bit-copy-support-audit/SOURCES.json | 53 ++ research/bit-copy-support-audit/TASK.json | 80 ++ research/bit-copy-support-audit/VERIFY.json | 92 ++ .../frame_rank_cross.py | 59 ++ .../independent_oracle.py | 271 ++++++ .../bit-copy-support-audit/source_check.py | 232 +++++ 18 files changed, 3683 insertions(+) create mode 100644 research/bit-copy-support-audit/FRAME-RANK-CROSS.json create mode 100644 research/bit-copy-support-audit/INDEPENDENT-REVIEW.json create mode 100644 research/bit-copy-support-audit/INDEPENDENT-REVIEW.md create mode 100644 research/bit-copy-support-audit/ORACLE-NOTES.txt create mode 100644 research/bit-copy-support-audit/ORACLE-PROVENANCE.json create mode 100644 research/bit-copy-support-audit/ORACLE-RESULT.json create mode 100644 research/bit-copy-support-audit/PACKAGE-REVIEW.json create mode 100644 research/bit-copy-support-audit/PRIMARY-REVIEW.json create mode 100644 research/bit-copy-support-audit/PROOF.md create mode 100644 research/bit-copy-support-audit/README.md create mode 100644 research/bit-copy-support-audit/RESULT.json create mode 100644 research/bit-copy-support-audit/REVIEW-FILE-MAP.json create mode 100644 research/bit-copy-support-audit/SOURCES.json create mode 100644 research/bit-copy-support-audit/TASK.json create mode 100644 research/bit-copy-support-audit/VERIFY.json create mode 100644 research/bit-copy-support-audit/frame_rank_cross.py create mode 100644 research/bit-copy-support-audit/independent_oracle.py create mode 100644 research/bit-copy-support-audit/source_check.py diff --git a/research/bit-copy-support-audit/FRAME-RANK-CROSS.json b/research/bit-copy-support-audit/FRAME-RANK-CROSS.json new file mode 100644 index 0000000000..8fd43effb6 --- /dev/null +++ b/research/bit-copy-support-audit/FRAME-RANK-CROSS.json @@ -0,0 +1,26 @@ +{ + "checked_MOVE_events": 2904, + "checked_final_cap_equalities": 111, + "checked_frame_ranks": 636, + "inputs": { + "GEOMETRY": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "WORD": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "method": "independent Fraction Gaussian elimination with forward row reduction; no producer or submitted checker import", + "rank_census": { + "0": 1, + "1": 111, + "2": 153, + "4": 70, + "6": 180, + "7": 120, + "8": 1 + }, + "scope_excludes": [ + "K/R coefficients", + "K-supported recipient projected ranks", + "decoded scalar endpoint", + "physical MOVE semantics" + ], + "status": "PASS" +} diff --git a/research/bit-copy-support-audit/INDEPENDENT-REVIEW.json b/research/bit-copy-support-audit/INDEPENDENT-REVIEW.json new file mode 100644 index 0000000000..64cd462b8f --- /dev/null +++ b/research/bit-copy-support-audit/INDEPENDENT-REVIEW.json @@ -0,0 +1,112 @@ +{ + "checked_utc": "2026-10-20T14:34:50.392487+00:00", + "cli_addendum": { + "change": "--output made optional, conditional receipt write; no mathematical or guard changes", + "final_code_sha256": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826", + "final_normal_optimized_receipts_byte_equal": true, + "prior_code_sha256": "bb9afe457a4bb61881d12ad2b1969e62666a3c87434fbeb690ced9ee59fc6c4a" + }, + "files": { + "FRAME-RANK-CROSS-V2.json": { + "bytes": 703, + "sha256": "9761d8b5fca1bbd8e0e5da956e9af47eecbcd71c7423bc531eb2e1b457f3e781" + }, + "FRAME-RANK-CROSS.json": { + "bytes": 703, + "sha256": "9761d8b5fca1bbd8e0e5da956e9af47eecbcd71c7423bc531eb2e1b457f3e781" + }, + "ORACLE-NORMAL.json": { + "bytes": 6495, + "sha256": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7" + }, + "ORACLE-OPT.json": { + "bytes": 6495, + "sha256": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7" + }, + "PROOF.md": { + "bytes": 15036, + "sha256": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5" + }, + "REVIEW.md": { + "bytes": 5087, + "sha256": "2ed386bf3e9303005402408ac89f946547fe95663c6c78ac7cd896cffc087b29" + }, + "SOURCE-NORMAL.json": { + "bytes": 10437, + "sha256": "930c7fe833fe5a8184f074a83ca03481f749ec8c5d7d9c47c2c30185cd8fad57" + }, + "SOURCE-OPT.json": { + "bytes": 10437, + "sha256": "930c7fe833fe5a8184f074a83ca03481f749ec8c5d7d9c47c2c30185cd8fad57" + }, + "SOURCE-V2-NORMAL.json": { + "bytes": 10437, + "sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270" + }, + "SOURCE-V2-OPT.json": { + "bytes": 10437, + "sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270" + }, + "frame_rank_cross.py": { + "bytes": 2803, + "sha256": "34aba82f60452cb341942f8f5577030fea4a74b804dad04e17fbae24cf08e91d" + }, + "independent_oracle.py": { + "bytes": 11887, + "sha256": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3" + }, + "oracle-NOTES.txt": { + "bytes": 4106, + "sha256": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2" + }, + "predecessor-PROOF.md": { + "bytes": 14738, + "sha256": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd" + }, + "source_check.py": { + "bytes": 10789, + "sha256": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826" + } + }, + "limits": [ + "no full root-closure reconstruction", + "no K/R or K-supported recipient/projected ranks", + "no all-660-column endpoint replay", + "no physical MOVE/compiler/caller feasibility", + "no recursive invoice or precision or full outer theorem", + "no human or formal-kernel acceptance", + "no new kappa" + ], + "outstanding_findings": [], + "predecessor_head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "resolved_findings": [ + { + "finding": "Required K-supported recipient and projected-recipient rank computations were attributed to the new checker, but it does not reconstruct K/R.", + "old_location": "PROOF.md original lines197-198", + "resolution": "Corrected proof separates all 636 frame ranks and 111 cap equalities from predecessor K-supported recipient/projected-rank evidence.", + "severity": "scope correctness" + } + ], + "reviewer": "separate OpenAI Codex agent; not human or formal-kernel acceptance", + "status": "PASS_SCOPED_AGENT_REVIEW_AFTER_SCOPE_CORRECTION", + "verification": { + "oracle_closed_walks": 1632, + "oracle_normal_exit": 0, + "oracle_optimized_exit": 0, + "oracle_receipts_byte_equal": true, + "oracle_symbolic_states": 34208, + "oracle_transitions": 317824, + "source_ADD_events": 36005, + "source_MOVE_events": 2904, + "source_cap_equalities": 111, + "source_checker_normal_exit": 0, + "source_checker_optimized_exit": 0, + "source_final_cli_no_output_optimized_exit": 0, + "source_frame_ranks": 636, + "source_receipts_byte_equal": true, + "source_records": 38927, + "third_rank_cross_exit": 0, + "tiny_closure_states": 283, + "tiny_closure_transitions": 1780 + } +} diff --git a/research/bit-copy-support-audit/INDEPENDENT-REVIEW.md b/research/bit-copy-support-audit/INDEPENDENT-REVIEW.md new file mode 100644 index 0000000000..af3edc1f57 --- /dev/null +++ b/research/bit-copy-support-audit/INDEPENDENT-REVIEW.md @@ -0,0 +1,21 @@ +# Independent scoped review + +Status: PASS after the one scope correction recorded below. This is an additional OpenAI Codex agent review, not human acceptance or a formal-kernel proof. + +Reviewed the fixed-L paired-execution induction, branch intervention/decomposition, closed nested-walk dimension inequality, finite-branch projection argument, literal-source applicability checker, and separately written finite oracle. The audited predecessor is Ross Richardson's PR4200 at `ddfc3133cbdf548e163c867d5671f8f01dd5d5ae`. + +The paired-run invariant is valid when the public schedule and frames are fixed, the compared public initial values agree, changed private injections occur only at frames containing L, and every actual data dependency preserves containment of L. Identical dirty initial values may be arbitrarily correlated. In the scalar-linear specialization, suppressing a branch's increments isolates its coefficient even when q is itself a linear functional of the dirty/public input; changing q at its ordinary source would be a different experiment. Cancellation can remove nonzero coefficients but cannot violate the invariant. Upward public MOVE and common-frame ADD are sufficient edge restrictions; the proof correctly avoids claiming they are necessary for every possible globally cancelling program. + +For a closed nested private walk, the running intersection loses at most each downward codimension, and total downward charge equals half the all-direction charge. The projected-root dimension and finite-union inequalities follow conditionally on the required recipient rank evidence. The rank-seven floor is explicitly credited to the predecessor. The relaxed downward-MOVE and unequal-frame-ADD controls violate the named restrictions; they are not bugs in the predecessor or admitted original words. + +An initial proof bullet overstated the new source check by saying it computed required K-supported recipient and projected-recipient ranks. The checker does not reconstruct K/R, so that was a real scope error. The corrected proof now explicitly leaves those ranks as predecessor evidence and states the newly executed rank checks precisely. The change is confined to that applicability/coverage wording. No unresolved correctness finding remains within the declared scope. + +Verification performed independently: + +- Source applicability checker, normal and optimized Python: both exit zero and byte-identical 10,437-byte receipts (SHA256 `080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270`). It authenticates raw WORD/GEOMETRY inputs and checks 38,927 records, including 2,904 upward MOVEs and 36,005 common-frame ADDs. The exact postscatter interval, immutable nine source registers, target non-source property, and final cap equalities are checked. The finite difference-state closure has 283 states and 1,780 transition occurrences; six nonzero-q relaxation failures and four legal double-read cancellations behave as claimed. +- Separately authored oracle, normal and optimized Python: both exit zero and byte-identical 6,495-byte receipts (SHA256 `938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7`). It checks 34,208 admissible symbolic states, 317,824 transitions, and 1,632 closed walks across two eight-frame rational families. Dirty/cancellation and named hypothesis-relaxation controls are meaningful. Runtime checks use explicit exceptions, so optimized mode retains them. +- A third, review-only Fraction Gaussian-elimination script imports neither implementation. It independently recomputes all 636 catalog-frame ranks, agrees with every submitted rank, checks all 2,904 MOVE rank differences, and establishes all 111 rank-seven root-orthogonal final cap equalities. This corroborates the new check's finite geometry, not K/R coefficients or physical MOVE semantics. + +Unreviewed obligations remain complete root closures, K/R and K-supported recipient ranks, all 660 decoded columns/full endpoint semantics, physical MOVE/compiler/caller feasibility, the recursive invoice, precision, and the full outer multiplication theorem. No selected-result or kappa improvement is established. Source credit remains with Ross Richardson and his review agent for the obstruction/projection argument and with Ali Romman, Sagar Thakrar, DreamingOfClouds/eumemic, PR589/PR555, and the retained NOTICE lineage for source word/transport. Historical decoder-floor credit is distinct and retained in the proof. + +Final CLI addendum: the source checker made `--output` optional and conditionally writes the receipt. This changes no mathematical recurrence or guard. Both final-code output modes replayed successfully, normal/optimized JSON bytes agree, and a no-output optimized invocation also passed. The previous receipt hash `930c7fe833fe5a8184f074a83ca03481f749ec8c5d7d9c47c2c30185cd8fad57` belongs to the prior CLI code and is preserved separately. The final source-checker SHA256 is `0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826`; proof SHA256 is `e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5`. diff --git a/research/bit-copy-support-audit/ORACLE-NOTES.txt b/research/bit-copy-support-audit/ORACLE-NOTES.txt new file mode 100644 index 0000000000..9d91315d67 --- /dev/null +++ b/research/bit-copy-support-audit/ORACLE-NOTES.txt @@ -0,0 +1,63 @@ +Independent support-propagation oracle +==================================== + +Scope: this interpreter was written without reading any primary implementation +or predecessor verifier. The only predecessor mathematics read was PROOF.md at +PR4200 commit ddfc3133cbdf548e163c867d5671f8f01dd5d5ae. Guidance was read from +the session checkout at canonical-main 12fa8c5c844be21bfefb38a19503fbd867a11244. + +Assumptions of the support statement: +1. A snapshot q is unchanged by reads. Geometry is over Q, coefficient algebra + over F2. Arbitrary dirty public inputs have independent formal columns. +2. L is contained in every private frame visited, including every read frame. +3. A private read adds scalar*q to a public receiver at exactly the same frame. +4. Public MOVE preserves the normalized decoded linear form and only moves to + a containing frame; public ADD uses two exactly equal current frames. +5. Operations are a fixed finite linear schedule, or one may separately apply + the argument to each fixed schedule. Arbitrary data-dependent frame choices + do not automatically have a single F2-linear matrix interpretation. + +Written induction (all dimensions/register counts; not a formal-kernel proof): +For each public register R, mark its q coefficient. Initially all marks are +zero, so the invariant 'a nonzero mark implies L <= frame(R)' holds. At a +private read, the recipient frame is the private read frame and contains L. +An upward MOVE preserves the mark and containment by transitivity. Equal-frame +ADD changes one mark by a scalar multiple of another mark, whose frame is the +same recipient frame. If the resulting mark is nonzero, at least one input +mark was nonzero and supplies the needed containment. Cancellation may remove +a mark; it cannot create a marked frame outside this set. This inductive proof +covers any finite number of private reads, public ADDs, and loops/revisits in +the fixed schedule. It does not assume zero dirty public inputs or source/helper +restoration; such constraints can restrict, but not enlarge, this support set. + +Private intersection bound: for every visited frame take the running meet. +An upward nested step cannot shrink it; a downward rank-d step shrinks its +dimension by at most d. A closed walk has equal total up/down dimension change, +so dim(L) >= dim(G) - m/2 for entrance G and all-direction rank sum m. + +Finite checks: two eight-frame lattices in Q^3, one coordinate and one generated +by a genuinely rational noncoordinate basis. For every possible L, every ordered +pair of public frames, and every pair of 3-column linear forms satisfying the +support invariant, exhaust all admissible 0/1 scalar reads, equal-frame scalar +ADDs and upward MOVE targets. Independent dirty columns range over every F2 +linear combination in these finite states. Separately enumerate every strict +nested closed private walk of zero through four edges in each family. The +five-operation cancellation loop restores both dirty inputs for all eight +concrete q/a/b assignments. Dropping either public monotonicity or frame +equality gives an explicit q coefficient in the zero frame while L is a line. +Those are counterexamples to relaxed hypotheses, not predecessor bugs. + +Remaining: no actual R438 event binding, no query-rank/paid-moment certification, +no arbitrary rational-geometry exhaustive search, no arbitrary-characteristic +specialization, no physical compiler/caller/invoice/precision/outer theorem. +The all-parameter contribution is the short written support induction above; +the finite enumeration only corroborates it and isolates its hypotheses. + +Attribution: Ross Richardson (RossRichardson), PR4200, supplies the source support argument and the +actual R438 context, with Ali Romman, Sagar Thakrar, DreamingOfClouds/eumemic, +PR589/PR555 and the retained source NOTICE lineage. This independent oracle +uses substantial OpenAI Codex assistance; Apache-2.0 repository contribution. + +Replay: +python3 -I -B independent_oracle.py --out /tmp/independent-support-result.json +python3 -I -O -W error -B independent_oracle.py --out /tmp/independent-support-result-O.json diff --git a/research/bit-copy-support-audit/ORACLE-PROVENANCE.json b/research/bit-copy-support-audit/ORACLE-PROVENANCE.json new file mode 100644 index 0000000000..cff0d4b7e2 --- /dev/null +++ b/research/bit-copy-support-audit/ORACLE-PROVENANCE.json @@ -0,0 +1,31 @@ +{ + "commands": [ + "python3 -I -B independent_oracle.py --out RESULT.json", + "python3 -I -O -W error -B independent_oracle.py --out RESULT-O.json" + ], + "file_sha256": { + "NOTES.txt": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2", + "RESULT-O.json": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "RESULT.json": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "independent_oracle.py": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3" + }, + "guards": "explicit RuntimeError; no assert in independent_oracle.py", + "normal_optimized_results_byte_identical": true, + "python": "3.12.14", + "source_head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "source_main_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "source_pr": 4200, + "source_sha256": { + "AGENTS.md": "eb25d8ec495b80190a4b1a634710819bb74f0fae88d5203285c2b75b6f147347", + "CONTRIBUTING.md": "8a49fe97e2ad088a2b2e0c5b222aaab08752783b1f9c1260790d7dd13011d215", + "autoresearch.md": "8c98d179208c34a8c6768931e13f3bbeaa1cb63d59c660799ffde05c40935d9b", + "research/bit-copy-path/construction/PROOF.md": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd" + }, + "status": "PASS", + "retained_original_to_package": { + "NOTES.txt": "ORACLE-NOTES.txt", + "RESULT.json": "ORACLE-RESULT.json", + "RESULT-O.json": "ORACLE-RESULT.json", + "independent_oracle.py": "independent_oracle.py" + } +} diff --git a/research/bit-copy-support-audit/ORACLE-RESULT.json b/research/bit-copy-support-audit/ORACLE-RESULT.json new file mode 100644 index 0000000000..0bc4f29a2f --- /dev/null +++ b/research/bit-copy-support-audit/ORACLE-RESULT.json @@ -0,0 +1,363 @@ +{ + "ambient_dimension": 3, + "coefficient_field": "F2", + "families": { + "coordinate": { + "assumption_counterexamples": { + "dirty_assignment_influence_comparisons": 8, + "downward_example": { + "frames_after": [ + 0, + 0 + ], + "frames_before": [ + 1, + 0 + ], + "rows": [ + 3, + 4 + ] + }, + "downward_move_rejected": true, + "mismatched_add_example": { + "frames": [ + 1, + 0 + ], + "rows_after": [ + 3, + 7 + ] + }, + "mismatched_add_rejected": true + }, + "cancellation": { + "all_concrete_dirty_and_q_assignments": 8, + "restores_both_arbitrary_dirty_inputs": true, + "symbolic_trace_columns_q_a_b": [ + [ + "initial", + [ + 2, + 4 + ] + ], + [ + "read q into a", + [ + 3, + 4 + ] + ], + [ + "add a into b", + [ + 3, + 7 + ] + ], + [ + "read q into a again", + [ + 2, + 7 + ] + ], + [ + "read q into b", + [ + 2, + 6 + ] + ], + [ + "add restored a into b", + [ + 2, + 4 + ] + ] + ] + }, + "frames": [ + [], + [ + [ + "1", + "0", + "0" + ] + ], + [ + [ + "0", + "1", + "0" + ] + ], + [ + [ + "1", + "0", + "0" + ], + [ + "0", + "1", + "0" + ] + ], + [ + [ + "0", + "0", + "1" + ] + ], + [ + [ + "1", + "0", + "0" + ], + [ + "0", + "0", + "1" + ] + ], + [ + [ + "0", + "1", + "0" + ], + [ + "0", + "0", + "1" + ] + ], + [ + [ + "1", + "0", + "0" + ], + [ + "0", + "1", + "0" + ], + [ + "0", + "0", + "1" + ] + ] + ], + "influence": { + "admissible_symbolic_states": 17104, + "all_transitions": 158912, + "equal_frame_add_transitions": 9280, + "equal_frame_read_transitions": 43648, + "upward_move_transitions": 105984 + }, + "walks": { + "by_edge_count": { + "0": 8, + "2": 38, + "3": 108, + "4": 662 + }, + "closed_walks": 816, + "intersection_frames_seen": 8 + } + }, + "noncoordinate_rational": { + "assumption_counterexamples": { + "dirty_assignment_influence_comparisons": 8, + "downward_example": { + "frames_after": [ + 0, + 0 + ], + "frames_before": [ + 1, + 0 + ], + "rows": [ + 3, + 4 + ] + }, + "downward_move_rejected": true, + "mismatched_add_example": { + "frames": [ + 1, + 0 + ], + "rows_after": [ + 3, + 7 + ] + }, + "mismatched_add_rejected": true + }, + "cancellation": { + "all_concrete_dirty_and_q_assignments": 8, + "restores_both_arbitrary_dirty_inputs": true, + "symbolic_trace_columns_q_a_b": [ + [ + "initial", + [ + 2, + 4 + ] + ], + [ + "read q into a", + [ + 3, + 4 + ] + ], + [ + "add a into b", + [ + 3, + 7 + ] + ], + [ + "read q into a again", + [ + 2, + 7 + ] + ], + [ + "read q into b", + [ + 2, + 6 + ] + ], + [ + "add restored a into b", + [ + 2, + 4 + ] + ] + ] + }, + "frames": [ + [], + [ + [ + "1", + "1/2", + "0" + ] + ], + [ + [ + "0", + "1", + "1/3" + ] + ], + [ + [ + "1", + "0", + "-1/6" + ], + [ + "0", + "1", + "1/3" + ] + ], + [ + [ + "1", + "0", + "5" + ] + ], + [ + [ + "1", + "0", + "5" + ], + [ + "0", + "1", + "-10" + ] + ], + [ + [ + "1", + "0", + "5" + ], + [ + "0", + "1", + "1/3" + ] + ], + [ + [ + "1", + "0", + "0" + ], + [ + "0", + "1", + "0" + ], + [ + "0", + "0", + "1" + ] + ] + ], + "influence": { + "admissible_symbolic_states": 17104, + "all_transitions": 158912, + "equal_frame_add_transitions": 9280, + "equal_frame_read_transitions": 43648, + "upward_move_transitions": 105984 + }, + "walks": { + "by_edge_count": { + "0": 8, + "2": 38, + "3": 108, + "4": 662 + }, + "closed_walks": 816, + "intersection_frames_seen": 8 + } + } + }, + "geometry_field": "Q", + "independent_columns": [ + "q", + "dirty_a", + "dirty_b" + ], + "scope": "finite symbolic induction and controls, not a full R438 source replay", + "status": "PASS", + "total_closed_private_walks": 1632, + "total_symbolic_states": 34208, + "total_transition_checks": 317824 +} diff --git a/research/bit-copy-support-audit/PACKAGE-REVIEW.json b/research/bit-copy-support-audit/PACKAGE-REVIEW.json new file mode 100644 index 0000000000..e36357d2a9 --- /dev/null +++ b/research/bit-copy-support-audit/PACKAGE-REVIEW.json @@ -0,0 +1,88 @@ +{ + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "checked_utc": "2026-10-20T14:37:58.175261+00:00", + "checks": { + "existing_WARM_log_contains_four_checks_and_final_PASS": true, + "five_inputs_match_retained_source_commit": true, + "five_package_inputs_match_export_bytes_sha256_git_blobs": true, + "four_registered_argv_static_inspection": true, + "new_scientific_replays_run_in_this_package_review": false, + "no_private_local_paths_in_public_text": true, + "science_proof_and_checkers_match_prior_review_hashes": true, + "scope_credit_and_open_obligations_consistent": true, + "two_canonical_provenance_bindings_match": true + }, + "file_sha256": { + "INDEPENDENT-REVIEW.json": "fb017e7e52e93faea72ac9ae8767c9a78833eec7ac7f1ad15f1875539c161411", + "INDEPENDENT-REVIEW.md": "2ed386bf3e9303005402408ac89f946547fe95663c6c78ac7cd896cffc087b29", + "ORACLE-NOTES.txt": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2", + "ORACLE-PROVENANCE.json": "38f798cbdf6ed2d77083252c32c84ea13d46f10c1c45ce9f43b2a7dcd8d4b298", + "ORACLE-RESULT.json": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "PRIMARY-REVIEW.json": "426cebf1ffe64ccf8ec5aebb4c43b3c620976b27ff97fa4592f6389881dba3a8", + "PROOF.md": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "README.md": "b2c612df27f4a8fc0d57a9ffb2b907a18efb287497f8753ceb9a2429104720bc", + "RESULT.json": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "SOURCE-PINS.json": "4f221ead234f6d65ed726b26c0d2367c5db8bcd6d93f443ec02e8d5f50608445", + "SOURCES.json": "675bed1c3572069d271249c0ea011cb72d8cd435f648ddf9be042bd379584b7f", + "TASK.json": "235dfc4c8962449a20b84dec68ccea26a8891344d880a125fd6faf66381e70e9", + "VERIFY.json": "e9370cc013162a59ddc18fce942d0b226f2d270f51220669e092ddbc2e4fee61", + "independent_oracle.py": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3", + "source/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "source/NOTICE.md.txt": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea", + "source/PR4200-PROOF.md.txt": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd", + "source/RELATED-WORK.md.txt": "6cbc0c016897e1a2b65b16b23c8ce69f8d250b7ef612211a410027a5b18b9d5d", + "source/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "source_check.py": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826" + }, + "findings": [ + { + "issue": "The claimed third Fraction checker and crosscheck receipt are hashed in the copied review but are absent from the package. Review receipt original names also lack publication mappings except the oracle provenance.", + "location": "INDEPENDENT-REVIEW.json files; INDEPENDENT-REVIEW.md verification paragraph", + "minimal_fix": "Retain portable frame_rank_cross.py and one FRAME-RANK-CROSS-V2.json receipt; record original review/CHECK names to actual package mappings, explicitly identify earlier CLI receipts as historical superseded evidence.", + "resolution": "Reviewer froze portable final helper and unchanged result receipt. Root will retain both and add REVIEW-FILE-MAP.json distinguishing historical CLI hashes/receipt names from current bindings. Pending final root package byte check.", + "severity": "evidence preservation" + } + ], + "helper_cli_addendum": { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/frame_rank_cross.py", + "--source-dir", + "{package}/source", + "--source-receipt", + "{package}/RESULT.json" + ], + "change": "Only --output optional plus conditional receipt write; all rank mathematics and explicit RuntimeError guards unchanged.", + "final_helper_sha256": "2e048e7127846c89f5f38bf1ef363c3b4adf715e43f0faac9f6c30e09731a666", + "final_receipt_sha256": "9761d8b5fca1bbd8e0e5da956e9af47eecbcd71c7423bc531eb2e1b457f3e781", + "normal_exit": 0, + "normal_optimized_receipts_byte_equal": true, + "optimized_argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/frame_rank_cross.py", + "--source-dir", + "{package}/source", + "--source-receipt", + "{package}/RESULT.json" + ], + "optimized_exit": 0, + "prior_helper_sha256": "34aba82f60452cb341942f8f5577030fea4a74b804dad04e17fbae24cf08e91d" + }, + "no_post_merge_or_frontier_write": true, + "package": "research/bit-copy-support-audit", + "retained_source_commit": "092718e959c25c85017f6463cdf66bb3f91de071", + "reviewer": "separate OpenAI Codex agent; not human or formal-kernel acceptance", + "scope_limits": [ + "No proof of K/R or required-recipient projected ranks by the new checker", + "No full decoded endpoint, physical MOVE, invoice, precision or outer theorem", + "No new kappa" + ], + "status": "PASS_SCIENTIFIC_SCOPE_RESOLUTION_PENDING_ROOT_BINDING" +} diff --git a/research/bit-copy-support-audit/PRIMARY-REVIEW.json b/research/bit-copy-support-audit/PRIMARY-REVIEW.json new file mode 100644 index 0000000000..a51272bc08 --- /dev/null +++ b/research/bit-copy-support-audit/PRIMARY-REVIEW.json @@ -0,0 +1,816 @@ +{ + "actual_input_sha256": { + "GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "actual_source_scope": { + "exact_rational_frame_ranks": [ + 0, + 8, + 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, + 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, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 4, + 4, + 4, + 4, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 4, + 4, + 4, + 4, + 4, + 4, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7 + ], + "final_cap_orthogonality_checks": 6470, + "geometry_sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "limits": "Checks actual trace, public upward containment via explicitly included root generators, all 636 supplied span ranks, signed same-frame ADDs, unchanged sources, no suffix COPY, exact final labels and equality of all final caps with their root-orthogonal hyperplanes. Does not compute complete root closures, actual R/K coefficients, full decoded endpoint, or physical MOVE semantics.", + "operation_counts": { + "ADD": 36005, + "COPY": 9, + "ERASE": 9, + "MOVE": 2904 + }, + "postscatter_counts": { + "0": 760, + "1": 939 + }, + "postscatter_interval": [ + 24069, + 25768 + ], + "postscatter_records": 1699, + "rank_eight_full_frames": [ + 1 + ], + "rank_seven_final_caps": 111, + "records": 38927, + "source_entry_frames": [ + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518 + ], + "source_registers": [ + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479 + ], + "word_sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "cli_integration_addendum": { + "change": "Only --output changed from required to optional. Full receipt is written only when supplied, and the existing PASS marker is always printed. Mathematical calculations and guards unchanged. No-output invocation passed as well.", + "current_check_sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "current_code_sha256": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826", + "prior_check_sha256": "930c7fe833fe5a8184f074a83ca03481f749ec8c5d7d9c47c2c30185cd8fad57", + "prior_code_sha256": "bb9afe457a4bb61881d12ad2b1969e62666a3c87434fbeb690ced9ee59fc6c4a", + "proof_unchanged": true + }, + "file_sha256": { + "CHECK-OPT.json": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "CHECK.json": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "PROOF.md": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "source_check.py": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826" + }, + "finite_control_scope": { + "closures": [ + { + "L_mask": 0, + "edges": 720, + "reachable_states": 100 + }, + { + "L_mask": 1, + "edges": 288, + "reachable_states": 49 + }, + { + "L_mask": 2, + "edges": 288, + "reachable_states": 49 + }, + { + "L_mask": 4, + "edges": 288, + "reachable_states": 49 + }, + { + "L_mask": 7, + "edges": 196, + "reachable_states": 36 + } + ], + "scope": "Complete finite-state closure for two F2 public scalar differences over the five rational subspaces of Q2 represented by 0,e1,e2,e1+e2,Q2; arbitrary finite trace length, not a proof for all frame spaces", + "total_edges": 1780, + "total_states": 283 + }, + "formal_kernel_verification_claimed": false, + "frozen_at_utc": "2026-10-20 14:33:45 UTC", + "human_review_claimed": false, + "license": "Apache-2.0", + "new_kappa_claimed": false, + "new_scope": "Independent all-finite-trace paired-execution proof of the support implication using a predicate-preserving local dependency condition; isolated unchanged-q coefficient and closed-walk geometric corollaries with distinct premises; minimal named relaxation counterexamples; no producer imports.", + "predecessor": { + "contextual_main": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "pr": 4200, + "source_text_sha256": { + "NOTICE.md": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea", + "construction/PROOF.md": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd", + "construction/walk_certificate.py": "9d7360b301641e9fcd9a400a5ad0b401f85038db5f1ea82ee7a9b240dcf7af4d", + "independent/REVIEW.md": "a02c11d01331b89e38beed47776832a520043ba20e988ea4ca9283b570350b36" + } + }, + "predecessor_credit": [ + "Ross Richardson PR4200 and its independent review agent: unchanged-total closed-walk floor and branch projection argument", + "Ali Romman: retained R438 word", + "Sagar Thakrar and DreamingOfClouds/eumemic/PR589/PR555: retained transport/source lineage", + "Russell Seligmann PR757 and Cody Harris PR761: separate historical direct-decoder floor, not rediscovered here" + ], + "relaxation_controls": { + "ambient_dimension_one_minimal": true, + "legal_F2_double_read_cancellation_cases": 4, + "nonzero_q_counterexample_executions": 6, + "positive_copy_embedding_dimension_two": true, + "same_initial_arbitrary_dirt": true + }, + "remaining": [ + "independent actual R/K coefficient and full 660-column endpoint audit not performed here", + "complete rational frame root-closure equality not performed here", + "physical transport semantics and private-MOVE ABI not admitted here", + "changed factories, mixed totals, public downward queries or adaptive schedules need a new argument", + "complete recursive invoice, precision and outer multiplication theorem unchanged" + ], + "scope_clarification": { + "change": "Clarified that actual K-supported recipient/projected-recipient ranks are predecessor evidence not rerun by the new checker; no mathematical lemma, code or result change.", + "frozen_proof_sha256": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "prior_proof_sha256": "0f9973233f8768ac0c6a4a53089e3e275cf0abcdd196d179998ee236c4202a37" + }, + "status": "PASS_WRITTEN_CAUSAL_SUPPORT_LEMMA_AND_BOUNDED_ACTUAL_TRACE", + "substantial_ai_assistance": true, + "verification": { + "no_output_exit": 0, + "normal_exit": 0, + "normal_optimized_receipts_identical": true, + "optimized_exit": 0, + "portable_commands": [ + [ + "python3", + "-I", + "-B", + "-W", + "error", + "source_check.py", + "--source-dir", + "source", + "--output", + "CHECK.json" + ], + [ + "python3", + "-I", + "-O", + "-B", + "-W", + "error", + "source_check.py", + "--source-dir", + "source", + "--output", + "CHECK-OPT.json" + ] + ], + "python": "3.12.14" + } +} diff --git a/research/bit-copy-support-audit/PROOF.md b/research/bit-copy-support-audit/PROOF.md new file mode 100644 index 0000000000..573da01338 --- /dev/null +++ b/research/bit-copy-support-audit/PROOF.md @@ -0,0 +1,273 @@ +# Independent causal-support audit for the unchanged-total private walk + +## Exact conclusion + +The support implication in PR4200, head +`ddfc3133cbdf548e163c867d5671f8f01dd5d5ae`, is valid under its stated +fixed-trace, upward-public-MOVE/common-frame-ADD hypotheses. The proof below +does not assume clean helpers, noncancelling paths, independent values of +ordinary registers, or a particular characteristic for the data group. +It separates this causal assertion from the linear same-query decomposition +and the rational geometric tariff argument. + +This is an independent written proof and a bounded source-trace applicability audit. +It is not a formal-kernel proof, a new lower bound for arbitrary algorithms, +or admission of a physical private-MOVE interface. The rank-seven obstruction +and its finite input geometry are predecessor results, not new discoveries. + +## 1. Fixed-trace causal-support lemma + +Let V be a finite-dimensional rational or real vector space. A fixed finite +straight-line trace assigns a frame U_r(t) subset V to each public register r +after event t. Fix a subspace L. Compare two runs with identical initial +public values, frames and prescribed events. The runs may differ only at a +specified family of external/private read events. Every such read changes +only a receiver whose frame contains L. + +Ordinary public events have the following dependency condition: for every +input register of frame U which can affect an output register of frame W, + + L subset U implies L subset W. (S) + +All data dependencies, including a guard or coefficient if data dependent, +must be counted. The events and frame schedule are fixed independently of +which compared run is used. Deterministic local transport may change its +data representation; it has no hidden dependency on a different register. + +**Lemma.** At every time t, if the two values of register r differ, then +L subset U_r(t). In particular a differing final target of frame K must +satisfy L subset K. + +**Proof.** Initially all public values agree. Consider the first output +whose compared values would differ despite its frame excluding L. An +external/private read cannot be this event, because its receiver contains +L. At an ordinary deterministic event, differing output values imply a +differing value of at least one of its inputs. By induction that input's +frame contains L. Condition (S) then forces the output frame to contain L, +a contradiction. Unmodified outputs preserve the inductive claim. This +proves the invariant for every finite event sequence. In particular, dirty +values can be arbitrary and correlated: the two runs begin with exactly the +same dirty values. No assumption about their numerical values is made. QED. + +Upward public MOVE U -> W satisfies (S) because U subset W. A common-frame +ADD `b <- b + c*a` satisfies (S) because its source and destination frames +are equal (and its old destination is in that same frame). Thus these are +sufficient hypotheses for the lemma. They are stronger than necessary: +a transfer from U to W is safe for this particular L whenever it preserves +the truth of containment of L, even when U is not a subspace of W. + +The proof uses equality of values rather than a path count or a notion of +positive influence. Cancellation can make an output agree; it cannot make +an output differ without some differing predecessor. The claim therefore +does not fail over F2, where two identical paths can cancel. + +## 2. Isolating one private branch and its coefficient + +The comparison relevant to the predecessor is an intervention on a single +branch: suppress only that branch's private-to-public ADD increments, not +the pre-existing public values, its original source q, or unrelated +branches. Keep the same public schedule and frames. The private source q +is unchanged throughout; the branch carries that same logical q and does +not read branch-modified public values. Thus suppressing these increments +does not change any later injection value or invalidate the stipulated +private return/ERASE contract. + +Let L be the intersection of every private frame visited by the branch. +Every private-to-public ADD is at a common frame W, so L subset W. Applying +the lemma shows that this intervention can change final target p only if +L subset K_p. + +For scalar linear logical data operations over a field k, write the initial +public state as z. If q=q(z) is a fixed linear functional, the intervention +difference is + + Delta_r(t,z) = a_r(t) q(z), (C) + +where a_r(t) is computed by the same scalar ADD recurrence starting from +zero and inserting the branch's read coefficients. In a decoded chart in +which MOVE preserves the logical scalar, MOVE preserves a_r. Equation (C) +follows by induction and does not require q to be independent of z. If q is +not identically zero, `a_p != 0` means an actual difference for at least one +input z; the support lemma forces L subset K_p. In F2 the a's are path sums +modulo two. Multiple paths may cancel a coefficient, never create one +outside the lemma's permitted frames. + +With several branches reading the same unchanged q, their scalar +intervention coefficients add by linearity. The support of the total +coefficient is contained in the union of the individual supports. This is +why the predecessor may use a union bound despite arbitrary F2 +cancellations. It is essential to distinguish isolating a branch from +changing the original source value: changing q at its ordinary source can +also alter unrelated public uses of q and is not this intervention. + +Source immutability and carrying exactly q are not needed for the abstract +causal-support lemma: arbitrary exogenous read values are allowed there. +They are needed to conclude that this one branch supplies a coefficient +of the required unchanged functional q, and to justify the copied-field +return/ERASE and independent same-query decomposition. Similarly, private +closure/nestedness is not needed for support; it is needed for the next +dimension bound. + +## 3. Closed private walks: distinct geometric obligation + +Suppose the branch starts and ends at G subset F, and every consecutive +private frame pair is nested. Let f=dim(F), r=f-dim(G), and let m be the sum +of the absolute dimension differences of every private MOVE, in both +directions. Since the walk is closed, its total downward dimension loss D +equals its upward dimension gain, so D=m/2. + +Intersect frames in chronological order. An upward edge does not shrink +the running intersection: it already lies in the old, smaller frame. A +downward edge U -> W of codimension d loses at most d dimensions, since +for R subset U, `dim(R intersect W) >= dim(R)-d`. Therefore + + L subset G subset F, + dim(L) >= dim(G)-m/2 = f-r-m/2. (D) + +This calculation uses rational/real frame dimensions independently of the +data field k. No preservation of rational ranks under arbitrary finite +characteristic specialization follows from it. + +Suppose final target frames are K_p = u_p^perp in a positive definite +rational/real inner product space. If target p is affected, then u_p is +orthogonal to L. Since L subset F, orthogonal projection P_F gives + + P_F(u_p) in F intersect L^perp, + dim(F intersect L^perp) = f-dim(L) <= r+m/2. (P) + +For finitely many branches i, if a required coefficient vector k is +delivered and the projected roots `{P_F(u_p): k[p] != 0}` span F, the union +of permitted supports and (P) yield + + f <= sum_i (r_i+m_i/2) <= sum_i (r_i+m_i). + +For f=7 this reproduces the predecessor's seven-rank floor. It does not +establish the required projected-root ranks: those are separate +source-bound finite geometry obligations. If a single branch's required +unprojected roots span V, support forces L=0 and (D) gives +`r+m >= 2f-r`, the predecessor's stronger one-branch inequality. + +## 4. Minimal necessity controls + +The following are counterexamples to relaxed hypotheses, not legal words +in the original model and not bugs in the predecessor. + +1. **Allow one downward public MOVE.** Take V=Q, L=Q, receiver A at Q, + final target frame K=0. A private read adds a nonzero q to A. Now move A + downward Q -> 0 while preserving its logical scalar. The final target + changes by q although L is not contained in K. This uses one receiver, + one read and one downward transfer. Dimension one is minimal, since V=0 + admits no pair L,K with L not contained in K. +2. **Allow one unequal-frame public ADD.** Take V=Q, L=Q, A at Q and B at + K=0. Read q into A at its common frame, then execute cross-frame + `B <- B+A`. B changes by q although L is not contained in K. All public + frames stay fixed, so this control relaxes ADD's frame restriction alone. + Two public registers are required for this unequal-frame ADD control. + +If one insists on a strictly positive entrance COPY, embed either example +in V=Q^2: let F=Q^2, G=L=span(e1), and COPY the unchanged q at rank one. +Read at G, return trivially to G, and ERASE against unchanged q. For the +downward control use target frame 0; for the ADD control use B's frame +span(e2). The private copied-total and closed-return conditions remain +satisfied. The only offending public event is the named relaxation. + +An additional fixed-trace control is necessary in any proposed extension: +a branch-dependent guard at frame L cannot choose whether to update an +unrelated target K excluding L while hiding that guard from the event's +dependency list. Such control flow introduces a dependency L -> K and +violates (S); calling the visible payload operand constant does not remove +that dependency. + +## 5. Applicability to the exact predecessor + +The audited source text is `research/bit-copy-path/construction/PROOF.md`, +`construction/walk_certificate.py`, and `independent/REVIEW.md` at the +stated PR4200 head. The source checker explicitly tests: + +- Every original public MOVE has nested entrance/exit frames and positive + dimension increase (`literal_frames`). +- Every original ADD has the exact same actual source/destination frame, + with fixed scalar coefficient +1 or -1. +- The postscatter target-writing interval is `[24069,25768)` and its + records contain only MOVE and ADD; there is no downstream COPY. +- Registers 471..479, the nine copied sources, receive neither ADD nor + MOVE in that interval; their values and source frames are unchanged. +- No actual target register is ever an ADD source, so the literal scatter + coefficient k_j is retained rather than inferred from a clean trial. +- All final target caps are tested against their actual root-orthogonal + hyperplanes. The new checker separately computes all 636 supplied frame + ranks and all 111 final cap ranks, norms and hyperplane equalities. + +The predecessor also computes ranks of the actual K-supported recipient +roots and of their projections onto each source frame. Those recipient +and projected-recipient rank claims remain predecessor evidence: this +new checker does not reconstruct K/R or rerun those particular ranks. + +These checks are the right hypotheses for the written support proof. This +agent separately authenticated the raw WORD and GEOMETRY compressed bytes +and replayed their frame/operation trace using `source_check.py`, importing no +producer code. It checks all 38,927 records: 2,904 public MOVEs, 36,005 ADDs, +nine COPYs and nine ERASEs. The exact B interval has 1,699 records, comprising +760 MOVEs and 939 ADDs. It verifies actual source identities 471..479 at +entry frames 510..518, and that neither their values nor their frames are +modified within B. Public upward containment is checked by literal +inclusion of old frame root generators among new frame root generators, +which directly implies containment of their rational spans. A separate +fraction-free primitive-integer elimination computes the rational ranks +of all 636 supplied frame spans, verifies the exact positive MOVE ranks, +and checks source rank seven. It checks full-frame rank eight, all 111 +final cap ranks seven, each port root's squared norm four, exact final +frame labels and 6,470 final cap-generator/root orthogonality equalities. +Rank seven plus containment in the nonzero root's perpendicular hyperplane +proves equality with that cap; orthogonality alone would not suffice. + +This replay does not reconstruct complete root closures, R/K coefficients, +all 660 decoded columns, or physical MOVE semantics. Those remain separate +predecessor or companion evidence. The source trace +checks establish the support lemma's literal operation premises, rather +than treating the producer code's existence as proof that its inputs +passed. + +A separate finite closure explores all reachable difference states of two +F2 public scalar registers with five rational frame labels +`{0,span(e1),span(e2),span(e1+e2),Q2}`. It permits every upward MOVE, +same-frame ADD, and read into a frame containing L, starting from every +frame pair and zero intervention difference. Its full finite-state closure +contains 283 states and 1,780 transition occurrences over all five choices +of L. This tests arbitrary finite schedule length in that finite abstract +model; it is not a proof for all rational subspaces. Four ordinary F2 +double-read cancellations are accepted. Six nonzero-q paired executions +over all relevant dirty assignments demonstrate the two forbidden +relaxations. Normal and optimized Python runs produce identical receipts. + +The written theorem itself has no enumerated-trace bound and is not +inferred from either finite replay. + +## Remaining obligations and credit + +No new source-preserving construction, frame compiler, native private-MOVE +ABI, recursive invoice, precision bound, selected-result change, or kappa +improvement follows. A changed public downward-query model, mixed query +totals, changed factory, data-dependent schedule, or different physical +caller needs its own support and complete cost argument. + +Credit Ross Richardson/PR4200 and its independent review agent for the +unchanged-total closed-walk obstruction and finite-branch projection +argument. The source word/transport credit belongs to Ali Romman, Sagar +Thakrar and the DreamingOfClouds/eumemic/PR589/PR555 lineage retained by that +package. Russell Seligmann/PR757 and Cody Harris/PR761 own the separate +historical direct-decoder floor; this note does not rediscover it. This +independent audit and its paired-run/edge formulation were prepared with +substantial OpenAI Codex assistance; no human or formal-kernel review is +claimed. Apache-2.0. + +## Open next questions + +- Combine this independently replayed suffix frame/operation and rational + rank trace with separately checked coefficient patterns and full + endpoint semantics before claiming a complete actual R438 audit. +- If extending the model, classify every new dependency edge using (S), + including control inputs, before reusing the rank-seven corollary. +- Keep physical feasibility, complete charged invoice and precision as + separate obligations rather than interpreting this support lemma as a + supplier or a selected-frontier result. diff --git a/research/bit-copy-support-audit/README.md b/research/bit-copy-support-audit/README.md new file mode 100644 index 0000000000..4c82065e4b --- /dev/null +++ b/research/bit-copy-support-audit/README.md @@ -0,0 +1,102 @@ +# Independent audit of BIT COPY support propagation + +**The support step requested by PR4200's handoff is valid in its stated model. +No new supplier or κ is claimed.** + +This adds a separately written paired-execution proof and code-disjoint checks +of one premise of Ross Richardson's unchanged-total COPY floor, at predecessor +head `ddfc3133cbdf548e163c867d5671f8f01dd5d5ae`. The earlier seven-rank floor, +projection argument and original construction remain predecessor work. + +## Exact scope + +Fix the intersection L of one private branch's visited frames. Compare the +same fixed public trace with and without that branch's read increments, +keeping all initial public values, including arbitrary correlated dirt, equal. +Every nonzero difference stays in a register whose frame contains L if every +ordinary dependency edge U→W preserves `L⊆U ⇒ L⊆W`. This local condition is +sufficient; it need not be necessary for a particular whole trace with dead +or cancelling edges. Upward MOVEs and same-frame scalar ADDs satisfy it. + +The proof covers every finite fixed trace. Cancellation, including over F2, +can remove a difference but cannot create one without a differing input. +It separately states the extra linearity/unchanged-q and closed-walk tariff +premises needed to recover the credited predecessor corollary. Hidden +data-dependent guards count as dependencies; adaptive schedules are not +silently admitted. See [PROOF.md](PROOF.md). + +## Evidence + +- The separate source checker authenticates the original compressed word and + geometry, checks all 38,927 operation/frame records, 636 exact rational span + ranks and 111 final cap equalities. It binds the public suffix + `[24069,25768)` to 760 upward MOVEs and 939 same-frame ADDs, with no COPY and + unchanged source registers 471..479. It checks 6,470 cap/root equalities. +- Its finite two-register closure has 283 states and 1,780 transitions, four + accepted cancellation cases, and six nonzero-q executions illustrating the + two forbidden hypothesis relaxations. +- A code-disjoint oracle checks 1,632 closed private walks, 34,208 symbolic + states and 317,824 transitions in coordinate and rational noncoordinate + frame families in Q³. Independent dirty columns, cancellations, a downward + MOVE and an unequal-frame ADD are explicit controls. + +The two relaxation examples are outside the original model; they are not +predecessor defects. The source checker does not recompute complete root +closures, R/K or recipient/projected-recipient ranks, all 660 scalar endpoint +columns, physical MOVE semantics, or a complete tariff. Those remain separate +predecessor evidence or open obligations. The finite checks corroborate the +written theorem; they do not prove its universal quantifier. + +## Reproduce + +Python 3.12, standard library only, from the repository root: + +```sh +python3.12 -B scripts/research_package.py --package research/bit-copy-support-audit --check-only +python3.12 -B scripts/research_package.py --package research/bit-copy-support-audit +``` + +Six registered commands run the two checkers and a separate Fraction rank cross-check in normal and strict optimized +modes. [REVIEW-FILE-MAP.json](REVIEW-FILE-MAP.json) resolves original report +filenames and explicitly separates historical CLI hashes from current bindings. +Standalone, Git-free receipts can be written outside the package: + +```sh +python3.12 -I -B research/bit-copy-support-audit/source_check.py --output /tmp/bit-support-primary.json +python3.12 -I -O -W error -B research/bit-copy-support-audit/independent_oracle.py --out /tmp/bit-support-oracle.json +``` + +The checks import no predecessor implementation. Minimal untouched data, +audited proof and notice/credit documents are in `source/`; text sources use a +`.txt` suffix so their original relative references are understood as references +to the original publication. [SOURCE-PINS.json](SOURCE-PINS.json) binds the +original source head, paths, Git blobs and SHA256 values. A retained source +commit in this PR's own ancestry makes reproduction independent of an unmerged +branch cache. [SOURCES.json](SOURCES.json) records that availability separately +from the original attribution. The selected record and catalogue remain pinned +historical provenance at canonical main `12fa8c5c844be21bfefb38a19503fbd867a11244`. + +## Open next questions + +A changed public dependency or mixed-total construction needs its own complete +word and bill. Begin with one literal arbitrary-input candidate, list every +dependency including guards, and price acquisition, transport, return, owners +and the actual caller. No such candidate is supplied here. Ross Richardson's +active mixed-total investigation is separate from this completed proof audit. +Native interfaces, precision, the complete recursive invoice and the outer +multiplication theorem remain open; this audit does not alter the frontier. + +## Credit + +Ross Richardson/PR4200 supplies the unchanged-total closed-walk obstruction, +branch projection argument and requested proof-review task. Retained R438 +credit belongs to Ali Romman, Sagar Thakrar and the DreamingOfClouds/eumemic +PR589/PR555 lineage. The distinct direct-decoder floor remains Russell +Seligmann's PR757 and Cody Harris's PR761 work, following Joel +Pulikkan/GamingPuzzled's PR620; it is not a result of this audit. Original +notices and fuller attribution are preserved in `source/`. + +Prepared for ToikY with substantial OpenAI Codex assistance, including separate +proof/source-check, oracle and review agents. This is written proof and exact +finite agent-checked evidence, not human or formal-kernel acceptance. New work +Apache-2.0; retained sources keep their original authorship and notice. diff --git a/research/bit-copy-support-audit/RESULT.json b/research/bit-copy-support-audit/RESULT.json new file mode 100644 index 0000000000..82d6b4d526 --- /dev/null +++ b/research/bit-copy-support-audit/RESULT.json @@ -0,0 +1,847 @@ +{ + "actual_source_trace": { + "exact_rational_frame_ranks": [ + 0, + 8, + 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, + 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, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 1, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 2, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 4, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 6, + 4, + 4, + 4, + 4, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 4, + 4, + 4, + 4, + 4, + 4, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7, + 7 + ], + "final_cap_orthogonality_checks": 6470, + "geometry_sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "limits": "Checks actual trace, public upward containment via explicitly included root generators, all 636 supplied span ranks, signed same-frame ADDs, unchanged sources, no suffix COPY, exact final labels and equality of all final caps with their root-orthogonal hyperplanes. Does not compute complete root closures, actual R/K coefficients, full decoded endpoint, or physical MOVE semantics.", + "operation_counts": { + "ADD": 36005, + "COPY": 9, + "ERASE": 9, + "MOVE": 2904 + }, + "postscatter_counts": { + "0": 760, + "1": 939 + }, + "postscatter_interval": [ + 24069, + 25768 + ], + "postscatter_records": 1699, + "rank_eight_full_frames": [ + 1 + ], + "rank_seven_final_caps": 111, + "records": 38927, + "source_entry_frames": [ + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518 + ], + "source_registers": [ + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479 + ], + "word_sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + "code_sha256": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826", + "finite_toy_closure": { + "closures": [ + { + "L_mask": 0, + "edges": 720, + "reachable_states": 100 + }, + { + "L_mask": 1, + "edges": 288, + "reachable_states": 49 + }, + { + "L_mask": 2, + "edges": 288, + "reachable_states": 49 + }, + { + "L_mask": 4, + "edges": 288, + "reachable_states": 49 + }, + { + "L_mask": 7, + "edges": 196, + "reachable_states": 36 + } + ], + "scope": "Complete finite-state closure for two F2 public scalar differences over the five rational subspaces of Q2 represented by 0,e1,e2,e1+e2,Q2; arbitrary finite trace length, not a proof for all frame spaces", + "total_edges": 1780, + "total_states": 283 + }, + "hypothesis_relaxation_controls": { + "allowed_F2_cancellation_cases": 4, + "meaning": "Named relaxations permit influence outside L containment; original hypotheses are not contradicted", + "nonzero_q_failure_count": 6, + "paired_executions": [ + { + "baseline": 0, + "changed": 0, + "control": "downward_public_move", + "dirty": [ + 0 + ], + "q": 0 + }, + { + "baseline": 0, + "changed": 0, + "control": "unequal_frame_public_add", + "dirty": [ + 0, + 0 + ], + "q": 0 + }, + { + "baseline": 1, + "changed": 1, + "control": "unequal_frame_public_add", + "dirty": [ + 0, + 1 + ], + "q": 0 + }, + { + "baseline": 1, + "changed": 1, + "control": "downward_public_move", + "dirty": [ + 1 + ], + "q": 0 + }, + { + "baseline": 1, + "changed": 1, + "control": "unequal_frame_public_add", + "dirty": [ + 1, + 0 + ], + "q": 0 + }, + { + "baseline": 0, + "changed": 0, + "control": "unequal_frame_public_add", + "dirty": [ + 1, + 1 + ], + "q": 0 + }, + { + "baseline": 0, + "changed": 1, + "control": "downward_public_move", + "dirty": [ + 0 + ], + "q": 1 + }, + { + "baseline": 0, + "changed": 1, + "control": "unequal_frame_public_add", + "dirty": [ + 0, + 0 + ], + "q": 1 + }, + { + "baseline": 1, + "changed": 0, + "control": "unequal_frame_public_add", + "dirty": [ + 0, + 1 + ], + "q": 1 + }, + { + "baseline": 1, + "changed": 0, + "control": "downward_public_move", + "dirty": [ + 1 + ], + "q": 1 + }, + { + "baseline": 1, + "changed": 0, + "control": "unequal_frame_public_add", + "dirty": [ + 1, + 0 + ], + "q": 1 + }, + { + "baseline": 0, + "changed": 1, + "control": "unequal_frame_public_add", + "dirty": [ + 1, + 1 + ], + "q": 1 + } + ] + }, + "not_a_formal_kernel_proof": true, + "predecessor_head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "status": "PASS_INDEPENDENT_CAUSAL_SUPPORT_AUDIT_NO_NEW_KAPPA" +} diff --git a/research/bit-copy-support-audit/REVIEW-FILE-MAP.json b/research/bit-copy-support-audit/REVIEW-FILE-MAP.json new file mode 100644 index 0000000000..57e906389e --- /dev/null +++ b/research/bit-copy-support-audit/REVIEW-FILE-MAP.json @@ -0,0 +1,154 @@ +{ + "schema_version": 1, + "purpose": "Explicit publication names for untouched independently authored reports; current mappings are byte-checked. Historical CLI hashes are separated, not claimed equal to current files.", + "current_byte_equalities": [ + { + "report": "PRIMARY-REVIEW.json", + "original_name": "CHECK-OPT.json", + "sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "package_path": "RESULT.json" + }, + { + "report": "PRIMARY-REVIEW.json", + "original_name": "CHECK.json", + "sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "package_path": "RESULT.json" + }, + { + "report": "PRIMARY-REVIEW.json", + "original_name": "PROOF.md", + "sha256": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "package_path": "PROOF.md" + }, + { + "report": "PRIMARY-REVIEW.json", + "original_name": "source_check.py", + "sha256": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826", + "package_path": "source_check.py" + }, + { + "report": "ORACLE-PROVENANCE.json", + "original_name": "NOTES.txt", + "sha256": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2", + "package_path": "ORACLE-NOTES.txt" + }, + { + "report": "ORACLE-PROVENANCE.json", + "original_name": "RESULT-O.json", + "sha256": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "package_path": "ORACLE-RESULT.json" + }, + { + "report": "ORACLE-PROVENANCE.json", + "original_name": "RESULT.json", + "sha256": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "package_path": "ORACLE-RESULT.json" + }, + { + "report": "ORACLE-PROVENANCE.json", + "original_name": "independent_oracle.py", + "sha256": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3", + "package_path": "independent_oracle.py" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "FRAME-RANK-CROSS-V2.json", + "sha256": "9761d8b5fca1bbd8e0e5da956e9af47eecbcd71c7423bc531eb2e1b457f3e781", + "package_path": "FRAME-RANK-CROSS.json" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "FRAME-RANK-CROSS.json", + "sha256": "9761d8b5fca1bbd8e0e5da956e9af47eecbcd71c7423bc531eb2e1b457f3e781", + "package_path": "FRAME-RANK-CROSS.json" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "ORACLE-NORMAL.json", + "sha256": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "package_path": "ORACLE-RESULT.json" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "ORACLE-OPT.json", + "sha256": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "package_path": "ORACLE-RESULT.json" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "PROOF.md", + "sha256": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "package_path": "PROOF.md" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "REVIEW.md", + "sha256": "2ed386bf3e9303005402408ac89f946547fe95663c6c78ac7cd896cffc087b29", + "package_path": "INDEPENDENT-REVIEW.md" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "SOURCE-V2-NORMAL.json", + "sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "package_path": "RESULT.json" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "SOURCE-V2-OPT.json", + "sha256": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "package_path": "RESULT.json" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "independent_oracle.py", + "sha256": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3", + "package_path": "independent_oracle.py" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "oracle-NOTES.txt", + "sha256": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2", + "package_path": "ORACLE-NOTES.txt" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "predecessor-PROOF.md", + "sha256": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd", + "package_path": "source/PR4200-PROOF.md.txt" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "source_check.py", + "sha256": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826", + "package_path": "source_check.py" + } + ], + "historical_cli_entries": [ + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "SOURCE-NORMAL.json", + "sha256": "930c7fe833fe5a8184f074a83ca03481f749ec8c5d7d9c47c2c30185cd8fad57", + "package_path": "SOURCE-NORMAL.json", + "current_sha256": null, + "classification": "historical CLI version retained as hash in the original report; not a current package-byte equality assertion" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "SOURCE-OPT.json", + "sha256": "930c7fe833fe5a8184f074a83ca03481f749ec8c5d7d9c47c2c30185cd8fad57", + "package_path": "SOURCE-OPT.json", + "current_sha256": null, + "classification": "historical CLI version retained as hash in the original report; not a current package-byte equality assertion" + }, + { + "report": "INDEPENDENT-REVIEW.json", + "original_name": "frame_rank_cross.py", + "sha256": "34aba82f60452cb341942f8f5577030fea4a74b804dad04e17fbae24cf08e91d", + "package_path": "frame_rank_cross.py", + "current_sha256": "2e048e7127846c89f5f38bf1ef363c3b4adf715e43f0faac9f6c30e09731a666", + "classification": "historical CLI version retained as hash in the original report; not a current package-byte equality assertion" + } + ], + "helper_cli_change": "Only optional --output and conditional receipt write; original review/helper hash is preserved in PACKAGE-REVIEW. Current helper is independently replayed by the six registered commands.", + "root_resolution": "All current referenced programs and scientific receipts are retained; no absent current helper." +} diff --git a/research/bit-copy-support-audit/SOURCES.json b/research/bit-copy-support-audit/SOURCES.json new file mode 100644 index 0000000000..ce1b480a84 --- /dev/null +++ b/research/bit-copy-support-audit/SOURCES.json @@ -0,0 +1,53 @@ +{ + "schema_version": 1, + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "64bfc5af6709ed9811171e0a2108f05e1219cb65", + "sha256": "352a6184713b8843d96fd2c2071eb7aeaa655906b7c51d45ad444912666c8a96" + }, + { + "path": "research/bit-copy-support-audit/source/WORD.json.gz", + "usage": "input", + "pin": "head:2c2b29438773f12b3bb5903723c3bb16f0dcd583:research/bit-copy-support-audit/source/WORD.json.gz", + "git_blob": "aa9ec3c341ad87d7513b9ea6934d5253035b8d30", + "sha256": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" + }, + { + "path": "research/bit-copy-support-audit/source/GEOMETRY.json.gz", + "usage": "input", + "pin": "head:2c2b29438773f12b3bb5903723c3bb16f0dcd583:research/bit-copy-support-audit/source/GEOMETRY.json.gz", + "git_blob": "e12a566658a4b2c8b6ae0ecc34fd41290f68f5e8", + "sha256": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + }, + { + "path": "research/bit-copy-support-audit/source/PR4200-PROOF.md.txt", + "usage": "input", + "pin": "head:2c2b29438773f12b3bb5903723c3bb16f0dcd583:research/bit-copy-support-audit/source/PR4200-PROOF.md.txt", + "git_blob": "082b804b08bea64114ff7838d66653109fb8e94d", + "sha256": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd" + }, + { + "path": "research/bit-copy-support-audit/source/NOTICE.md.txt", + "usage": "input", + "pin": "head:2c2b29438773f12b3bb5903723c3bb16f0dcd583:research/bit-copy-support-audit/source/NOTICE.md.txt", + "git_blob": "67c569b8ab928d536d1d832575e7394855eb7f9c", + "sha256": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea" + }, + { + "path": "research/bit-copy-support-audit/source/RELATED-WORK.md.txt", + "usage": "input", + "pin": "head:2c2b29438773f12b3bb5903723c3bb16f0dcd583:research/bit-copy-support-audit/source/RELATED-WORK.md.txt", + "git_blob": "dc125ae0b5130e50555f8dd2a9e5fd1109979883", + "sha256": "6cbc0c016897e1a2b65b16b23c8ce69f8d250b7ef612211a410027a5b18b9d5d" + } + ] +} diff --git a/research/bit-copy-support-audit/TASK.json b/research/bit-copy-support-audit/TASK.json new file mode 100644 index 0000000000..ef5c9e646f --- /dev/null +++ b/research/bit-copy-support-audit/TASK.json @@ -0,0 +1,80 @@ +{ + "schema_version": 1, + "task_id": "coverage-law-change", + "priority_revision": 7, + "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "original_card": { + "id": "coverage-law-change", + "question": "Can a template or call contract leave two or more unpaid coordinates per live family?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/complex-local-word-ceiling/README.md", + "research/idle-axis-hosting/PROOF.md", + "certificates/selected-result.json" + ], + "methods": [ + "State a replacement for the coverage identity (mass = 72W + 64N) and the contract change that realizes it, with its implementation cost.", + "Find an obstruction: show which data-endpoint obligation forces exactly one unpaid coordinate in the current template." + ], + "acceptance_gate": "An explicit replacement identity, verified on a small complete instance with dirty inputs, priced with ceiling.ceiling(unpaid=...). 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", + "research/complex-local-word-ceiling/verify.py" + ], + "expected": "PASS_COMPLEX_LOCAL_WORD_CEILING", + "inspect": "Read the selected word's per-call local profile, its packing ceiling and the lever table; run levers.py for the ideal budget of the lever you target.", + "scope": "Positive control and planning budget only; this is not a new construction or full cold replay." + }, + "first_experiment": "Explain where the single unpaid coordinate per family comes from in the hosted template; propose one change and price it. Ideal budget: two unpaid coordinates per family is 3.77x (levers.py).", + "bottleneck_link": "The deficit is one coordinate per family minus the centre charge; doubling unpaid coordinates per family scales it directly.", + "allowed_variations": [ + "One template change or one endpoint-contract change.", + "If the coverage law, template or guard changes, derive an applicable fully charged replacement bound instead of applying the incumbent ceiling outside its scope." + ], + "scope_change_triggers": [ + "Counting a coordinate as unpaid while leaving it unadvanced in the data endpoint.", + "Continuing a partial cost improvement while leaving the same unpriced consumer, restoration or central-readout obligation unresolved; refresh the family expansion decision first. Local product-retiming evidence has a narrow scope and is not a ban on changed graphs or contracts." + ], + "overlap_terms": [ + "coverage identity", + "unpaid coordinate", + "deficit law", + "W - 64N" + ] + }, + "scope_status": "changed", + "actual_scope": "Independent audit of PR4200 support propagation: paired executions with fixed frame trace, branch-relative influence, exact predicate-preserving dependency condition and pinned actual suffix hypotheses.", + "scope_change_reason": "Take the explicit unclaimed independent proof-review handoff in1166/4199 instead of the catalogue generic complex coverage experiment. This is an audit of a named BIT copy-path implication, not another search or a changed supplier.", + "bottleneck_link": "The seven-rank unchanged-total COPY floor depends on branch support remaining in final caps that contain the private-frame intersection. Audit that implication and distinguish it from the separate dimension/tariff and mixed-total construction questions.", + "budget_minutes": 60, + "stop_rule": "By15:05:31UTC freeze one support-proof audit or explicit permitted counterexample; final15minutes reserved for independent review, committed-byte/cold replay, publication and handoff. No heavy/native/Lean or whole historical replay.", + "outcome": "completed", + "evidence": "Written all-finite-trace proof, authenticated38927-record source frame audit, separate283-state closure and34208-state oracle; source/normal-optimized receipts and review retained.", + "author": "ToikY with OpenAI Codex assistance", + "ai_assistance": "Substantial OpenAI Codex assistance from coordinating, proof/source-check, code-disjoint oracle and separate review agents. Agent review is not human or formal-kernel acceptance.", + "open_questions": [ + { + "question": "Can a changed public dependency that fails the fixed-L predicate still yield a legal useful complete path at a favorable full cost?", + "why_it_matters": "The local invariant does not exclude changed transport or mixed totals outside PR4200 premises.", + "first_step": "Give one complete changed arbitrary-input word, label all frame dependency edges, and account for the entire source acquisition, transport, return and caller bill.", + "blocked_by": "No such candidate is supplied; active mixed-total investigation belongs to Ross Richardson and is outside this audit." + } + ], + "scope_key": "803d81955fc34e683c60", + "upstream_main": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "predecessor_head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "canonical_claim": "https://github.com/CrocSwap/integer-mult-bounds/discussions/4199#discussioncomment-19074339", + "first_working_example": { + "command": "python3.12 -I -B research/bit-copy-support-audit/source_check.py", + "reason_for_override": "The live proof-review handoff supersedes the catalogue complex-ceiling example; this checker directly tests the actual support-premise trace. Predecessor scalar/K/R and full suite evidence will be explicitly reused, not freshly claimed." + }, + "freshness": { + "checked_at": "2026-10-20 14:22:14 UTC", + "canonical_main": "12fa8c5c844be21bfefb38a19503fbd867a11244", + "priority_revision": 7, + "open_and_draft_bodies": 318, + "discussion": "Fresh newest1166 and canonical4199 read; independent-proof request unclaimed; mixed-total claim expressly excluded. Broader coverage partial." + } +} diff --git a/research/bit-copy-support-audit/VERIFY.json b/research/bit-copy-support-audit/VERIFY.json new file mode 100644 index 0000000000..5a4389d0f7 --- /dev/null +++ b/research/bit-copy-support-audit/VERIFY.json @@ -0,0 +1,92 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/bit-copy-support-audit/source/WORD.json.gz", + "research/bit-copy-support-audit/source/GEOMETRY.json.gz", + "research/bit-copy-support-audit/source/PR4200-PROOF.md.txt", + "research/bit-copy-support-audit/source/NOTICE.md.txt", + "research/bit-copy-support-audit/source/RELATED-WORK.md.txt" + ], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/source_check.py" + ], + "timeout_seconds": 120, + "checks": "Authenticated literal public frame/suffix audit and independent paired-execution premise controls; no full scalar endpoint/K/R replay." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/source_check.py" + ], + "timeout_seconds": 120, + "checks": "Authenticated literal public frame/suffix audit and independent paired-execution premise controls; no full scalar endpoint/K/R replay." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/independent_oracle.py" + ], + "timeout_seconds": 120, + "checks": "Code-disjoint finite rational/coordinate frame oracle, arbitrary dirty columns, cancellations and explicit forbidden-relaxation counterexamples." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/independent_oracle.py" + ], + "timeout_seconds": 120, + "checks": "Code-disjoint finite rational/coordinate frame oracle, arbitrary dirty columns, cancellations and explicit forbidden-relaxation counterexamples." + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/frame_rank_cross.py", + "--source-dir", + "{package}/source", + "--source-receipt", + "{package}/RESULT.json" + ], + "timeout_seconds": 120, + "checks": "Separate Fraction elimination corroborates636 rational frame ranks,2904 MOVE differences and111 cap equalities against the committed primary receipt; no producer or primary checker import." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/frame_rank_cross.py", + "--source-dir", + "{package}/source", + "--source-receipt", + "{package}/RESULT.json" + ], + "timeout_seconds": 120, + "checks": "Separate Fraction elimination corroborates636 rational frame ranks,2904 MOVE differences and111 cap equalities against the committed primary receipt; no producer or primary checker import." + } + ] +} diff --git a/research/bit-copy-support-audit/frame_rank_cross.py b/research/bit-copy-support-audit/frame_rank_cross.py new file mode 100644 index 0000000000..631bd26e2d --- /dev/null +++ b/research/bit-copy-support-audit/frame_rank_cross.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +import json, gzip, hashlib, argparse +from fractions import Fraction +from pathlib import Path +from math import gcd + +parser=argparse.ArgumentParser() +parser.add_argument('--source-dir',type=Path,required=True) +parser.add_argument('--source-receipt',type=Path,required=True) +parser.add_argument('--output',type=Path) +args=parser.parse_args() +ROOT=args.source_dir +RECEIPT=args.source_receipt +def need(test,message): + if not test: raise RuntimeError(message) +def rank(rows): + a=[[Fraction(v) for v in row] for row in rows] + h=0 + for c in range(8): + i=next((i for i in range(h,len(a)) if a[i][c]),None) + if i is None: continue + a[h],a[i]=a[i],a[h] + pivot=a[h][c] + a[h]=[v/pivot for v in a[h]] + for j in range(h+1,len(a)): + v=a[j][c] + if v:a[j]=[u-v*w for u,w in zip(a[j],a[h])] + h+=1 + if h==len(a):break + return h +raws={name:(ROOT/(name+'.json.gz')).read_bytes() for name in ['WORD','GEOMETRY']} +word,geo=[json.loads(gzip.decompress(raws[name])) for name in ['WORD','GEOMETRY']] +expected=json.loads(RECEIPT.read_bytes())['actual_source_trace']['exact_rational_frame_ranks'] +ranks=[rank([geo['lines'][j] for j in frame]) for frame in geo['frames']] +need(ranks==expected,'fraction RREF disagreement with fraction-free submitted ranks') +frames=[set(x) for x in geo['frames']] +actual=word['start'][:]+[None] +moves=0 +for i,row in enumerate(word['records']): + op,d,s,c,f,_=row + if op==0: + need(actual[d]==s,'move entrance mismatch') + need(frames[s] <= frames[c], 'upward literal generator inclusion') + need(ranks[c]-ranks[s]==f and f>0,'move rank mismatch') + actual[d]=c;moves+=1 + elif op==1: + need(actual[d]==actual[s]==f,'ADD frame mismatch') + elif op==2:actual[660]=f + elif op==3:actual[660]=None +need(actual[:-1]==word['final'] and actual[-1] is None,'final frame mismatch') +for p in range(111): + n=geo['lines'][p] + fr=word['final'][111+p] + need(sum(x*x for x in n)==4 and ranks[fr]==7,'cap dimension') + need(all(sum(x*y for x,y in zip(n,geo['lines'][q]))==0 for q in frames[fr]),'cap orthogonality') +result={'status':'PASS','method':'independent Fraction Gaussian elimination with forward row reduction; no producer or submitted checker import','checked_frame_ranks':len(ranks),'checked_MOVE_events':moves,'checked_final_cap_equalities':111,'scope_excludes':['K/R coefficients','K-supported recipient projected ranks','decoded scalar endpoint','physical MOVE semantics'],'inputs':{k:hashlib.sha256(v).hexdigest() for k,v in raws.items()},'rank_census':{str(v):ranks.count(v) for v in sorted(set(ranks))}} +if args.output is not None: + args.output.write_text(json.dumps(result,sort_keys=True,indent=2)+'\n') +print(json.dumps(result,sort_keys=True)) diff --git a/research/bit-copy-support-audit/independent_oracle.py b/research/bit-copy-support-audit/independent_oracle.py new file mode 100644 index 0000000000..08e2368813 --- /dev/null +++ b/research/bit-copy-support-audit/independent_oracle.py @@ -0,0 +1,271 @@ +#!/usr/bin/env python3 +"""Independent finite support oracle; no predecessor implementation imports. + +Rational geometry and F2 coefficient arithmetic are deliberately separate. +Rows are exact decoded linear forms in independent q, dirty_a, dirty_b. +""" + +import argparse +from collections import Counter +from fractions import Fraction as Q +from itertools import product +import json +from pathlib import Path + + +def require(condition, message): + if not condition: + raise RuntimeError(message) + + +def reduced(rows, n=3): + rows = [[Q(value) for value in row] for row in rows if any(row)] + at = 0 + for column in range(n): + pivot = next((r for r in range(at, len(rows)) if rows[r][column]), None) + if pivot is None: + continue + rows[at], rows[pivot] = rows[pivot], rows[at] + scale = rows[at][column] + rows[at] = [value / scale for value in rows[at]] + for r in range(len(rows)): + if r != at and rows[r][column]: + scale = rows[r][column] + rows[r] = [a - scale * b for a, b in zip(rows[r], rows[at])] + at += 1 + if at == len(rows): + break + return tuple(tuple(row) for row in rows[:at]) + + +def perpendicular(frame, n=3): + pivots = [next(i for i, x in enumerate(row) if x) for row in frame] + answer = [] + for free in range(n): + if free in pivots: + continue + row = [Q(0)] * n + row[free] = Q(1) + for equation, pivot in zip(frame, pivots): + row[pivot] = -equation[free] + answer.append(row) + return reduced(answer, n) + + +def intersection(left, right): + return perpendicular(reduced(perpendicular(left) + perpendicular(right))) + + +def subset(left, right): + return reduced(left + right) == right + + +def frame_family(basis): + return tuple(reduced([basis[i] for i in range(3) if mask & (1 << i)]) + for mask in range(8)) + + +def check_geometry(frames): + require(len(set(frames)) == 8, "basis does not generate eight distinct frames") + contains = [[subset(left, right) for right in frames] for left in frames] + intersections = [[frames.index(intersection(a, b)) for b in frames] for a in frames] + for a in range(8): + for b in range(8): + meet = intersections[a][b] + require(contains[meet][a] and contains[meet][b], "intersection not a lower bound") + for c in range(8): + require(not (contains[c][a] and contains[c][b]) or contains[c][meet], + "intersection not the greatest lower bound") + return contains, intersections + + +def closed_walks(frames, contains, meets): + """Every strict nested closed private walk of zero through four edges.""" + neighbors = [[b for b in range(8) if b != a and (contains[a][b] or contains[b][a])] + for a in range(8)] + census = Counter() + meets_seen = Counter() + total = 0 + for start in range(8): + stack = [(start, (start,), start, 0, 0, 0)] + while stack: + current, path, meet, cost, upward, downward = stack.pop() + edges = len(path) - 1 + if current == start: + require(upward == downward and cost == upward + downward, + "closed walk has unequal upward/downward dimension charges") + require(2 * len(frames[meet]) >= 2 * len(frames[start]) - cost, + "closed-walk intersection dimension bound failed") + require(all(contains[meet][vertex] for vertex in path), + "walk intersection escapes a visited frame") + total += 1 + census[edges] += 1 + meets_seen[meet] += 1 + if edges < 4: + for target in neighbors[current]: + delta = len(frames[target]) - len(frames[current]) + stack.append((target, path + (target,), meets[meet][target], + cost + abs(delta), upward + max(delta, 0), + downward + max(-delta, 0))) + return {"closed_walks": total, "by_edge_count": dict(sorted(census.items())), + "intersection_frames_seen": len(meets_seen)} + + +def support_holds(frame_ids, rows, meet, contains): + return all(not (row & 1) or contains[meet][frame] + for frame, row in zip(frame_ids, rows)) + + +def exhaustive_inductive_transitions(frames, contains): + """All two-register linear states satisfying the invariant, not just samples. + + Each row has three independent F2 columns: q, dirty_a, dirty_b. + Every 0/1 scalar READ/ADD and all upward MOVE targets are tested. + This single-step closure covers arbitrary finite operation counts, but only + for these two finite frame families; the accompanying written induction is + needed for arbitrary rational geometries/register counts. + """ + counts = Counter() + for meet, first, second in product(range(8), repeat=3): + ids = (first, second) + for row_a, row_b in product(range(8), repeat=2): + rows = (row_a, row_b) + if not support_holds(ids, rows, meet, contains): + continue + counts["admissible_symbolic_states"] += 1 + for receiver in range(2): + for scalar in (0, 1): + # READ is available only at a private visited frame. Every + # such frame contains meet; grant every equal-frame read + # satisfying that necessary condition for this stronger test. + if contains[meet][ids[receiver]]: + new_rows = list(rows) + new_rows[receiver] ^= scalar + require(support_holds(ids, new_rows, meet, contains), + "equal-frame private read broke support") + counts["equal_frame_read_transitions"] += 1 + source = 1 - receiver + if ids[source] == ids[receiver]: + new_rows = list(rows) + new_rows[receiver] ^= scalar * rows[source] + require(support_holds(ids, new_rows, meet, contains), + "equal-frame public add broke support") + counts["equal_frame_add_transitions"] += 1 + for target in range(8): + if contains[ids[receiver]][target]: + new_ids = list(ids) + new_ids[receiver] = target + require(support_holds(new_ids, rows, meet, contains), + "upward public move broke support") + counts["upward_move_transitions"] += 1 + counts["all_transitions"] = sum(value for key, value in counts.items() + if key.endswith("_transitions")) + return dict(counts) + + +def evaluate(row, bits): + return (row & bits).bit_count() & 1 + + +def cancellation_control(frames, contains): + # q, a, b are independent. q is copied/read without changing its own value. + meet = 1 + ids = [meet, meet] + rows = [2, 4] + trace = [("initial", list(rows))] + rows[0] ^= 1 + trace.append(("read q into a", list(rows))) + rows[1] ^= rows[0] + trace.append(("add a into b", list(rows))) + rows[0] ^= 1 + trace.append(("read q into a again", list(rows))) + rows[1] ^= 1 + trace.append(("read q into b", list(rows))) + rows[1] ^= rows[0] + trace.append(("add restored a into b", list(rows))) + require(rows == [2, 4], "cancellation loop did not restore arbitrary dirty data") + require(all(support_holds(ids, pair, meet, contains) for _, pair in trace), + "cancellation loop broke support") + concrete = 0 + for bits in range(8): + a, b, q = (bits >> 1) & 1, (bits >> 2) & 1, bits & 1 + a ^= q + b ^= a + a ^= q + b ^= q + b ^= a + require([a, b] == [evaluate(row, bits) for row in rows], + "symbolic and concrete dirty loop disagree") + concrete += 1 + return {"symbolic_trace_columns_q_a_b": trace, + "all_concrete_dirty_and_q_assignments": concrete, + "restores_both_arbitrary_dirty_inputs": True} + + +def forbidden_controls(frames, contains): + zero, line = 0, 1 + require(not contains[line][zero], "counterexample line unexpectedly trivial") + # q + dirty_a, after an allowed equal-frame private read at line. + before_ids, before_rows = [line, zero], [3, 4] + require(support_holds(before_ids, before_rows, line, contains), + "counterexample premise already violates support") + # Forbidden move line -> zero transports the same decoded linear row. + downward_ids = [zero, zero] + require(not support_holds(downward_ids, before_rows, line, contains), + "downward-move mutant escaped detection") + # Forbidden ADD from line into a zero-frame receiver creates q there. + mismatched_rows = [3, 4 ^ 3] + require(not support_holds(before_ids, mismatched_rows, line, contains), + "mismatched-add mutant escaped detection") + # Both violations remain visible with all independent dirty assignments; + # compare q=0 and q=1 while fixing the dirty columns. + comparisons = 0 + for dirty_bits in range(4): + q_zero = dirty_bits << 1 + q_one = q_zero | 1 + require(evaluate(before_rows[0], q_zero) != evaluate(before_rows[0], q_one), + "downward mutant lost q influence") + require(evaluate(mismatched_rows[1], q_zero) != evaluate(mismatched_rows[1], q_one), + "mismatched-add mutant lost q influence") + comparisons += 2 + return {"downward_move_rejected": True, "mismatched_add_rejected": True, + "dirty_assignment_influence_comparisons": comparisons, + "downward_example": {"frames_before": before_ids, + "frames_after": downward_ids, "rows": before_rows}, + "mismatched_add_example": {"frames": before_ids, "rows_after": mismatched_rows}} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--out", type=Path) + args = parser.parse_args() + bases = { + "coordinate": ((1, 0, 0), (0, 1, 0), (0, 0, 1)), + "noncoordinate_rational": ((1, Q(1, 2), 0), (0, 1, Q(1, 3)), (Q(1, 5), 0, 1)), + } + result = {"status": "PASS", "ambient_dimension": 3, + "coefficient_field": "F2", "geometry_field": "Q", + "independent_columns": ["q", "dirty_a", "dirty_b"], + "scope": "finite symbolic induction and controls, not a full R438 source replay", + "families": {}} + for name, basis in bases.items(): + frames = frame_family(basis) + contains, meets = check_geometry(frames) + result["families"][name] = { + "frames": [[[str(value) for value in row] for row in frame] for frame in frames], + "walks": closed_walks(frames, contains, meets), + "influence": exhaustive_inductive_transitions(frames, contains), + "cancellation": cancellation_control(frames, contains), + "assumption_counterexamples": forbidden_controls(frames, contains), + } + result["total_closed_private_walks"] = sum(x["walks"]["closed_walks"] for x in result["families"].values()) + result["total_symbolic_states"] = sum(x["influence"]["admissible_symbolic_states"] for x in result["families"].values()) + result["total_transition_checks"] = sum(x["influence"]["all_transitions"] for x in result["families"].values()) + payload = json.dumps(result, indent=2, sort_keys=True) + "\n" + if args.out: + args.out.write_text(payload, encoding="utf-8") + print(json.dumps({key: value for key, value in result.items() if key != "families"}, sort_keys=True)) + + +if __name__ == "__main__": + main() diff --git a/research/bit-copy-support-audit/source_check.py b/research/bit-copy-support-audit/source_check.py new file mode 100644 index 0000000000..17efa6f15c --- /dev/null +++ b/research/bit-copy-support-audit/source_check.py @@ -0,0 +1,232 @@ +#!/usr/bin/env python3 +"""Independent finite support controls and exact predecessor trace applicability.""" +import argparse +from collections import Counter, deque +import gzip +from hashlib import sha256 +import json +from math import gcd +from pathlib import Path + +WORD_SHA = "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c" +GEOMETRY_SHA = "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022" + + +def need(ok, why): + if not ok: + raise ValueError(why) + + +def rational_rank(rows): + """Fraction-free primitive integer elimination, independent of producer.""" + def primitive(row): + g = 0 + for x in row: + g = gcd(g, abs(x)) + if g: + row = [x // g for x in row] + if next(x for x in row if x) < 0: + row = [-x for x in row] + return row + + basis = {} + for row in rows: + row = primitive(list(row)) + for pivot in sorted(basis): + if row[pivot]: + old = basis[pivot] + a, b = row[pivot], old[pivot] + row = primitive([b*x-a*y for x, y in zip(row, old)]) + pivot = next((j for j, x in enumerate(row) if x), None) + if pivot is not None: + basis[pivot] = row + return len(basis) + + +def tiny_closure(): + # Rational lines 0, e1, e2, e1+e2, and the plane represented by their + # intersections with these three nonzero root directions. For this + # finite lattice, set containment exactly equals rational containment. + frames = (0, 1, 2, 4, 7) + + def contained(a, b): + return a & ~b == 0 + + counts = [] + for low in frames: + seeds = {(a, b, 0, 0) for a in frames for b in frames} + seen, pending = set(seeds), deque(sorted(seeds)) + edges = 0 + while pending: + a, b, da, db = pending.popleft() + fs, ds = (a, b), (da, db) + need(all(not d or contained(low, f) for f, d in zip(fs, ds)), + "finite causal invariant") + successors = [] + for dest in range(2): + for newframe in frames: + if contained(fs[dest], newframe): + newfs = list(fs) + newfs[dest] = newframe + successors.append(tuple(newfs) + ds) + if contained(low, fs[dest]): + newds = list(ds) + newds[dest] ^= 1 + successors.append(fs + tuple(newds)) + if a == b: + successors.extend(((a, b, da ^ db, db), (a, b, da, db ^ da))) + edges += len(successors) + for nxt in successors: + if nxt not in seen: + seen.add(nxt) + pending.append(nxt) + counts.append({"L_mask": low, "reachable_states": len(seen), "edges": edges}) + return { + "scope": "Complete finite-state closure for two F2 public scalar differences over the five rational subspaces of Q2 represented by 0,e1,e2,e1+e2,Q2; arbitrary finite trace length, not a proof for all frame spaces", + "closures": counts, + "total_states": sum(x["reachable_states"] for x in counts), + "total_edges": sum(x["edges"] for x in counts), + } + + +def relaxation_controls(): + # Actual paired executions, with every dirt assignment and q in F2. + # Positive rank-one entrance COPY from Q2 to L=e1 and exact ERASE are + # outside this public trace; the source q never changes. + rows = [] + for q in (0, 1): + for a in (0, 1): + # Same logical scalar after a deliberately downward public move. + base, changed = a, a ^ q + need((base ^ changed) == q, "downward relaxation difference") + rows.append({"control": "downward_public_move", "q": q, + "dirty": [a], "baseline": base, "changed": changed}) + for b in (0, 1): + base, changed = b ^ a, b ^ (a ^ q) + need((base ^ changed) == q, "cross-frame ADD relaxation difference") + rows.append({"control": "unequal_frame_public_add", "q": q, + "dirty": [a, b], "baseline": base, "changed": changed}) + # A real cancellation control: two equal reads cancel in F2 at an + # allowed frame; this is accepted rather than counted as an obstruction. + need(all(a ^ q ^ q == a for a in (0, 1) for q in (0, 1)), + "F2 cancellation remains an accepted legal control") + return {"paired_executions": rows, + "nonzero_q_failure_count": sum(x["baseline"] != x["changed"] for x in rows), + "allowed_F2_cancellation_cases": 4, + "meaning": "Named relaxations permit influence outside L containment; original hypotheses are not contradicted"} + + +def actual_trace(inputs): + paths = {"word": inputs / "WORD.json.gz", "geometry": inputs / "GEOMETRY.json.gz"} + raws = {k: p.read_bytes() for k, p in paths.items()} + need(sha256(raws["word"]).hexdigest() == WORD_SHA, "word immutable hash") + need(sha256(raws["geometry"]).hexdigest() == GEOMETRY_SHA, "geometry immutable hash") + word, geom = (json.loads(gzip.decompress(raws[k])) for k in ("word", "geometry")) + rootsets = [frozenset(xs) for xs in geom["frames"]] + need(len(rootsets) == 636 and len(geom["lines"]) == 111, "actual source dimensions") + need(all(len(row) == 8 and all(type(x) is int for x in row) for row in geom["lines"]), + "integer eight-dimensional actual roots") + ranks = [rational_rank(geom["lines"][q] for q in roots) for roots in rootsets] + need(ranks[0] == 0 and ranks[1] == 8, "zero and full frame rational ranks") + current = word["start"][:] + [None] + need(len(current) == 661, "660 public and one private slot") + counts = Counter() + last_erase = None + copy_source = None + copy_rows = [] + last_target_add = None + frames_at = {} + for index, row in enumerate(word["records"]): + op, d, s, c, f, phase = row + need(0 <= d < 660 and 0 <= s <= 660, "operand range") + if op == 0: + need(current[d] == s, "MOVE entrance frame") + need(rootsets[s] <= rootsets[c], "upward MOVE via included root generators") + need(f > 0 and ranks[c] - ranks[s] == f, "positive exact rational MOVE rank") + current[d] = c + counts["MOVE"] += 1 + elif op == 1: + need(current[d] == current[s] == f, "ADD same actual frame") + need(c in (-1, 1), "fixed signed unit scalar") + need(d != copy_source, "active copied source is unchanged") + need(not 111 <= s < 222, "targets never feed another ADD") + if 111 <= d < 222: + last_target_add = index + counts["ADD"] += 1 + elif op == 2: + need(current[660] is None and copy_source is None and s == 660, "fresh COPY") + need(current[d] == c and rootsets[f] <= rootsets[c], "COPY source/destination frames") + need(ranks[c] > ranks[f], "strictly positive exact COPY rank") + current[660], copy_source = f, d + copy_rows.append({"index": index, "source_register": d, "source_frame": c}) + counts["COPY"] += 1 + elif op == 3: + need(s == 660 and d == copy_source, "ERASE same source") + need(current[d] == c and current[660] == f, "ERASE same actual frames") + current[660], copy_source = None, None + last_erase = index + frames_at[index + 1] = current[:] + counts["ERASE"] += 1 + else: + raise ValueError("unknown opcode") + need(current[:-1] == word["final"] and current[-1] is None, "exact final frame labels") + need(last_erase is not None and last_target_add is not None, "actual bounds exist") + begin, end = last_erase + 1, last_target_add + 1 + need((begin, end) == (24069, 25768), "exact postscatter interval") + suffix = word["records"][begin:end] + need(all(r[0] in (0, 1) for r in suffix), "suffix has no COPY or ERASE") + need(not any(r[0] in (0, 1) and 471 <= r[1] < 480 for r in suffix), + "nine source values and frames unchanged in suffix") + need([x["source_register"] for x in copy_rows] == list(range(471, 480)), + "nine actual source identities") + need(all(ranks[x["source_frame"]] == 7 for x in copy_rows), "nine source ranks seven") + dots = 0 + for p in range(111): + normal = geom["lines"][p] + cap = word["final"][111 + p] + need(sum(x*x for x in normal) == 4 and ranks[cap] == 7, + "nonzero norm-four root and rank-seven final cap") + for q in rootsets[cap]: + need(sum(a*b for a, b in zip(normal, geom["lines"][q])) == 0, + "final frame generators orthogonal to actual port root") + dots += 1 + return { + "word_sha256": WORD_SHA, + "geometry_sha256": GEOMETRY_SHA, + "records": len(word["records"]), + "operation_counts": dict(counts), + "postscatter_interval": [begin, end], + "postscatter_records": len(suffix), + "postscatter_counts": dict(Counter(str(r[0]) for r in suffix)), + "source_registers": list(range(471, 480)), + "source_entry_frames": frames_at[begin][471:480], + "final_cap_orthogonality_checks": dots, + "exact_rational_frame_ranks": ranks, + "rank_seven_final_caps": 111, + "rank_eight_full_frames": [i for i, rank in enumerate(ranks) if rank == 8], + "limits": "Checks actual trace, public upward containment via explicitly included root generators, all 636 supplied span ranks, signed same-frame ADDs, unchanged sources, no suffix COPY, exact final labels and equality of all final caps with their root-orthogonal hyperplanes. Does not compute complete root closures, actual R/K coefficients, full decoded endpoint, or physical MOVE semantics.", + } + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--source-dir", "--inputs", dest="inputs", type=Path, + default=Path(__file__).resolve().parent / "source") + parser.add_argument("--output", type=Path) + args = parser.parse_args() + receipt = { + "status": "PASS_INDEPENDENT_CAUSAL_SUPPORT_AUDIT_NO_NEW_KAPPA", + "predecessor_head": "ddfc3133cbdf548e163c867d5671f8f01dd5d5ae", + "finite_toy_closure": tiny_closure(), + "hypothesis_relaxation_controls": relaxation_controls(), + "actual_source_trace": actual_trace(args.inputs), + "code_sha256": sha256(Path(__file__).read_bytes()).hexdigest(), + "not_a_formal_kernel_proof": True, + } + if args.output is not None: + args.output.write_text(json.dumps(receipt, indent=2, sort_keys=True) + "\n") + print(receipt["status"]) + + +if __name__ == "__main__": + main() From 304cfbd1910cf7041e6e33ee7db9b2045e74d9f6 Mon Sep 17 00:00:00 2001 From: ToikY <27568617+ToikY@users.noreply.github.com> Date: Tue, 20 Oct 2026 08:46:57 -0700 Subject: [PATCH 3/3] Refresh final package seals while preserving original review chronology --- .../PACKAGE-REVIEW.json | 218 ++++++++++++++++-- 1 file changed, 201 insertions(+), 17 deletions(-) diff --git a/research/bit-copy-support-audit/PACKAGE-REVIEW.json b/research/bit-copy-support-audit/PACKAGE-REVIEW.json index e36357d2a9..c5b6a0b74c 100644 --- a/research/bit-copy-support-audit/PACKAGE-REVIEW.json +++ b/research/bit-copy-support-audit/PACKAGE-REVIEW.json @@ -1,16 +1,38 @@ { "base_commit": "12fa8c5c844be21bfefb38a19503fbd867a11244", - "checked_utc": "2026-10-20T14:37:58.175261+00:00", + "checked_utc": "2026-10-20T15:45:15.678417+00:00", "checks": { - "existing_WARM_log_contains_four_checks_and_final_PASS": true, - "five_inputs_match_retained_source_commit": true, - "five_package_inputs_match_export_bytes_sha256_git_blobs": true, - "four_registered_argv_static_inspection": true, - "new_scientific_replays_run_in_this_package_review": false, - "no_private_local_paths_in_public_text": true, - "science_proof_and_checkers_match_prior_review_hashes": true, - "scope_credit_and_open_obligations_consistent": true, - "two_canonical_provenance_bindings_match": true + "current_review_mapping_bindings_match": true, + "five_inputs_match_published_source_ancestor": true, + "no_shared_checkout_or_frozen_archive_edits": true, + "review_map_does_not_reference_package_review": true, + "scientific_proof_code_data_unchanged": true, + "seven_source_provenance_bindings_match": true, + "six_registered_argv_executed_successfully": true, + "twenty_current_listed_file_hashes_match_actual_public_head": true, + "twenty_current_listed_files_match_committed_public_bytes": true + }, + "current_file_sha256": { + "INDEPENDENT-REVIEW.json": "fb017e7e52e93faea72ac9ae8767c9a78833eec7ac7f1ad15f1875539c161411", + "INDEPENDENT-REVIEW.md": "2ed386bf3e9303005402408ac89f946547fe95663c6c78ac7cd896cffc087b29", + "ORACLE-NOTES.txt": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2", + "ORACLE-PROVENANCE.json": "38f798cbdf6ed2d77083252c32c84ea13d46f10c1c45ce9f43b2a7dcd8d4b298", + "ORACLE-RESULT.json": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "PRIMARY-REVIEW.json": "426cebf1ffe64ccf8ec5aebb4c43b3c620976b27ff97fa4592f6389881dba3a8", + "PROOF.md": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "README.md": "1dfc8efdaff043678c3c31d3cce9cb2434bf4ed2311e85f7aed6cd944aa9b3f8", + "RESULT.json": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "SOURCE-PINS.json": "4f221ead234f6d65ed726b26c0d2367c5db8bcd6d93f443ec02e8d5f50608445", + "SOURCES.json": "13134769eb5065e7020e75cd5da19255f407e48dbc40f297fcc41f50807db117", + "TASK.json": "235dfc4c8962449a20b84dec68ccea26a8891344d880a125fd6faf66381e70e9", + "VERIFY.json": "2f13e167ec8380da40ffa1691395ca9e0bbdc160df13e65425b3f04d94893881", + "independent_oracle.py": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3", + "source/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "source/NOTICE.md.txt": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea", + "source/PR4200-PROOF.md.txt": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd", + "source/RELATED-WORK.md.txt": "6cbc0c016897e1a2b65b16b23c8ce69f8d250b7ef612211a410027a5b18b9d5d", + "source/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "source_check.py": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826" }, "file_sha256": { "INDEPENDENT-REVIEW.json": "fb017e7e52e93faea72ac9ae8767c9a78833eec7ac7f1ad15f1875539c161411", @@ -20,12 +42,12 @@ "ORACLE-RESULT.json": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", "PRIMARY-REVIEW.json": "426cebf1ffe64ccf8ec5aebb4c43b3c620976b27ff97fa4592f6389881dba3a8", "PROOF.md": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", - "README.md": "b2c612df27f4a8fc0d57a9ffb2b907a18efb287497f8753ceb9a2429104720bc", + "README.md": "1dfc8efdaff043678c3c31d3cce9cb2434bf4ed2311e85f7aed6cd944aa9b3f8", "RESULT.json": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", "SOURCE-PINS.json": "4f221ead234f6d65ed726b26c0d2367c5db8bcd6d93f443ec02e8d5f50608445", - "SOURCES.json": "675bed1c3572069d271249c0ea011cb72d8cd435f648ddf9be042bd379584b7f", + "SOURCES.json": "13134769eb5065e7020e75cd5da19255f407e48dbc40f297fcc41f50807db117", "TASK.json": "235dfc4c8962449a20b84dec68ccea26a8891344d880a125fd6faf66381e70e9", - "VERIFY.json": "e9370cc013162a59ddc18fce942d0b226f2d270f51220669e092ddbc2e4fee61", + "VERIFY.json": "2f13e167ec8380da40ffa1691395ca9e0bbdc160df13e65425b3f04d94893881", "independent_oracle.py": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3", "source/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", "source/NOTICE.md.txt": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea", @@ -34,13 +56,130 @@ "source/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", "source_check.py": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826" }, + "final_root_binding": { + "changed_metadata_hashes": { + "README.md": { + "new_sha256": "1dfc8efdaff043678c3c31d3cce9cb2434bf4ed2311e85f7aed6cd944aa9b3f8", + "old_sha256": "b2c612df27f4a8fc0d57a9ffb2b907a18efb287497f8753ceb9a2429104720bc" + }, + "SOURCES.json": { + "new_sha256": "13134769eb5065e7020e75cd5da19255f407e48dbc40f297fcc41f50807db117", + "old_sha256": "675bed1c3572069d271249c0ea011cb72d8cd435f648ddf9be042bd379584b7f" + }, + "VERIFY.json": { + "new_sha256": "2f13e167ec8380da40ffa1691395ca9e0bbdc160df13e65425b3f04d94893881", + "old_sha256": "e9370cc013162a59ddc18fce942d0b226f2d270f51220669e092ddbc2e4fee61" + } + }, + "checked_utc": "2026-10-20T15:45:15.678417+00:00", + "chronology": "The initial review checked its earlier snapshot at initial_review_checked_utc. This later follow-up does not claim those publication-time files or six commands were checked by the original report at its original timestamp.", + "current_listed_files_checked": 20, + "feedback_credit": "James Reed (rcfc-jreed), PR4206 issuecomment-6294840185, identified the three stale metadata hashes.", + "feedback_url": "https://github.com/CrocSwap/integer-mult-bounds/pull/4206#issuecomment-6294840185", + "historical_listed_files_preserved": 20, + "inspected_public_head": "e77cea5e7998b20fc7126019bd8368d7989fdb33", + "original_report_sha256": "90580d44d73c3fc0ab47436799afe12d8a1ab565743e42df0ddc18dbaeb1c198", + "publication_state": "Prepared reviewer follow-up only; the coordinator must commit/publish this one-file change and verify its resulting new head separately.", + "published_source_ancestor": "2c2b29438773f12b3bb5903723c3bb16f0dcd583", + "python": "3.12.14", + "registered_commands": [ + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/source_check.py" + ], + "exit": 0, + "stderr_bytes": 0, + "stdout_sha256": "3ff55c9bc86d8cb5a1473e714292a96db17351f98232f66d6bfe97bebfdc28f8" + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/source_check.py" + ], + "exit": 0, + "stderr_bytes": 0, + "stdout_sha256": "3ff55c9bc86d8cb5a1473e714292a96db17351f98232f66d6bfe97bebfdc28f8" + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/independent_oracle.py" + ], + "exit": 0, + "stderr_bytes": 0, + "stdout_sha256": "8bb789785bfb85f58a4157ad9294f97ad382edaf30cf5bc12b9df37cc7f4b5bb" + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/independent_oracle.py" + ], + "exit": 0, + "stderr_bytes": 0, + "stdout_sha256": "8bb789785bfb85f58a4157ad9294f97ad382edaf30cf5bc12b9df37cc7f4b5bb" + }, + { + "argv": [ + "{python}", + "-I", + "-B", + "{package}/frame_rank_cross.py", + "--source-dir", + "{package}/source", + "--source-receipt", + "{package}/RESULT.json" + ], + "exit": 0, + "stderr_bytes": 0, + "stdout_sha256": "027a9a9922d86985999fcafc5568bde54885655cf7d713af5d7f1db1436892e5" + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/frame_rank_cross.py", + "--source-dir", + "{package}/source", + "--source-receipt", + "{package}/RESULT.json" + ], + "exit": 0, + "stderr_bytes": 0, + "stdout_sha256": "027a9a9922d86985999fcafc5568bde54885655cf7d713af5d7f1db1436892e5" + } + ], + "review_mapping_current_bindings_checked": 20, + "review_mapping_historical_cli_entries": 3, + "scope": "Follow-up metadata and receipt binding only. Current file_sha256 and current_file_sha256 are identical current seals; historical_file_sha256 is the complete original twenty-entry snapshot. No scientific code/proof/data changed." + }, "findings": [ { "issue": "The claimed third Fraction checker and crosscheck receipt are hashed in the copied review but are absent from the package. Review receipt original names also lack publication mappings except the oracle provenance.", "location": "INDEPENDENT-REVIEW.json files; INDEPENDENT-REVIEW.md verification paragraph", "minimal_fix": "Retain portable frame_rank_cross.py and one FRAME-RANK-CROSS-V2.json receipt; record original review/CHECK names to actual package mappings, explicitly identify earlier CLI receipts as historical superseded evidence.", - "resolution": "Reviewer froze portable final helper and unchanged result receipt. Root will retain both and add REVIEW-FILE-MAP.json distinguishing historical CLI hashes/receipt names from current bindings. Pending final root package byte check.", - "severity": "evidence preservation" + "resolution": "Resolved in the inspected public package: portable Fraction helper/result retained, twenty current review mappings plus three historical CLI classifications match. Follow-up at 2026-10-20T15:45:15.678417+00:00 verifies all twenty listed files against the current public head and executes all six registered argv.", + "resolved_checked_utc": "2026-10-20T15:45:15.678417+00:00", + "severity": "evidence preservation", + "status": "resolved" } ], "helper_cli_addendum": { @@ -75,14 +214,59 @@ "optimized_exit": 0, "prior_helper_sha256": "34aba82f60452cb341942f8f5577030fea4a74b804dad04e17fbae24cf08e91d" }, + "historical_checks": { + "existing_WARM_log_contains_four_checks_and_final_PASS": true, + "five_inputs_match_retained_source_commit": true, + "five_package_inputs_match_export_bytes_sha256_git_blobs": true, + "four_registered_argv_static_inspection": true, + "new_scientific_replays_run_in_this_package_review": false, + "no_private_local_paths_in_public_text": true, + "science_proof_and_checkers_match_prior_review_hashes": true, + "scope_credit_and_open_obligations_consistent": true, + "two_canonical_provenance_bindings_match": true + }, + "historical_file_sha256": { + "INDEPENDENT-REVIEW.json": "fb017e7e52e93faea72ac9ae8767c9a78833eec7ac7f1ad15f1875539c161411", + "INDEPENDENT-REVIEW.md": "2ed386bf3e9303005402408ac89f946547fe95663c6c78ac7cd896cffc087b29", + "ORACLE-NOTES.txt": "5f80466e60f99250ef65f4c0b6cbd7eadc159f064b79196183f5679e2b9609c2", + "ORACLE-PROVENANCE.json": "38f798cbdf6ed2d77083252c32c84ea13d46f10c1c45ce9f43b2a7dcd8d4b298", + "ORACLE-RESULT.json": "938b42ded10164d2d6e331f0592ae3f676e0d120ba3c9bc5c33545319226f8f7", + "PRIMARY-REVIEW.json": "426cebf1ffe64ccf8ec5aebb4c43b3c620976b27ff97fa4592f6389881dba3a8", + "PROOF.md": "e808578fb46b2eba8e407acd710ee214ae2e31bc02c72e189e592e60111c2ef5", + "README.md": "b2c612df27f4a8fc0d57a9ffb2b907a18efb287497f8753ceb9a2429104720bc", + "RESULT.json": "080f4a39d9cea4a37afb1df8626a0b7ef9fe15c0a0c9a614740c03d51146f270", + "SOURCE-PINS.json": "4f221ead234f6d65ed726b26c0d2367c5db8bcd6d93f443ec02e8d5f50608445", + "SOURCES.json": "675bed1c3572069d271249c0ea011cb72d8cd435f648ddf9be042bd379584b7f", + "TASK.json": "235dfc4c8962449a20b84dec68ccea26a8891344d880a125fd6faf66381e70e9", + "VERIFY.json": "e9370cc013162a59ddc18fce942d0b226f2d270f51220669e092ddbc2e4fee61", + "independent_oracle.py": "58ead94a392f2f74d27f408fa98cf7077a0edae3e15352b7897759ee6197dfa3", + "source/GEOMETRY.json.gz": "a353999bceac4ac957f540adfd3e5f8768297138b27132eeb83332e2ea4b1022", + "source/NOTICE.md.txt": "5af1ffd47973e696b501c36ba27e66b7888479c1dc9130978f77c966217ff4ea", + "source/PR4200-PROOF.md.txt": "0993a370d83b7a3cae2fe98b8b36b274719f94c66ac189b2b87be118863762bd", + "source/RELATED-WORK.md.txt": "6cbc0c016897e1a2b65b16b23c8ce69f8d250b7ef612211a410027a5b18b9d5d", + "source/WORD.json.gz": "c46ccd7d3eedabc6a7efbb1a91ec13f2928bad8ee0bac57c6e593a092d13d96c", + "source_check.py": "0c078ec9831c53c2671d398be9a991db34747fe76db1bf7691aaf2546d808826" + }, + "historical_findings": [ + { + "issue": "The claimed third Fraction checker and crosscheck receipt are hashed in the copied review but are absent from the package. Review receipt original names also lack publication mappings except the oracle provenance.", + "location": "INDEPENDENT-REVIEW.json files; INDEPENDENT-REVIEW.md verification paragraph", + "minimal_fix": "Retain portable frame_rank_cross.py and one FRAME-RANK-CROSS-V2.json receipt; record original review/CHECK names to actual package mappings, explicitly identify earlier CLI receipts as historical superseded evidence.", + "resolution": "Reviewer froze portable final helper and unchanged result receipt. Root will retain both and add REVIEW-FILE-MAP.json distinguishing historical CLI hashes/receipt names from current bindings. Pending final root package byte check.", + "severity": "evidence preservation" + } + ], + "historical_retained_source_commit": "092718e959c25c85017f6463cdf66bb3f91de071", + "historical_status": "PASS_SCIENTIFIC_SCOPE_RESOLUTION_PENDING_ROOT_BINDING", + "initial_review_checked_utc": "2026-10-20T14:37:58.175261+00:00", "no_post_merge_or_frontier_write": true, "package": "research/bit-copy-support-audit", - "retained_source_commit": "092718e959c25c85017f6463cdf66bb3f91de071", + "retained_source_commit": "2c2b29438773f12b3bb5903723c3bb16f0dcd583", "reviewer": "separate OpenAI Codex agent; not human or formal-kernel acceptance", "scope_limits": [ "No proof of K/R or required-recipient projected ranks by the new checker", "No full decoded endpoint, physical MOVE, invoice, precision or outer theorem", "No new kappa" ], - "status": "PASS_SCIENTIFIC_SCOPE_RESOLUTION_PENDING_ROOT_BINDING" + "status": "PASS_FINAL_ROOT_BINDING_SIX_REGISTERED_COMMANDS_AND_CURRENT_TWENTY_FILE_SEAL" }