From c28110134390499b181ad62f5047514da4f3d5d1 Mon Sep 17 00:00:00 2001 From: ToikY <27568617+ToikY@users.noreply.github.com> Date: Mon, 26 Oct 2026 13:43:18 -0700 Subject: [PATCH] research: independently audit the first asynchronous helper hub Bind PR5786 step1 to the exact PR5774 word, independent temporal histories, a 791-axis literal scalar/frame split and an opposite-direction oracle. Retain Ali Romman and all source credit. New audit by ToikY with substantial OpenAI Codex assistance and separate implementation/review contexts. No native-phase, complete invoice, caller/compiler or kappa admission. --- research/p104-async-first-hub-audit/NOTICE | 67 +++ .../p104-async-first-hub-audit/ORACLE.json | 229 +++++++++ research/p104-async-first-hub-audit/PROOF.md | 156 ++++++ research/p104-async-first-hub-audit/README.md | 84 ++++ .../p104-async-first-hub-audit/RESULT.json | 160 ++++++ .../p104-async-first-hub-audit/SOURCES.json | 41 ++ research/p104-async-first-hub-audit/TASK.json | 108 ++++ .../p104-async-first-hub-audit/VERIFY.json | 47 ++ .../inputs/PLAN.json | 193 ++++++++ .../inputs/WORD.json.gz | Bin 0 -> 122348 bytes research/p104-async-first-hub-audit/oracle.py | 196 ++++++++ research/p104-async-first-hub-audit/verify.py | 465 ++++++++++++++++++ 12 files changed, 1746 insertions(+) create mode 100644 research/p104-async-first-hub-audit/NOTICE create mode 100644 research/p104-async-first-hub-audit/ORACLE.json create mode 100644 research/p104-async-first-hub-audit/PROOF.md create mode 100644 research/p104-async-first-hub-audit/README.md create mode 100644 research/p104-async-first-hub-audit/RESULT.json create mode 100644 research/p104-async-first-hub-audit/SOURCES.json create mode 100644 research/p104-async-first-hub-audit/TASK.json create mode 100644 research/p104-async-first-hub-audit/VERIFY.json create mode 100644 research/p104-async-first-hub-audit/inputs/PLAN.json create mode 100644 research/p104-async-first-hub-audit/inputs/WORD.json.gz create mode 100644 research/p104-async-first-hub-audit/oracle.py create mode 100644 research/p104-async-first-hub-audit/verify.py diff --git a/research/p104-async-first-hub-audit/NOTICE b/research/p104-async-first-hub-audit/NOTICE new file mode 100644 index 0000000000..f3c2f7136c --- /dev/null +++ b/research/p104-async-first-hub-audit/NOTICE @@ -0,0 +1,67 @@ +Asynchronous helper hubs +New work: Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. + +Retained native copies from PR5774 at 7d6ec0cdef31d0c37b7d2563e709979caa0d5eae. +All prior credit follows unchanged. + +Paid intermediate meetings and collective helper splits. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +No subagents. All checks are author-side calculations. + +The complete PR5718 notice follows unchanged. + +Four paid interior public-basis changes. +Ali Romman, with substantial OpenAI Codex assistance. Apache-2.0. +No subagents. + +The following exact notice is retained from PR5660. + +New helper-subspace construction, proof and replay: +Ali Romman with substantial OpenAI Codex assistance. Apache-2.0. +The same assistant performed the construction and author-side checks. + +Retained contributions: +flyingviper: PR5605 shared relay, PR5612 delayed relay, and the PR5608/PR5613 +relay/split compositions. +Scratch-net: PR5606 prepared-helper identities and target debit. +Pierre-Loic Doulcet (hexapode): PR5565 commuting-contact construction, used as the exact source. +Ali Romman: PR5602 fixed boundary relations, PR5601 three-contact frame +change, PR5580 contact step, +and PR5544/5545 complete P104 caller. +Joel Pulikkan (GamingPuzzled): PR5569 priced helper handoff. +DreamingOfClouds: PR5561 free helper endpoints and PR5568 search tools. +thu-nmrc: PR5551 contact improvements. +Gareth Davidson (bitplane): PR2305 source composition. +David Arias: PR2152 coalesced P104 word. +Cinna Davis: PR2219 private reuse and the controller lineage. +Jacob Alan Sussman: productive mixed-target recursion. +zxv and Cao Yifan: exact intervals, compiler and native/pricing lineage. +GamingPuzzled: PR5472 successor handoff, a predecessor to the split concept. +The retained source notices preserve earlier geometry, BIT and analytic credit. + +The elementary rank-one basis identity is not claimed as a new general +linear-algebra theorem. The contribution is its explicit independent-target +use on this P104 word and the complete conditional kappa improvement. + +New contribution: Ali Romman, with substantial OpenAI Codex assistance. +The four-gate source-version rewrite composes zxv PR5643 and Ali Romman PR5644. +The A2 method retains Chris R/Clear1nsight PR3998 and ToikY PR4019 credit. +The compensated triangle method retains Cinna Davis PR4692 credit. +No subagents were used for this contribution. Apache-2.0. + +Concurrent PR5650 by zxv publishes the PR5643/PR5644 composition. PR5651 by +Ali Romman corroborates it. This package credits that released composition +and contributes the further four-gate placement. + +New work: distributed scalar updates on an unobserved public field interval, the exact witness and complete conditional price. Prepared for Ali Romman with substantial OpenAI Codex assistance. No subagents. Apache-2.0. The source archive retains all predecessor notices. + +Two-boundary main-assisted helper split and early cleanup: flyingviper with substantial +OpenAI Codex assistance, including independent AI review agents. Apache-2.0. + +Retained native-copy construction +Prepared by Ali Romman with substantial OpenAI Codex assistance. No subagents. +The paid-meeting source is PR5751 by Ali Romman with OpenAI Codex assistance. +The dimension-four span [265,194,164,75] is from Joel Pulikkan / GamingPuzzled +PR5739, with Claude Opus 5.5 assistance. The R22 block edits are not included. +The retained-copy mechanism, exact constructor, source-specific verification, +new price and proof are the contribution of this package. Apache-2.0. diff --git a/research/p104-async-first-hub-audit/ORACLE.json b/research/p104-async-first-hub-audit/ORACLE.json new file mode 100644 index 0000000000..3b92e6dd10 --- /dev/null +++ b/research/p104-async-first-hub-audit/ORACLE.json @@ -0,0 +1,229 @@ +{ + "axes": 789, + "basis_commutes_with_literal_source": true, + "canonical_word_sha256": "75f429fc0c8b206f4439bfbda4b621fc62ea892e6e3008c17409f2d3ee0981bb", + "eligible_support": [ + 133, + 696, + 697, + 699, + 709, + 733 + ], + "individual_injections": [ + { + "delivered": { + "113": "1", + "118": "-1", + "120": "-1", + "122": "1", + "123": "1", + "124": "-1", + "127": "-1", + "129": "-1", + "132": "-1", + "133": "1", + "136": "1", + "138": "1", + "140": "1", + "143": "1", + "144": "1", + "147": "1", + "148": "-1", + "150": "1", + "153": "-1", + "154": "-1", + "157": "-1", + "158": "-1", + "159": "-1", + "160": "-1", + "164": "1", + "165": "1", + "168": "1", + "170": "-1", + "174": "-1", + "175": "-1", + "178": "1", + "179": "-1", + "182": "-1", + "183": "-1", + "187": "1", + "189": "1", + "192": "-1", + "194": "-1", + "197": "1", + "198": "1", + "200": "1", + "202": "1", + "203": "1", + "207": "-1", + "210": "-1", + "212": "-1", + "215": "-1", + "217": "1", + "218": "1", + "219": "-1", + "222": "-1", + "223": "-1", + "696": "1" + }, + "role": 696, + "time2": 27044 + }, + { + "delivered": { + "113": "1", + "118": "-1", + "120": "-1", + "122": "1", + "123": "1", + "124": "-1", + "127": "-1", + "129": "-1", + "132": "-1", + "133": "1", + "136": "1", + "138": "1", + "140": "1", + "143": "1", + "144": "1", + "147": "1", + "148": "-1", + "149": "-1", + "150": "1", + "153": "-1", + "154": "-1", + "157": "-1", + "158": "-1", + "159": "-1", + "160": "-1", + "164": "1", + "165": "1", + "168": "1", + "170": "-1", + "174": "-1", + "175": "-1", + "178": "1", + "179": "-1", + "182": "-1", + "183": "-1", + "187": "1", + "189": "1", + "192": "-1", + "194": "-1", + "197": "1", + "198": "1", + "200": "1", + "202": "1", + "203": "1", + "207": "-1", + "210": "-1", + "212": "-1", + "215": "-1", + "217": "1", + "218": "1", + "219": "-1", + "223": "-1", + "697": "1" + }, + "role": 697, + "time2": 27044 + }, + { + "delivered": { + "113": "-2", + "118": "2", + "120": "2", + "122": "-2", + "123": "-2", + "124": "2", + "127": "2", + "129": "2", + "132": "2", + "136": "-2", + "138": "-2", + "140": "-2", + "143": "-2", + "144": "-2", + "147": "-2", + "148": "2", + "149": "2", + "150": "-2", + "153": "2", + "154": "2", + "157": "2", + "158": "2", + "159": "2", + "160": "2", + "164": "-2", + "165": "-2", + "168": "-2", + "170": "2", + "174": "2", + "175": "2", + "178": "-2", + "179": "2", + "182": "2", + "183": "2", + "187": "-2", + "189": "-2", + "192": "2", + "194": "2", + "197": "-2", + "198": "-2", + "200": "-2", + "202": "-2", + "203": "-2", + "207": "2", + "210": "2", + "212": "2", + "215": "2", + "217": "-2", + "218": "-2", + "219": "2", + "222": "2", + "223": "2", + "695": "1", + "709": "1", + "733": "1" + }, + "role": 770, + "time2": 27501 + }, + { + "delivered": { + "149": "-1", + "222": "-1", + "695": "-1", + "699": "1" + }, + "role": 699, + "time2": 27516 + } + ], + "input_row": { + "696": "1" + }, + "output_column": { + "133": "2", + "696": "1", + "697": "1", + "699": "1", + "709": "1", + "733": "1" + }, + "plan_sha256": "2c4878f78dc393339f8cccf24441d9bfb50257784459c2f253ebcb27c964211c", + "scope": "Exact decoded temporal identities only; native phases, physical contact legality, full source endpoint and complete price remain separate obligations.", + "source_identity_columns": [ + 133, + 696, + 697, + 699, + 709, + 733 + ], + "source_identity_row": 696, + "source_word_sha256": "7c393444fa5b9a6941471d02047beb2aa8285e5614bb052fb85458b69236a38a", + "status": "PASS_P104_ASYNC_FIRST_HUB_ORACLE", + "unit_pairing": "1" +} diff --git a/research/p104-async-first-hub-audit/PROOF.md b/research/p104-async-first-hub-audit/PROOF.md new file mode 100644 index 0000000000..1cfe1125ac --- /dev/null +++ b/research/p104-async-first-hub-audit/PROOF.md @@ -0,0 +1,156 @@ +# One temporal helper split: scalar implication and source boundary + +This is an independent audit of **step 1 only** of Ali Romman's PR #5786 at +`6b936acd68a7e0f9062037900f0fe9bc4b6fdd25`, using its pinned PLAN and the +PR #5774 word at `7d6ec0cdef31d0c37b7d2563e709979caa0d5eae`. +The algebra below is quantified over arbitrary inputs. Its source instantiation +checks temporal scalar data and frames; it does not admit the complete caller. + +## Quantified temporal lemma + +Work over the rational scalars with the source's permitted dyadic operations. +Let a finite linear word have public input vector x and arbitrary dirty owned +input vector a. Under its charged INIT/CLEAR semantics its complete endpoint is +`(T x, 0_owned)`, independent of a. Let G be a set of independent public helper +coordinates with common zero entrance frame and common full exit frame V. +Require both rows and columns of T on G to be those of the identity: equivalently, +`T = I_G direct-sum T_rest` in this coordinate decomposition. In particular, an +admissible change of basis on G commutes with T. + +Fix h in G, an intermediate frame F, and a cut where the physical field h is +live at F. Suppose the following data are supplied and checked against the +actual word, including all public and dirty owned columns: + +1. Collection contacts, all at F and no later than the cut, have complete + prefix row c. Its support is in G; its dirty owned coefficients vanish. +2. Injection contacts, all at F and no earlier than the cut, have complete + suffix column d into all old outputs. Its support is in G, including zero + components on old owned outputs. Thus injecting a common scalar u adds d u. +3. `c d = 1`, and there is an admissible invertible dyadic basis Q on G with + `Q e_h = d` and `c Q = e_h^T`. Both boundary basis changes are legal at the + common entrance and exit frames. +4. A separately charged owned buffer can remain live at F from the first + collection through the last injection. Every interior contact is available + through a paid, admissible query subdivision; all required primitive costs + and owned storage are retained. These are hypotheses about implementation, + not consequences of the scalar pairing. + +Then one can replace helper h's old zero-to-V target by two independent public +targets, zero-to-F and F-to-V, while retaining every other prescribed public +output and zeroing every owned output under the same INIT/CLEAR semantics. +The target ranks become `dim(F)` and `dim(V)-dim(F)`. + +For completeness, when `d_h` is a unit in the dyadic ring, a concrete Q is +`B D A`, where + +``` +A = I - e_h sum_(j != h) c_j e_j^T, +D scales coordinate h by d_h, +B = I + sum_(j != h) (d_j/d_h) e_j e_h^T. +``` + +All factors are invertible and admissible under that unit hypothesis. +Immediately `B D A e_h = d`. The unit pairing gives +`c B D = e_h^T + sum_(j != h) c_j e_j^T`, so `c B D A = e_h^T`. +The present instance has `d_h = 1`. + +## Proof, with the buffer value retained + +Apply Q to the public helper inputs at their common entrance. Initialize the +new owned buffer b at the first collection. Its incoming value is arbitrary; +the inherited, charged INIT primitive removes its dependence on that value. +Accumulate the collection contacts without changing their source fields. +Their sum is `c Q x = x_h`, independently of every dirty owned input. +No inverse of a possibly singular prefix is used. + +At the cut write y for the old value of physical field h. Introduce a fresh, +independent public input z at F. Initially `(h,b,fresh) = (y,x_h,z)`. Perform + +``` +swap(h,b); swap(fresh,b); b <- b - h. +``` + +Each scalar swap is three ADDs and one SCALE by -1: on coordinates (p,q), use +`p<-p+q; q<-q-p; p<-p+q; q<--q`. Thus the displayed sequence leaves +`(h,b,fresh) = (x_h,z-x_h,y)`. Retire physical h at F. Rename **every** remaining +reference in its old trajectory to fresh, including its final boundary-basis +reference. The source continuation therefore begins with its original y; +there is no assumption that y equals x_h. + +Keep b at F and inject its unchanged value at the stated later contacts. +Linearity of the complete suffix histories makes the resulting correction +exactly `d(z-x_h)`, including zero correction on every old owned output. +The continuing old-coordinate output before the final basis inverse is + +``` +T Q x + d(z-x_h). +``` + +Since T commutes with Q and `Q^-1 d = e_h`, applying the legal terminal Q^-1 +gives `T x + e_h(z-x_h)`. Its h coordinate is z, every other old public output +is unchanged, and all old owned outputs remain zero. The retired physical +field holds x_h at F. These are the two independent targets asserted above. + +After its last injection **the buffer still contains `z-x_h` in general**. +Its final zero is supplied by the inherited, charged CLEAR primitive. This +argument does not derive reversible erasure of an arbitrary scalar, supply +free clean storage, or discharge the framework assumption behind INIT/CLEAR. + +## Exact first-step binding and limits + +For the pinned step, h is 696, F is frame 1031, and the cut time2 is 27044. +An even time2 denotes the boundary before event `time2/2`; an odd value is an +interior contact in the indexed MOVE. The collection is field 696 at 27026. +The injection contacts are fields 696 and 697 at 27044, owned field 770 at +27501, and field 699 at 27516. The complete row and column to check are + +``` +c = e_696^T, +d = e_696 + e_697 + e_699 + e_709 + e_733 + 2 e_133. +``` + +All six coordinates in d enter at frame 3 (the zero space) and exit at frame +127 (dimension nine). They belong to the identity block of the prescribed +source endpoint `I + sum_(r live) e_(r+112) e_r^T`. Thus `c d = 1`, `d_696 = 1`, +and the boundary-basis conditions hold. These support facts alone do not +establish the temporal rows: the verifier separately checks complete +prefix/suffix histories and the actual source contact frames and lifetime. + +The odd injection contact is inside source event 13750, +`MOVE 770 591 597 owned=true`. The actual frame dimensions are 8, 5, 1, and +the required descending inclusions are `591 > 1031 > 597`. Its paid ranks +are consequently `7 -> (3,4)`, with access-query cost change +`H3 + H4 - H7`, where `Hr = r^t`. This is a frame/rank audit of this single +subdivision, not the full step invoice. In particular, `2H1-H2` is not the +cost change for this first-step query. The split helper targets have ranks +5 and 4 instead of 9. + +The verifier also emits and replays this first split in an independent formal +namespace: old public labels 0 through 766 and owned labels 767 through 788 +are retained, fresh public input z is label 789, and the new owned buffer is +790. It emits the initial basis, collection, all nine cut operations, all four +injections, the two real-frame query segments with their intervening injection, +the charged buffer CLEAR, and the terminal basis inverse. All source references +to 696 at or after the cut are renamed to 789; the terminal inverse uses 789 +as well. This is not a byte-identity claim for the author's emitted word. + +The literal witness has 25,909 events, 25 owned lifetimes and peak 12 live +owned fields. Exact replay checks all `791^2 = 625,681` endpoint coefficient +positions, including every arbitrary dirty owned input axis. It restores all +old public values and zero owned outputs, retires 696 at frame 1031 and ends +789 at frame 127. Immediately before CLEAR the buffer row is exactly +`e_789^T - e_696^T`. Omitting that CLEAR and omitting the first swap's SCALE +are separately rejected by endpoint discrepancies. Thus the finite decoded +scalar/frame restoration and emitted owned-lifetime closure are checked; +their complete native implementation and price remain separate obligations. + +This audit does not check native maps or absolute phases, price all boundary +and lifetime operations, replay steps 2 or 3, verify the physical caller, +establish an ordinary compiler, or admit a full conditional kappa bound. +Static unit pairing without the checked temporal frames, complete histories, +legal bases, and funded owned lifetime cannot justify the target split. + +Credit: Ali Romman with OpenAI Codex assistance for the source temporal +construction, PLAN, PR #5774 word and retained predecessor lineage in NOTICE. +This scoped proof/audit was prepared by ToikY with substantial OpenAI Codex +assistance, using separate implementation and review contexts. Apache-2.0. diff --git a/research/p104-async-first-hub-audit/README.md b/research/p104-async-first-hub-audit/README.md new file mode 100644 index 0000000000..7d2dc484a9 --- /dev/null +++ b/research/p104-async-first-hub-audit/README.md @@ -0,0 +1,84 @@ +# Independent audit of the first asynchronous helper hub + +This checks one temporal implication in Ali Romman's PR #5786 at +`6b936acd68a7e0f9062037900f0fe9bc4b6fdd25`, on its exact PR #5774 source +`7d6ec0cdef31d0c37b7d2563e709979caa0d5eae`. It answers the first-step review +request in [Discussion #5600](https://github.com/CrocSwap/integer-mult-bounds/discussions/5600#discussioncomment-19202381). +The [audit claim](https://github.com/CrocSwap/integer-mult-bounds/discussions/5600#discussioncomment-19203981) distinguishes this from the active different-output-owner construction. The new result is an independently implemented source-data audit and quantified +scalar implication, not a new construction or conditional bound. + +The fixed object is pivot 696, frame 1031, cut time2=27044. Collection reads +field 696 at 27026. Four injections read the retained difference buffer into +696/697 at 27044, owned 770 at 27501, and 699 at 27516. The odd time is inside +actual source query 13750; event numbers apply only to this frozen source. + +The complete temporal row is `c=e696^T`, and the complete delivery column is +`d=e696+e697+e699+e709+e733+2e133`, with `c*d=1`. Role 133 is an eligible +helper hole: main roles are derived from the actual live ports and their +offset 112 partners, rather than treating every role below 224 as main. +The independent oracle checks all 789 axes and establishes commutation of the +actual boundary basis with the literal source endpoint. Individual injection +contributions need not have helper-only support; their exact sum does. + +The actual owned query is `MOVE 770:591->597`. Frame dimensions are 8, 5, 1 +through the inserted frame 1031. Its descending subspaces give paid ranks +`7 -> (3,4)`, so the **access-query delta only** is `H3+H4-H7`, where +`Hr=r^t`. The helper target splits into ranks 5 and 4. The full step invoice +also owes boundary bases, scalar swaps, owned initialization/erasure and +routing. This package does not price that full invoice or claim a gain. + +[PROOF.md](PROOF.md) states the quantified hypotheses and the two-swap +difference-buffer argument. The buffer contains `z-x_h` before its charged +CLEAR; it is not asserted to vanish by reversible scalar algebra. INIT/CLEAR +retain the inherited owned-erasure assumption. A static pairing alone is not +a physical or chronological construction. + +## Reproduction and evidence + +Python 3.12 and the standard library suffice. The two implementations import +no predecessor implementation and do not import each other. + +```sh +python3.12 -I -W error -B research/p104-async-first-hub-audit/verify.py +python3.12 -I -O -W error -B research/p104-async-first-hub-audit/oracle.py +python3.12 -B scripts/research_package.py --package research/p104-async-first-hub-audit +``` + +`verify.py` uses complete rational prefix/suffix histories and an independently emitted first-step scalar/frame witness, with frame/lifetime checks and meaningful rejection controls. `oracle.py` uses +a reversed read functional and four separate forward perturbations, then +checks the necessary source identity columns and pivot output row. See +[RESULT.json](RESULT.json) and [ORACLE.json](ORACLE.json) for exact receipts. +The literal first-split witness checks all 625,681 endpoint positions on 791 formal inputs, 25 owned lifetimes and a peak of 12 live owned fields. It explicitly emits both swaps, buffer INIT/CLEAR and the query subdivision. It checks all 622,521 original source endpoint positions as a separate prerequisite. Seven controls reject omitted collection, owned injection, causal order, source binding, paid access, new buffer CLEAR and a swap sign. Default execution compares the entire canonical JSON RESULT/ORACLE receipts, including boolean/number type distinctions; `verify.py --emit` is an explicit candidate-generation mode and writes no files. + +The package vendors only the 122,348-byte source word and the 3,840-byte PLAN, +not a copy of either predecessor implementation. Both raw SHA256 and Git +blob identifiers are authenticated independently; the decoded word also has +a canonical JSON SHA256. [SOURCES.json](SOURCES.json) records exact origin +commits, paths and byte bindings. Generic provenance rows bind the main task +catalogue and selected context. The vendored-data checks do not establish +publication ancestry or imply that the predecessor's complete export ran. + +Main was refreshed to `de5ec2e7a6074068452f45b1a191b5c72832df4a`, priority 8. +[Task](TASK.json) records the explicit change from a formalization card to this +finite exact source-binding audit. No Lean build was run. The exact selected-source inputs were materialized and the current baseline passed `PASS_RESEARCH_BASELINE_BINDINGS_ONLY` on Python 3.12.14. This authenticates selected source bindings and metadata only; no native selected replay or supplier admission follows. + +## Open next questions + +- Independently check native maps and absolute phases for this subdivision, + and bind all scalar/buffer/route costs to the full first-step invoice. + Temporal equality and ranks alone do not prove that binding. +- Then audit steps 2/3 on their own exact input words; source event indices + change after each construction. The complete caller, ordinary compiler, + precision and analytic framework assumptions remain outside this audit. + +The structured next question and its blockers are in [TASK.json](TASK.json). +No all-size theorem, supplier admission, new kappa or frontier change follows. + +## Credit + +Ali Romman, with OpenAI Codex assistance, supplied the asynchronous +construction, plans and retained-copy source word. Retain flyingviper's +boundary bases, Joel Pulikkan/GamingPuzzled's basis work and every native, +controller, compiler and BIT predecessor in [NOTICE](NOTICE). New audit and +proof: ToikY with substantial OpenAI Codex assistance, using separate bounded +implementation and read-only proof/review contexts. Apache-2.0. diff --git a/research/p104-async-first-hub-audit/RESULT.json b/research/p104-async-first-hub-audit/RESULT.json new file mode 100644 index 0000000000..c1f9c8f762 --- /dev/null +++ b/research/p104-async-first-hub-audit/RESULT.json @@ -0,0 +1,160 @@ +{ + "collection_row": { + "696": "1" + }, + "contacts": [ + { + "actual_frame": 1031, + "coefficient": "1", + "kind": "collection", + "owned_live": false, + "role": 696, + "time2": 27026 + }, + { + "actual_frame": 1031, + "coefficient": "1", + "kind": "injection", + "owned_live": false, + "role": 696, + "time2": 27044 + }, + { + "actual_frame": 1031, + "coefficient": "1", + "kind": "injection", + "owned_live": false, + "role": 697, + "time2": 27044 + }, + { + "actual_frame": 1031, + "coefficient": "1", + "kind": "injection", + "owned_live": true, + "role": 770, + "time2": 27501 + }, + { + "actual_frame": 1031, + "coefficient": "1", + "kind": "injection", + "owned_live": false, + "role": 699, + "time2": 27516 + } + ], + "cut_time2": 27044, + "delivery_column": { + "133": "2", + "696": "1", + "697": "1", + "699": "1", + "709": "1", + "733": "1" + }, + "eligible_full_boundary_helpers": 388, + "erasure_scope": "INIT/CLEAR use the predecessor's charged owned-erasure semantics", + "failure_controls": [ + { + "name": "omitted_collection", + "reason": "complete temporal collection row", + "rejected": true + }, + { + "name": "omitted_owned_injection", + "reason": "complete temporal delivery column", + "rejected": true + }, + { + "name": "injection_before_cut", + "reason": "causal collection/cut/injection order", + "rejected": true + }, + { + "name": "wrong_source", + "reason": "step source binding", + "rejected": true + }, + { + "name": "unpaid_owned_interior_query", + "reason": "unpaid interior contact", + "rejected": true + }, + { + "name": "omitted_new_buffer_CLEAR", + "reason": "split arbitrary-input endpoint at role 790", + "rejected": true + }, + { + "name": "omitted_first_swap_SCALE", + "reason": "split arbitrary-input endpoint at role 113", + "rejected": true + } + ], + "frame": 1031, + "helper_133_is_eligible": true, + "literal_first_split": { + "before_clear_row": { + "696": "-1", + "789": "1" + }, + "coefficient_positions_checked": 625681, + "endpoint_sha256": "b8354146bda85ded4f6baef48b34fea08e055e720a4387acabe9a427db8bf5e0", + "event_stream_sha256": "62637d16db1ae4e9c777a9837877634cdb55d6d8f7967febf6a4db2a028e32c8", + "formal_input_axes": 791, + "fresh_final_frame": 127, + "fresh_public_label": 789, + "label_scope": "Independent namespace; not a byte-identity claim for the author's emitted word", + "new_buffer_clear_count": 1, + "new_buffer_init_count": 1, + "new_owned_buffer_label": 790, + "owned_lifetimes": 25, + "peak_live_owned": 12, + "program_events": 25909, + "retired_pivot_final_frame": 1031 + }, + "paid_access": [ + { + "event": [ + "MOVE", + 770, + 591, + 597, + true + ], + "frame_dimensions": [ + 8, + 5, + 1 + ], + "index": 13750, + "replaced_rank": 7, + "replacement_ranks": [ + 3, + 4 + ] + } + ], + "paid_access_delta": { + "3": 1, + "4": 1, + "7": -1 + }, + "pairing": "1", + "pivot": 696, + "plan_raw_sha256": "2c4878f78dc393339f8cccf24441d9bfb50257784459c2f253ebcb27c964211c", + "schema": "p104-async-first-hub-audit/1", + "scope": "Finite exact first-step temporal contacts and literal scalar/frame restoration; no native phase, full caller or kappa admission", + "source_canonical_sha256": "75f429fc0c8b206f4439bfbda4b621fc62ea892e6e3008c17409f2d3ee0981bb", + "source_endpoint": { + "coefficient_positions_checked": 622521, + "endpoint": "I + sum e_(r+112) e_r^T on public coordinates; zero owned outputs", + "endpoint_sha256": "377cd8e5aa4515a2fda585cfe1f180651a3800be0cdcd467b17aa53c1bc0cf52", + "input_columns": 789, + "output_rows": 789, + "owned_lifetimes": 24, + "peak_live_owned": 12 + }, + "source_raw_sha256": "7c393444fa5b9a6941471d02047beb2aa8285e5614bb052fb85458b69236a38a" +} diff --git a/research/p104-async-first-hub-audit/SOURCES.json b/research/p104-async-first-hub-audit/SOURCES.json new file mode 100644 index 0000000000..fb1ebd3a6f --- /dev/null +++ b/research/p104-async-first-hub-audit/SOURCES.json @@ -0,0 +1,41 @@ +{ + "schema_version": 1, + "base_commit": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "581f8d87008354eb5b869f7ed9de1317ad837ce8", + "sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "3404fbdd5e7529a0674eef26114b5071e4586cec", + "sha256": "ead6cdc9d0af6d58e8a49744d8ec8c7c15e13d2ba93c276c434bcf9b51b93a81" + } + ], + "vendored_inputs": [ + { + "path": "inputs/WORD.json.gz", + "repository": "aliromman/integer-mult-bounds", + "commit": "7d6ec0cdef31d0c37b7d2563e709979caa0d5eae", + "source_path": "research/p104-retained-native-copy/WORD.json.gz", + "git_blob": "3ae3c4ebc8fc92098784f717a3107e6fa958dd86", + "sha256": "7c393444fa5b9a6941471d02047beb2aa8285e5614bb052fb85458b69236a38a", + "bytes": 122348, + "usage": "Frozen package-local source data; verifier authenticates raw bytes and Git blob independently. No predecessor implementation import." + }, + { + "path": "inputs/PLAN.json", + "repository": "aliromman/integer-mult-bounds", + "commit": "6b936acd68a7e0f9062037900f0fe9bc4b6fdd25", + "source_path": "research/p104-asynchronous-helper-hubs/PLAN.json", + "git_blob": "9cf72d400fdb2adef54eca047c752a657a0d4a33", + "sha256": "2c4878f78dc393339f8cccf24441d9bfb50257784459c2f253ebcb27c964211c", + "bytes": 3840, + "usage": "Frozen package-local source data; verifier authenticates raw bytes and Git blob independently. No predecessor implementation import." + } + ], + "source_binding_scope": "Original source objects were read through public GitHub exact-commit resources and independently matched here. The generic provenance rows bind only current-main context; archived data authenticates itself in the verifier. No source-publication ancestry or predecessor full replay is inferred." +} diff --git a/research/p104-async-first-hub-audit/TASK.json b/research/p104-async-first-hub-audit/TASK.json new file mode 100644 index 0000000000..f3b17f9f80 --- /dev/null +++ b/research/p104-async-first-hub-audit/TASK.json @@ -0,0 +1,108 @@ +{ + "schema_version": 1, + "task_id": "formal-interface-lemma", + "priority_revision": 8, + "base_commit": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "original_card": { + "id": "formal-interface-lemma", + "question": "Can one uncovered interface implication be formalized with exact caller and certificate bindings?", + "starting_points": [ + "docs/research/research-family-status.md", + "certificates/selected-result.json", + "research/gate-operand-parity-lean/README.md", + "research/staged544-certified-endpoint/README.md", + "research/unconditional-batched-crt/README.md" + ], + "methods": [ + "Formalize a missing boundary lemma identified by the selected review.", + "Audit a formal theorem-to-certificate binding independently." + ], + "acceptance_gate": "State the exact formalized proposition and remaining assumptions; avoid duplicate arithmetic formalizations already present.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_selected_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Resolve the current selected review, separate complex/ordinary BIT/admitted BIT/outer budgets, and compare the card against live handoffs before starting. Historical ceilings require exact source/model equivalence.", + "scope": "Source-binding orientation only; not a scientific replay or all-size proof. Materialize selected inputs if this checkout is sparse." + }, + "first_experiment": "Write one missing statement with quantified hypotheses, actual caller and existing coverage. A compact-switch lemma is a candidate only after its mathematical contract is reviewed. Establish a bounded proof plan before a separately budgeted proof-assistant build; do not rerun large Lean jobs as orientation.", + "bottleneck_link": "A missing interface proof can reduce the conditional gap even if it does not change kappa.", + "allowed_variations": [ + "Narrow to one formal lemma or one theorem-to-certificate binding." + ], + "scope_change_triggers": [ + "Formalizing already-covered arithmetic and claiming the full multiplication theorem." + ], + "overlap_terms": [ + "hyperplane end", + "formal interface", + "Lean binding", + "3807", + "3857", + "4100", + "gate-operand-parity-lean", + "staged544-certified-endpoint", + "unconditional-batched-crt" + ], + "existing_checks": [ + { + "scope": "PR #3807: scoped gate-operand parity formalization.", + "evidence": "research/gate-operand-parity-lean/README.md", + "remaining": "Exact theorem-to-caller binding and genuinely uncovered interface lemmas.", + "status": "author-checked", + "source_commit": "4c3530f42a6abcc48e7a6bcffd6c901911dc8269", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #3857: certified real-power moment/endpoint arithmetic.", + "evidence": "research/staged544-certified-endpoint/README.md", + "remaining": "Uniform algorithmic implications, not another endpoint digit.", + "status": "author-checked", + "source_commit": "ef4315b8caa605e47a2515004845eb2d2ed71a86", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "scope": "PR #4100: compact-switch formalization proposed as future validation.", + "evidence": "research/unconditional-batched-crt/README.md", + "remaining": "Audit the statement and assumptions before a formal proof campaign.", + "status": "author-checked", + "source_commit": "337d04939571a637aeab54a0f58f54fde811663a", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Independent exact source-data audit of PR5786 step1 temporal helper split: pivot696,F1031,cut27044, actual collection/injection times including owned query13750. Independently emit and replay only this first split on791 formal coordinates, including the new dirty buffer lifetime and two scalar swaps; no native phase/full invoice.", + "scope_change_reason": "Follow explicit Discussion5600/1166 first-step review handoff. This is a finite exact temporal-interface proof/certificate audit, not a Lean formalization or a claim to close a selected framework assumption.", + "bottleneck_link": "Tests the temporal implication behind a changed productive helper inventory; a static pairing alone cannot justify independent target credit.", + "budget_minutes": 60, + "stop_rule": "Freeze by21:05:38UTC; stop or narrow if actual source contact/frame/liveness, unit pairing or arbitrary-input restoration fails. No broader search, source rewrite, native-phase or complete-price admission.", + "outcome": "completed", + "evidence": "RESULT.json:622521 source coefficient positions,625681 first-split positions/791 axes,25 owned lifetimes/peak12,seven specific rejection controls. ORACLE.json:independent temporal c/d and literal source basis commutation. Normal and optimized typed payloads agree; full route price/native phases/caller/compiler remain outside scope. Entire canonical JSON receipts reject boolean/number aliases; selected baseline source-binding report passes after exact input materialization.", + "author": "ToikY", + "ai_assistance": "Substantial OpenAI Codex assistance; separate bounded implementation and read-only review contexts.", + "open_questions": [ + { + "question": "Do the remaining two temporal splits and complete invoice bind to the physical caller?", + "why_it_matters": "This first-step temporal audit cannot establish full conditional admission.", + "first_step": "Audit exact step2/3 inputs and native/price binding in PR5786 without transferring event numbers.", + "blocked_by": "Outside this one-step scope; native all-column, caller/compiler/precision/analytic assumptions remain." + } + ], + "source_heads": { + "PR5786": "6b936acd68a7e0f9062037900f0fe9bc4b6fdd25", + "PR5774": "7d6ec0cdef31d0c37b7d2563e709979caa0d5eae" + }, + "claim_expires": "2026-10-26T22:20:00Z", + "started_at": "2026-10-26T20:20:38+00:00", + "science_cutoff": "2026-10-26T21:05:38+00:00", + "finish_by": "2026-10-26T21:20:38+00:00", + "selected_baseline": { + "status": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "selected_record_sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5", + "scope": "Source bindings and metadata only; no native replay or admission." + } +} diff --git a/research/p104-async-first-hub-audit/VERIFY.json b/research/p104-async-first-hub-audit/VERIFY.json new file mode 100644 index 0000000000..3aa4bfeedf --- /dev/null +++ b/research/p104-async-first-hub-audit/VERIFY.json @@ -0,0 +1,47 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [], + "commands": [ + { + "argv": [ + "{python}", + "-I", + "-W", + "error", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Exact source/PLAN authentication; all789 source axes; first split791 formal axes/625681 coefficient positions; contact/frame/lifetime and7 specific controls; entire frozen RESULT comparison." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Optimized independent first-split replay with explicit guards and exact frozen receipt." + }, + { + "argv": [ + "{python}", + "-I", + "-O", + "-W", + "error", + "-B", + "{package}/oracle.py" + ], + "timeout_seconds": 120, + "checks": "Opposite-direction temporal oracle;6 source columns/pivot-row basis commutation; complete frozen ORACLE receipt." + } + ] +} diff --git a/research/p104-async-first-hub-audit/inputs/PLAN.json b/research/p104-async-first-hub-audit/inputs/PLAN.json new file mode 100644 index 0000000000..9cf72d400f --- /dev/null +++ b/research/p104-async-first-hub-audit/inputs/PLAN.json @@ -0,0 +1,193 @@ +{ + "source_canonical_sha256": "75f429fc0c8b206f4439bfbda4b621fc62ea892e6e3008c17409f2d3ee0981bb", + "steps": [ + { + "pivot": 696, + "frame": 1031, + "time2": 27044, + "buffer": 790, + "collection": [ + { + "time2": 27026, + "role": 696, + "coefficient": "1" + } + ], + "injection": [ + { + "time2": 27044, + "role": 696, + "coefficient": "1" + }, + { + "time2": 27044, + "role": 697, + "coefficient": "1" + }, + { + "time2": 27501, + "role": 770, + "coefficient": "1" + }, + { + "time2": 27516, + "role": 699, + "coefficient": "1" + } + ], + "input": { + "696": "1" + }, + "output": { + "733": "1", + "709": "1", + "696": "1", + "133": "2", + "699": "1", + "697": "1" + }, + "queries": [ + 13750 + ], + "source_sha256": "75f429fc0c8b206f4439bfbda4b621fc62ea892e6e3008c17409f2d3ee0981bb", + "query_events": [ + [ + "MOVE", + 770, + 591, + 597, + true + ] + ], + "output_sha256": "42b7418cdcd42c50a09ec8bd97cd42f4953802e16f179997643d8bde503735f1" + }, + { + "pivot": 623, + "frame": 117, + "time2": 26314, + "buffer": 792, + "collection": [ + { + "time2": 26314, + "role": 623, + "coefficient": "1" + } + ], + "injection": [ + { + "time2": 26318, + "role": 624, + "coefficient": "1" + }, + { + "time2": 26330, + "role": 627, + "coefficient": "-1/2" + }, + { + "time2": 26332, + "role": 629, + "coefficient": "-1/2" + }, + { + "time2": 26336, + "role": 629, + "coefficient": "1/2" + }, + { + "time2": 32701, + "role": 732, + "coefficient": "1/2" + } + ], + "input": { + "623": "1" + }, + "output": { + "732": "1/2", + "576": "2", + "549": "2", + "570": "4", + "558": "-4", + "575": "2", + "548": "2", + "569": "2", + "547": "2", + "546": "-2", + "568": "4", + "205": "1", + "625": "-1", + "623": "1", + "627": "-1/2", + "624": "1" + }, + "queries": [ + 16350 + ], + "source_sha256": "42b7418cdcd42c50a09ec8bd97cd42f4953802e16f179997643d8bde503735f1", + "query_events": [ + [ + "MOVE", + 732, + 594, + 222, + false + ] + ], + "output_sha256": "21b8911d58e6d7777dc7458ccf5b05f1da8669bc1044270909746ddd4abc5948" + }, + { + "pivot": 585, + "frame": 245, + "time2": 34391, + "buffer": 794, + "collection": [ + { + "time2": 31557, + "role": 438, + "coefficient": "-1" + }, + { + "time2": 34391, + "role": 585, + "coefficient": "1" + } + ], + "injection": [ + { + "time2": 34391, + "role": 585, + "coefficient": "1" + } + ], + "input": { + "585": "1" + }, + "output": { + "585": "1" + }, + "queries": [ + 15778, + 17195 + ], + "source_sha256": "21b8911d58e6d7777dc7458ccf5b05f1da8669bc1044270909746ddd4abc5948", + "query_events": [ + [ + "MOVE", + 438, + 911, + 127, + false + ], + [ + "MOVE", + 585, + 918, + 127, + false + ] + ], + "output_sha256": "45e3f8efd004f2a6d2c02a2ac2ebe3dd9ce04c887641ec9ab31e47f8c7f41e1b" + } + ] +} diff --git a/research/p104-async-first-hub-audit/inputs/WORD.json.gz b/research/p104-async-first-hub-audit/inputs/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..3ae3c4ebc8fc92098784f717a3107e6fa958dd86 GIT binary patch literal 122348 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 literal 0 HcmV?d00001 diff --git a/research/p104-async-first-hub-audit/oracle.py b/research/p104-async-first-hub-audit/oracle.py new file mode 100644 index 0000000000..0cf57fb1ef --- /dev/null +++ b/research/p104-async-first-hub-audit/oracle.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python3 +"""Independent forward-perturbation oracle for the first PR5786 hub. + +New audit: ToikY with substantial OpenAI Codex assistance in a separate +implementation context. Ali Romman supplied the asynchronous construction, +plan and retained-copy word. Apache-2.0; NOTICE retains predecessor credit. +No predecessor implementation or the package verifier is imported. +""" +from fractions import Fraction +from hashlib import sha1, sha256 +import gzip +import json +from pathlib import Path + + +HERE = Path(__file__).resolve().parent +WORD_SHA256 = "7c393444fa5b9a6941471d02047beb2aa8285e5614bb052fb85458b69236a38a" +WORD_BLOB = "3ae3c4ebc8fc92098784f717a3107e6fa958dd86" +CANONICAL_WORD = "75f429fc0c8b206f4439bfbda4b621fc62ea892e6e3008c17409f2d3ee0981bb" +PLAN_SHA256 = "2c4878f78dc393339f8cccf24441d9bfb50257784459c2f253ebcb27c964211c" +PLAN_BLOB = "9cf72d400fdb2adef54eca047c752a657a0d4a33" + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def authenticated(name, expected_sha256, expected_blob): + raw = (HERE / "inputs" / name).read_bytes() + require(sha256(raw).hexdigest() == expected_sha256, + "Exact oracle input SHA256: " + name) + blob = sha1(b"blob " + str(len(raw)).encode() + b"\0" + raw).hexdigest() + require(blob == expected_blob, "Exact oracle Git blob: " + name) + return raw + + +def sparse(vector): + return {str(i): str(value) for i, value in enumerate(vector) if value} + + +def role(event, position, size): + value = event[position] + require(type(value) is int and 0 <= value < size, "Oracle role range") + return value + + +def split_time(word, time2): + require(type(time2) is int and 0 <= time2 <= 2 * len(word["program"]), + "Oracle contact time range") + index, midpoint = divmod(time2, 2) + if midpoint: + require(index == 13750 and word["program"][index] + == ["MOVE", 770, 591, 597, True], + "Oracle actual paid interior query") + return index, midpoint + + +def prefix_functional(word, contact): + """Backpropagate one read functional, without inverting the prefix.""" + size = word["public"] + word["owned_fields"] + vector = [Fraction(0) for _ in range(size)] + source = contact["role"] + require(type(source) is int and 0 <= source < size, "Oracle collection role") + vector[source] = Fraction(contact["coefficient"]) + index, midpoint = split_time(word, contact["time2"]) + # A decoded MOVE is the identity, including either half of a subdivision. + for event in reversed(word["program"][:index]): + op = event[0] + dst = role(event, 1, size) + if op == "MOVE": + continue + if op in ("INIT", "CLEAR"): + vector[dst] = Fraction(0) + elif op == "SCALE": + vector[dst] *= Fraction(event[-2]) + else: + require(op in ("ADD", "COPY"), "Oracle prefix opcode") + src = role(event, 2, size) + require(src != dst, "Oracle distinct prefix operands") + vector[src] += Fraction(event[-2]) * vector[dst] + if op == "COPY": + vector[dst] = Fraction(0) + return vector + + +def forward_delivery(word, contact): + """Inject one perturbation, then execute the remaining decoded program.""" + size = word["public"] + word["owned_fields"] + vector = [Fraction(0) for _ in range(size)] + target = contact["role"] + require(type(target) is int and 0 <= target < size, "Oracle injection role") + vector[target] = Fraction(contact["coefficient"]) + index, midpoint = split_time(word, contact["time2"]) + for event in word["program"][index + midpoint:]: + op = event[0] + dst = role(event, 1, size) + if op == "MOVE": + continue + if op in ("INIT", "CLEAR"): + vector[dst] = Fraction(0) + elif op == "SCALE": + vector[dst] *= Fraction(event[-2]) + else: + require(op in ("ADD", "COPY"), "Oracle forward opcode") + src = role(event, 2, size) + require(src != dst, "Oracle distinct forward operands") + value = Fraction(event[-2]) * vector[src] + vector[dst] = value if op == "COPY" else vector[dst] + value + return vector + + +def run(): + raw = authenticated("WORD.json.gz", WORD_SHA256, WORD_BLOB) + word = json.loads(gzip.decompress(raw)) + plan = json.loads(authenticated("PLAN.json", PLAN_SHA256, PLAN_BLOB)) + canonical = json.dumps(word, sort_keys=True, separators=(",", ":")).encode() + require(sha256(canonical).hexdigest() == CANONICAL_WORD + == plan["source_canonical_sha256"], "Oracle canonical source word") + step = plan["steps"][0] + require((word["public"], word["owned_fields"], len(word["program"])) + == (767, 22, 25882), "Oracle fixed input inventory") + require((step["pivot"], step["frame"], step["time2"], step["queries"]) + == (696, 1031, 27044, [13750]), "Oracle fixed first-step scope") + require(step["source_sha256"] == CANONICAL_WORD, "Oracle step source pin") + require(step["collection"] == [{"time2": 27026, "role": 696, + "coefficient": "1"}], "Oracle fixed collection") + require([(c["time2"], c["role"], c["coefficient"]) + for c in step["injection"]] + == [(27044, 696, "1"), (27044, 697, "1"), + (27501, 770, "1"), (27516, 699, "1")], + "Oracle fixed injections") + size = word["public"] + word["owned_fields"] + collected = [Fraction(0) for _ in range(size)] + delivered = [Fraction(0) for _ in range(size)] + for contact in step["collection"]: + vector = prefix_functional(word, contact) + collected = [left + right for left, right in zip(collected, vector)] + individual = [] + for contact in step["injection"]: + vector = forward_delivery(word, contact) + delivered = [left + right for left, right in zip(delivered, vector)] + individual.append({"time2": contact["time2"], "role": contact["role"], + "delivered": sparse(vector)}) + require(sparse(collected) == {"696": "1"} == step["input"], + "Oracle exact collection on all input axes") + require(sparse(delivered) == step["output"], + "Oracle exact delivery on all output axes") + pairing = sum((a * b for a, b in zip(collected, delivered)), Fraction(0)) + require(pairing == 1 and delivered[696] == 1, "Oracle unit pairing and pivot") + main = set(word["live"]) | {r + 112 for r in word["live"]} + support = {i for i in range(size) if collected[i] or delivered[i]} + require(all(i < word["public"] and i not in main + and word["initial"][i] == 3 and word["final"][i] == 127 + for i in support), "Oracle independent full-boundary support") + require(133 in support and 133 not in main, + "Oracle derives helper eligibility without an ID cutoff") + # Here c=e_696 and d_696=1, so Q=I+(d-e_696)e_696^T. These + # literal source column/row checks establish TQ=QT without assuming a + # complete source endpoint theorem or replaying all its columns. + for index in sorted(support): + column = forward_delivery(word, {"time2": 0, "role": index, + "coefficient": "1"}) + require(sparse(column) == {str(index): "1"}, + "Oracle source identity column on basis support") + row = prefix_functional(word, {"time2": 2 * len(word["program"]), + "role": 696, "coefficient": "1"}) + require(sparse(row) == {"696": "1"}, + "Oracle source pivot row including arbitrary outside inputs") + return { + "status": "PASS_P104_ASYNC_FIRST_HUB_ORACLE", + "source_word_sha256": WORD_SHA256, + "canonical_word_sha256": CANONICAL_WORD, + "plan_sha256": PLAN_SHA256, + "axes": size, + "input_row": sparse(collected), + "output_column": sparse(delivered), + "individual_injections": individual, + "unit_pairing": str(pairing), + "eligible_support": sorted(support), + "source_identity_columns": sorted(support), + "source_identity_row": 696, + "basis_commutes_with_literal_source": True, + "scope": "Exact decoded temporal identities only; native phases, physical " + "contact legality, full source endpoint and complete price remain " + "separate obligations.", + } + + +if __name__ == "__main__": + result = run() + expected = json.loads((HERE / "ORACLE.json").read_bytes()) + require(json.dumps(result, sort_keys=True, separators=(",", ":")) + == json.dumps(expected, sort_keys=True, separators=(",", ":")), + "Frozen independent oracle receipt differs") + print(json.dumps(result, indent=2, sort_keys=True)) diff --git a/research/p104-async-first-hub-audit/verify.py b/research/p104-async-first-hub-audit/verify.py new file mode 100644 index 0000000000..f4ec32ee8f --- /dev/null +++ b/research/p104-async-first-hub-audit/verify.py @@ -0,0 +1,465 @@ +#!/usr/bin/env python3 +"""Independent data-only audit of PR5786's first temporal helper split. + +ToikY with substantial OpenAI Codex assistance. Apache-2.0. +The retained word and plan are Ali Romman's work; NOTICE preserves predecessors. +No predecessor Python code is imported or executed by this checker. +""" +from collections import Counter +from copy import deepcopy +from fractions import Fraction +from hashlib import sha256 +from pathlib import Path +import argparse +import gzip +import json + + +HERE = Path(__file__).resolve().parent +WORD_RAW = "7c393444fa5b9a6941471d02047beb2aa8285e5614bb052fb85458b69236a38a" +WORD_CANONICAL = "75f429fc0c8b206f4439bfbda4b621fc62ea892e6e3008c17409f2d3ee0981bb" +PLAN_RAW = "2c4878f78dc393339f8cccf24441d9bfb50257784459c2f253ebcb27c964211c" + + +def require(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + + +def rational_map(value): + return {int(k): Fraction(v) for k, v in value.items() if Fraction(v)} + + +def encoded(vector): + return {str(k): str(v) for k, v in sorted(vector.items())} + + +def accumulate(destination, source, coefficient): + for key, value in source.items(): + new = destination.get(key, 0) + coefficient * value + if new: + destination[key] = new + else: + destination.pop(key, None) + + +def frame_spaces(word): + spaces = [] + for basis in word["frames"]: + values = {0} + for vector in basis: + require(type(vector) is int and 0 < vector < 512 and vector not in values, + "independent nine-bit frame basis") + values.update({old ^ vector for old in values}) + spaces.append(frozenset(values)) + return spaces + + +def forward_history(word, plan, spaces): + """Propagate every public and dirty-owned input, recording physical contacts.""" + public = word["public"] + size = public + word["owned_fields"] + rows = [{j: Fraction(1)} for j in range(size)] + frames = word["initial"][:] + [None] * word["owned_fields"] + live_owned = set() + wanted = {(item["time2"], item["role"]) + for kind in ("collection", "injection") for item in plan[kind]} + wanted.add((plan["time2"], plan["pivot"])) + snapshots = {} + lifetimes = peak = 0 + + def observe(time, middle=None): + for contact_time, role in wanted: + if contact_time != time: + continue + frame = plan["frame"] if middle and role == middle[1] else frames[role] + snapshots[time, role] = { + "row": rows[role].copy(), "frame": frame, + "owned_live": role in live_owned, + } + + for index, event in enumerate(word["program"]): + observe(2 * index) + opcode, target = event[:2] + require(type(target) is int and 0 <= target < size, "source target role") + if opcode == "MOVE": + _, _, entrance, exit_frame, private = event + require(frames[target] == entrance and (target in live_owned) == private, + "source MOVE frame and owned lifetime") + require(spaces[exit_frame] < spaces[entrance] if private + else spaces[entrance] < spaces[exit_frame], "source nested MOVE") + observe(2 * index + 1, event) + frames[target] = exit_frame + elif opcode == "INIT": + require(target >= public and target not in live_owned, + "source owned initialization") + live_owned.add(target) + lifetimes += 1 + peak = max(peak, len(live_owned)) + rows[target] = {} + frames[target] = event[2] + elif opcode == "CLEAR": + require(target in live_owned and frames[target] == event[2], + "source owned erasure frame") + # This models the predecessor's charged erasure operation. It does + # not assume the buffer was zero before CLEAR. + rows[target] = {} + frames[target] = None + live_owned.remove(target) + else: + coefficient = Fraction(event[-2]) + require(coefficient and frames[target] == event[-1], + "source scalar destination frame") + if opcode == "SCALE": + rows[target] = {key: coefficient * value + for key, value in rows[target].items()} + else: + require(opcode in ("ADD", "COPY"), "source scalar opcode") + source = event[2] + require(source != target and 0 <= source < size + and frames[source] == frames[target], "source common scalar frame") + if opcode == "COPY": + require(target in live_owned and not rows[target], + "source COPY into cleared owned field") + rows[target] = {} + accumulate(rows[target], rows[source], coefficient) + observe(2 * len(word["program"])) + require(not live_owned and frames[:public] == word["final"] + and frames[public:] == [None] * word["owned_fields"], "source boundary frames") + live = set(word["live"]) + for output, row in enumerate(rows): + expected = {output: Fraction(1)} if output < public else {} + if output - 112 in live: + expected[output - 112] = Fraction(1) + require(row == expected, "source full arbitrary-input endpoint") + return snapshots, { + "input_columns": size, "output_rows": size, + "coefficient_positions_checked": size * size, + "endpoint": "I + sum e_(r+112) e_r^T on public coordinates; zero owned outputs", + "endpoint_sha256": sha256(canonical([encoded(row) for row in rows])).hexdigest(), + "owned_lifetimes": lifetimes, "peak_live_owned": peak, + } + + +def suffix_columns(word, plan): + """Reverse-mode delivery propagation, independent of the forward row table.""" + size = word["public"] + word["owned_fields"] + effects = [{j: Fraction(1)} for j in range(size)] + wanted = {(item["time2"], item["role"]) for item in plan["injection"]} + snapshots = {} + + def observe(time): + for contact_time, role in wanted: + if contact_time == time: + snapshots[time, role] = effects[role].copy() + + observe(2 * len(word["program"])) + for index in range(len(word["program"]) - 1, -1, -1): + event = word["program"][index] + opcode, target = event[:2] + if opcode in ("INIT", "CLEAR"): + effects[target] = {} + elif opcode == "SCALE": + coefficient = Fraction(event[-2]) + effects[target] = {key: coefficient * value + for key, value in effects[target].items()} + elif opcode in ("ADD", "COPY"): + accumulate(effects[event[2]], effects[target], Fraction(event[-2])) + if opcode == "COPY": + effects[target] = {} + else: + require(opcode == "MOVE", "reverse source opcode") + observe(2 * index) + if opcode == "MOVE": + observe(2 * index + 1) + return snapshots + + +def audit_plan(word, plan, spaces, prefixes, suffixes): + require(plan["source_sha256"] == WORD_CANONICAL, "step source binding") + frame, cut = plan["frame"], plan["time2"] + queries = plan["queries"] + require(len(queries) == len(set(queries)), "distinct paid queries") + for kind in ("collection", "injection"): + for item in plan[kind]: + time, role = item["time2"], item["role"] + require(type(time) is int and 0 <= time <= 2 * len(word["program"]), + "contact time range") + require(type(role) is int and 0 <= role < word["public"] + word["owned_fields"] + and Fraction(item["coefficient"]), "contact operand") + require(time <= cut if kind == "collection" else cut <= time, + "causal collection/cut/injection order") + require(time % 2 == 0 or time // 2 in queries, "unpaid interior contact") + require(prefixes[time, role]["frame"] == frame, "actual contact frame") + require([word["program"][index] for index in sorted(queries)] == plan["query_events"], + "exact paid query binding") + require(prefixes[cut, plan["pivot"]]["frame"] == frame, "physical pivot at cut") + query_receipts = [] + delta = Counter() + for index in sorted(queries): + event = word["program"][index] + require(event[0] == "MOVE", "paid contact subdivides MOVE") + _, role, entrance, exit_frame, private = event + require(spaces[exit_frame] < spaces[frame] < spaces[entrance] if private + else spaces[entrance] < spaces[frame] < spaces[exit_frame], + "strict actual intermediate GF2 frame") + a, middle, b = (len(word["frames"][j]) for j in (entrance, frame, exit_frame)) + ranks = [abs(a - middle), abs(middle - b)] + delta.update(ranks) + delta[abs(a - b)] -= 1 + query_receipts.append({"index": index, "event": event, + "frame_dimensions": [a, middle, b], + "replacement_ranks": ranks, "replaced_rank": abs(a - b)}) + collection, delivery = {}, {} + for item in plan["collection"]: + accumulate(collection, prefixes[item["time2"], item["role"]]["row"], + Fraction(item["coefficient"])) + for item in plan["injection"]: + accumulate(delivery, suffixes[item["time2"], item["role"]], + Fraction(item["coefficient"])) + require(collection == rational_map(plan["input"]), "complete temporal collection row") + require(delivery == rational_map(plan["output"]), "complete temporal delivery column") + main = set(word["live"]) | {role + 112 for role in word["live"]} + eligible = {role for role in range(word["public"]) if role not in main + and word["initial"][role] == 3 and word["final"][role] == 127} + require(set(collection) | set(delivery) <= eligible, "actual independent full-boundary helpers") + pairing = sum(value * delivery.get(role, 0) for role, value in collection.items()) + require(pairing == 1 and delivery.get(plan["pivot"]), "unit pairing and physical pivot") + return { + "collection_row": encoded(collection), "delivery_column": encoded(delivery), + "pairing": str(pairing), "eligible_full_boundary_helpers": len(eligible), + "helper_133_is_eligible": 133 in eligible, + "paid_access": query_receipts, + "paid_access_delta": {str(rank): count for rank, count in sorted(delta.items()) if count}, + } + + +def split_replay(word, plan, spaces, omit_clear=False, omit_swap_scale=False): + """Emit and replay the first split on an independent formal label namespace.""" + original_size = word["public"] + word["owned_fields"] + fresh, buffer = original_size, original_size + 1 + size = original_size + 2 + pivot, frame, cut = plan["pivot"], plan["frame"], plan["time2"] + delivery = rational_map(plan["output"]) + require(rational_map(plan["input"]) == {pivot: Fraction(1)} + and delivery[pivot] == 1, "specialized first-step boundary basis") + basis = [(role, coefficient) for role, coefficient in sorted(delivery.items()) + if role != pivot] + events = [["ADD", role, pivot, str(coefficient), 3] for role, coefficient in basis] + first = min(item["time2"] for item in plan["collection"]) + last = max(item["time2"] for item in plan["injection"]) + + def renamed(event, time): + result = event[:] + for position in ((1, 2) if event[0] in ("ADD", "COPY") else (1,)): + if time >= cut and result[position] == pivot: + result[position] = fresh + return result + + def swap(left, right, first_swap=False): + events.extend([["ADD", left, right, "1", frame], + ["ADD", right, left, "-1", frame], + ["ADD", left, right, "1", frame]]) + if not (first_swap and omit_swap_scale): + events.append(["SCALE", right, "-1", frame]) + + def contact(time): + if time == first: + events.append(["INIT", buffer, frame]) + for item in plan["collection"]: + if item["time2"] == time: + events.append(["ADD", buffer, item["role"], item["coefficient"], frame]) + if time == cut: + swap(pivot, buffer, first_swap=True) + swap(fresh, buffer) + events.append(["ADD", buffer, pivot, "-1", frame]) + for item in plan["injection"]: + if item["time2"] == time: + role = fresh if item["role"] == pivot else item["role"] + events.append(["ADD", role, buffer, item["coefficient"], frame]) + if time == last and not omit_clear: + events.append(["CLEAR", buffer, frame]) + + for index, event in enumerate(word["program"]): + contact(2 * index) + if index in plan["queries"]: + _, role, entrance, exit_frame, private = event + events.append(renamed(["MOVE", role, entrance, frame, private], 2 * index)) + contact(2 * index + 1) + events.append(renamed(["MOVE", role, frame, exit_frame, private], 2 * index + 1)) + else: + events.append(renamed(event, 2 * index)) + contact(2 * len(word["program"])) + events.extend([["ADD", role, fresh, str(-coefficient), 127] + for role, coefficient in reversed(basis)]) + + rows = [{role: Fraction(1)} for role in range(size)] + frames = word["initial"][:] + [None] * word["owned_fields"] + [frame, None] + owned = set(range(word["public"], original_size)) | {buffer} + live_owned = set() + lifetimes = peak = buffer_inits = buffer_clears = 0 + before_clear = None + for event in events: + opcode, target = event[:2] + require(type(target) is int and 0 <= target < size, "split target role") + if opcode == "INIT": + require(target in owned and target not in live_owned, + "split owned initialization") + live_owned.add(target) + lifetimes += 1 + peak = max(peak, len(live_owned)) + buffer_inits += int(target == buffer) + rows[target] = {} + frames[target] = event[2] + elif opcode == "CLEAR": + require(target in live_owned and frames[target] == event[2], + "split owned erasure frame") + if target == buffer: + before_clear = rows[target].copy() + buffer_clears += 1 + rows[target] = {} + frames[target] = None + live_owned.remove(target) + elif opcode == "MOVE": + _, _, entrance, exit_frame, private = event + require(frames[target] == entrance and (target in live_owned) == private, + "split MOVE frame and ownership") + require(spaces[exit_frame] < spaces[entrance] if private + else spaces[entrance] < spaces[exit_frame], "split strict nested MOVE") + frames[target] = exit_frame + else: + coefficient = Fraction(event[-2]) + require(coefficient and frames[target] == event[-1], + "split scalar destination frame") + if opcode == "SCALE": + rows[target] = {key: coefficient * value + for key, value in rows[target].items()} + else: + require(opcode in ("ADD", "COPY"), "split scalar opcode") + source = event[2] + require(source != target and 0 <= source < size + and frames[source] == frames[target], "split common scalar frame") + if opcode == "COPY": + require(target in live_owned and not rows[target], + "split COPY into cleared owned field") + rows[target] = {} + accumulate(rows[target], rows[source], coefficient) + live = set(word["live"]) + for role, row in enumerate(rows): + expected = {role: Fraction(1)} if role < word["public"] or role == fresh else {} + if role - 112 in live: + expected[role - 112] = Fraction(1) + require(row == expected, "split arbitrary-input endpoint at role " + str(role)) + expected_frames = word["final"][:] + [None] * word["owned_fields"] + [127, None] + expected_frames[pivot] = frame + require(frames == expected_frames and not live_owned, "split final frames and owned closure") + require(before_clear == {fresh: Fraction(1), pivot: Fraction(-1)}, + "split retained buffer before charged erasure") + require(buffer_inits == buffer_clears == 1 and lifetimes == 25 and peak <= 13, + "split charged owned lifetime census") + return { + "formal_input_axes": size, "coefficient_positions_checked": size * size, + "fresh_public_label": fresh, "new_owned_buffer_label": buffer, + "retired_pivot_final_frame": frame, "fresh_final_frame": 127, + "program_events": len(events), "owned_lifetimes": lifetimes, + "peak_live_owned": peak, "new_buffer_init_count": buffer_inits, + "new_buffer_clear_count": buffer_clears, "before_clear_row": encoded(before_clear), + "endpoint_sha256": sha256(canonical([encoded(row) for row in rows])).hexdigest(), + "event_stream_sha256": sha256(canonical(events)).hexdigest(), + "label_scope": "Independent namespace; not a byte-identity claim for the author's emitted word", + } + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--emit", action="store_true", + help="emit a candidate result without comparing RESULT.json; never writes files") + args = parser.parse_args() + raw = (HERE / "inputs/WORD.json.gz").read_bytes() + plan_bytes = (HERE / "inputs/PLAN.json").read_bytes() + require(sha256(raw).hexdigest() == WORD_RAW, "raw source WORD authentication") + require(sha256(plan_bytes).hexdigest() == PLAN_RAW, "raw PLAN authentication") + word, plans = json.loads(gzip.decompress(raw)), json.loads(plan_bytes) + require(sha256(canonical(word)).hexdigest() == WORD_CANONICAL, + "canonical source WORD authentication") + require(plans["source_canonical_sha256"] == WORD_CANONICAL, "PLAN source binding") + require(word["public"] == 767 and word["owned_fields"] == 22 + and len(word["program"]) == 25882, "fixed source dimensions") + plan = plans["steps"][0] + require((plan["pivot"], plan["frame"], plan["time2"]) == (696, 1031, 27044), + "fixed first-step contact") + spaces = frame_spaces(word) + prefixes, endpoint = forward_history(word, plan, spaces) + suffixes = suffix_columns(word, plan) + result = audit_plan(word, plan, spaces, prefixes, suffixes) + require(result["collection_row"] == {"696": "1"}, "first-step exact input") + require(result["delivery_column"] == {"133": "2", "696": "1", "697": "1", + "699": "1", "709": "1", "733": "1"}, + "first-step exact output including helper hole") + require(result["paid_access_delta"] == {"3": 1, "4": 1, "7": -1}, + "first-step actual paid subdivision") + require(prefixes[27501, 770]["owned_live"], "owned injection is in its live interval") + controls = [] + changes = [ + ("omitted_collection", "complete temporal collection row", + lambda p: p.update(collection=[])), + ("omitted_owned_injection", "complete temporal delivery column", + lambda p: p["injection"].pop(2)), + ("injection_before_cut", "causal collection/cut/injection order", + lambda p: p["injection"][0].update(time2=27042)), + ("wrong_source", "step source binding", + lambda p: p.update(source_sha256="0" * 64)), + ("unpaid_owned_interior_query", "unpaid interior contact", + lambda p: p.update(queries=[])), + ] + for name, expected, change in changes: + bad = deepcopy(plan) + change(bad) + try: + audit_plan(word, bad, spaces, prefixes, suffixes) + except ValueError as error: + require(str(error) == expected, "control rejected for unintended reason: " + name) + controls.append({"name": name, "rejected": True, "reason": str(error)}) + else: + raise ValueError("control accepted: " + name) + split = split_replay(word, plan, spaces) + for name, options in (("omitted_new_buffer_CLEAR", {"omit_clear": True}), + ("omitted_first_swap_SCALE", {"omit_swap_scale": True})): + try: + split_replay(word, plan, spaces, **options) + except ValueError as error: + require(str(error).startswith("split arbitrary-input endpoint at role "), + "split control rejected for unintended reason: " + name) + controls.append({"name": name, "rejected": True, "reason": str(error)}) + else: + raise ValueError("split control accepted: " + name) + contacts = [] + for kind in ("collection", "injection"): + for item in plan[kind]: + physical = prefixes[item["time2"], item["role"]] + contacts.append({"kind": kind, **item, "actual_frame": physical["frame"], + "owned_live": physical["owned_live"]}) + output = { + "schema": "p104-async-first-hub-audit/1", + "scope": "Finite exact first-step temporal contacts and literal scalar/frame restoration; no native phase, full caller or kappa admission", + "source_raw_sha256": WORD_RAW, "source_canonical_sha256": WORD_CANONICAL, + "plan_raw_sha256": PLAN_RAW, "source_endpoint": endpoint, + "pivot": plan["pivot"], "frame": plan["frame"], "cut_time2": plan["time2"], + "contacts": contacts, **result, "literal_first_split": split, + "failure_controls": controls, + "erasure_scope": "INIT/CLEAR use the predecessor's charged owned-erasure semantics", + } + if not args.emit: + require(canonical(output) == canonical(json.loads( + (HERE / "RESULT.json").read_text(encoding="utf-8"))), + "frozen RESULT.json mismatch") + print(json.dumps(output, sort_keys=True, indent=2)) + print("PASS_P104_ASYNC_FIRST_HUB_AUDIT") + + +if __name__ == "__main__": + main()