From a655734277aa5f2ad74bcba29e093f6dd3b84a68 Mon Sep 17 00:00:00 2001 From: Nick Petalas Date: Wed, 14 Oct 2026 22:32:04 +0100 Subject: [PATCH] feat(research): bound completed P104 word precision Bind PR2139's unchanged producer to its complete literal stream and\ncheck exact all-cut input and defect maps, including dirty helpers and\nprivate copies. Derive a sufficient 39-bit relative feedback guard.\n\nRetain PR2139 construction and PR2096 norm-method credit. No supplier\nadoption, precision-charge reduction or selected-frontier change. --- research/p104-delayed-precision/NOTICE.md | 33 ++ research/p104-delayed-precision/README.md | 246 +++++++++++ research/p104-delayed-precision/RESULT.json | 310 ++++++++++++++ research/p104-delayed-precision/SOURCES.json | 66 +++ research/p104-delayed-precision/TASK.json | 107 +++++ research/p104-delayed-precision/VERIFY.json | 35 ++ research/p104-delayed-precision/WORD.json.gz | Bin 0 -> 141047 bytes .../p104-delayed-precision/export_word.py | 110 +++++ .../predecessor/README.md | 267 ++++++++++++ .../predecessor/SOURCES.json | 28 ++ research/p104-delayed-precision/producer.py | 385 ++++++++++++++++++ .../p104-delayed-precision/test_verify.py | 173 ++++++++ research/p104-delayed-precision/verify.py | 383 +++++++++++++++++ 13 files changed, 2143 insertions(+) create mode 100644 research/p104-delayed-precision/NOTICE.md create mode 100644 research/p104-delayed-precision/README.md create mode 100644 research/p104-delayed-precision/RESULT.json create mode 100644 research/p104-delayed-precision/SOURCES.json create mode 100644 research/p104-delayed-precision/TASK.json create mode 100644 research/p104-delayed-precision/VERIFY.json create mode 100644 research/p104-delayed-precision/WORD.json.gz create mode 100644 research/p104-delayed-precision/export_word.py create mode 100644 research/p104-delayed-precision/predecessor/README.md create mode 100644 research/p104-delayed-precision/predecessor/SOURCES.json create mode 100644 research/p104-delayed-precision/producer.py create mode 100644 research/p104-delayed-precision/test_verify.py create mode 100644 research/p104-delayed-precision/verify.py diff --git a/research/p104-delayed-precision/NOTICE.md b/research/p104-delayed-precision/NOTICE.md new file mode 100644 index 0000000000..53bf10600c --- /dev/null +++ b/research/p104-delayed-precision/NOTICE.md @@ -0,0 +1,33 @@ +# Source notice + +New precision replay, stream exporter, tests and proof are Apache-2.0 under the +repository LICENSE. + +`producer.py` is retained byte-for-byte from Jose Manuel / jmbarrancoml's +PR2139, commit `1df674ca8e9d9e0fb98ba4df402b648e9b3be0a4`, at +`research/p104-delayed-query-side/verify.py`. The original README and source +manifest are preserved under `predecessor/`, including their original notices +and disclosures. The exporter and literal stream are not a newly claimed +P104 construction. + +The producer consumes Ali Romman's `research/native-source-codes/source_data.py` +and its immutable selected archive. Its original source-word, Hamming packet, +mutable-source/target, native compiler and hosting credits remain authoritative. +The native fixture and compiler/interpreter are inherited through Rohan Arun / +PR1972 and Chafik Boukhalfa / PR1991. Adam Gall / PR1940 and Josie Elliston / +PR1071 supply the preceding delivery geometry. Compiler credit remains with +icekylinx and the retained native lineage; the independent Gaussian interpreter +is Ali Romman's PR1862/PR1931 lineage. + +Relevant unchanged notice files remain at: + +- `research/native-source-codes/README.md` and its source manifest. +- `research/p104-native-channel/notices/`. +- `research/gauge44-slots-t16/NOTICE.md` and `UPSTREAM-NOTICE.md`. +- The selected archive's pinned source credits, listed by + `research/native-source-codes/source_data.py` in `CREDIT_PINS`. + +Adam Gall / PR2096, exact head `f22626f334a06f6e842766e4a6647419e6821d2d`, +supplies the Hilbert-norm independent-defect and state-relative feedback method +on the different G/2 channel. No code or numerical constant from that package +is copied here. Its combined-word precision handoff motivated this check. diff --git a/research/p104-delayed-precision/README.md b/research/p104-delayed-precision/README.md new file mode 100644 index 0000000000..159d0aa525 --- /dev/null +++ b/research/p104-delayed-precision/README.md @@ -0,0 +1,246 @@ +# Precision of the completed delayed-query P104 word + +This supplies a finite local precision implication for Jose Manuel's +[PR2139](https://github.com/CrocSwap/integer-mult-bounds/pull/2139), exact head +`1df674ca8e9d9e0fb98ba4df402b648e9b3be0a4`. It does not supply a rounded +recursive implementation, an admitted supplier or a new exponent. The +predecessor's unfavorable fixed-profile cost screen remains unchanged. + +Adam Gall's [PR2096](https://github.com/CrocSwap/integer-mult-bounds/pull/2096) +checks precision for the different `G/2` channel. Its next question 2 asks for +combined prefix/error maps once a corrected chronological word is available. +This result checks that implication on PR2139's completed forward identity +word, rather than transferring the old channel's constants. + +## Exact result + +The norm is the maximum of individual register Hilbert norms. It is not the +addresswise maximum norm. Let every independent initial register have norm +at most `B`. + +| All-cut quantity | Exact coefficient | +| --- | ---: | +| Ideal input-to-register row norm `P` | 131072 | +| Accumulation of independent unit absolute defects `A` | 1394705 | +| Accumulation of independent weighted defects `K` | 2134050 | + +All three first attain their maxima after combined event **33373**, in source +register **93**. Events are zero-based: 7686 initial compensation additions, +then the predecessor's 26647 actions. The attaining instruction is +`source93 -= 8*source103`. Its ideal row is + +``` +-65536 * input86 - 65536 * input93. +``` + +Input86 is one of the omitted source ports and is an arbitrary dirty helper. +The final source row is just input93. The final target rows are `Y_t + X_t`, +and all 628 dirty helpers restore their own inputs. Thus the ideal endpoint +maximum of two cannot replace the all-cut coefficient 131072. + +[RESULT.json](RESULT.json) contains the complete 2-input and 29-defect +attaining rows, all-cut norm-stream hash and endpoint error maxima. The +checker visits every changed register after every instruction; untouched +registers retain their preceding norm. Exact adapters preserve Hilbert norm, +and exact resets cannot increase it. This covers the initial boundary and +all 34333 subsequent instruction boundaries, not sampled cuts. + +There are 32722 defect sites: 28108 additions, 707 scales and 3907 positive +native transports. There are also 32 exact private resets and 1579 exact +phase/adapter annotations. The eight private copies are additions following +owned initialization, not eight uncharged extra operations. Their later +reset does not erase defects already propagated to another register. + +The full paid profile stays +`2564 H1 + 547 H2 + 432 H3 + 142 H4 + 83 H5 + 128 H6 + 11 H7`, +with rank mass 6782. No precision or recursive charge is removed. + +## Error contract and proof + +### Literal scalar reduction + +Use the predecessor's actual common unitary charts. A physical register at a +cut is `Gamma_W z`. Each exact native transport is +`Gamma_new Gamma_old^-1`; additions and scales have their literal rational +coefficients in logical coordinates. Boundary monomial factors are exact. +The inherited normalized Clifford factors are unitary in Hilbert norm; this +is not a claim of addresswise contraction. + +An additive physical output defect at site `j` becomes +`eta_j = Gamma_after_j^-1 e_j`, with the same Hilbert norm. Therefore every +cut row has the exact form + +``` +z_r = sum_s a[r,s] * input_s + sum_j c[r,j] * eta_j. +``` + +The implementation retains signed dyadic coefficients until it takes the +row's absolute sum. At every updated row it checks cached input, absolute and +weighted norms against direct reductions of the complete coefficient maps. +It does not multiply positive majorants throughout the word. A separate +reverse-adjoint recurrence uses `Fraction` arithmetic and +agrees on the attaining rows. Sign-aligned forward executions attain `P`, +`A` and `K`. For arbitrary independent vectors, choose one unit vector and +align each input or logical defect with the sign of its row coefficient. +Unitary charts convert those logical defects to physical defects with the +same norm. This proves sharpness for **independent additive vector defects**, +not for correlated rounding errors. + +Exact private reset replaces only its current row by zero. Existing error +symbols in other registers survive. Each later instruction has a fresh +error symbol, so reusing the private field cannot alias different lifetimes. +The replay independently checks all 844 initial columns, including the eight +private columns, against the completed endpoint and full frame contract. + +### Absolute defects + +If every defect has norm at most `delta`, every cut has error at most +`1394705 * delta`. This finite independent-defect coefficient is sharp. +For example, `delta <= B * 2^(-b-21)` suffices for all-role error at most +`B * 2^-b` for any integer `b >= 0`. + +### State-relative feedback + +Assume exact dyadic coefficients and a common `u >= 0` satisfying these +completed-instruction output-defect bounds on the actual perturbed operands: + +- Native transport: `u * ||input||`. +- Addition `dst += a*src`: `u * (||dst_before|| + |a|*||src_before||)`. +- Scale `dst *= a`: `u * |a| * ||dst_before||`. + +Resets and monomial factors are exact. A recursively implemented transport +must first meet this completed-output contract; its internal errors are not +analyzed here. For a copy expressed as an addition after exact reset, the +addition hypothesis is sufficient, but may overestimate its actual error. + +Put `w_j=1`, `1+|a|`, or `|a|` respectively at those sites. The sharp weighted +independent-defect coefficient is `K=2134050`. If `M` is the maximum actual +register norm over the finite execution, then + +``` +M <= 131072*B + 2134050*u*M. +``` + +When `2134050*u < 1`, rearranging gives + +``` +M <= 131072*B / (1 - 2134050*u), +max_boundary_error <= 131072*2134050*u*B / (1 - 2134050*u). +``` + +For every integer `b >= 0`, **`u <= 2^(-b-39)` suffices** for all-cut error at +most `B*2^-b`. Indeed, + +``` +K*(P+1) = 279716335650 < 2^39, +P*K = 279714201600 > 2^38. +``` + +For `b >= 0`, `K*(P*2^b+1) <= K*(P+1)*2^b < 2^(b+39)`, which proves the +claim for all `b`, not only the tested examples. The second inequality means +38 uniform guard bits fail this particular sufficient feedback estimate. +It does not prove a minimal numerical precision requirement. This estimate also does not justify subtracting 39 +bits from, or replacing, the selected production precision bill. + +## Source binding and replay + +[producer.py](producer.py) is byte-for-byte PR2139's original `verify.py`. +Its original README and source manifest are under [predecessor/](predecessor/). +`export_word.py` authenticates inputs before importing that producer, observes +only the return of its `main` function, and exports its actual initial frames, +final frames, every compensation coefficient, every action and frame basis. +It does not alter the producer's operations or checks. The registered replay +reconstructs and compares **every** exported field, not just a profile or hash +from a submitted receipt. Native mode also runs the predecessor's 241 new +recipe checks, all 421 bindings and its global-phase rejection control. +Original selected native recipes retain their inherited proof and pins; this +is not a fresh audit of every retained Clifford recipe. + +The default precision replay reads only `WORD.json.gz` and `RESULT.json`, +needs neither Git nor network and writes nothing. It verifies the complete +uncompressed word SHA256 before parsing. Full producer rebinding requires +Git history for the original selected archive. Compressed bytes are not the +mathematical regeneration comparison. + +From the repository root, standard-library CPython 3.12: + +```sh +python3.12 -I -O -W error -B research/p104-delayed-precision/verify.py +python3.12 -I -O -W error -B research/p104-delayed-precision/test_verify.py +python3.12 scripts/research_package.py --package research/p104-delayed-precision --check-only +python3.12 scripts/research_package.py --package research/p104-delayed-precision +``` + +`verify.py --write NEW_PATH` and `export_word.py --write NEW_PATH` create new +files exclusively. The behavior suite checks seven separate endpoint adjoints, +dyadic coefficient extremes, private-defect survival after discard, missing +clear and baseline compensation, illegal charts, receipt/word corruption, +changed-producer rejection before import, no overwrite, capacity limits and +relocated read-only normal/optimized execution. + +Observed locally on Linux x86_64 with CPython 3.12.15: the complete registered +replay passes, including new native phase checks and all nine behavior tests +in normal and optimized modes. The 65 repository research-workflow tests and +`python3 -B scripts/research_baseline.py` also pass. The latter checks selected +source bindings only, not the selected cold replay. No hosted CI pass, +proof-assistant run or independent human review is claimed. + +### Implementation bounds + +New replay loops have fixed stream bounds: 844 roles, 1008 frames of at most +nine generators, 34333 events and at most one defect symbol per event. Input +files are capped at 4 MiB compressed and decompressed. Receipt generation +observed at most 671250 live error coefficients and a maximum row denominator +of 54 bits. The optimized direct replay took 3.27 seconds with 114768 KiB peak +RSS on the stated Linux/Python environment. These are local measurements, +not portable resource guarantees. The registered commands have explicit +120/240-second limits. + +Python requires dynamic allocation and dictionary dispatch. These are +managed-runtime deviations from Power of Ten rules 3 and 9, bounded by the +fixed domain above; there is no ambient registry or unbounded queue. Rule 8 +also has a narrow replay-only deviation for importing the authenticated +producer and a return-profile callback with one known target, restored in +`finally`. The independent precision verifier does neither. All new functions +fit within 60 lines; Python warnings are errors in the registered checks. +No separate type checker or linter was available locally; strict compilation +and execution are the available diagnostics, not a substitute for type analysis. +The preserved producer and loader contain long functions and historical +library/control-flow patterns. They remain immutable predecessor inputs, +not refactored code. Their compensating controls are source authentication, +fixed input geometry, exact regeneration and bounded replay. A future +predecessor API change would require a separately source-bound successor. + +## Open next questions + +1. Bind an actual rounded rank-1 through rank-7 child to the completed-output + Hilbert defect hypothesis. First test the exact rounding convention at + `u <= 2^(-b-39)`. The missing implementation/interface, not native unitarity, + blocks recursive precision admission. +2. Reduce the source93 transient while retaining the full dirty boundary and + bill. First inspect the gauge/scalar cleanup interval around event33373, + propose one exact resynthesis, and replay all columns and paid operations. + Common-chart legality and arbitrary dirty restoration are required. + +Global owners, the dual word, tape/all-size lifting and supplier admission +remain open. PR2139's fixed-profile cost obstruction still applies. Neither +finite precision implication nor automated verification is a complete +multiplication theorem or independent human review. + +## Credit and freshness + +Jose Manuel / PR2139 supplies the entire corrected construction. Adam Gall / +PR2096 supplies the Hilbert-defect and feedback method on the older channel; +no constants or code from that package are imported. Rohan Arun / PR1972, +Chafik Boukhalfa / PR1991, Ali Romman's source reconstruction and Gaussian +interpreter, Adam Gall / PR1940, Josie Elliston / PR1071, icekylinx's Clifford +lineage and the selected Hamming/dirty-helper contributors retain their +original attribution. See [NOTICE.md](NOTICE.md) and the retained source +manifest. New material is Apache-2.0. + +The scientific base is canonical main +`0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2`, priority revision 4. The sole chooser +nonce is `159427fb87da401855d7b74679378fb5`. [TASK.json](TASK.json) records the +changed scope and overlap limits. The canonical coordination claim is in +[Discussion2121](https://github.com/CrocSwap/integer-mult-bounds/discussions/2121#discussioncomment-18934115). +No selected record, frozen predecessor or review disposition is changed. diff --git a/research/p104-delayed-precision/RESULT.json b/research/p104-delayed-precision/RESULT.json new file mode 100644 index 0000000000..15b2b4d761 --- /dev/null +++ b/research/p104-delayed-precision/RESULT.json @@ -0,0 +1,310 @@ +{ + "all_cut_norms_sha256": "ef479ccafbbbfe94b37447cdef3def907f870c7f6fdf6a68759cf2473fc72651", + "all_cut_peaks": { + "absolute": { + "event": 33373, + "register": 93, + "value": "1394705", + "witness": [ + [ + 7691, + "-65536" + ], + [ + 19242, + "-65536" + ], + [ + 19243, + "65536" + ], + [ + 19245, + "-65536" + ], + [ + 19254, + "-65536" + ], + [ + 19255, + "65536" + ], + [ + 19257, + "-65536" + ], + [ + 19298, + "-65536" + ], + [ + 19299, + "-65536" + ], + [ + 19300, + "-65536" + ], + [ + 20913, + "-65536" + ], + [ + 22867, + "-65536" + ], + [ + 25350, + "-65536" + ], + [ + 25353, + "65536" + ], + [ + 25355, + "65536" + ], + [ + 25679, + "-65536" + ], + [ + 26768, + "-65536" + ], + [ + 27760, + "-65536" + ], + [ + 27768, + "32768" + ], + [ + 31855, + "32768" + ], + [ + 31898, + "65536" + ], + [ + 31952, + "65536" + ], + [ + 31954, + "8192" + ], + [ + 33167, + "8192" + ], + [ + 33175, + "-1024" + ], + [ + 33195, + "-1024" + ], + [ + 33196, + "-8" + ], + [ + 33370, + "-8" + ], + [ + 33373, + "1" + ] + ] + }, + "input": { + "event": 33373, + "register": 93, + "value": "131072", + "witness": [ + [ + 86, + "-65536" + ], + [ + 93, + "-65536" + ] + ] + }, + "relative": { + "event": 33373, + "register": 93, + "value": "2134050", + "witness": [ + [ + 7691, + "-65536" + ], + [ + 19242, + "-65536" + ], + [ + 19243, + "65536" + ], + [ + 19245, + "-65536" + ], + [ + 19254, + "-65536" + ], + [ + 19255, + "65536" + ], + [ + 19257, + "-65536" + ], + [ + 19298, + "-65536" + ], + [ + 19299, + "-65536" + ], + [ + 19300, + "-65536" + ], + [ + 20913, + "-65536" + ], + [ + 22867, + "-65536" + ], + [ + 25350, + "-65536" + ], + [ + 25353, + "65536" + ], + [ + 25355, + "65536" + ], + [ + 25679, + "-65536" + ], + [ + 26768, + "-65536" + ], + [ + 27760, + "-65536" + ], + [ + 27768, + "32768" + ], + [ + 31855, + "32768" + ], + [ + 31898, + "65536" + ], + [ + 31952, + "65536" + ], + [ + 31954, + "8192" + ], + [ + 33167, + "8192" + ], + [ + 33175, + "-1024" + ], + [ + 33195, + "-1024" + ], + [ + 33196, + "-8" + ], + [ + 33370, + "-8" + ], + [ + 33373, + "1" + ] + ] + } + }, + "defect_sites": 32722, + "endpoint_error_maxima": { + "dirty_helper": { + "absolute": "131727/4", + "relative": "11940483/256", + "roles": 628 + }, + "private": { + "absolute": "0", + "relative": "0", + "roles": 8 + }, + "source": { + "absolute": "3226355727/131072", + "relative": "3231272975/131072", + "roles": 104 + }, + "target": { + "absolute": "13259/4", + "relative": "20699/4", + "roles": 104 + } + }, + "events": 34333, + "evidence": [ + "full arbitrary-input endpoint and paid profile", + "three reverse cut identities", + "three sign-aligned attaining executions" + ], + "maximum_live_error_coefficients": 671250, + "maximum_row_denominator_bits": 54, + "op_counts": { + "add": 28108, + "exact": 1579, + "reset": 32, + "scale": 707, + "transport": 3907 + }, + "paid_mass": 6782, + "roles": 844, + "scope": "Finite completed forward word, conditional unitary-chart/completed-child defect contract. No rounded-child, global hosting, all-size, supplier or kappa claim.", + "status": "PASS_P104_DELAYED_PRECISION", + "uniform_relative_guard_bits": 39, + "word_sha256": "8be1f3c659d887030fa70afdbdeca38fbfbaea1b2a57b1783d3669e92816545c" +} diff --git a/research/p104-delayed-precision/SOURCES.json b/research/p104-delayed-precision/SOURCES.json new file mode 100644 index 0000000000..3aa9bf2c27 --- /dev/null +++ b/research/p104-delayed-precision/SOURCES.json @@ -0,0 +1,66 @@ +{ + "schema_version": 1, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "predecessors": [ + { + "author": "Jose Manuel / jmbarrancoml", + "pr": 2139, + "head": "1df674ca8e9d9e0fb98ba4df402b648e9b3be0a4", + "path": "research/p104-delayed-query-side/verify.py", + "retained_as": "research/p104-delayed-precision/producer.py", + "sha256": "c948f0d726399b1a4503af3b6468566be270f86229e5d0d29a2b62bf4d4e553a", + "scope": "Entire completed forward construction and inherited native checks, retained byte-for-byte. Original README and source manifest are under predecessor/." + }, + { + "author": "Adam Gall", + "pr": 2096, + "head": "f22626f334a06f6e842766e4a6647419e6821d2d", + "scope": "Hilbert-norm, independent-defect and state-relative feedback method on the different G/2 word. No code or constants are imported." + } + ], + "word_payload_sha256": "8be1f3c659d887030fa70afdbdeca38fbfbaea1b2a57b1783d3669e92816545c", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", + "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "e8870e5917057d59b730eb14721a778639eca050", + "sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7" + }, + { + "path": "research/native-source-codes/source_data.py", + "usage": "input", + "git_blob": "c9d465ed47500304bef65fcb588befe356c5cf09", + "sha256": "d23924511e3aed41e5e64511ca70126a636d91c8aa02e656cb61d6ceca1fe0a0" + }, + { + "path": "research/p104-native-channel/inputs/P104-FIXTURE.json", + "usage": "input", + "git_blob": "2e16f99b295bb386fd13bd8fbd57b42ef54143a9", + "sha256": "516c06f6ec3cb84be588c546108de897650288576dd5fbf5fe44b9c5546ad8a4" + }, + { + "path": "research/community-frontier1042-audit/selected-replay.tar.gz", + "usage": "input", + "git_blob": "6f4dc6fe7631d8aacf8081fcaecf32197181685b", + "sha256": "22c3f4dce4b897a1d423d1388801933e288b6a6b1906cb15e1b16a5eb68db754" + }, + { + "path": "research/p104-native-channel/vendor/clifford_exact.py", + "usage": "input", + "git_blob": "166841a037f069249f6f7f6dedb89248812f59e2", + "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962" + }, + { + "path": "research/p104-native-channel/vendor/native_verify.py", + "usage": "input", + "git_blob": "2c209dfa9cfade3bc20ac5fc9d876b433a147f8c", + "sha256": "3049471905b47b385c88378a1a3be7a18b8858aadd035b8a6da2f4a03b470f38" + } + ] +} diff --git a/research/p104-delayed-precision/TASK.json b/research/p104-delayed-precision/TASK.json new file mode 100644 index 0000000000..c34d855f3c --- /dev/null +++ b/research/p104-delayed-precision/TASK.json @@ -0,0 +1,107 @@ +{ + "schema_version": 1, + "task_id": "p104-side-correction", + "priority_revision": 4, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "original_card": { + "id": "p104-side-correction", + "question": "Can the native P104 low-rank channel be completed with a legal, fully charged I-G/2 side correction?", + "starting_points": [ + "research/p104-native-channel/README.md", + "research/p104-native-channel/PROOF.md", + "docs/research/community-efficient1000-review.md" + ], + "methods": [ + "Construct one side-correction word at an explicit chronological cut with the needed frames still available.", + "Derive a lower bound on the side correction and hosting costs that decides whether this channel can beat the selected budget." + ], + "acceptance_gate": "An exact arbitrary-input identity, source/target frame availability and restoration at the chosen cut, plus the complete channel+correction+idle/hosting bill or an explicit favorable bound. The native channel alone is not a supplier.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the P104 open next questions and its fixed local histogram; inspect why appending I-G/2 after source completion is not justified. #1991 supplies the checked native channel, not the missing correction.", + "scope": "Source-bound orientation only. Read the named package and review before relying on its local evidence; this command is not its replay or supplier admission." + }, + "first_experiment": "Choose one exact side-correction cut and bound its allowed cost from a favorable completed moment at a declared target. Stop or hand off if the necessary source/target access cannot be justified or even the optimistic total misses the target.", + "bottleneck_link": "Completing an already realized changed channel tests a concrete construction opportunity, instead of refining the incumbent packing. A positive local result still needs global and all-size admission.", + "allowed_variations": [ + "One correction factorization, one chronological cut, or one explicit hosting obstruction.", + "A changed correction schedule with an updated full bill and native frame contract." + ], + "scope_change_triggers": [ + "Recompiling the already certified low-rank channel without closing a new obligation.", + "Treating a pending ancestor, local histogram or unpriced side correction as an admitted global supplier." + ], + "overlap_terms": [ + "P104", + "I-G/2", + "side correction", + "native channel", + "1972", + "1991" + ] + }, + "scope_status": "changed", + "actual_scope": "Source-bound all-instruction-cut input and defect coefficients for PR2139's completed forward P104 identity word, including its initial compensation, 628 arbitrary dirty helpers and eight owned private-copy lifetimes.", + "scope_change_reason": "The live overlap supplied a completed chronological identity word in PR2139 and a precision handoff in PR2096 question 2. This closes that finite local implication rather than duplicating a correction construction. The older G/2 word's constants cannot be transferred to this changed producer. PR2139's unfavorable fixed-profile cost screen is retained, not reopened.", + "bottleneck_link": "A completed P104 mechanism still needs a local precision interface before any recursive admission. This result measures that obligation on the exact combined word and supplies a reusable benchmark for changed carrier paths; it does not pass the original supplier-construction gate.", + "budget_minutes": 60, + "stop_rule": "Stop after the literal word binding, exact finite all-cut bound, independent reverse/Fraction checks and failure controls. Do not redesign the word, improve its owner packing or claim a rounded-child or all-size implementation.", + "outcome": "completed", + "evidence": "WORD.json.gz rebinds every stream field to the unchanged PR2139 producer. RESULT.json records P=131072, A=1394705, K=2134050 and 39 sufficient relative guard bits. The independent verifier checks all 844 input columns, every instruction cut and the complete profile; reverse adjoints and sign-aligned executions check the peak witnesses.", + "author": "Nick Petalas", + "ai_assistance": "Acceptance evidence consists of automated checks, not independent human review or proof-assistant verification.", + "chooser_nonce": "159427fb87da401855d7b74679378fb5", + "scientific_predecessor_head": "1df674ca8e9d9e0fb98ba4df402b648e9b3be0a4", + "discussion": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2121#discussioncomment-18934115", + "entry_overlap": { + "open_prs": 403, + "discussions": 826, + "complete_pagination": true, + "warnings": [], + "checked_at_utc": "2026-10-14T21:03:22Z", + "limits": "Titles, bodies, comments/replies and local package metadata, not all code diffs, closed history or unpublished work. No-match does not prove novelty." + }, + "submission_checkpoint": { + "canonical_main": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "priority_revision": 4, + "checked_at_utc": "2026-10-14T21:31:14Z", + "relevant_changes": "None. Canonical main, selected record and both pending predecessor heads are unchanged.", + "open_prs": 415, + "discussions": 837, + "complete_pagination": true, + "warnings": [], + "overlap_delta": "The targeted precision search matched this claim and an unrelated cyclic Fourier local note. The final all-P104 refresh adds PR2163's max-flow audit of the frozen cut family, not this changed producer's precision obligation. Entry and submission coverage do not include all diffs or unpublished work." + }, + "verification": { + "environment": "CPython 3.12.15, Linux x86_64, standard library only", + "commands": [ + "python3.12 scripts/research_package.py --package research/p104-delayed-precision --check-only", + "python3.12 scripts/research_package.py --package research/p104-delayed-precision", + "python3.12 -I -O -W error -B research/p104-delayed-precision/verify.py", + "python3.12 -W error -B -m unittest discover -s tests -p 'test_research_*.py'", + "python3 -B scripts/research_baseline.py" + ], + "behavior_groups": 9, + "repository_research_tests": 65, + "unrun": "No full selected cold replay, fresh native audit of every retained recipe, rounded recursive child, global owner/dual/tape/all-size admission, proof assistant or independent human review." + }, + "open_questions": [ + { + "question": "Does an actual rounded rank-1 through rank-7 child meet this completed-output Hilbert defect contract?", + "why_it_matters": "A symbolic local feedback implication does not establish recursive numerical stability or permit removal of the production precision charge.", + "first_step": "Bind one actual child implementation's rounding convention to u <= 2^(-b-39), then test its complete output defect, not just a native factor's norm.", + "blocked_by": "No rounded-child implementation or all-size error contract is supplied here." + }, + { + "question": "Can the source93 transient be reduced while preserving the completed word's dirty boundary and full bill?", + "why_it_matters": "All three peaks occur after source93 -= 8*source103; its ideal row is -65536*(input86+input93), despite a final unit source row. This creates substantial interior amplification.", + "first_step": "Inspect the gauge/scalar cleanup interval around combined event33373, propose one exact resynthesis, and replay all 844 columns plus the full transport and coefficient invoice.", + "blocked_by": "A changed scalar order or scale must retain legal common charts and arbitrary dirty restoration; a local norm reduction is not a supplier or exponent improvement." + } + ] +} diff --git a/research/p104-delayed-precision/VERIFY.json b/research/p104-delayed-precision/VERIFY.json new file mode 100644 index 0000000000..4a4fc3997b --- /dev/null +++ b/research/p104-delayed-precision/VERIFY.json @@ -0,0 +1,35 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/native-source-codes/source_data.py", + "research/community-frontier1042-audit/selected-replay.tar.gz", + "research/p104-native-channel/inputs/P104-FIXTURE.json", + "research/p104-native-channel/vendor/clifford_exact.py", + "research/p104-native-channel/vendor/native_verify.py" + ], + "commands": [ + { + "argv": ["{python}", "-I", "-W", "error", "-B", "{package}/verify.py"], + "timeout_seconds": 120, + "checks": "All 844 input columns, every instruction cut, complete profile, signed sensitivity peaks, independent reverse cut identities and constructive attainment." + }, + { + "argv": ["{python}", "-I", "-W", "error", "-B", "{package}/export_word.py", "--check", "--native"], + "timeout_seconds": 240, + "checks": "Authenticate and run the unchanged PR2139 producer, compare every literal-stream field and run its 241 new native recipes / 421 occurrence bindings and phase control. Full Git history is required." + }, + { + "argv": ["{python}", "-I", "-W", "error", "-B", "{package}/test_verify.py"], + "timeout_seconds": 120, + "checks": "Fraction arithmetic, seven endpoint adjoints, private-defect survival, malformed chart/clear/compensation controls, guard boundaries, relocated read-only normal/optimized replay, corrupted source/receipt and no overwrite." + }, + { + "argv": ["{python}", "-I", "-O", "-W", "error", "-B", "{package}/test_verify.py"], + "timeout_seconds": 120, + "checks": "Repeat the behavior suite with Python assertions disabled." + } + ] +} diff --git a/research/p104-delayed-precision/WORD.json.gz b/research/p104-delayed-precision/WORD.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..44bc431a2d077340a891b6e51ddbfb7e959cf2b1 GIT binary patch literal 141047 zcmaI72{@GB+c=(WEMx3jgN!kZoiw4bWSJQ=#aNOMnwV;oJ(Q(ojD3q43R!2SER`e* zAzPuyMYOuxO%M z&!oC&>e0}c6#=1c^fJptC_Qmt>5bAG_JiqVm}&3R6F*z^B*7ndgu7? z=a-U)zvmqHu6BR&3;MnD{AOrEhF{CY6m_VDWMug{(D zzuP<&_4(_^7iXtm+l5~EegDYsPh;S(7tVkG8GPZJ%ERB^_8#e*y72w;)UR(>E?fwF zTjG;{;m79C?~O0(C6>QF+y|iBx1T#d{IL=BBk$o4)8fh_zgMrkX#PDEy?I;lti_v4 z%;=F6!`vp}Niz3*b6(>5?^Un02?d~NDLTCFU8BNx zd>?37&aLC8yYR=uB=hUjb{rE>S7@-6(xrV97r^iR2ES>3d%R8ldRfV>=qcXM9A5of zd|JAXHa#l$1PxJ5{xsHYQn6& zl=c00EG)Z6hx%+O)b53*$LGN2H-Bn=3z8E8xtnW8>=l}0f$fb*!egsn+`WIES6=D9 z96*S%k^jo~tKwCwO8j@F`2O=Gq3_hwQ7Y?CDCRkwK6d`fp6c$ojfN?4rAv~B`{zs( z5;Rp#?VoV$jMjx}>0u5lY>BOZ=h>UUMhP9*P{U&sh4rx$rD=sowj|6bI4!kC0<8a!t^j2br&sO zU;ZB4PMPBMS61lg=Dvb{_bFKVjMro9YnFj`99#Z=iE};xCQjH6IVzWaT5kM|wPh2D za@Wc|b=~hk^z2XFv!Z!=dXKbpF`Mp(AOE}_Zhrmf$qq8OV|HA2>O%U=9i);Ac>BKq}iOdgkQC=U{X?-dWu=}tf7_ZQ2_M_5@p66n@m|lMDNBnpYxCh(qZ~`Rf9|iD z4VMU%AMJWD_wL^1h!4@5o!8*;wT^k&ebw ztlpYQGJ6?Y)sWU_BVDzL|uu&p&tX3ev?R#@6#@0x4ceH^! zYo9(Ym}H#qo4V+4n16KZzTL4A-%BoXB|FkmIM~+`gs-Tka9hO40GE(z>|_TNp|Sn4 zBLk#Yu&tJrF&Q!r8Z4mNbSN3Eg?8eQBIx9o1jS8L?bX*#W4HF8ditkpF2l=iKAkqr0j$3Q;d#8A@H48@ox^FdlEI7bMZsg zq(|NX2#M#(3;uO#p2_n@rO{BYE-~vbC{riS)xJ}_wsH&k^%5;9s_YYT3){71p5rwO zB!Pdbz=CGLGorijxt%g8$F05=hLnBP?9T}9uuDQ#uw+ucUYvT!v87G5Xu#8P44KGd zq^lP?o)|ymus`)s`a7!A6=blT_4Z4N7KBhpVU!lT>jv1JaHG)(rn4UuTmm?%A_1Xbq%O z0>hi7kD>{OksGk>+li^Lz_k|GlHpFz5VME^4@hfc98el@+c?^liCu)L@M5zf3s60I z6%;irQX6`6DRr!JfNg!9#iYqNM9vT+XX3^xJNaCllaoFe4(AG2mx+PxJTJxUl;sS} z-#XH$m0T<)f2UJ}2~l8wILM zP3zi=N=scui(A*vZPOv=vqDUfW}$nnK3xqUY+C zZVk{J-BQp$1GGzAVh2}HSUenV{{!Y>b^f9*Y%g9eOZwOhK7WI!_Tm zQsH9qOd z6~+6Q(c097O8%^edk^QkgJp+Mm^NZl~)i`_Pru)-0ob5jhvHu4{sG>><9dc!J)Xo z^Xen-)XOk>}~(_GS(BZSD!T=JD8!vFKY zF8k<*uZLwnxB{MN@tR$JXLH8jkkoHm^_9IcO)-r<6Hg(LzJiULc-~+^3gZ@QZa4Vxh+%JP3ZuUpy;qzV~yrysmgUp)M&>}+En)^ zav?V(Yke;GBHRJ&MJK zkFKFbw3(gK3VIdEL<3(t9y1O1P#IZ{zi(109GxNB2-FI?5yyn11CuA)P9i_l1E7Ov zyzX*pDi`JPlwUTq1AqXVfDxDmkRbQ;h_8(R#nE&oM7Bk;sPqIVf7cdo9w-iI>&dKq zV7zuqx^}rA@vU)nmzd1(0a{2astX(Kr?_j^(lsTZ1*Sy zqwd&-E|{PRv<)87P_-4%t@6T*l5hzY-%VkhoY6d`nM0nbb{O?jFEh!1pF&#QbBMQF zPFU%%W=KGG+nofUAfj{_5fV_=b_dJb4SlwN2bD1DCpe?kg>$$0=QeeEqt3Gc3&B`5 zh%Bd2AduL^!JDA(Knc8OkXXh?istfe6Ijf6GGOt*vBAFefF0qmP|;J2Q`CxsJ+z4Is%wP5448z`6wv^h&zU=i5g;qRDcXs8VaY`X#3 z4)2;l<)vF-gHXdl%~Vci0XmsO9p%$g4UV%-lCOLVe}3h?`=^2S@{)|mFGWuHYCc2x~H>n z`+2PAb}66#=(p$SwA2dY9v_EK!ME$ApPPZpng({iqze_!=EdR#QnEy(RAn`7wDIw- zr9zcfe+Yfw;k0H0qn__@z7_+cI1FAOHS62AjmLf5OKYbxE;A$JFiZTYqry`4(uk8t z{3~KSb1OGjImBb$qsR8>ZU7G8k@? zUlh3Bm#l%utoJ4Ae@cImlogE-dZy|PHshd6wnULnGO$`m%X&w1_Vv6t6}4dbu(Lz; z8v*?N2T`1qEO{ftqXo~oDx>%Afc%qk{TxScL`f6gGNLSY0lxVvVYL$ce-aiyE9xzN zcJzGmNss>aux9std}eUA(iD78YeHCT+U$lLK*)J}7}0${`N%Z8NL0dvm+{Vfc+MnG zw~7v6uBeVuRl%`J*G#Vq-f9qmnmco@AKn7&HAm&&k)$t(NX?j0oU~ca z=>#0oU*f3a80pVQ>Uz?}^R*5FIu)0lU@!7K7?t1f^QXjjIys zsE6$oIfVtB+61@jBtkf+?+1wSu|lSxM1btblwQ|`#ndJ*_QGqC;GSY#cueiZ#a`aB z%@ncmyMP`!;pZ>mWt$!_)ZVoC_a~@*KcwYsKHp6q$A`ri3(Vr=vK0xLeGH{CB--X* zMvi1OU2P3x$Nft=!PA(HoyGk{rTk$&k=^%0SEArThYjUC{qtAd8laM~ABef7low;t zMfZ_=f*r#ri)WiHdZS|Gg#NUE@Rx!Pb_|;==5A5G3xmrxAwX*wO7F_ovx>%oenh`} zxKF+;SEvLxl@1^E&cy7Z(fMdlm#P6UIn^_cPpj0b`7e@*I=) zC?Y#J)ZRmSx_~Qc?hBe7V}Z{JrFuZ*NCt*2G6&Jc#jpC0B13rGqqHNlo==~RcG|D+ zG28~JRabNj4xZmFV;u5!T!b3rZ0zxNe(6?8#OOtibX{GoB$Rw=S8KrDE_y~?5jC`Y z(GoOrF5SS4|IRFINr^lx;10=wbZo3j9@?)_RNE^tL52kywJ_2%5Jhydx%_rK_HrDr zU#IZRSdk;Ac}jd;4vrEy0&mQPbn$m_Q)l+mq=%ga{hLKF2AE(cyLXFkt#wpJLDDy_ z83eMd_wMW7jku^!8LtwJ>T_HAaGm=ZWo{BknH00E_GHlOY}Im((qK8WYC zj~(ik$Szx889JoBdpJdzp&Q%rx}~#6LM>3wTt2Gf$?0rhUxo4*%e}AeXqq)> zjn-%zt!@CDL0(5=02w7VY8=k=E6=SJ?`K5HX zlWXfl4%I%so2#HgK2y>BbcD33x*>#fo3_HT&_u(CqS)3+x=@5!{MBm3bZ8f_etH~G zCTO2gOU%mDS{ZSgM1=mP7Y`fXeu6XW(&FCBcNTHw=kRVmQvMl8C?~Azun;?U2 zI!T{1j7e+!dbbMi1@i^11hzpYN&QLvo14aA=O-!CD<9ao`}Gww&=yJ@EajbRtl}PS z5Ne_591JbdLeP`WU|?DplvsJ_!H&e*0dk>c^(Tj7*(h(dcPFsWn*oQ3!1QXOH7d&K z3GlltQ+Dn72wXf31@(~Xp<7+%Kl#yWNx9-O*rPT}9k@Bi=p=mvE4LbiZM3ePqa<-) z1adt9_e_7cN&1+k)M{|<(%4a>!n)3Ntk{(Np4cPYm2>mo=foI|H~vcf3+upL zmRMRjmkqG`oZI6sc-L7{xCm$4)gJCze9qr+A>YbEnv51%U~$0tEj_c|T_@Kj4(9AD z@12z;JCx^-kgJe)py$p&&YjVdR)BM_5!LRd={hCc)KKx6FAby8o+VT>0QAx4?_bv01%GybIZY-b zaR6in)>3S>I=er~xf|i(DtiV4k#IOd!wd}d-5*lc&{^sBj?qp}EhdGoH#&1jD~-zh z8vB!_?)3YsCGu+*gtHhE42C29JKS*L^dssa1o@a4y&9czIUiG0Sd&$a&d$llJVBWf zVr1@kCWrX1z*jVuRL8d)*@-7*kJ+Xq?U~*w98j8SqkE2)>orK=@50bYQUpW6-h+W_ zHsNt-?MvEpg|EcmK3M=Q@rYGN))As^^d@THjSIU>RubX?yVvy@Ln!wlCeyu^*Ja zyu(oib}*v(t8#-?G!x85HvN4x{!fYiALKtY;PGF`|8V|a;*RbO%!s)AXvLf6ZXx}| z#o@M0xVrp2=G~27rAwyaX6&@Q6BnZJ`W{hdDd#_FRALQ$1>GkC>GTtE^uR3WD1W4a zyV`R??=pMV;Ut%2kyX8`_>ES-v=8YTXHv3YR=JE&t#rQaYEHAf*7jQ{!fP5r$03`Z zb`zE0RsjD%rKg#FdDbDObM%m7iD%IZJ_S0CWEWYA)~NE!eyoo)tZfqM>qu(uWV8`U z{jZ*Uh%eG`y98UY0a%Ex-2`ZiK5w~1EItxeq+#L5PL=Bc{Dqn5$4I94k%_%88VBi| zH(=Lpg|;j!h!pz-oTpjLsQQZJ4f*X=X|B$uMIQlUI0Jp$j47`$wC~r@z*ndHYR<~N zxUN1NCe>3=aZt?Bs2Y5WflWMFrcHN9n|qbS&^hzl{*4Pae4A&8G|Ii{!|{bHuEy?7 z&X3wW!pk9?j#`pt%y4USQguI{f)o#lfXqLyF>>^1lo6Yej=1YNWE9Q8e)H-*c1Qo% z`PcpfOMU!F^W}79F()h`M4?x;USDL5c_NM(cu{*45vh=uHtI9p^XKXV?ky>xN!{Qz z-lxy)WKuk9)y&$$SWD&^i(3~20LHB-=Q_*fy~&MQwc|3L(jvMh=d(WEUCE100=8** z4q1G4Gp~6cEozzXX3XerYGTl@yF2V4Ttpqi$Ii@gJ%KWY1HrU@I)3t>x{t_(s0~C$D|jH0ERY#eMtE$eR)Ti|&3b3qQ+bLO494 z&ezGT44EZ@wzvpmtaJYf|OQBEiq%+H|WPL`rYwg*e| zUk+Euc$KiwfG;;#5n$-67ADT7OYZT*yilO;!d2@QUhj50lNY-zmGR0ZLZ)^bQmB63 z5L)?YK?v=gd~3Oer=hT|tg~N07q{%X)1s!S-KP0T&76CtYRAV>3_BNaTb?Vq+5g50 zh$1xMIqO%F!rjl}n4C;eVW)1Z2rog+XoxFnek}q0^VdR_SaAQYC!NrY9i^Eua9g=D zM*1Kb8(fo0rZd6yc&g8DnFrc|(aO2^%RtVLGvp={p*Y}&X^m{UsLDVkOT6BjKKo6K zud$UD|3!QtSaE(u!*D@P{T(H%=GW104s_s+pIjxl6uX}^EZ|GaTN321IUb?zGuv|i z0~-{Jw|uc=8F9OETCLbkxpJS8U z3BNrPS+L!uEsFrftaRPN&I~~`Grpt`plq&eBtw_lea`zpnM>PwNZGgSo*?wi9>ar zJ-={GS1UPy@uGkDWH^<1PHH$=c{v$WLYcQ7AIdOTQ4gHiKiYGpF2%rK?MOe!_trp1 z`vk6)?GOuuiRi|k)B|Vtk9J+D%Qo;oQ-6IueWmuP@cuvKtERffq3!{*HN&$LQ@Etb z=z>mP>7+**jkXy?r@Cw(*RUk0gXc?U&XZG)8K4jBvfP(FPfk$YNt0cYz-_7BzG{~q zy*}nbo4SOr$6Buj1!CT4BGVu zj-qTdwyUPD_^*K`D5Rvfl)yu;2==8!sBSFI(bE~3v7=2w%}w#{ALD+j9NCwViuMnu zGt*@BVk7vxX-bR=MxIp>N@3912?^OzLFu0dM|^|x#gtKRRWNYkPIlO$F2n*t!wG5a zvl&!ZO7xYAkebz6CdwO<=^)8hgwn$d+IWGIbOpoeibnTe)}2&z3gH!j)r+pIV1Q`1 z64*qjLsKXZOFcpgU<8?I17ThuPN%F^xm9}?KTrYCI$#juY4)o>U0xArz(hli*IZz8 z6vJ6m1V}8%KTdS#ZxwmFRu~ZOD4j9k8XV z8t}5YZ+}oTKPMH3_fK0_Rj|`a>O!>0G;5j=0jcZ*Sh)bV?A~^(^KoU!qVNVhM|yYi zjHUvtu&SLgTxKc)!fy)(ylhgezf9C0{Im^W&?jk835P)vN>Fa6CmubI+CG>-GLp}& zsRl8W)1+Px{+Z+p7Tr-FAHyaytUH>Z5X-rOGky{uA6o(CW<|az6VRt1(X6^jQtiX+ zzvV4O?wdJm22oyf6iLk(p3bDKq+F&Gc~k0PzIs{iVEAhQwDQ$Ub_XL~$0gS*^t9|u zj`4%7KZY%5P{$Q%h@!4-1mw=F7(a>i$6HYHLtog1M=$`g>L-ZK-d5;3LUnbK$d$pU z3%C%hU0pI=yabHt8hZMazT){;|Ab{X|e!6A5$;2ESaP<=&4ScpH=*?ihXn_C%2no9mF8x#bm?VzebLI>j2LZIIpMk)>ST2rqKHF3JW` z{tQmszNSFV?uIEAZgVR%0`ECiJQs2)Nx;-$<6Hm&o_THRpR(&pZRS+-= zKFr2L+N~F}%#A+mnIy!^$Mp{HLYmd)4nY8FTjg z^oSX9itN3gtK0gV(Oqlu%N|k&w=BD-#WM$a%P0u|a<$2iW}=M-wlQbvUPfsRWVz5@ z-C4Rvm-^kT{qJKZvIATv+Hiw`l6kSF;~d=(BXDdPvpvZ+?82>TzIQ>f(s5|LqB%9K zJdB72JuZb!lKNj@+D4^Z?{F`6`B0C**3T$1EIYl(>y1>r*Q`{0EIkfgL`g>YOZFb9 zPc9enZ%23MAX8Qdf3N`f2P-AK#ZVG|NesEO2_Iu`RHy+Zo>m3I;`Xk1>dee3|CP28TF;Dk9#bBk`zbay}6Zru|Ih>3Ox^a z?KXzBtV1Ei>{%ENY#kc2?PtAU<8+jGNayDrvx##SZIG8SS&GH$+f2-Z!v#Au&cGIV zg3eCT##hFHFOleq1-k9NjsT=MM*v}95-!wGAf_6y+X0R0I%aYum^IY5^ZvmhQVq$< zsa*d$9$OjCz*fYcS>B!&&Voh9@^aoXl8bSUz;x3^=oSL-WOp#LyI0LLb4U9p0_Kt< zELy3>_3iAn0uWNmQ_=#65hTN+q0PO+Iw_iX5=V!QLNWc3bCivId5k@6zyJ)nnt~T%(-h!EUph-yP3f_5m;z` z>MhsfDlXV1oT*KpMzuE~Q+5Cy+298>P)r>R3xO_>T*9*G*Zf8a9S^_qPalb)uiUmE zYz!5{ew=cY_*IV-{yj=Tw)PTZ9qGb#y>79LTN}8;pEB;vTn%_+GMXA(D?24k=3Npt zqJBl>TU}l3G8s(?u9Kc3{}qz>S&vNlHA+UF@7Sl|#8P$-6cY1I0#qS;_(uW3-9R|b zcGsa^{!s>*HxTY%OxK8svoEzEX!I2$U_sJ>wMe1lF$RBEAk*P1KTl{3{bGZKwbl3* z(NRL;K2kV&41YBMAR+)_96$slaWiD;&{`y*^uL<+uUdlQNQHL36~u>MLq$wWx`IQN z)6BQZ0I7)ee&7A4T5hnK7MF&%RQZT2bQr>fy zcGwx*LPz-z_KsO(PA-S8Dpj%OoRkxodql9OrBdJ1$h@1|@~tv$IEC@dJ;K<}Jawhw zOo5_!<`x>MOXl4pj5#fn{2oXT671z)^_k&(`sm7}P8u>R;;pZbHsg@!IESpS_ZV!lJWAI-cK#h;7@iGS856 z?dN+zYpa-roXjJftXLFtR8Y_hoL=4Zex}tSc9Qa>dznYvcg;#&zG51&KTh~|ZBdP? zsZet=N9=f-K%5}8H@dVL8`S}BzuHDl)e*~=Ch{v%IX4}Q?u)cv>pY+J@^uo_2}pi3 za6xUNP96S=IQ%tsGCr+FMx^9tx?-Oqhd@ELWEzwEwa&2GjoYQ`BjI(DUgUuDs{a&Jk@S2MICWTo6Uu$BPw)WLghMaLdL<6T|N665(8Vltn zYCiY?GOOhiMJjf2t>0hN3atnHCK4`>2*=ZFw+9>UjMi`up4?G4bj#SNFx{2oWB|=S zlA1^{tYn(`pL(=+lw!0I=epCWM6e*kI`L$db~UZ;3;YP;Fu6kCCyCS>2viN|( zD97&5Xu)piD~`bWGrsd$-3k9!|v$bD@qI)01+Y8WYm0dkoZ1bfF)RiZfjcE^lHEx0C|aDcz1aVE=P*3$N2XN7foI7{56j)iWL zw8eKLwiDy@DdE|fTKzkpqy(}!{4rxKPiv%>4`_}z;2T1z72@?1s7i z^?Hc@t5@%mHQaP~5(jCP=U>mKQ0!2Y0QJSrwD@ypvuiHl419$uXAlPqD=M#f6)uFT zEX4U4UmQ$CKXy{i?F$VbKi5x;#tD6=0LdBdh(#8MydqG^48OB;4&sv^iz+dWBdPpSAogdfywF%c{VEZyowmD>_#W} zX&(P^|C&>rxbE!W_WeT=%3{i|ZMsX8wi)SSGijfHA3d@>dg!S7juZ67KAfN-0;Gjb z|Krn3l40*9Wc}hFDKjPn`~V&hqElGe`z+tL$ZR7Zcj92$nG(e0xj2P95R1P5BMw_Q zjF{=t7}(l`Q?y=^9=9M7+zW358stAk&TvMETz&4niFQs0=eN-4#+UiF4@{qE6|jl1?6 zmz{<~N4(jM;Pe1JQcPUScj5h?Mx_@g)Y_k4fXJ;r0CHO0m~wXo-(F;bWm?1mb3aK6 zS_11U=eX3w#95UP8LDuB2aE^aapOx;vq4wzwP(b`8~0~D^^WsemYNN_a<*w4dz&fs zu$cUL2f_Gbc66R&Qg4mh*JbPKGb!aCyw6|0CDuPjt!hwcu|8~Iw2@<*h7X(aWAAtm zY>+qTukJ{Ak>X>=f0|(P?88gm-1r_f)Uc0syL!x;v^topALtJlKD@FHO`Kk2ZvyS* z*```-l5+`iIQk^dPwwN(c&WY;1WsjQNQ&DE6e9K#hBx?AE(4=zzxDeAj&+MQQe(Rb zS$m?YD+Z|C1TMsrEmD^(L${2%el4J04tQ2y3-}`BVyBKc7w7eqC|@%Qy7SF)gWZ|d zMyTQ@a<@TduA+K=QqLqIslB7+v!2G$)Is~+`o%R+gcoW4K$xDHaxy3_pMGkD``z!G z7$et!^W+d8hx|^bZgoNsQ&=N&z{1)73u5P>^dr}o#iz9H*UM2YtnVEw?{&|esqdvO zoekJ_y+%A}4HquyIWlHEYOOANbdZY)=do29bWRD}u6gg6`J;Q=q9xH{eTaSI&#XQU ziLIUw1o9X-FkzIm+(~)@E@kE9aT+IliV`w4hdSeK+NsFcK!Z{aKrz;USFYANO*1o_ zI#ckNzc|}kW|pwu+Q~0&|Egdr6)KIeH}MQ%i!x2jo{RDvQJmlLk{Wj%lwA%?HiDEu zwbS;!kC#y%zjMZyh~iGYRs$MN4Bc8b!LpPGb0UdjZ&kuS4=vuA@|2Qw_V(7J^x|#n zS)X!`k#){$%48vsw%a767dx(~d(%I~Mw;l^TR{njMN{`_n|x9iAyU@hbt}$+HIjFc z{(3%X@@zkpd>i=CPSkL?saX5x*IZa#$R|>H?z0NG*fMVFK{qsARMMBO2>480?ZCcx z9``1PZG`P=GhMC8(wqfyWPl5>PX_NUS%r&5Id}G5I|T&O>sU;}XM%}r*1CykWgL!i z@ABlR?fvSJD>pb8+jLpw(pwq!hW@PJSphMfnX3{6T@I03L{g!W1MxF)X)P7-1hQ4n~cCjlx4qCXa^}>Z)on?-Z>b>Rd?3bOw zUfX;~yARMKq4wxwD*R%+!A|W6KQ%%*V*5)hh@KTUKr%FDujL5pHRcZu>=}NJyx-oT zACzr-H$m*V99r-&cGVpETvy9R=ghI)(82y}b*io~nNa#w?A0XoWaFREdX~Ck{e3uH z9=+3hwky2MBv~G9ylmG%!V3Vm>n{%FJ=+&v zW;>7|<{%&a_H5aK0W8ts(7fU*=({z^P$gF=F#)b17nOI^LOK7*3jFh_GP+4+nFP58 zpVbbZyOw5dQ`4u$pT^ItDwC5|(=5SJ2&7gKN-;t81yQml`e0(SRAXCOKq4r`T^ZpUQ3`uS{c1yN z?%bU^erpe2bOE-rf^RAQ@cW^;P z#wEd#KgtvO&3Yp#rAvLVKee))!jL248NVO?>>C^WU8{QD{@fy=`aO<8yz-+x19!Rf z67>?`XB`V$n|JadE~AWM;QMnN9kxHoGs@X{Ow;cP{&7xrx|Z7Z1307WqQ~t2At3&n zAodpOF#1jJgh*f4q9nf$KXIF*YiG)6G(D=?TyYEt&A#UsBcrOAtjAwdxDX(FEtx;R z$>niQS-O_(_5+DV*VD=N+k5kj=zlBRm?N+*)divkO*ZASg6rTAXh0Via}aaHf4=24 zj&X@+6R%UtY8Obq9Ckf@7Ld$0qVGCpabjN*Uz?xgh9&%jQnaC6QbKYo?r$K;pekb6 ziIW0&nHxfm1+cP5TAfDLsmGDAzf+bCt5_23A(Aatz6?m3w25f`U3>_%4c{tewpUuzYhqL*M#4xmv)mkHR8Mxz&${_Np_KFFv&56*7}X?>6?v4}FdY9FD-IMmb~B&j;=-xnJv zv1sUTVJ#F194Y9@+*(x=8BDt@X1hLdOR2J&m)`@R<*0=`0{U@}l&(-aNYFnE*3y9Q zjgtufID<(N2<+zq@rK9U1f4sh85$9;Gk9nqo6EambI^;O`gAK6(0WA!GD$WSzM2IR zcfqRbzfuOy<1l#W6@L7IGqc5|L`PD6nB#3T2_!_{&?d+IB}h?wRI(^qSvIhr;M2e@jPS#{kyHcbysb8;}KO5op-_UF%Ljy}G?e{}F zK7Pm$Vma%z^xbXOc-YRqmg{hymBL9FW$|*-6zJ?sa;f%%A0XOm25^q%Z;$LP)1T-+ z1k%hj9%S7QY!zb_XV;panVS1xIG>*qjr*jDDtN|wnpd#aFPqsr_f&aNW*l%$szL)~ z5fcNz4pUCsb7iV)`L^vuY=olHI$X;*-8M19Kp_h+0;l`(4LJqOKt&LA04cqL z?EJI&j02lf1B90(@@1}iwaYr92}%FyWN9j;V&9<<0S>bVe@NT~DjXm+{UKrhlCp0Iig^E#+9Lgx`iBH4{D;JAw!Ud# zq5&kBz3zC?(rHb4HN3~_v--{^rx;gYX}6Vfm4qBTHfQc)57i#tx*1L}o2a>6o=? zZ(K-@z%&Bf;T(I3v9ZJMlLc`mM(NSI>65q+y1=w%Yd0bG5=&PI$zw_UDG%0G1!#;==-d<>PDe2ZxAc9x500IEDBh|Cxz z?7C^{a;VhATSQa0bND3&cZVIvB9j?Yi1|a1`9mOtUt$3SK%y2_NVfjBRp1T+&<|aq zzl5!R2ww~P(~p^m^40K|j}rc>w?Zw`*jgQ+^hjh4ofFZ&wcy1wm}wU_ekY(`jW4c*=N;rKIcs1ZRqqpsKia6s)m#Ugy( z?-!-HDw_uMJv zE!nMNhTG3UFi2)v-;)p5A0(rJW1{F0fmglyK)801U#x$}R$vzJSV#18Vc6ilSJvrr zuX;81s21Ut?%-oI7s#}(3~4tYGTKYoijN9J^i#+^hzL}FG$2^VKtug4t&32@gx;&J zKqwcfM8X~f*yMK>+=KxPHQ76k^eoh;s1ih-fjXH)XkgnSW|xMudK%~2RUp*sjVW5> zT_DRlA%V7yVE?o$QZk|z43M_s!v{mNv;k)$SrJ~zz%gF$s)dBEs^$VQUO}cbka3DF zYR+`>ut5R#NGA7t5a5GX*qyxM92`>0On?9h(hBh8WRSS;7n_L&yoolP$pP#L!r_ks z$EgzhuSrg;S68#gI>iiyWq@=GBd5Jax)?M5>C+v?Lgs|G!p;H^;Qx~;8tR)IBI`qA z3`@STB~1gd>N#t-Q`m2)VZ4bxpn4Z>^GC@Va9TEn)DKIIr>wj>?3n6(s!k1^tV$pm zx#SMl13BmgqLu_(6m-!>2ErlLg0oQ=z^kS>l3=>2(MTQPCLU+0Gr}>*9W=Q zsgYaDp=varZ6R>dvh=Fp)-UCs-@h>Mw1P+EDd?F#d~aQNYL*~h!Pwi;i z+?~Rm507IC<~JH!mFS#j6M*xQfv{*^+n%Nql!*gyu124^@+8}$Fx>v4>_I>`=5sg{ z_;wZjcXVZ-Qr^#_@(oq)n~7&sZ>w7q>*a@5c7i-Ht6%L)v(bh8`o7)U_ztgreMUPQ zqai_1#zhngGTR01x4`EoNO#|GAE;u}9pJ~%z*%e?9iN1)?2!c9)~$!2*65bq26%2n zLtP%lL;%VAHDMxms9WLvm}xc_uvq7>05PlJR;5|v`$X1PceX{2yslWtyHVj&`uPrC zMv4^-BF*v&05p<~!+HZ|=p#+&dBc+y$Vk&WwoXXE29zdYbIpwuqsYdedIG$Q!iVul z;BCUCaZboTJ$n7*PKw|OHSrg?9fc0&rdQ8~7_Ytwm}wvBq21kTN#$Fsf4USl9WdK5 z(v@&G8+?KkPlZYtkjG6ZM0z zx*`4U6LQ4{Wr~k6HR?)HwL$OyI|O0Z?xG6TqOt}(pUgVu^p?PiuC-Gh<40}^_j?dc zCGDY@C&`X)-cSrj4&lWzaa+cuJ+5lz4F#AKdfyDV%rMwM{V9$)QYD(|mV|w=%$yB` z)+az3n*P5>Va|)NesI9kx-mhi3Ck>4(YttoJI66Mw@aN$>?)A_2gG$1sNOj)%)G7J zdwTa}?!kSpw_ex! z=4JK9rDsy(k;n1s+notGSGsC08KdqIN7CCbb@P~T9KaK|uN>kUs(M4-{XhbLuJq;N zGlbVAnGr@KjiQg_2iaX#GONz5nrE3b@_P24eRWeia93ids~;V zc#x%RZ=h;@jnhFK?<0=8I6BP(Tb$e+hLsi)dG3PH_#1~*xgFaAfn$%($_bY)(7TEZEWhkk?|k6L3z8)4J>bCd^TG<6LC<9 zRI1&YL8x9R;8s;{Cl6WjEsmbZ5(S5CzQ$Y$E(%uyj^?L65~jU-?|1iR2f6VM_Ohau z_)IeltZSlj+dDOc`A&lq#`v35>k%ZPXOeLFD(}+_6|z|D!v9CzTSnE5;)6>(oYpS}s zO9n3iMLaJ10Mb&+6G`*zX#@rrwgYC-+Q?WVRUotCV#hS>F@;ctqa02{0xXw&lAZ##f^o@g#k^HZugoS|9;6@y*cF*5Fy5X z*99NtuUT$cL)b1%j4dUciwM|@t@4@~um0MDKPYmAARx|)lzEcR<<0>t$?Tvx2+DYE zbQG5ljDuk;BC{pt2gsiql%~s9Oh-U9JCxcEv1Po0vuUCh@-du+<0&czBQc|egz11E zDy|!U#_T_SD9G_s`!E2$L`$^%mHhGcCEw(kN;x^cdZD1#FcOBBXabu;@@_w5M*inD-q zkn&2{8Fidnrc4=1kyc~{USK`MoJUDVfh{L~pa724WMh~xfQ|?VeZcC6ODa8}3I*&} zJ{G*T4dDt-@csZVuh{>muY?eEEYO=PIJpllX-9`O?Ia;%389*D@O3EI0aJ%SZBb9r zn+cldOJBDbCJvKOPlV9-{^V0&UXxVsgtHWZQ%){lQ7iH;9R3V)D~}-R0mV*W0Av!Fb7>Lb;4~y?&I| zR;eWcLlZ3_5IMy9(Be!|0+-hP4HQW)3f24lynO#i=$?3jw%`R&kTg0!)WW$B=WWkH zjTq-*{OKeJ(GBudTd6FuK0IN-hF>rCETJluOJj;oC0#rLuH73#{7QDoyEY|aTzmt5 z6n(VmS8U?`AxwjjlK#+A{JnbO&S{RZ$rZh{oQuN5fcLmj-&>A}urgqBL^P>5Qeg`} z0tM;X0B04Gb!Rj{{qlCNXhISR9x!*7q{;knODe$(s4x{KBSKoL6}fTtB;T^50o#s{dEPA+)XNz0Q4 zEVnbFmp?TKPxzXSM^UG*T44lnX6mI*ty4;%vQ#0LlPmXMfyMwb>y;UKCVHmSj!;K` z3*RyUf3OFbCN*ojpO}20nw$LTqd93xSwi6K5cy||x%XCEFAIAq#Ss?Wf*ikNOxal)LywA8zcfIw+jHXV?D#O`gIgys+=)!;j1CNTPtbdmV=(A~y6asIqC zrPz_FHB#ICW3v4o?6DVi+;!+hvF1Dr=;%No+CZrPJS$Ccj%~~=LKXty`&nwLw*}px z656fiSD$MUk1Xix?{n0P=teUtY#Ibe>VgvJT;IyvhxmhN+6GGse@V}*k+NuAW0bpt z!sY7@sI;ui(Y`Un1SSqZNXmY!now!fR*pQ}A2KASMhr$({Q<7-Ory_toaifz3oCxR z4$cREoHsWi^fa;!YkC%Qo(?4mS%RYI2pGZN4L~JF`WAdbs`}PvYw(pELcepPg}r*h z4{IOS#I4n|a?# z-0e$W-EE2irS*ulK5xKbjKk)Ud!u4aV4p=q8160zYuZ66nalh&he$zFF%ntQOV7v; zn`LoALsBUcnM;)epEUMU)x-eC6?B~PC;{?~mv&isTzsu0MJ-JYl-C<76aCy6s?gfX zi2-XW|9;6AY1~5LxK6b=d?B+oG&eA^La*t?vf_p~A!BcdbBgB)l-Hc$$A-AdaPkE{<&4*qEqdh$Z)@`nM0=k4Y4|zvq66O*NJO`OeS>jU=Wl`?Np+#Lx zPIr!hjI(#nuHq$_i!ilY-BrLGxQx2B^&sT0U$L-FVN_AfNeN+B83FQ=ge?5T*b#JE z;V|^0UyJO~sSoqstce{M+1-i&yL#%J2s}}~<-ys@O(w#L$dD2q5cV!P5EO?pr<+S$ zX5WHC)7LA8vlsV1mTyt8+1}28gfiyD5sY@o#4^jXgKu7(AK2#ZA&26`k9FS7sk)Od z29x!~ULHkG0SD%PXF62a{ZBY0HWxy{t4O8zF^$GVgt&dGx0#Z-MLAiX(U_J<_J%{k zxCNv%^LSf5@xDy&$>gh0{3S$`g&>!cCQT>VMYI(Zg??{9s)RXz{6X!UwVzL$Ssii# zSjN=?k&%jG`%J4gUPqPV379G8$>X?4rSgF8J+D=ZS@s1(pJC2_BAro-_`~i?>~lB>=o{zs$bLsV zfO8c>HaLb#&E2PLf^a@&%l|5dhN=g!&USiNo2;AHjk_c>yg$Yft4c7LAFFm^wYw!YyHu(Ah#`s{OyNbr7^ZJ#erl8}{B3E(?7Ai%NLNh;3A zvuhdpL~jAGDmplt{E#Y8_jz-Gd*+CdYO@JA3O)!lzgW+UTp&dmh{*z7yrm7GMagE`6`Jk?N>9r zyib%g^APUk-3EE)LRAu;2BpKC?V&yOq@T#%%##bTT;VK%=;f=Rw-z|RfZrC&`#VLrFyGW%jk&Y4kgEHcva?dM^859n=WTmc6ijA>Ol5rl$(o7$SN zGlRH|K`@{x!YH|cfLHVI4Jc`s7M;MQhrXZuQU-#krVs}qW|OK@AcJFHVW!wnCOdQ?&;-MzBWhAfj8!7JXigg z7eG#!MrJfl^be4a#!YTc@LBeni#bQb=jy&+`Ae#o8CXrpZLd*|Qfz#wdIw@lpz@sD zA^BrHqXV9@VE{w$=@}w+2_p8uKLA|(y@n>=by3PKw<@Qm?F$ed z2ykTT@J0a$BUD}-mqolews-=iWdaf#kT}UDet;8*Hy@jMwWlg@0-kKxaxInl) z5)~IZTXda)Kmtiy#Tg92zb^-KqxWh9unQ)}IYAyfaPX@un!H@Y$ccIK^(>Q^x-D&u-I-l5xjK&g(% zJm;L^_&z2*`NIAfM6VH1DN;e852?%90n=peiEKY}N3d0L&e^55iMYJoIPl@i;qZqq zbm0%4KFx=5jz0lKGVz4L*zH@88h~?Yh`0hh`L)NLGw1*V|G@16z@-sTGm=69hAe-~ zov_H}O<|Xd;JW{+(EZS^Bm%OS$)UW!$@cbI+9h+VOW;Ik-YUy0=Mm*g^ERiAO>BG8 zv=4Tv2N>icVle`$+gu6Cm>EAbf%ShUABuMM+8Z%PJtdTayASGD%Gc&xdw~0Y8z&^r zk{FogWW%Q-o8JSKd^5V*CReAa)<*a1@IkX=Sx5$njssfij^NjZvY1JsywJ(^!r(;o zh2i*GD#iz$0{=XBa0$LsK@LS2&i9!wr#nLdL7Xvh<`^_H;_@X6_3&9BVs19d z!L_(H)!H!3C8hV2 zBWBgixtWYGf;tz(w0WOaMAgFyN0b#B=w9tJp-gL(i~Bak(~Kd3$66u6Mj^u1zrWPbK-6VAID#R3Ctv`$>HTrDb0-Rh zu_}klgdwc?E;1%x^pvT ze^&yepkQSD)MT7+UY<9)Bb(-*>n? zp6ou@T_5s%xtked_Od%K{PCo8xMA{WSk3&!+pOMg#*lf0i}}H*EGeR2qBSBZh`+z@ z^j_J&v{Rp1t?BOe()IVId}~nVFBml5U2>yx(j-D-GEIq2D`8SC0jKj+R#S z`&ZlW-knc=(FoHod*gI{IlR@5w|vg$#=P@o`f+`xQNL{SxqR2g`^~!>iS4;+8asDe>3-kby5B$I{{GVG$<5Sa-5K5% zHhDWNxt+6pJ1oCla^BFHY53*Qqb)qVbagJuj`isFkoz{r!UdSwJyyi z*c}+xx&YJoe7X@eHw=5bVKXN?^?}ptKB^Siu^p+^t9otP{awWa@b8TE*#@U!U9V>cz2CY??>hG) zhBJX%fTv8Qj+I{HVw-in+p_s(%gl~b>Byma?f(jwhwA?egdM8?FQ7A5-cX@q^`UXG z#k$^U+5E6&X4a{+{80U$0{zCt4(ocaW%I|DnH#6l<3sf&paw9=zXiZJ{}%w7{2#%x z-i>JPUDRRb?)8}SbFKbwAXj;qd3!zP_I&A78gZyjI9Kjmj=WRP^=)p^K+nS8?f;jV z`(orTzmMPieo6X$edztPzxDF+Xj9oG+uBY7{~=-B#kkiC|F9z5OTXWVU#~RKtsG~k zQ2TDSOQYTP(^~!KZ*wVzdKN)$<@h^5CNpLI@nFW{x~IYqEHaf%um1Z7e3#AYqmJ-H z=QefpOKpjt3fSlEzHT;a+tPIwjD~aCJr(rWUu($+w$V3|2u8&ojz)x+gw29$4#}O4+*TN zLsgG#Cqdh#XHE2*)|#WwLPQl02ipGgg)sLwHf<%*g#48W!5`?+Th+;(%f*khL%uC@ zu9xDtVIyl8{~9^ckg!(?T1A$9b8D>IxLMCtZDI8>b8*W9a<1KX4)akvd%j+@+9L4d z975lQwakyD_>NHNC-0x_3!_y0qf|FcPU&yZa>S97mY<2>zgz$ISu%AYtOD=s5DRVR z41i(!yxj+0;?uius3W3;1q(v2V_-DPb+c|&vHdrvz59oGdG$D*%gXu)Kx#=}iNP6Ol@INHbq5PSCO+ZclBU<)H{6?9wN~O`9$P1C9<+12;hC=Ky)U;>~Mu?`ggdY8h{)4jR7VC(X0Q0B;EP6e_UTnJ%;_2UxVnxb8{$tOhy;urux?ht8siZN?|PS z^$!>gYP`54$-QYx1!Bi~*a9VSV-j$gVQ3wi1V5zGTRTxFSEYCl&ObyBkUE55{cuf!3fbM z>q82jLuvHj^**0r~IjFCOxrGX2ID#M__tg&*{NV*;Z=}I@lzFiCG}U3=%s9X_Swj zDlV%O$ZCIXf5eHo+{GrNa}`qB7UU900hR}Rbc6E*-O61nbAkoc=nNPqlr#kC4g3^|F)5Z4?>UJv8P*1Nv`ok);c*UOXDJm}KwdFA zNab`9g!5F91%|e5waVT*ghnHFcYkvRzhRt6S}TqpOBviLOD}@sJ*P$juKu}hEFDdz6iW#YmdG)*bD#AaxE){qbKMAT7;R9QR~ihI z+l-L=DPy}mZ%Q`=L_{f8h7|Kuob(F&AHsM;O@g-+92lu>17w5n@X6D}-S#PmU_rSq z=sSBv*Zx2yUl5T}5G6Xsb~xS8y?H!)iD@P(UGa`(YJ39Es;zwkqX!VwKmV@_zWqV_Ko%!-OU7JsNzmwjXd;i5n%MIpcN zNkHWsWI(J5`IXrM3xiS@7K%Alp;HUa+;I2V?0uMs*2&trr~U7H`fRIyl`DgBD6!0P zJfu*>Gtd1uery%KyE?;Y)0^Mjg*>7}&JEo>5g;n&g6Zjd${f4DlRK=x&fzN?N?@Un zG+v@2-u1gwm1R{O*WEtP8=eB@YA9H%2Li-EYCO6*xq`}6MMK}7!K)dx@Q9`+`#o0I zeWQm-_yqNebR<1A{5Ddy%Gn$=oTA|O`a4~kuwkjKK3OXLO*oo{2H}L?bocSvCRx4m z{Sgr3`3fra6)n4x#7-)}<&*2r;ymBiClVZcAI)v`!IzEVeOg6dvV zER62jtb-4d^wdS4vvlN%H#F^mmTm%r$MIo;p8n1*tI=f^$Vq{P`8?)W!U@R?2_o<5F>t85238-P~OYXPt;%3FZk28Cg?7M`R$Eo@#^I>_$~vTI2^(v+!VF0 zKFF}~ZTBQZYe(MvHI)DvwE$Ux5Sb*EK^o3LF#Omn6psO6xZR)`J4TnG4@<8kq_Xp( zyK+uuKZMJ!*_rxf!`y=M-|+J=eX@fmLg`a8fIx{rz^2rM4j{xuN9jYBj3MI@5VH*+ zOsaC=jc1|M;D-;I{Z0Tj#KWlU3VcqZH?SO5P`!fB z)~WtGCYXhR8K~M`T9;Q8dGhy>JXPp-8xr2W5sI&?0`_-0gcY56P_k>-^H8$GO&vb6 zGC)4yBV@%=mLi0$&*p;|J|6uWSe~{gd#`)wP@if2ippXG%bu^)ne|OCWzg8ZoSL5C zkomEPvQ+V0=2dqO;0I8JMVM(D2EFUB6cv?k4YVt}dcKrlVbiLzqQcyMl3%egS43v~ zeo1=D%}LuvlJ;c($)D~BF)B{J1SNbv0kJi~*hulvp{$ft_hU_DN56Q%&0U zZ1Are-#>b4l4NQ|A)?uu_Hv?OBFXVs_!;LP_GDKzN242I+y8zs5lVmwPl5^W92@a6 zKJ)*GUwDnM2sOo40hxH)i0>_zdOnA%dHw*gd7IhP`8%M5YkkUqS=oS5fMe~>?{O1R z6{@tGEi&Ph&dyr{KL47)va1@s;fMXS&m=W6SGQ&si@{S57X1N4KPsAL%prTmD>!%~ zBIufQanklj5op>?D^~Neif7|!l=tN)(8Kl9!=2E>scK3HI7MP>MuidjI!P}H7gHFG}QhoyM|SU9>m7vLqilgd;p1r+yn-0643-hZXE<4)WAUELyc!ngo0dU zg$ciife`p&;$1=^@KR8w(f0Q6oZDFN<(_o4Q#DLx4diRAsU3BQ=vq8`%RJMg**5^e zWZh<4e>^ar8jgIyor%R77GKey=d0jo$gXk43J^yFO1=ff{ptfPX$dR^_FW=l%wEtjth&o;L5D2-wd*RE1xZz=}@Jl&^#BkMx z722p1ArnF#NO!bPz5e9ZDos0NRVu7GREler<063#o1|j~5%aogAKwlP z$@6^6z?@*#Bm!*j?}6{`RiZm(be+!4-Cs)XXhBp8^G6D5kEi|~ar&JrKAu^>On%@NwFRJsMHou zcMpoj!4SDu!Af;cmUSSS zV{P1DgP-L&+)~7%yjp;)0XEE>6uEvv5w=p4A6pyCW14lCZ|6m&wFw{6VA5ygtWRIJ zPd)!*sWL06bFCXjBe4gpf0kSnP8XSZ7hN$Vswv1zy-$wZox@aAKsLGYO`she5!>72 z7uZJ9=H4Tu0aJ1;#VBW4LJ=M07It|^&1gxA^?Y;)Mtm@SJT>$6F7075yBDC z$h>M!VkhBF$_qAksF5}7jid?v6sXNf9$(qG&mT&z?L>qwA>QXMA4{j;`;Pz0UB?&c zQir65<_Uj5b9z#I!84-zoz-B#(fp2$Hkp8Mda|CPV4M<82}eU>S&OA=e^racZ-)dK zRvF5Y6PQ~BPmf&<;x_8@V+ZA4+ao8+fsHck)uuXg+*wKBuJN41+pcATb9?GBf^2`4 z>|>uG_It)#QyY?jtvAf)ke_|Pd9;tyLNzFp;G9gX%hAeDq$(aQ_Gi>?;YwY>r+a zHM*dD2()>F&Vu93F)}OR>8Hyax8??5i zfSdQgi@ww8n zzTP{EvJ`an5jcy_0i5hTDfos0N%>YTIZ8jqNkkxS;P`alLVvv>h<_h}Y<|4x8<8Rp z;T9zDvbJ}xZOi0vg0m{ z88&HIr*j6T>Hz)9rHBwf-^mDS{`!t9#CSKE(q=sK7TGOx+^ncP=pmG@P9s~QT8bD} z>qoZDVR$Mlm@~oI{09OJ)>74&(NWSbEpw%5uKy}1^^%J>SouE8gN?HAmwNBln%GH8LlnD&BpU0`IZDUp5F@l{Y~x=h;d~R3eA;1t z5+tYh3Z$?@+53#>jEHi{f3n~^2xw^c#256F>@>Y)bDyNd%d>;X1Jz2`3&C9^Lw)Pd z^kM}UgMIph^Bj&h@(1LYEJ%qdJfJcIulyJN)V5zFKYbn`>HeZj!6|_*;QH(2 zuP-MLw^V@jTjYQpaAcDUos)?b^4LLrpXR=m!mdmvkpfZB@=wO1KVbTk5dhkf_h7%Y zbQJ%9PZ=ZW`Mr!!b6}D_G%*efHrRDtfViELYzID-Ex4q_@&f*F_o1>6KQX&4$s09O znw%eR4YSl+0kr-a3+SnaoHH^qZ*Mw5?Q;q>$Iq^K6HWIad|ZJwWLfd+X|17Yu84|q zcJ9Y$ERMD8cV&2)<#$}_m7Hsst_84RbRAgJ=|SM;_H-P@<2m!Wk=riBmZ_Y%+T@bw z%{6}gG=yOKg7X=~cHCY*<9W((#aN;@fz;z1Xx3A?cKmDu+R!EUqtQ&f@P|n7!Y=Ht zAq^sWkm{i2k=6VZ^ngc(6|mJ^_Re;6CPS05$d^lBobK??5wY<2Sf@=fg>f zN>h9=xxmmCcJ5NPKfuae3IHt#ouydP6o$jvYMfO_i&h9SX=kA0iSD4vr#QN}kcu+2 zROe!Z7XB2~M~R!C-Tv%?faTVp+SZAV!wjlf{J`!dyr8W;TJ=p+$~XvA5^ZNzV&K!l zWlkq31#N3pcg;bYFs>AcLI)6%JiBx$cq$1)ka8k-Zt84Wo8Wl-jt^gc!-8LtmV}qt zI9CaPa{tKmCqCFYEeDZWaWqFA3MNx(La;{?1|k*5sjqP5%E2mcdkb(=gr|g?#G?9- z;Y`QQ4WC4iK`)}FHqu}%sUplvFlN9K-Fkmnf-ln49!#>^`#V2`a1MhcHLdN_>wha< z(Z&z?QKHJZ>qKTZ1kF(~dp}UJ920L#mI6wf4J?wtR&n4LzMwq_780EEVNVfj5W*rB zy0XTt5TR2Z`^$ED;OJgD^_)Ec%^DUy4M&fXN7Gj)>5DB@k+G73S1|t<=*)erPHzDY z&J_&VAj0?EP;MjuNv5D5ralrf_$>$gmK7SYlSy~ijhIO{SWB&en@M)90T>a7K_z(Y z>oSdO|K9fwqYweQJklj)k|>l7*{e8hF<;yD;zo|UU$$0edkOU6!J*jvN;cs}za-01 zWE8qNeapwHk?8}}O+R0uy&0R*mXn&P zf%3ns{5II_@tNA6==K1-gBAV3yY|J%8l$b16tG$|40MNa7)<&1X?`&qPe&g1bCe8m zr17I&`oJ2cyDMo;dH*HyJle252SKvPV$S$*JECLpzRgF%yiimJd$DLd>0@-gAwLv~ zpe9nj-b(mM9kmUrqYUH$mI8r!ZuaMYWw7d}{!p9R&uX$zA`Vfnw621R6Zy7fU+jP@ zK~yszZRaoEtzPlIFTCN~)5=bHPf^rPMrJydn~xb?1YVkVvJ<7s?q?eZ;631Fwl~IH z4%MHn^M%?e6|wo^1Q5*pIICJG-N>P=IQK?*B8G4W{kM`N;p&XQjyMcTW0EO%Cep~z z6mz3cBw`rwLH>qiKyppCs^-@qB2a}qi61#J{eB?J$lOwKn8)XvXq?aXf1n*M#e;*$ z3B78@2L#Er0rz82l8;ZUBfu$pjR5wVyEql(nxJx75=djS>iFp@RBhhXDS^JbFs zT7;!#$b5Dtc{)>busQThrWpK2bVdhe@F5!qiJt5-_tcTGEepv{hAX3^V77bRAJ-4m zObgKiUg^9nr_C5b*$Y6n(z_p_(ITOAc-fKI#ILBH?C_B|koB(^>1PFqsU1LeK0g$& z>?7qX{Rgt+7juYnQ0UB+vzd_>!#+mwC9Z0QIL(SqGN8j*xpN3CfHleK!yx{^vU)(v z_Ll*iA~GbhrIz#+>$J3fPGHU&dIit5>bd)^BZpML#Bw(?S#FIQ; zC&6j{h}}lFS8e{F$>~*=EHwN6jYUBeHm9%wZLr7^Dfm3hJ`#^R{SmhfhotSZ-wjghjsccZXO0p8m?;pUXoWN;n0PhMpc$ zr>&T_hFSp;4u1A8d;h;8oZZIX4VVY=H%>PGKO3+==vJacRF7leNf?Qvdy1ud8qz^b zpNONLBagr&mFowUT#L}5hUr$ztf$?uT04T=ifi=}OWYqw`wbv^s+MY{pAI94DU%2|~YVM0DLU%Aax`le;>`d*? zPfU@jq!f5VAd)66IQoWuXeropm6M!1R`-?8*Rj;j!X7$bZhzl+Kim9%xUT$tRjGgU zRC$>6Xza|O+i5j;oUecT`8=shS^w?k!?sUIFEl8=3SC09uzgJlL%>>-(m4OiH$VBs z5iwXezpPZ!>qTbDUFegpo-T#ElxrE5nlWFmF`-pb|(8KT(gi>QuJPm6kG}w{kgWXlj03 zAHry0FpgAUu)0%tWYCVm3+YwGScw%6$ty{`(S`?oERIvqDX&8Rya%JIA?JaUsM%CA z|14nAem5nc(JruR-v)hw35u02(LUIvr-}V$MMWfiP%dwsiGqw77Nc2GU3Z!v1Zw2H z45nG0#p`zp+UUigOeCnBKhaFPjkWKrX-fPsrh-M8sHioWNc90iR_@2bi7`m>W3hu# zW6ha_Ng|su!X4LQTAi=?2&S{1CFUd83wh)SvJ?2mf>`bF65#w-Buc1 zeHgNrOl=<`jsj;iS2bO_kG1@Im94msjL#{nrWMAkp8Io>du1q{LK$p8OokaclaF<1 zc?mi!7@)9FXDQ{2NlcI&k8bJI=S0ftydez0#C^efDkIRma^TcgIE7X-#~_AWr>t3? zNI$N;IjfmEk+cTNhiWX6l_v4@YFd!u6LlhG4P|oQ=TuHdgW~5Zi&F0W`6su~5l*nicP2 zREM8Wn(^LMQ^ru0YpJgh_zkx?PrV&`j`D#idK_u=i{-I+Pci&Ge0b-aA`ARLNjH&~ zaN86+2l^S#AlWq@JFAQeY~}^QqZZ%lNJ*!~vc#T5IL}jQV(Hm{VV#O)t)@iH$`0>tOr06=HM+! zz1&Hsh05II{}4yXx@92ybzXlJxnw=DfpEK80h2^&PkW0&3x|EsK8ec3hr-{8owGkC zW|@f7>?ir{;N*B2eq1^)dMvh@_lskj5Hn}V8(C8AEk!rJqqfMST%xc%4XSL{t!n#8 zkxYW9jx!CuL}+_N-;WbfVr-lx<>~{2tcgW>N2HAdN7i3O+t3EKvE`Adyly=9#25-i zw@-y2&dEVPA?^c(g_s>K6kjxTqN0;7voBoU_&$-V{7kGl>vIW;Eo1<`$rc8OwPkQQ zg1(37oge1*aYHm~1MV$(vQbzO*0$pF2n29nZb6Wq<8j;aq)|e}uOPf6NZo1S_{UMb zt0=rE4&6d0S zLe+46niMRyoE4)E|BnS7`NoT5EeY6FPB-V)68#gihPKd8ZWq}@1^uk8B{J5Zs=p); z^*(%GNSamce@Nags4}E_VQdvVE(ioYkV>v69-MZw*=0sHXiJGJiM8Wwwnxf~S%KCc z%_^bomM)UNdRye}R3$uctt{Cqpjv!|S=|f^93X2At{pIBce05}hRP^DTGkQfsH9vA zhAHyMZ-_M|ky0-fjLO}H9ASoCupL?rp#UHFsvJ)AQ4%$rQtA6qnZM@N_QJQ1dTPinXXF@VQ_vvAndWOv->cx?~a@jA+%E9M6%#dyH04vR|Q+Sm+bTE4_A z;`mD)0Y*8l?|H}naed(6&bbU zvdcnFb%ldp&ra$fHCvbF8bQl-;Cq@zhCcaib+(K2Ww)z`VNKSH6&@?xJOInc*X4hA zOgF1DRsW_ul?yx5V^=DXvevfw#B0%etMYobAm5r#(2$}A&xeYzlApM4+WJkw=vCc^ z!9R?ndUF~2ms{mo*fWMPve}j{<(M}YP z0DSbrc*)_KVW#~u$iTkINRp=Q1Xzk@wem zASE~F#yNCTTT0YLy>ws=$K`o0>q2#{NNnE0(!zkn=nUp(uCVZf3=};gwUwLL1TpCv zwaG9kl311KSBf@`Ni+7vp-FWC8+oXfUXiT7Ce-0wN$h-tGs1OSX|Hj$i}IHZ>Old4 z%T8XxZEf`yJuOR-HcI2y3Ws?R-5M=l4u%`Wsp@324lgL(w?+xK4G`AmGo0A{%Gr8* zDJ`=g3hBXn;CTuC(4#;2DdSt8VC0f}O%Oz^M#K1!NaW&bxKGE~T>Ns$8c^~hhgVc( z2VfD#i&l|sP2XbLt%^F+(sk*fco}EAtq#7}u~Hl^PU{Cat#!y;&-LIg;~e4QvfCR( zUE>bodU@sQ-`71sX;*9u@D&A^TP#eGPxljP;EW0$?ya?%YnFE`R~{rUMYick)ObLV zlsKAGUX~JUH%N{R2T)JH8C|KP=EyKfOznA0xNAImS)+MkXvf{Om3=}rh-n&oud_{& zQb^WSr9nCMV@u)J5=#6yfdz+V}}0l*;isvSwBlF)TGgj3cPZ^`q1yA1rmcozM+=Nm&=lD=FowZfSNSd2Hyl-~NKS0Y6iwB`_vqx@3nHKF-+T#Vr&KSQP>e=SRw zvQW0eqEFeXcgZoR$I(++=(po%ctDU?w&gP`)<-PWw?LY*Hon)MPo^4V*q*Xqud7`c zb?T&?>i>LS_ba)V0hCx#q}{x0$hY168+{z?8tuAOf$ey8r-FY|2#K93^~bARA!X

(K~>I(f<<(_7oS7T%M$S~YqFoM53I(x1SqW! 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%0AgSKLF?t}I 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 k{L`=gNj|^&%a4B, +T[s,k] = 2 / , +D T^transpose = 2 G. +``` + +If a side producer on P104 union {a_k} receives ordinary inputs x and +pseudo-inputs z_k=-(q_k+T_k^transpose x)/2 at a_k, its 104 requested rows give + +``` +(I-G/2)x + D(q+T^transpose x)/4. +``` + +Initial compensation -Dq/4 makes this x. The mixed deleted basis {b_k} is +not the coordinate frame, so label substitution into the selected P112 word +does not establish that producer. I implement the identity through two +different query cuts in the selected word instead. + +Four a_k lie in the second deleted orthogonal frame C. In selected indices +they are X81, X86, X54 and X25. The corresponding coordinate-center rows at +axes 3,4,5,6 have diagonal coefficients g=(-1,-1,1,-1) on these four inputs, +and zero off-diagonal coefficients. Run A with arbitrary inputs h at those +ports. At the A cut, query Q_i contains g_i h_i plus the ordinary source +query and helper dirt. Add delta_i=-Q_i/g_i along the A-state response to +input i. The effective source value h_i+delta_i has no h_i contribution. +The other initial-dirt terms have known linear coefficients and receive +frame-zero compensation. + +The other four b_k lie in C. Their completed code-only target rows satisfy + +``` +Y_b = eta_b - (1/2) sum_s x_s. +``` + +All C-source columns vanish in those rows because the roots of C are +orthogonal. Thus they do not depend on the early delayed inputs. Put +g=. Copy -Y_b/g from b_k-perp, descend seven ranks to , and +deliver with coefficient D[t,k]. The dirty eta_b term receives initial +compensation; the remaining term is the required Gram contribution. + +## Early injection and arbitrary dirt + +At original event 12550, each early source column has six relevant rows in +five non-FULL frames. `verify.py` lists their exact registers, coefficients +and frame IDs. The five frames form an antichain: one has rank two and four +have rank three. A private query copy descends to and feeds five new +dirty carriers there. Each carrier then climbs to its injection frame. + +The program treats the twenty carrier inputs as independent, rather than +assuming a shared dirty value. One carrier needs a later repair: after +original event 16592 it climbs from frame230 to frame240 and subtracts its +whole content from L341. L341 has no later scalar consumer at that frame. +The other nineteen carriers need no non-FULL repair. + +Immediately before original event17846, all remaining non-Y responses of +the twenty carriers lie at FULL. The four original query registers L224, +L11, L240 and L9 still hold their A-cut values and have zero response to the +injections. The program makes 135 FULL-frame additions to cancel the +non-Y responses, then twenty additions c_i+=Q_i/g_i to restore the carriers. +It runs the original full-frame cleanup afterward, unchanged. Skipping the +query registers' original cleanup would be incorrect because later cleanup +operations read them. + +The twenty carrier paths cost + +``` +24 H1 + 17 H2 + H5 + 16 H6 + 3 H7, +``` + +with rank mass 180. Their progress belongs to new dirty helper paths; it is +not an uncharged private ascent or an extra copied-information descent. + +## Late-query chronology + +The verifier constructs a dependency DAG that preserves strict access order +on each original register, including reads. It removes only the original +center phase. It first executes A and the dependency ideal needed to finish +the four b_C target rows, then resumes the remaining events. + +This query-ready cut contains 13,412 original events. The four final query +writes are events16453,16309,16173,15955 on Y110,Y106,Y8,Y50. None of the 208 +required live-target upper climbs belongs to that dependency ideal. Each +target therefore still has its requested rank-seven read interval available. +The verifier checks each actual common frame in the reordered word. + +For each of the four late queries, 28 carriers serve its 52 targets. The +112 carriers each follow ranks 0 to1 to7 to9, giving + +``` +112 H1 + 112 H6 + 112 H2. +``` + +The chosen read occurs after the target's last target-basis mixing or scale, +so the remaining word does not alter its coefficient. At the full-frame +cleanup cut, the omitted query targets climb to FULL. Their still-live values +restore the carriers. After the original cleanup, the program removes each +omitted target's side increment using restored FULL source values. + +## Verification and native frames + +The checker derives the new initial compensation from an exact formal-row +replay and checks that every required input is available at frame zero. It +then replays the resulting program from scratch on all 844 formal columns. +This proves the linear boundary identity for arbitrary address functions: +each scalar operation acts in one common chart, and each checked native +transport preserves its logical row. + +With `--native`, the retained Gaussian-dyadic compiler lowers each new +transport. The separate interpreter compares signed Pauli actions and an +exact nonzero state column, fixing the global phase. Source padding needs +intrinsic C_q before the retained entry adapter; target padding needs C_q +after the retained exit adapter. The checker uses those operators rather +than treating either boundary as an internal canonical-chart edge. + +The original native events retain their pinned recipes and their order on +each register. This package inherits their source proof; its native check +covers the new recipes. Semantic controls reject an omitted L341 repair, +an omitted carrier restoration and missing initial compensation. A native +control changes a recipe's global phase and must fail. + +```sh +python3 -I -B research/p104-delayed-query-side/verify.py --native +python3 -I -O -B research/p104-delayed-query-side/budget.py +python3.12 scripts/research_package.py --package research/p104-delayed-query-side +``` + +The replay reads pinned Git evidence and writes no files. The package needs +full Git history for the retained selected archive. I checked the local +prototype with Python3.14.6 and the registered replay with Python3.12. + +## Completed optimistic cost obstruction + +Grant a dual orientation with the same profile and favorable hosting. All +invocations use this fixed profile; a cheaper second orientation changes the +screened premise. For +paired-chain parameter p>=1, use s=2p+1, m=16p+9, W=208p and one unpaid +coordinate per data family. Let B be the number of additional fully paid +families. The remaining idle rank mass is + +``` +I = (m-1)W + mB - s*6726. +``` + +We require I>=0 and put all idle mass at the largest rank R with +m^2>2R^2. This gives a lower bound on any completed moment for the fixed +profile. The budget checker takes the smallest feasible B for each +p=1,...,15 and proves its moment exceeds one at + +``` +a = 836330098538459 / 499163669901461541. +``` + +This is the balanced primitive target associated with the selected kappa +at the pinned base. Adding another fully paid family adds favorable cost +(m/R)^a>1 per family, so it cannot repair an already failing moment. + +For p>=16, m>=265. The deficit per call is less than48, while exact rational +intervals give + +``` +a * sum_r n_r*r*log(265/r) > 54.7514 > 48. +``` + +Using exp(x)>=1+x and discarding the positive idle entropy proves failure +for those p as well. The construction therefore cannot beat the pinned +selected saving within this coverage/guard model. This argument does not +cover a redesigned producer, a changed profile or a changed coverage law. + +## Open next questions + +- Can a joint target trajectory reduce the 112 late carriers? Start with a + new legal path for one coordinate query and propagate its coefficient + through the remaining target mixing. The fixed safe-read paths are already + priced here; an owner rearrangement alone cannot fix this profile. +- Can the early response carriers share an existing paid path? A candidate + must restore each independent dirty input and preserve the query until + the repair cut. Reuse the twenty-column response test before claiming a + reduced inventory. + +Global chronological ownership, the dual word, precision/tape bounds and +all-size admission remain open. I stop this fixed construction at its +unfavorable complete price rather than claiming a new supplier. + +## Attribution + +Ali Romman's PR1862 supplies the clean-J reconstruction and source pins. +The selected Hamming packet, mutable-source/target, native compiler and +hosting lineage belongs to the contributors retained in that package's +notices, including icekylinx, jacklightChen and DreamingOfClouds. Rohan Arun's +PR1972 and Chafik Boukhalfa's PR1991 supply the P104 query convention and +fixture; Adam Gall's PR1940 and Josie Elliston's PR1071 supply the preceding +delivery geometry. The compiler/interpreter retain their original attribution. +Douglas Colkitt's PR1240 supplies the exact interval arithmetic; the coverage +premise follows the PR1012 and paired-chain lineage. + +David Arias's PR2082 and Adam Gall's PR2090 study frozen temporal cuts. +Jeremy Diviney's PR2113 and Ross Richardson's PR2127 extend the retained-path +storage analysis; PR2127 distinguishes productive helper progress from excess +rank. Adam Gall's PR2083 gives the terminal correction floor and its coverage +obstruction; PR2089 gives the direct terminal word. This contribution changes +the query inputs and chronology. It does not claim those terminal or +frozen-cut results. Hope7Happiness's Discussion2131 tests a separate bounded +room-rectangle construction with changed paths. + +Jose Manuel (@jmbarrancoml), with substantial OpenAI Codex assistance in +construction, proof, implementation and prose. No independent human review +or proof-assistant verification. Apache-2.0. diff --git a/research/p104-delayed-precision/predecessor/SOURCES.json b/research/p104-delayed-precision/predecessor/SOURCES.json new file mode 100644 index 0000000000..cebdf4679d --- /dev/null +++ b/research/p104-delayed-precision/predecessor/SOURCES.json @@ -0,0 +1,28 @@ +{ + "schema_version": 1, + "base_commit": "0fdd7d82de03e43c9e5a1000dfbcd380d1b687d2", + "files": [ + {"path": "docs/research/agent-task-catalog.json", "usage": "provenance", "git_blob": "e8870e5917057d59b730eb14721a778639eca050", "sha256": "d46eb6d5b3e279428753d770653663fbdf1063e55c255ea073d768f344927ef7"}, + {"path": "certificates/selected-result.json", "usage": "provenance", "git_blob": "ae6a99f28aa468649eb66a361e764d769363bf11", "sha256": "10b9e340fd8e354a37a0c4813c90e5de1dd42044b5f6aca4a3fc5a42b685fa32"}, + {"path": "research/native-source-codes/source_data.py", "usage": "input", "git_blob": "c9d465ed47500304bef65fcb588befe356c5cf09", "sha256": "d23924511e3aed41e5e64511ca70126a636d91c8aa02e656cb61d6ceca1fe0a0"}, + {"path": "research/community-frontier1042-audit/selected-replay.tar.gz", "usage": "input", "git_blob": "6f4dc6fe7631d8aacf8081fcaecf32197181685b", "sha256": "22c3f4dce4b897a1d423d1388801933e288b6a6b1906cb15e1b16a5eb68db754"}, + {"path": "research/p104-native-channel/inputs/P104-FIXTURE.json", "usage": "input", "git_blob": "2e16f99b295bb386fd13bd8fbd57b42ef54143a9", "sha256": "516c06f6ec3cb84be588c546108de897650288576dd5fbf5fe44b9c5546ad8a4"}, + {"path": "research/p104-native-channel/vendor/clifford_exact.py", "usage": "input", "git_blob": "166841a037f069249f6f7f6dedb89248812f59e2", "sha256": "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962"}, + {"path": "research/p104-native-channel/vendor/native_verify.py", "usage": "input", "git_blob": "2c209dfa9cfade3bc20ac5fc9d876b433a147f8c", "sha256": "3049471905b47b385c88378a1a3be7a18b8858aadd035b8a6da2f4a03b470f38"}, + {"path": "research/complex-local-word-ceiling/ceiling.py", "usage": "input", "git_blob": "6c0f54527d879396f689523bfde19928a9b6157c", "sha256": "86a1432870b3b21d8454106ec9162fddc0471472d9214c590a1420f2426cedfc"} + ], + "predecessors": [ + {"author": "Ali Romman", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/1862", "head": "bb29ea73ad9be9a0c3d53cdcb1d22b2ee9ffe42f", "scope": "Clean-J source reconstruction, selected archive binding and independent Gaussian interpreter."}, + {"author": "Rohan Arun", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/1972", "head": "fd82d172f46933fd253c2c6de4bd5eaff5429cfd", "scope": "P104 D/T fixture and dirty query convention."}, + {"author": "Chafik Boukhalfa", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/1991", "head": "6e222517e182e98499239bc9a4009f540e1c5520", "scope": "Native P104 realization and retained compiler/interpreter distribution."}, + {"author": "Adam Gall", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/1940", "head": "a9b7dfe2809092a9a4c90784d12bb60061e995e8", "scope": "Preceding target-order delivery geometry; the present word uses a different selected-side chronology."}, + {"author": "Josie Elliston", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/1071", "scope": "P104 frame-pair fixture and delivery geometry, through the pinned native fixture."}, + {"author": "Douglas Colkitt", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/1240", "scope": "Exact rational interval arithmetic and favorable idle-rank pricing."}, + {"author": "David Arias", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2082", "head": "60f4e337ffba470e09727dd435b1f1be3b67d03d", "scope": "Frozen temporal access obstruction; different retained-word premise."}, + {"author": "Adam Gall", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2083", "head": "7231ab9715308e87f8254d4bf10337e8ebde0b0f", "scope": "Terminal correction floor and coverage accounting, including a relaxed104-rank word."}, + {"author": "Adam Gall", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2090", "head": "dff116efc2c4ddd7236020ad8316db5c98aa693e", "scope": "Frozen temporal query cut."}, + {"author": "Ross Richardson", "url": "https://github.com/CrocSwap/integer-mult-bounds/pull/2127", "head": "befebf0f4ae7a3f69fe9c5e136262559dcac125f", "scope": "Retained-path storage cut and distinction between productive progress and excess rank."} + ], + "source_policy": "The selected loader authenticates its frozen Git archive and member hashes. This package imports retained modules unchanged and adds only its own construction/checks. Full Git history is required. Original compiler, scalar-word and hosting notices remain authoritative.", + "attribution": "The delayed-input response carriers, query-ready retiming, combined local forward word and fixed-profile all-stage screen are this contribution. The source word, geometry, compiler and interval methods retain predecessor credit." +} diff --git a/research/p104-delayed-precision/producer.py b/research/p104-delayed-precision/producer.py new file mode 100644 index 0000000000..f95f44bd22 --- /dev/null +++ b/research/p104-delayed-precision/producer.py @@ -0,0 +1,385 @@ +"""Prototype joint P104 word with delayed inputs and arbitrary dirty carriers. + +Jose Manuel, with substantial OpenAI Codex assistance. This reads the pinned +selected side word through Ali Romman's source loader. No supplier admission. +""" + +from collections import Counter, defaultdict +from fractions import Fraction as Q +from hashlib import sha256 +from pathlib import Path +import argparse +import copy +import importlib.util +import json +import sys + +ROOT = Path(__file__).resolve().parents[2] +need_source = ROOT / "research/native-source-codes/source_data.py" +if sha256(need_source.read_bytes()).hexdigest() != "d23924511e3aed41e5e64511ca70126a636d91c8aa02e656cb61d6ceca1fe0a0": + raise ValueError("selected source-loader pin") +spec = importlib.util.spec_from_file_location("p104_selected_source",ROOT / "research/native-source-codes/source_data.py") +S = importlib.util.module_from_spec(spec) +spec.loader.exec_module(S) + + +def need(ok,message): + if not ok: + raise ValueError(message) + + +def span(vs): + out = {0} + for v in vs: + out |= {x^v for x in tuple(out)} + return frozenset(out) + + +def add(row,other,q): + S.add(row,other,q) + + +def touched(event): + if event[0]=="scalar": + op = event[1] + return [reg(r) for r in (op[1:3] if op[0] in ("add","copy") else op[1:2])] + if event[0] in ("climb","adapter","residual_adapter"): + return [event[2]] + return [] + + +def reg(pair): + return pair[1] + (704 if pair[0]=="C" else 0) + + +def scalar(event,state): + if event[0]!="scalar": + return + op = event[1] + t = reg(op[1]) + if op[0]=="clear": + state[t] = {} + elif op[0]=="scale": + state[t] = {j:x*Q(op[2],op[3]) for j,x in state[t].items()} + elif op[0]=="copy": + state[t] = dict(state[reg(op[2])]) + else: + need(op[0]=="add","scalar kind") + add(state[t],state[reg(op[2])],Q(op[3],op[4])) + + +def sc(t,s,q,f): + ref = lambda x:["C",x-704] if 704<=x<712 else ["L",x] + return ["scalar",["add",ref(t),ref(s),Q(q).numerator,Q(q).denominator],f] + + +def main(): + parser=argparse.ArgumentParser() + parser.add_argument("--native",action="store_true") + args=parser.parse_args() + data = S.reconstruct(ROOT) + w,p,R = data["word"],data["programs"]["forward"],data["R"] + frames = list(map(span,w["frames"])) + frame_bases = list(w["frames"]) + full,zero = 1,0 + need(len(frames[full])==512 and frames[zero]=={0},"frame anchors") + n = len(w["start"]) + need(n==704,"selected width") + a_cut = p.index(["phase","centers"]) + b_start = p.index(["phase","B"]) + cleanup = p.index(["phase","full_frame_cleanup"]) + need((a_cut,b_start,cleanup)==(12550,12759,17845),"pinned source cuts") + old = [i for i in range(len(p)) if not a_cut<=ithreshold[112+t] and normals[axis] in frames[f] + and f!=w["final"][112+t]] + need(candidates,"safe nonterminal query read") + start,end,f = min(candidates,key=lambda z:max(z[0],threshold[112+t])) + need(len(frames[f])==128 and end not in ideal,"safe rank-seven read after queries") + key = (axis,f) + if key not in group_ids: + group_ids[key] = 732+len(group_ids) + deliveries[end].append((group_ids[key],112+t,coefficient,f)) + need(len(group_ids)==112 and sum(map(len,deliveries.values()))==208,"late delivery invoice") + total = 844 + # Derive the twenty independent injection responses at the FULL repair cut. + response = [{} for _ in range(total)] + for j,(_,f,items) in enumerate(injection): + for r,q in items.items(): + response[r][j] = q + response_frames = w["start"].copy() + for i in order: + if ilen(frames[e[4]])] + need(len(drops)==8 and all(e[2]==704 and e[5]==7 for e in drops),"eight owned private descents and COPY56") + native={"status":"NOT_RUN"} + if args.native: + def load(name,path,pin): + need(sha256(path.read_bytes()).hexdigest()==pin,"native source pin") + sp=importlib.util.spec_from_file_location(name,path) + module=importlib.util.module_from_spec(sp);sys.modules[name]=module;sp.loader.exec_module(module) + return module + CE=load("p104_delayed_compiler",ROOT/"research/p104-native-channel/vendor/clifford_exact.py", + "2982ead07721e83358dc67c6f49c2b4c16a236a6bebdfd72f58221be1f5d0962") + N=load("p104_delayed_independent",ROOT/"research/p104-native-channel/vendor/native_verify.py", + "3049471905b47b385c88378a1a3be7a18b8858aadd035b8a6da2f4a03b470f38") + charts={} + def chart(f): + if f not in charts:charts[f]=CE.canonical_frame(9,frame_bases[f]) + return charts[f] + checked={};uses=0;phase_control=False + for e in actions: + if e[0]!="climb" or e[1] not in ("joint","source_pad_entry","target_pad_exit"):continue + _,kind,r,a,b,rank=e;uses+=1 + normal=w["ports"][r if kind=="source_pad_entry" else r-112] if kind!="joint" else None + key=(kind,a,b,normal) + if key in checked:continue + if kind=="joint": + op=chart(a).adjoint().then(chart(b)) + expected=N.adjoint(N.frame(tuple(frame_bases[a]),9))+N.frame(tuple(frame_bases[b]),9) + else: + # Padding enters BEFORE the retained source adapter and exits + # AFTER the retained target adapter; both need intrinsic C_q. + op=CE.cgate(9,normal,1);expected=(("C",normal,1),) + recipe,_=CE.lower_child(op) + need(recipe["rank"]==rank,"new positive child rank") + N.equal(N.recipe(recipe),expected,"new joint-side native transport") + if not phase_control: + bad=copy.deepcopy(recipe);bad["left"]["phase"]=(bad["left"]["phase"]+1)%4 + try:N.equal(N.recipe(bad),expected,"mutated global phase") + except ValueError:phase_control=True + else:raise ValueError("accepted wrong native phase") + checked[key]=rank + need(phase_control,"native phase control ran") + native={"status":"PASS_NEW_NATIVE_RECIPES","distinct_recipes":len(checked),"paid_occurrences":uses,"global_phase_control":"REJECT"} + print(json.dumps({"status":"PASS_CANONICAL_P104_DELAYED_SIDE_PROTOTYPE", + "persistent_columns":total-8,"private_columns":8,"actions":len(actions), + "baseline_compensation_adds":len(compensation),"paid_profile":dict(sorted(paid.items())), + "paid_mass":sum(r*c for r,c in paid.items()),"early_dirty_carriers":20, + "late_dirty_carriers":112,"query_cut":len(ideal),"native_new_recipe_check":native, + "controls":controls, + "scope":"Exact finite forward endpoint and canonical common frames. Native recipes are checked only with --native. Global hosting, dual orientation, precision and supplier admission remain separate."},indent=2)) + + +if __name__=="__main__":main() diff --git a/research/p104-delayed-precision/test_verify.py b/research/p104-delayed-precision/test_verify.py new file mode 100644 index 0000000000..38d47c225c --- /dev/null +++ b/research/p104-delayed-precision/test_verify.py @@ -0,0 +1,173 @@ +#!/usr/bin/env python3 +"""Behavior controls and separate Fraction checks for the completed-word bound.""" +from fractions import Fraction as Q +import gzip +import importlib.util +import json +from pathlib import Path +import subprocess +import sys +import tempfile +import unittest + +HERE = Path(__file__).resolve().parent +spec = importlib.util.spec_from_file_location("p104_delayed_precision", HERE / "verify.py") +V = importlib.util.module_from_spec(spec) +sys.modules[spec.name] = V +spec.loader.exec_module(V) +I = V.Instruction + + +class PrecisionTests(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.word = V.load_word() + cls.program = V.normalize(cls.word) + cls.result = V.analyze(cls.program) + + def test_signed_cancellation_and_all_cut_coverage(self): + program = [I("add", 0, 1, Q(1)), I("add", 0, 1, Q(-1))] + result = V.analyze(program, roles=2) + self.assertEqual([p[0] for p in result["peaks"]], [Q(2), Q(2), Q(4)]) + self.assertEqual(result["inputs"][0].coefficients(), {0: Q(1)}) + self.assertEqual(result["errors"][0].coefficients(), {0: Q(1), 1: Q(1)}) + V.check_peaks(program, result) + + def test_fraction_oracle_for_dyadic_row_updates(self): + weights = (2, 3, 5) + rows = [V.DyadicRow(weights, i) for i in range(3)] + dense = [{i: Q(1)} for i in range(3)] + operations = [(0, 1, Q(-1, 65536)), (0, 2, Q(3, 2)), + (2, 0, Q(65536)), (1, 2, Q(-8)), (0, 1, Q(1, 2)), + (0, 1, Q(-1, 2)), (2, 1, Q(1, 8))] + # Initial input weights are intentionally nonzero in this arithmetic test. + for i, row in enumerate(rows): + row.weighted = weights[i] + for dst, src, q in operations: + rows[dst].add_scaled(rows[src], q) + for j, value in tuple(dense[src].items()): + dense[dst][j] = dense[dst].get(j, Q(0)) + q * value + if not dense[dst][j]: + del dense[dst][j] + self.assertEqual(rows[dst].coefficients(), dense[dst]) + self.assertEqual(Q(rows[dst].absolute, 1 << rows[dst].exponent), + sum(map(abs, dense[dst].values()))) + self.assertEqual(Q(rows[dst].weighted, 1 << rows[dst].exponent), + sum(abs(q) * weights[j] for j, q in dense[dst].items())) + rows[0].scale(Q(-1, 65536)) + self.assertEqual(rows[0].coefficients(), {j: -q / 65536 for j, q in dense[0].items()}) + + def test_reset_does_not_erase_propagated_private_error(self): + program = [I("reset", 1), I("add", 1, 0, Q(1)), + I("add", 0, 1, Q(1)), I("reset", 1)] + result = V.analyze(program, roles=2) + self.assertEqual(result["errors"][1].coefficients(), {}) + self.assertEqual(result["errors"][0].coefficients(), {1: Q(1), 2: Q(1)}) + self.assertEqual(V.injected(program, 3, 0, defects={1: Q(1)}, roles=2), Q(1)) + + def test_completed_word_sharp_peaks_and_endpoint_sensitivities(self): + self.assertEqual([p[:3] for p in self.result["peaks"]], + [(Q(131072), 33373, 93), (Q(1394705), 33373, 93), + (Q(2134050), 33373, 93)]) + V.endpoint_check(self.result, self.word["live_ports"]) + V.check_peaks(self.program, self.result) + for target in (93, 112, 86, 224, 712, 732, 704): + inputs, errors = V.adjoint(self.program, len(self.program) - 1, target) + self.assertEqual(inputs, self.result["inputs"][target].coefficients()) + self.assertEqual(errors, self.result["errors"][target].coefficients()) + self.assertEqual(V.injected(self.program, 33373, 93, defects={7691: Q(1)}), Q(-65536)) + self.assertEqual(V.injected(self.program, len(self.program)-1, 112, + defects={22003: Q(1)}), Q(1)) + self.assertEqual(V.injected(self.program, len(self.program)-1, 704, + defects={22003: Q(1)}), Q(0)) + + def test_state_relative_guard_is_sufficient_not_a_precision_minimum(self): + P, K = Q(131072), Q(2134050) + self.assertEqual(V.guard_bits(P, K), 39) + for bits in (0, 1, 32, 128, 1024): + u = Q(1, 1 << (bits + 39)) + self.assertLess(K * u, 1) + self.assertLessEqual(P * K * u / (1 - K * u), Q(1, 1 << bits)) + u = Q(1, 1 << (bits + 38)) + self.assertGreater(P * K * u / (1 - K * u), Q(1, 1 << bits)) + with self.assertRaisesRegex(ValueError, "positive feedback"): + V.guard_bits(P, Q(0)) + with self.assertRaisesRegex(ValueError, "capacity exceeded"): + V.guard_bits(Q(1 << 1024), Q(2)) + + def test_semantic_faults_fail(self): + bad = dict(self.word) + bad["actions"] = [list(e) for e in self.word["actions"]] + first = next(i for i, e in enumerate(bad["actions"]) if e[0] == "climb") + bad["actions"][first][3] = 1 + with self.assertRaisesRegex(ValueError, "transport entry chart"): + V.normalize(bad) + # Suppress a real private clear without changing any instruction index. + bad = list(self.program) + index = next(i for i, e in enumerate(bad) if e.op == "reset") + bad[index] = I("exact") + with self.assertRaisesRegex(ValueError, "arbitrary-input endpoint"): + V.endpoint_check(V.analyze(bad), self.word["live_ports"]) + # Initial compensation is part of the completed word, not free metadata. + with self.assertRaisesRegex(ValueError, "arbitrary-input endpoint"): + V.endpoint_check(V.analyze(self.program[7686:]), self.word["live_ports"]) + + def test_read_only_export_and_fail_closed_receipts(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + for name in ("verify.py", "WORD.json.gz", "RESULT.json"): + (root / name).write_bytes((HERE / name).read_bytes()) + before = {p.name: p.read_bytes() for p in root.iterdir()} + for flags in ([], ["-O"]): + done = subprocess.run([sys.executable, "-I", "-B", *flags, str(root / "verify.py")], + capture_output=True, text=True, timeout=60) + self.assertEqual(done.returncode, 0, done.stderr) + self.assertIn("input=131072 absolute=1394705 relative=2134050", done.stdout) + self.assertEqual(before, {p.name: p.read_bytes() for p in root.iterdir()}) + receipt = json.loads((root / "RESULT.json").read_text()) + receipt["uniform_relative_guard_bits"] = 38 + (root / "RESULT.json").write_text(json.dumps(receipt)) + failed = subprocess.run([sys.executable, "-I", "-B", str(root / "verify.py")], + capture_output=True, text=True, timeout=60) + self.assertNotEqual(failed.returncode, 0) + self.assertIn("complete canonical precision receipt", failed.stderr) + raw = gzip.decompress((root / "WORD.json.gz").read_bytes()) + (root / "WORD.json.gz").write_bytes(gzip.compress(raw + b" ", mtime=0)) + failed = subprocess.run([sys.executable, "-I", "-B", str(root / "verify.py")], + capture_output=True, text=True, timeout=60) + self.assertNotEqual(failed.returncode, 0) + self.assertIn("literal stream authentication", failed.stderr) + + def test_changed_producer_is_rejected_before_import(self): + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + (root / "export_word.py").write_bytes((HERE / "export_word.py").read_bytes()) + (root / "producer.py").write_text("raise RuntimeError('untrusted producer executed')\n") + failed = subprocess.run([sys.executable, "-I", "-B", str(root / "export_word.py"), + "--check"], capture_output=True, text=True, timeout=10) + self.assertNotEqual(failed.returncode, 0) + self.assertIn("unchanged PR2139 producer authentication", failed.stderr) + self.assertNotIn("untrusted producer executed", failed.stderr) + + def test_no_overwrite_and_coefficient_boundaries(self): + with tempfile.TemporaryDirectory() as directory: + target = Path(directory) / "receipt.json" + target.write_text("keep\n") + failed = subprocess.run([sys.executable, "-I", "-B", str(HERE / "verify.py"), + "--write", str(target)], + capture_output=True, text=True, timeout=60) + self.assertNotEqual(failed.returncode, 0) + self.assertIn("FileExistsError", failed.stderr) + self.assertEqual(target.read_text(), "keep\n") + with self.assertRaisesRegex(ValueError, "replay domain capacity"): + V.analyze([I("exact")], roles=845) + with self.assertRaisesRegex(ValueError, "replay domain capacity"): + V.analyze([I("exact")] * 34334, roles=1) + self.assertEqual(V.coefficient("-1/65536"), Q(-1, 65536)) + for value in ("0", "1/3", "65537", "1/131072"): + with self.assertRaises(ValueError): + V.coefficient(value) + + +if __name__ == "__main__": + unittest.main() diff --git a/research/p104-delayed-precision/verify.py b/research/p104-delayed-precision/verify.py new file mode 100644 index 0000000000..99cb11d76a --- /dev/null +++ b/research/p104-delayed-precision/verify.py @@ -0,0 +1,383 @@ +#!/usr/bin/env python3 +"""Exact all-cut input and defect maps of the completed PR2139 P104 word.""" +import argparse +from collections import Counter +from fractions import Fraction as Q +import gzip +import hashlib +import json +from pathlib import Path +from typing import NamedTuple + +HERE = Path(__file__).resolve().parent +WORD_SHA256 = "8be1f3c659d887030fa70afdbdeca38fbfbaea1b2a57b1783d3669e92816545c" +MAX_BYTES = 4 * 1024 * 1024 + + +def need(condition, message): + if not condition: + raise ValueError(message) + + +def canonical(value): + return json.dumps(value, sort_keys=True, separators=(",", ":")).encode() + + +def load_word(path=HERE / "WORD.json.gz"): + need(path.stat().st_size <= MAX_BYTES, "compressed stream capacity") + with gzip.open(path, "rb") as stream: + raw = stream.read(MAX_BYTES + 1) + need(len(raw) <= MAX_BYTES, "decompressed stream capacity") + need(hashlib.sha256(raw).hexdigest() == WORD_SHA256, "literal stream authentication") + return json.loads(raw) + + +class Instruction(NamedTuple): + op: str + dst: int = -1 + src: int = -1 + coefficient: Q = Q(0) + rank: int = 0 + + +def coefficient(value): + q = Q(value) + need(q != 0 and abs(q) <= 65536, "nonzero bounded coefficient") + need(q.denominator <= 65536 and q.denominator & (q.denominator - 1) == 0, + "bounded dyadic coefficient") + return q + + +def register(reference): + need(isinstance(reference, list) and len(reference) == 2, "register reference") + kind, index = reference + need(kind in ("C", "L") and type(index) is int, "register kind/index") + limit = 8 if kind == "C" else 844 + need(0 <= index < limit, "register index capacity") + return index + (704 if kind == "C" else 0) + + +def span(basis): + need(isinstance(basis, list) and len(basis) <= 9, "binary basis capacity") + values = {0} + for value in basis: + need(type(value) is int and 0 <= value < 512, "nine-bit frame label") + values.update(x ^ value for x in tuple(values)) + return frozenset(values) + + +def scalar_instruction(event, current): + need(len(event) == 3 and isinstance(event[1], list), "scalar event shape") + op, frame = event[1:] + dst = register(op[1]) + need(current[dst] == frame, "scalar destination chart") + code = op[0] + if code == "clear": + need(len(op) == 2 and 704 <= dst < 712 and frame == 0, "owned exact clear") + return Instruction("reset", dst) + if code == "scale": + need(len(op) == 4, "scale shape") + return Instruction(code, dst, coefficient=coefficient(Q(op[2], op[3]))) + need(code == "add" and len(op) == 5, "scalar opcode/shape") + src = register(op[2]) + need(src != dst and current[src] == frame, "distinct common-chart operands") + return Instruction(code, dst, src, coefficient(Q(op[3], op[4]))) + + +def action_instruction(event, current, frames): + need(isinstance(event, list) and 2 <= len(event) <= 6, "action shape") + if event[0] == "scalar": + return scalar_instruction(event, current) + if event[0] == "owned_init": + need(len(event) == 3 and 704 <= event[1] < 712, "owned private reset") + dst, new = event[1:] + need(0 <= new < len(frames), "private reset frame") + current[dst] = new + return Instruction("reset", dst) + if event[0] == "climb": + need(len(event) == 6, "transport shape") + dst, old, new, rank = event[2:] + need(type(dst) is int and 0 <= dst < 844, "transport register") + need(0 <= old < len(frames) and 0 <= new < len(frames), "transport frame indices") + need(current[dst] == old, "transport entry chart") + a, b = frames[old], frames[new] + need(a <= b or b <= a, "nested native transport") + need(rank == abs(len(a).bit_length() - len(b).bit_length()) and rank > 0, + "positive transport rank") + current[dst] = new + return Instruction("transport", dst, rank=rank) + need(event[0] in ("phase", "adapter", "residual_adapter"), "action opcode") + return Instruction("exact") + + +def normalize(word): + need(word["schema_version"] == 1 and word["total_roles"] == 844, "word geometry") + need(len(word["initial_frames"]) == len(word["final_frames"]) == 844, + "boundary role inventory") + need(len(word["frame_bases"]) == 1008, "frame inventory") + frames = [span(basis) for basis in word["frame_bases"]] + current = list(word["initial_frames"]) + need(all(type(f) is int and 0 <= f < len(frames) for f in current), "initial frames") + live = word["live_ports"] + need(len(live) == 104 and live == sorted(set(live)) and all(0 <= p < 112 for p in live), + "live P104 ports") + need(len(word["compensation"]) == 7686 and len(word["actions"]) == 26647, + "complete instruction inventory") + program = [] + for dst, src, raw in word["compensation"]: + need(type(dst) is int and type(src) is int and 0 <= dst < 844 and 0 <= src < 844, + "compensation indices") + need(dst != src and current[dst] == current[src] == 0, "baseline common zero chart") + program.append(Instruction("add", dst, src, coefficient(raw))) + for event in word["actions"]: + program.append(action_instruction(event, current, frames)) + need(current == word["final_frames"], "complete output charts") + paid = Counter(e.rank for e in program if e.op == "transport") + need(dict(paid) == {1: 2564, 2: 547, 3: 432, 4: 142, 5: 83, 6: 128, 7: 11}, + "complete predecessor paid profile") + return program + + +class DyadicRow: + """Integer coefficients at one row-local power-of-two denominator.""" + def __init__(self, weights, initial=None): + self.weights = weights + self.exponent = 0 + self.values = {} if initial is None else {initial: 1} + self.absolute = 0 if initial is None else 1 + self.weighted = 0 + + def add_scaled(self, other, q): + denominator_bits = q.denominator.bit_length() - 1 + exponent = max(self.exponent, other.exponent + denominator_bits) + if exponent != self.exponent: + factor = 1 << (exponent - self.exponent) + self.values = {j: v * factor for j, v in self.values.items()} + self.absolute *= factor + self.weighted *= factor + self.exponent = exponent + factor = q.numerator << (exponent - other.exponent - denominator_bits) + for j, value in other.values.items(): + old = self.values.get(j, 0) + new = old + value * factor + change = abs(new) - abs(old) + self.absolute += change + self.weighted += change * self.weights[j] + if new: + self.values[j] = new + else: + self.values.pop(j, None) + + def scale(self, q): + self.exponent += q.denominator.bit_length() - 1 + self.values = {j: v * q.numerator for j, v in self.values.items()} + self.absolute *= abs(q.numerator) + self.weighted *= abs(q.numerator) + + def inject(self, index): + value = 1 << self.exponent + self.values[index] = value + self.absolute += value + self.weighted += value * self.weights[index] + + def coefficients(self): + return {j: Q(v, 1 << self.exponent) for j, v in self.values.items()} + + +def weights_for(program): + result = [] + for event in program: + if event.op == "add": + result.append(1 + abs(event.coefficient)) + elif event.op == "scale": + result.append(abs(event.coefficient)) + else: + result.append(Q(int(event.op == "transport"))) + bits = max((q.denominator.bit_length() - 1 for q in result), default=0) + return result, bits, tuple(int(q * (1 << bits)) for q in result) + + +def update(rows, event, weights): + dst = event.dst + if event.op == "reset": + rows[dst] = DyadicRow(weights) + elif event.op == "add": + rows[dst].add_scaled(rows[event.src], event.coefficient) + elif event.op == "scale": + rows[dst].scale(event.coefficient) + + +def analyze(program, roles=844): + need(1 <= roles <= 844 and 1 <= len(program) <= 34333, "replay domain capacity") + weights, bits, integers = weights_for(program) + zero_weights = (0,) * roles + inputs = [DyadicRow(zero_weights, i) for i in range(roles)] + errors = [DyadicRow(integers) for _ in range(roles)] + peaks = [(Q(1), -1, 0, {0: Q(1)}), (Q(0), -1, 0, {}), (Q(0), -1, 0, {})] + stream = hashlib.sha256() + max_slots = slots = 0 + max_exponent = 0 + for index, event in enumerate(program): + if event.op == "exact": + continue + dst = event.dst + before = len(errors[dst].values) + update(inputs, event, zero_weights) + update(errors, event, integers) + if weights[index]: + errors[dst].inject(index) + slots += len(errors[dst].values) - before + max_slots = max(max_slots, slots) + ir, er = inputs[dst], errors[dst] + need(ir.absolute == sum(map(abs, ir.values.values())), "input row norm cache") + need(er.absolute == sum(map(abs, er.values.values())), "defect row norm cache") + need(er.weighted == sum(abs(v) * integers[j] for j, v in er.values.items()), + "weighted defect row norm cache") + values = (Q(ir.absolute, 1 << ir.exponent), Q(er.absolute, 1 << er.exponent), + Q(er.weighted, 1 << (er.exponent + bits))) + for which, value in enumerate(values): + if value > peaks[which][0]: + row = ir if which == 0 else er + peaks[which] = value, index, dst, row.coefficients() + stream.update(canonical([index, dst, *map(str, values)]) + b"\n") + max_exponent = max(max_exponent, ir.exponent, er.exponent) + return {"inputs": inputs, "errors": errors, "weights": weights, "peaks": peaks, + "norm_stream_sha256": stream.hexdigest(), "max_error_slots": max_slots, + "max_row_denominator_bits": max_exponent} + + +def endpoint_check(result, live): + for reg, row in enumerate(result["inputs"]): + expected = {} if 704 <= reg < 712 else {reg: Q(1)} + if 112 <= reg < 224 and reg - 112 in live: + expected[reg - 112] = Q(1) + need(row.coefficients() == expected, "arbitrary-input endpoint: " + str(reg)) + + +def adjoint(program, stop, target, roles=844): + """Separate Fraction recurrence for one cut, with no integer-row machinery.""" + need(1 <= roles <= 844 and 0 <= target < roles and -1 <= stop < len(program) <= 34333, + "reverse cut capacity") + row = [Q(int(i == target)) for i in range(roles)] + defects = {} + for index in range(stop, -1, -1): + event = program[index] + if event.op == "exact": + continue + dst = event.dst + if event.op in ("add", "scale", "transport") and row[dst]: + defects[index] = row[dst] + if event.op == "reset": + row[dst] = Q(0) + elif event.op == "add": + row[event.src] += event.coefficient * row[dst] + elif event.op == "scale": + row[dst] *= event.coefficient + return {i: q for i, q in enumerate(row) if q}, defects + + +def injected(program, stop, target, inputs=None, defects=None, roles=844): + need(1 <= roles <= 844 and 0 <= target < roles and -1 <= stop < len(program) <= 34333, + "injected cut capacity") + state = [Q(0)] * roles + for i, q in (inputs or {}).items(): + state[i] = q + for index in range(stop + 1): + event = program[index] + if event.op == "exact": + continue + dst = event.dst + if event.op == "reset": + state[dst] = Q(0) + elif event.op == "add": + state[dst] += event.coefficient * state[event.src] + elif event.op == "scale": + state[dst] *= event.coefficient + if defects and index in defects: + state[dst] += defects[index] + return state[target] + + +def check_peaks(program, result): + for which, (value, index, target, witness) in enumerate(result["peaks"]): + inputs, defects = adjoint(program, index, target) + need(witness == (inputs if which == 0 else defects), "reverse cut coefficient identity") + signs = {j: Q(1 if q > 0 else -1) for j, q in witness.items()} + if which == 0: + actual = injected(program, index, target, inputs=signs) + else: + if which == 2: + signs = {j: q * result["weights"][j] for j, q in signs.items()} + actual = injected(program, index, target, defects=signs) + need(actual == value, "constructive peak attainment") + + +def guard_bits(P, K): + need(P >= 0 and K > 0, "nonnegative input and positive feedback coefficients") + bits = 0 + for candidate in range(1025): + if Q(1 << candidate) >= K * (P + 1): + bits = candidate + break + else: + raise ValueError("guard-bit capacity exceeded") + need(K < 1 << bits, "strict feedback guard") + return bits + + +def summarize(program, word, result): + P, A, K = (peak[0] for peak in result["peaks"]) + guards = guard_bits(P, K) + groups = {"source": word["live_ports"], "target": [112 + t for t in word["live_ports"]], + "dirty_helper": [r for r in range(844) if r not in word["live_ports"] + and r not in [112 + t for t in word["live_ports"]] + and not 704 <= r < 712], "private": list(range(704, 712))} + endpoint = {} + for name, regs in groups.items(): + rows = [result["errors"][r].coefficients() for r in regs] + endpoint[name] = {"roles": len(regs), + "absolute": str(max(sum(map(abs, row.values()), Q(0)) for row in rows)), + "relative": str(max(sum((abs(v) * result["weights"][j] + for j, v in row.items()), Q(0)) for row in rows))} + need(P == 131072 and A == 1394705 and K == 2134050 and guards == 39, + "complete all-cut constants") + peaks = {name: {"value": str(value), "event": index, "register": reg, + "witness": [[j, str(q)] for j, q in sorted(row.items())]} + for name, (value, index, reg, row) in zip(("input", "absolute", "relative"), result["peaks"])} + return {"status": "PASS_P104_DELAYED_PRECISION", "word_sha256": WORD_SHA256, + "events": len(program), "roles": 844, + "defect_sites": sum(bool(w) for w in result["weights"]), + "op_counts": dict(sorted(Counter(e.op for e in program).items())), + "paid_mass": sum(e.rank for e in program), "all_cut_peaks": peaks, + "endpoint_error_maxima": endpoint, "uniform_relative_guard_bits": guards, + "all_cut_norms_sha256": result["norm_stream_sha256"], + "maximum_live_error_coefficients": result["max_error_slots"], + "maximum_row_denominator_bits": result["max_row_denominator_bits"], + "evidence": ["full arbitrary-input endpoint and paid profile", "three reverse cut identities", + "three sign-aligned attaining executions"], + "scope": "Finite completed forward word, conditional unitary-chart/completed-child defect contract. No rounded-child, global hosting, all-size, supplier or kappa claim."} + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--write", type=Path, help="create a new canonical receipt exclusively") + args = parser.parse_args() + word = load_word() + program = normalize(word) + result = analyze(program) + endpoint_check(result, word["live_ports"]) + check_peaks(program, result) + receipt = summarize(program, word, result) + if args.write: + with args.write.open("x") as stream: + json.dump(receipt, stream, indent=2, sort_keys=True) + stream.write("\n") + else: + need(canonical(receipt) == canonical(json.loads((HERE / "RESULT.json").read_text())), + "complete canonical precision receipt") + print("PASS_P104_DELAYED_PRECISION input=131072 absolute=1394705 relative=2134050 " + "guard_bits=39 endpoint_columns=844 reverse_cuts=3 no_new_kappa") + + +if __name__ == "__main__": + main()