From 886222c1d3e2c2d878b263dc8d165ef03d5bac7f Mon Sep 17 00:00:00 2001 From: Hiroki KUMAZAKI Date: Sun, 18 Oct 2026 11:05:51 +0900 Subject: [PATCH] Bind P104 outgoing ports to actual recipient histories and admission --- .../CERTIFICATE.json.gz | Bin 0 -> 96984 bytes research/p104-external-port-closure/PROOF.md | 110 ++ research/p104-external-port-closure/README.md | 160 +++ .../p104-external-port-closure/SOURCES.json | 54 + .../p104-external-port-closure/SUMMARY.json | 1198 +++++++++++++++++ research/p104-external-port-closure/TASK.json | 143 ++ .../p104-external-port-closure/VERIFY.json | 21 + research/p104-external-port-closure/oracle.py | 175 +++ research/p104-external-port-closure/verify.py | 395 ++++++ 9 files changed, 2256 insertions(+) create mode 100644 research/p104-external-port-closure/CERTIFICATE.json.gz create mode 100644 research/p104-external-port-closure/PROOF.md create mode 100644 research/p104-external-port-closure/README.md create mode 100644 research/p104-external-port-closure/SOURCES.json create mode 100644 research/p104-external-port-closure/SUMMARY.json create mode 100644 research/p104-external-port-closure/TASK.json create mode 100644 research/p104-external-port-closure/VERIFY.json create mode 100644 research/p104-external-port-closure/oracle.py create mode 100644 research/p104-external-port-closure/verify.py diff --git a/research/p104-external-port-closure/CERTIFICATE.json.gz b/research/p104-external-port-closure/CERTIFICATE.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..e6347a3d29194c7308dab5e5fff9855c9258d2d5 GIT binary patch literal 96984 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%0Dp0tH>Icxk>g1;@)2(32TXA#NR$>#ygE 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𝔊5cMWf-#gPYm$auWRg4`8XqZ?|YoCXG8(u|nCw$Ce*yXk+ z($1}fgBGN-su`8Z( zWY?hIAbZ&GhO#-sQX-Kg{gYW(3F!m$W8iqAWX=1Msw!SKcv7)SK*s^%W09y2> z%BDgP@v|oZiGV^#wMNp~Ti})k2%Fq9`i9+o``Nvn8l9c4*32bN%`w?m7$-5*TC6Id z9s71a;WR4setouUGV&H+aP^bR*POmLV$+$|Shdbi>;&Mdq_OgPTbbfEYuWMn^3vg> z7T%9lw{;}?y_7SCI0uw5)!~`Wbvt*k>Y?y!2b=fF7yAJh6_-DKkWOSBjA$)eW%9R5B1CRGbg zsXV0aeU1#pz-FsTKqb}IjChS@arj*KQ{oo-&3)stntYl8C#@~l2V=zkeJOIZP~wGE zZIs44UnQ#T8T!>8Y0eo8luoyr0);cSmM}i;ub9CX~9@)Gf|s2Eo1_IPo4*NBXJL2abBXtc7RSNL71ro!T?mq)(T9>9tg-&;_W= zP*A%16rKn$?Dl{at`$w&urtED#1S7oF zU%@!|`}afJdeFg2!b`#SNd>aSt!Ida14Ck0Xa>da^l&DUhd!-=Jloq9rQc~F=6=hq zZBX&)&nD{!;xreIaba`R;Cn3Gb=J~!ASl#F$&KgH@Y`P7 z=QPWH4P(`A{>sw3yV3jplx*l^mwluRoA<@wh8endsO)W(0y|B{hqNe?SXnA0&*@T` zXZO#fRM5yi<7hq{f33J-yBE02iFT?nuD4>FKD7jlq|YfQ7`>7lpZt; zY^%>2MTFS56>RPaQLh{XJWi2}wOcjjdQa;u^Lkf_|FPmhkmz^`*Mq9aeR7I5lkXPJ9pwTbWAiWb|c^A})y{1~G+(o_m)(hh4pZFl`9Up$Q=c{Uo#ggs01{ zo+G>Pld?A-fWPGLJ^$c|w-n6Ad~TYW32MnR0$-qm(hKb5?KWHMNPZ~nWm zCDvl7q`lah9k1glk`FcaCTVp9!4QVbLY1j+aIb>Vq@dks(qZ71S{B)JvhXKrO3ae1 z=V`&I&nmX)>MDcqzHyG|W@kOmQAVWwfHO04cEFiy+}_TbIl<2EHgn>K4Zbkxj~khc z6OxJ2U6Wds@QV@B!ZTVL-uF6I=L(uT9#-~Tn*Hr!?wC4}9m|0|!|DNgKc-|KuA7&6)0inF3cqb+7G;Q0YBPUfGk~W3u06 zFS}Sqm7K%aYRB70-r|cC@pgW=jz>8VQtuI^K;M)O`-HLwVUTjmQ*|Ss2MnD@Zrw0D zb-!BLdAEC%deg8OZcwObI}zD6n!mA=181rpD1BIGS|(lkP^d_tdUtNyAQK7TfJ8DG|dW<9r)~$Wng8Bx7}((kD`9 z4Fipl)=Uwl?1uM@y{tXMq!=-_v%Vc1nX5P6Q~dpspG(fDma literal 0 HcmV?d00001 diff --git a/research/p104-external-port-closure/PROOF.md b/research/p104-external-port-closure/PROOF.md new file mode 100644 index 0000000000..9cae0ff3bf --- /dev/null +++ b/research/p104-external-port-closure/PROOF.md @@ -0,0 +1,110 @@ +# Conditional dependency, admission and endpoint proof + +Hiroki Kumazaki with substantial OpenAI Codex assistance. Apache-2.0. + +## 1. Literal closure + +Give every initial bank a distinct state version. Each transport/sign depends +on its preceding bank version; ADD depends on both the preceding target and +current source; zero has no value predecessors; erase depends on its current +private value. The least predecessor-closed set containing an observation is +its graph ancestor set. This proves the SSA algorithm's literal minimality. + +For any touched private lifetime, also require its matching erase. Iterate +predecessor closure and this requirement to a fixed point. Each iteration only +adds vertices in a finite graph, so it terminates. Any legal set satisfying +these two conditions contains every iteration, hence contains the result. +This minimality is graph-theoretic, not a lower bound against cancellation or +alternative schedules. The independent reverse scan propagates live demands +through precisely the same literal instructions without constructing this DAG. + +The 675 observations use the exact published PR3423 port-index hash. At an ADD +observation, predecessor closure retains both the current recipient history and +the actual source history. Running retained instructions in their original +order therefore yields each observed ideal value, by induction. Private erase +checks prove exact zero scalar rows, rather than silently discarding dirt. + +The original 146 endpoint observations require 265 inputs. Requesting the +original endpoints of those 265 inputs adds 215 events and no new inputs. +This is a selected-output projection. Other outgoing effects are not implied +by preserving its selected endpoints; they are explicitly listed separately. + +## 2. Native premise and normalized rows + +Assume the relevant initial and current chart maps `A_H` are unitary +automorphisms of `B9`, and every used native transport has its archived operator +`T_(H->K) = A_K A_H^-1`, and that each complete native primitive is unitary, +preserves `B9 = E Z[i]^512`, and is exact for the admitted module on the common +grid. These are the existing chart/module implications, not consequences of +our file hashes. The new check binds all used occurrences to their source data. + +Put `z_s = A_initial(s)^-1 v_s(0)`. Induction gives + +`v_b(t) = A_frame(b,t) sum_s r[b,s,t] z_s`. + +Transport changes the outer frame only. Common-frame ADD performs the literal +rational row addition. Sign negates a row. Private zero creates the zero row; +erase is allowed only for the zero row. These arguments quantify over arbitrary +independent dirty initial arrays, not just the three numerical fixtures. +The final formula keeps both frame factors; neither initial X frames nor final +Y frames can be dropped. + +The exact retained matrix shows normalized restoration of 213 non-X banks and +an identity X diagonal plus a rank-9 Y map on the 52 X endpoints. The rank is +computed by corrected rational pivot elimination, with duplicate/dependent-row +regressions. A separate explicit factorization expresses all 52 rows using +nine named rows and verifies every coefficient; a 9-by-9 minor of those rows +has determinant `-1/128`. These give the matching upper and lower rank bounds. The separate literal fixture interpreter +checks projection/full ideal-word agreement but is not the universal proof; +the induction and complete exact rows provide that statement. + +## 3. Minimal independent dyadic product entrance + +Restrict each independent initial bank to `2^k_s B9`, `k_s >= 0` an integer. +The chart automorphism premise makes each normalized `z_s` independently +arbitrary in that same module. For any one row, its output lies in `B9` for all +such inputs if and only if `r[b,s] 2^k_s` is an integer for every source s. + +Sufficiency follows from integer linear closure of B9. For necessity, set every +other input to zero and choose `z_s = 2^k_s E e_0`. Applying `E^-1` to that row +leaves its nonintegral scalar coefficient in the zeroth coordinate. The outer +chart is an automorphism, so it cannot repair nonmembership. All coefficients +are real dyadic rationals; the maximum reduced-denominator exponent over every +retained row is consequently the coordinatewise-minimal k_s. + +The computed maxima are two for all 104 Y inputs, one for the 38 listed N +inputs, and zero for the other 123. Reducing any positive exponent by one is +rejected using its actual coefficient witness (142 cases). This is a condition +for the retained *prefix invariant*. It does not characterize correlated inputs +or domains admitting only the final cut. N33/N34's omitted full-word half-reads +are not licensed by this projection's weaker entrance. + +Every retained ADD includes its before and after rows. Under this entrance both +are in B9, hence their difference—the actual increment—is also in B9. Thus +rational coefficient divisions are exact on the common grid. Native prefix +exactness uses the separate inherited module premise; scalar rows alone do not +verify a native circuit's phase or intermediate rounding. + +The event-312 witness is stronger than an odd-integer half: `N100(x)=2*x_0` +is in B9 because its only nonzero Newton coefficient is `2/(1+i)=1-i`. +No instruction has touched N100 before its half-read. All other banks remain +zero beforehand. Its arithmetically exact half `x_0` has coefficient +`1/(1+i)=(1-i)/2`, outside the Gaussian integers. `4*x_0` is the positive +2B9 control. This satisfies every original 63-bank entrance assumption and +exhibits an independent external admission obligation. + +## 4. Conditional payload width + +Let H bound each real and imaginary physical input component across the 265 +inputs. Each 512-entry complex vector has Euclidean norm at most `32H`. +Unitary initial chart normalization preserves this norm. Triangle inequality +and the exact row identity give `||v_b||_2 <= 32H sum_s |r[b,s]|`. +The retained maximum is `127/2`, first at event 3589, so `2032H` bounds each +payload component. Unitary complete native prefixes preserve the entrance norm; +partially written disjoint components inherit a bound from their before/after +stage. This reproduces the retained norm estimate on the actual recipient +slice, not a new global estimate or a physical storage theorem. + +H itself, initial domain preparation, physical allocation, scratch layout, +movement, controls, exposed codecs and recursive interfaces still need a paid +caller. The unchanged-profile `599/584` stop is unaffected. diff --git a/research/p104-external-port-closure/README.md b/research/p104-external-port-closure/README.md new file mode 100644 index 0000000000..4d897e52df --- /dev/null +++ b/research/p104-external-port-closure/README.md @@ -0,0 +1,160 @@ +# Closing the P104 open program's external recipient histories + +This answers [PR3423's 675-port handoff][handoff] at +`15d28c4de37dc47ea07cd7173c8b318fca7a4d75`, using the unchanged literal PR2586 +word retained on canonical main `6f100d4bb5083f8c35d96fd95a539811c62f245c`. +The result is a source-bound dependency and conditional numerical interface, +not a physical supplier or a new multiplication exponent. + +## Result + +The 63-bank open program's 675 outgoing ADDs reach 83 distinct recipient banks. +Their actual histories require substantially more inputs: + +| Observations required | Events with private cleanup | Initial banks | +| --- | ---: | ---: | +| All 675 recipient states immediately after their port ADD | 2,907 | 263 | +| Final endpoints of the 83 recipients and 63 original banks | 3,812 | 265 | +| Also preserve the original endpoint histories of all 265 dependencies | 4,027 | 265 | + +A state-version dependency graph and a separately written reverse-liveness +scan agree on the exact event and input sets. These are least closures in the +literal read/write graph with all touched private lifetimes closed. They are +not minima over algebraic cancellations, rewritten programs or different +implementations. Merely adding the eight erases is insufficient: their forty +cleanup predecessors must be included too. + +The final 4,027-event projection has 2,310 ADDs, 1,597 native transports, +104 signs, eight private allocations and eight zero-checked erasures. +It reaches all 265 original endpoints without introducing more inputs. +It omits 1,371 word events and 93 initial banks. **696 omitted outgoing ADDs** to those 93 banks +are explicitly inventoried in [SUMMARY.json](SUMMARY.json); this projection +is not a replacement for the whole word on those omitted banks. + +## Additional admission and an exact-half counterexample + +Conditional on the inherited native chart identities and Gaussian Newton +module invariance, the coordinatewise-minimal independent dyadic product +entrance for **every retained atomic state** is: + +- All 104 initial Y banks in `4B9`. +- The following 38 N banks in `2B9`: + `2,4,7,9,18,20,27,29,35,36,40,44,45,46,48,49,50,54,58,59,64,65,66,70,74,75,79,80,81,83,84,85,87,88,89,92,98,100`. +- The other 123 dependencies in `B9`: 52 X, 32 D, 29 G, eight Q, and N33/N34. + +Here `B9 = E Z[i]^512`, with +`E = [[1,0],[1,1+i]] tensor ... tensor [[1,0],[1,1+i]]` (nine factors). +One common grid `2^-f` can scale every displayed module. +Relative to PR3423 this adds 202 initial banks: 52 more strengthened Y inputs, +38 half-read N inputs, two ordinary N inputs, 52 X, 27 D, seven Q and 24 G. +It does not claim that correlated final-cut domains require these individual +scales; PR3426 studies such cancellations separately. The whole-word product +theorem of PR3406 is credited, not rediscovered: this result specializes the +entrance to the actual recipient closure, where N33/N34 need only `B9`. + +The first added incoming boundary is event **312**, `X100 += N100/2` at the +empty frame. Set `N100(x)=2*x_0` on the 512 binary addresses, and all other +initial banks to zero. Every input belongs to `B9`, and all PR3423 63-bank +admissions hold. The division is exact in Gaussian integers, but its output +`X100(x)=x_0` has Newton coefficient `(1-i)/2` at index one, outside `Z[i]`. +The source coefficient is `1-i`. Amplitude four is the positive control. +This exposes an additional recipient admission obligation; it is not a defect +in PR3423, which explicitly left recipient histories open. + +## Composed endpoints and widths + +Write `A_F = Delta_F`, with the empty-frame map equal to identity. Under the +native covariance premise, at every retained state the exact physical value is + +``` +v_b(t) = A_frame(b,t) * sum_s r[b,s,t] * A_initial(s)^(-1) * v_s(0). +``` + +The certificate retains the complete rational rows, actual initial frames and +actual final frames. Initial X banks are not at the empty frame. Final frames +also vary; using PR3423's common frame at event 4516 for the later endpoints +would be incorrect. + +All 213 non-X banks in the 265-bank projection return their normalized initial +rows. Each of the 52 X endpoints has its own initial X coefficient one, only Y +increments, and no residual N/D/Q/G dirt. The actual complete 52-by-104 Y map +has rational rank 9: every row has a retained nine-row factorization and a +9-by-9 minor has determinant `-1/128`. This is a different, larger operator from PR3423's +rank-one **subset of port increments**; the remaining histories are included +here. [CERTIFICATE.json.gz](CERTIFICATE.json.gz) provides every endpoint row +and the before/increment/after rows for all 675 ports. + +If every initial real/imaginary component of the 265 physical inputs is bounded +by `H`, unitary chart maps give `32 H * ||r||_1` as a payload bound. The maximum +row norm is `127/2`, at event 3589 on X46, giving **2032 H**. This is the retained +whole-word norm bound, now bound to the recipient histories; no sharper global +width claim is made. Native prefix unitarity extends it to complete native +stages. Physical storage, temporary layout, caller heights, ownership, routing, +control, exposed representation conversions and recursive charges remain unpaid. + +The inherited unchanged-profile `599/584` stopping decision remains. This +interface certificate does not justify another supplier-construction round. + +## Evidence and reproduction + +The checker imports no predecessor executable. It binds the unchanged WORD and +NATIVE files and all native occurrence/frame/rank records. Native operator +semantics are **assumed**, not proved by matching those records. PR3382's module +theorem and PR3416's broader native-covariance certificate are credited external +premises; PR3423's 392-occurrence check alone does not cover this larger slice. + +The bounded check includes eight structural/semantic rejection groups, 142 +one-bit-weaker input-scale controls, two dependent-row rank regression cases, +an exact rank factorization/minor, three independent literal scalar fixtures +comparing the projection with the full ideal word, and the exact-array Newton +counterexample/positive control. The full-word comparison is scalar algebra +under the chart premise, not a rounded native execution on unadmitted inputs. + +```sh +python3.12 -B scripts/research_package.py --package research/p104-external-port-closure +python3.12 -I -O -B research/p104-external-port-closure/verify.py +``` + +Runtime uses only the standard library. `verify.py --emit` prints the complete +certificate; `verify.py --summary` prints its summary. +`oracle.py --full` prints the independently reconstructed closure. +[SUMMARY.json](SUMMARY.json) is the readable summary; [PROOF.md](PROOF.md) states +the conditional implications. Exact base, source hashes, context heads, overlap +coverage, environment and command outcomes are in SOURCES.json and TASK.json. +No heavy native replay, Lean check or selected-frontier replay is claimed. + +## Open next questions + +1. Can a paid caller supply this 265-bank entrance and physical layout, including + the 52 additional `4B9` and 38 `2B9` admissions? Start with the explicit input + list and event-312 witness; stop at any unproved divisibility or ownership + premise. Current H and input modules are assumptions, not preparation costs. +2. If using the projection inside the original word, how will its omitted + outgoing effects be supplied and paid? Start with the exact omitted-ADD list + in SUMMARY.json. The selected endpoints alone do not preserve those effects. + Any changed supplier/profile must first pass a compatible full cost screen. + +## Credit and scope history + +Hiroki Kumazaki, with substantial OpenAI Codex assistance for analysis, code, +execution, writing and separate AI-agent review. No independent human or +formal proof-kernel review is claimed. Apache-2.0. + +Credit Clear1nsight (PR3423/3382 and the explicit handoff), ywz65 (PR2586 word +and native recipes), Arham Tahir (PR2665 binding and PR2674 atomic row/grid +bounds), Tekalign (PR3025 literal wrapper/ledger), Ross Richardson (PR3068 +period domain), Nick Petalas (PR3406 product domain, PR3416 native covariance, +PR3426 correlated entrance), and the original geometry/native/compiler lineage. +Jose Manuel's unchanged-profile stop and Vasek's PR2744 audit remain credited. +The main `p104-whole-word-internal-grid` package already proves the whole-word +row norm and an alternative sufficient enlarged fixed grid. + +This refines the current P104 producer/consumer question by taking the released +PR3423 handoff, rather than repeating the preceding PR3044 audit or reopening +fixed-cover matching searches. Entry overlap covered 353 open PRs and 2,277 +Discussion records with complete pagination; literal numeric searches have +false-positive matches. Focused PR3423/675-port and canonical-thread checks +found no other published closure for this handoff. Coverage excludes unpublished +work and exhaustive historical diffs. The canonical claim is recorded in TASK. + +[handoff]: https://github.com/CrocSwap/integer-mult-bounds/discussions/2750#discussioncomment-19009429 diff --git a/research/p104-external-port-closure/SOURCES.json b/research/p104-external-port-closure/SOURCES.json new file mode 100644 index 0000000000..ff008ed3d8 --- /dev/null +++ b/research/p104-external-port-closure/SOURCES.json @@ -0,0 +1,54 @@ +{ + "schema_version": 1, + "base_commit": "6f100d4bb5083f8c35d96fd95a539811c62f245c", + "files": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0" + }, + { + "path": "research/p104-rounded-collector/inputs/NATIVE.json.gz", + "usage": "input", + "git_blob": "04f2877aa5444948b7ae37efd267745af82cb34d", + "sha256": "ab91c78835c3e10cf3b2cb8a5d4e0b7cfc3df1ae5a811298d27842f2193e1e3d" + }, + { + "path": "research/p104-rounded-collector/inputs/WORD.json", + "usage": "input", + "git_blob": "93acaabc0a523789ef2f1b06f6eeeefed5551397", + "sha256": "cec1fb3fbd0067b500ad5119a62ba60685be718e769374d7ec8abdd2beaa7e50" + } + ], + "context_sources": [ + { + "pr": 3423, + "head": "15d28c4de37dc47ea07cd7173c8b318fca7a4d75", + "path": "research/p104-newton-interfaces/RECEIPT.json", + "sha256": "fbc444897b13be5973c92ecfa5de67a8efae13b1aca0d8181bd430e2cffba1d3", + "usage": "Inspected published port boundary;675eventindices authenticate to04b3a0bc022c336c9b177eeed49036f1257ab81ea9d0459b8170075b002a24a4. No executable import or Git fetch required." + }, + { + "pr": 3406, + "head": "18a054fd585ab4b2010770ec83cba0c9f28184e3", + "usage": "Credited wholewordproductdomain, not rerun or imported." + }, + { + "pr": 3416, + "head": "f1112560883a5e81b1a29c37c81a79a20be31fe3", + "usage": "Native covariance external mathematical premise, not rerun or imported." + }, + { + "pr": 3426, + "head": "ce2221dddab6efd3027c09269765dd7eb45f2877", + "usage": "Distinct correlated finalcut result, not rerun or imported." + } + ] +} diff --git a/research/p104-external-port-closure/SUMMARY.json b/research/p104-external-port-closure/SUMMARY.json new file mode 100644 index 0000000000..34385fe76f --- /dev/null +++ b/research/p104-external-port-closure/SUMMARY.json @@ -0,0 +1,1198 @@ +{ + "actual_recipient_counterexample": [ + { + "amplitude": 2, + "half_arithmetic_exact": true, + "output_bad_indices": [ + 1 + ], + "output_newton_coefficient_1": [ + "1/2", + "-1/2" + ], + "source_newton_coefficient_1": [ + "1", + "-1" + ] + }, + { + "amplitude": 4, + "half_arithmetic_exact": true, + "output_bad_indices": [], + "output_newton_coefficient_1": [ + "1", + "-1" + ], + "source_newton_coefficient_1": [ + "2", + "-2" + ] + } + ], + "certificate_payload_sha256": "66a6a84b3b90959e69e35f439186b5e990cff92d372e52f7ba457aabb2aee4da", + "history_complete": { + "component_bound_factor": "2032", + "event_ids_sha256": "66113bcd513a17eac24f43944a8759bdae1bb2a85e2b9900122f281c5c676dc8", + "events": 4027, + "inputs": 265, + "max_row_event": 3589, + "max_row_l1": "127/2", + "op_counts": { + "add": 2310, + "erase": 8, + "sign": 104, + "transport": 1597, + "zero": 8 + } + }, + "initial_scale_bits": { + "D0": 0, + "D1": 0, + "D10": 0, + "D11": 0, + "D12": 0, + "D13": 0, + "D14": 0, + "D15": 0, + "D16": 0, + "D17": 0, + "D18": 0, + "D19": 0, + "D2": 0, + "D20": 0, + "D21": 0, + "D22": 0, + "D23": 0, + "D24": 0, + "D25": 0, + "D26": 0, + "D27": 0, + "D28": 0, + "D29": 0, + "D3": 0, + "D30": 0, + "D31": 0, + "D4": 0, + "D5": 0, + "D6": 0, + "D7": 0, + "D8": 0, + "D9": 0, + "G0": 0, + "G1": 0, + "G10": 0, + "G11": 0, + "G12": 0, + "G13": 0, + "G14": 0, + "G15": 0, + "G16": 0, + "G17": 0, + "G18": 0, + "G19": 0, + "G20": 0, + "G21": 0, + "G22": 0, + "G23": 0, + "G24": 0, + "G25": 0, + "G26": 0, + "G27": 0, + "G28": 0, + "G29": 0, + "G30": 0, + "G31": 0, + "G4": 0, + "G5": 0, + "G6": 0, + "G7": 0, + "G8": 0, + "N100": 1, + "N18": 1, + "N2": 1, + "N20": 1, + "N27": 1, + "N29": 1, + "N33": 0, + "N34": 0, + "N35": 1, + "N36": 1, + "N4": 1, + "N40": 1, + "N44": 1, + "N45": 1, + "N46": 1, + "N48": 1, + "N49": 1, + "N50": 1, + "N54": 1, + "N58": 1, + "N59": 1, + "N64": 1, + "N65": 1, + "N66": 1, + "N7": 1, + "N70": 1, + "N74": 1, + "N75": 1, + "N79": 1, + "N80": 1, + "N81": 1, + "N83": 1, + "N84": 1, + "N85": 1, + "N87": 1, + "N88": 1, + "N89": 1, + "N9": 1, + "N92": 1, + "N98": 1, + "Q0": 0, + "Q1": 0, + "Q2": 0, + "Q3": 0, + "Q4": 0, + "Q5": 0, + "Q6": 0, + "Q7": 0, + "X1": 0, + "X100": 0, + "X103": 0, + "X13": 0, + "X14": 0, + "X18": 0, + "X19": 0, + "X2": 0, + "X20": 0, + "X22": 0, + "X23": 0, + "X27": 0, + "X28": 0, + "X29": 0, + "X3": 0, + "X32": 0, + "X35": 0, + "X36": 0, + "X4": 0, + "X40": 0, + "X44": 0, + "X45": 0, + "X46": 0, + "X48": 0, + "X49": 0, + "X50": 0, + "X54": 0, + "X58": 0, + "X59": 0, + "X64": 0, + "X65": 0, + "X66": 0, + "X7": 0, + "X70": 0, + "X74": 0, + "X75": 0, + "X79": 0, + "X8": 0, + "X80": 0, + "X81": 0, + "X83": 0, + "X84": 0, + "X85": 0, + "X87": 0, + "X88": 0, + "X89": 0, + "X9": 0, + "X92": 0, + "X94": 0, + "X95": 0, + "X98": 0, + "X99": 0, + "Y0": 2, + "Y1": 2, + "Y10": 2, + "Y100": 2, + "Y101": 2, + "Y102": 2, + "Y103": 2, + "Y11": 2, + "Y12": 2, + "Y13": 2, + "Y14": 2, + "Y15": 2, + "Y16": 2, + "Y17": 2, + "Y18": 2, + "Y19": 2, + "Y2": 2, + "Y20": 2, + "Y21": 2, + "Y22": 2, + "Y23": 2, + "Y24": 2, + "Y25": 2, + "Y26": 2, + "Y27": 2, + "Y28": 2, + "Y29": 2, + "Y3": 2, + "Y30": 2, + "Y31": 2, + "Y32": 2, + "Y33": 2, + "Y34": 2, + "Y35": 2, + "Y36": 2, + "Y37": 2, + "Y38": 2, + "Y39": 2, + "Y4": 2, + "Y40": 2, + "Y41": 2, + "Y42": 2, + "Y43": 2, + "Y44": 2, + "Y45": 2, + "Y46": 2, + "Y47": 2, + "Y48": 2, + "Y49": 2, + "Y5": 2, + "Y50": 2, + "Y51": 2, + "Y52": 2, + "Y53": 2, + "Y54": 2, + "Y55": 2, + "Y56": 2, + "Y57": 2, + "Y58": 2, + "Y59": 2, + "Y6": 2, + "Y60": 2, + "Y61": 2, + "Y62": 2, + "Y63": 2, + "Y64": 2, + "Y65": 2, + "Y66": 2, + "Y67": 2, + "Y68": 2, + "Y69": 2, + "Y7": 2, + "Y70": 2, + "Y71": 2, + "Y72": 2, + "Y73": 2, + "Y74": 2, + "Y75": 2, + "Y76": 2, + "Y77": 2, + "Y78": 2, + "Y79": 2, + "Y8": 2, + "Y80": 2, + "Y81": 2, + "Y82": 2, + "Y83": 2, + "Y84": 2, + "Y85": 2, + "Y86": 2, + "Y87": 2, + "Y88": 2, + "Y89": 2, + "Y9": 2, + "Y90": 2, + "Y91": 2, + "Y92": 2, + "Y93": 2, + "Y94": 2, + "Y95": 2, + "Y96": 2, + "Y97": 2, + "Y98": 2, + "Y99": 2 + }, + "omitted_outgoing_adds": { + "count": 696, + "event_indices": [ + 373, + 374, + 390, + 391, + 392, + 393, + 398, + 399, + 400, + 401, + 402, + 403, + 406, + 407, + 408, + 409, + 410, + 411, + 418, + 421, + 423, + 425, + 427, + 429, + 432, + 433, + 435, + 437, + 440, + 442, + 444, + 446, + 450, + 451, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 468, + 469, + 470, + 471, + 476, + 477, + 546, + 548, + 550, + 552, + 554, + 557, + 559, + 561, + 562, + 565, + 567, + 569, + 571, + 573, + 576, + 579, + 580, + 583, + 584, + 585, + 586, + 589, + 590, + 595, + 596, + 597, + 601, + 603, + 604, + 608, + 609, + 610, + 613, + 614, + 615, + 616, + 619, + 623, + 624, + 625, + 626, + 627, + 628, + 631, + 632, + 633, + 636, + 637, + 638, + 641, + 642, + 643, + 644, + 645, + 648, + 650, + 652, + 656, + 658, + 661, + 662, + 663, + 666, + 669, + 670, + 671, + 676, + 677, + 678, + 681, + 682, + 684, + 686, + 688, + 691, + 693, + 694, + 699, + 700, + 702, + 705, + 707, + 712, + 713, + 714, + 715, + 717, + 719, + 720, + 721, + 722, + 723, + 725, + 727, + 729, + 731, + 732, + 733, + 734, + 736, + 738, + 740, + 743, + 745, + 746, + 751, + 753, + 755, + 759, + 763, + 764, + 765, + 768, + 769, + 770, + 772, + 773, + 774, + 778, + 782, + 783, + 784, + 787, + 789, + 793, + 794, + 795, + 798, + 799, + 800, + 804, + 805, + 811, + 815, + 817, + 818, + 819, + 821, + 822, + 823, + 825, + 826, + 827, + 829, + 830, + 831, + 832, + 833, + 834, + 836, + 837, + 838, + 840, + 841, + 844, + 846, + 847, + 848, + 852, + 853, + 858, + 859, + 860, + 861, + 868, + 869, + 870, + 871, + 872, + 873, + 876, + 877, + 878, + 879, + 880, + 881, + 886, + 887, + 888, + 889, + 890, + 891, + 894, + 895, + 898, + 899, + 900, + 901, + 904, + 907, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2616, + 2617, + 2623, + 2624, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2650, + 2651, + 2652, + 2653, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2681, + 2686, + 2687, + 2688, + 2689, + 2690, + 2694, + 2695, + 2696, + 2697, + 2698, + 2702, + 2703, + 2706, + 2707, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2740, + 2741, + 2742, + 2743, + 2745, + 2746, + 2747, + 2748, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2785, + 2786, + 2788, + 2791, + 2792, + 2793, + 2797, + 2798, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2809, + 2810, + 2811, + 2812, + 2813, + 2816, + 2817, + 2818, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2828, + 2829, + 2831, + 2832, + 2833, + 2834, + 2836, + 2837, + 2838, + 2839, + 2842, + 2877, + 2883, + 2884, + 2886, + 2887, + 2888, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2901, + 2902, + 2903, + 2904, + 2905, + 2908, + 2910, + 2912, + 2913, + 2948, + 2949, + 2950, + 2951, + 2952, + 2954, + 2956, + 2957, + 2959, + 2982, + 2983, + 3027, + 3028, + 3034, + 3058, + 3060, + 3062, + 3064, + 3066, + 3068, + 3070, + 3072, + 3074, + 3076, + 3078, + 3080, + 3082, + 3084, + 3104, + 3106, + 3108, + 3110, + 3112, + 3114, + 3116, + 3118, + 3120, + 3122, + 3136, + 3138, + 3150, + 3152, + 3180, + 3182, + 3184, + 3186, + 3188, + 3190, + 3192, + 3194, + 3196, + 3198, + 3204, + 3206, + 3208, + 3210, + 3214, + 3216, + 3218, + 3220, + 3222, + 3224, + 3226, + 3228, + 3230, + 3232, + 3267, + 3278, + 3280, + 3282, + 3284, + 3286, + 3295, + 3297, + 3299, + 3301, + 3303, + 3312, + 3314, + 3320, + 3322, + 3329, + 3331, + 3333, + 3335, + 3337, + 3339, + 3341, + 3343, + 3345, + 3347, + 3349, + 3351, + 3353, + 3366, + 3368, + 3370, + 3372, + 3374, + 3376, + 3378, + 3381, + 3383, + 3385, + 3392, + 3394, + 3396, + 3398, + 3402, + 3404, + 3406, + 3408, + 3413, + 3415, + 3417, + 3419, + 3421, + 3423, + 3487, + 3489, + 3494, + 3501, + 3503, + 3505, + 3515, + 3517, + 3524, + 3526, + 3528, + 3530, + 3532, + 3534, + 3541, + 3543, + 3545, + 3548, + 3550, + 3557, + 3559, + 3561, + 3566, + 3568, + 3570, + 3573, + 3575, + 3577, + 3580, + 3584, + 3586, + 3591, + 3593, + 3595, + 3597, + 3602, + 3604, + 3606, + 3608, + 3615, + 3695, + 3711, + 3713, + 3718, + 3720, + 3723, + 3730, + 3732, + 3734, + 3736, + 3739, + 3741, + 3744, + 3746, + 3749, + 3754, + 3756, + 3758, + 3761, + 3763, + 3770, + 3775, + 3780, + 3782, + 3871, + 3874, + 3877, + 3880, + 3882, + 3888, + 3893, + 3896, + 3901, + 3967, + 3970, + 4108, + 4110, + 4124, + 4668, + 4669, + 4674, + 4675, + 4676, + 4677, + 4682, + 4683, + 4684, + 4685, + 4686, + 4687, + 4688, + 4689, + 4694, + 4695, + 4699, + 4701, + 4703, + 4705, + 4708, + 4710, + 4712, + 4713, + 4716, + 4718, + 4720, + 4722, + 4724, + 4727, + 4734, + 4735, + 4736, + 4737, + 4738, + 4739, + 4742, + 4743, + 4744, + 4745, + 4746, + 4747, + 4752, + 4753, + 4754, + 4755, + 4940, + 4943, + 4992, + 4994, + 4996, + 4998, + 5000, + 5003, + 5005, + 5007, + 5008, + 5011, + 5013, + 5015, + 5017, + 5019, + 5025, + 5026, + 5029, + 5030, + 5031, + 5032, + 5035, + 5040, + 5041, + 5048, + 5049, + 5050, + 5051, + 5052, + 5053, + 5056, + 5057, + 5058, + 5059, + 5060, + 5061, + 5066, + 5067, + 5068, + 5069, + 5073, + 5074, + 5077, + 5078, + 5079, + 5080, + 5083 + ], + "events_sha256": "f0c3adbc3eafd025739cfcb33bcb5e366cf71c3736ebfcbc7176dc0d83812679", + "first_two": [ + { + "event": 373, + "operation": [ + "add", + "X34", + "N34", + "1/2", + [] + ] + }, + { + "event": 374, + "operation": [ + "add", + "X33", + "N33", + "-1/2", + [] + ] + } + ], + "source_by_role": { + "G": 358, + "N": 96, + "Q": 196, + "Y": 46 + }, + "target_bank_by_role": { + "G": 3, + "N": 38, + "X": 52 + }, + "target_by_role": { + "G": 6, + "N": 138, + "X": 552 + }, + "target_count": 93, + "target_roles": [ + "G2", + "G3", + "G9", + "N10", + "N12", + "N15", + "N17", + "N24", + "N26", + "N37", + "N38", + "N39", + "N41", + "N42", + "N43", + "N47", + "N5", + "N51", + "N52", + "N53", + "N55", + "N56", + "N57", + "N60", + "N61", + "N62", + "N63", + "N67", + "N68", + "N69", + "N71", + "N72", + "N73", + "N76", + "N77", + "N78", + "N82", + "N86", + "N90", + "N91", + "N96", + "X0", + "X10", + "X101", + "X102", + "X11", + "X12", + "X15", + "X16", + "X17", + "X21", + "X24", + "X25", + "X26", + "X30", + "X31", + "X33", + "X34", + "X37", + "X38", + "X39", + "X41", + "X42", + "X43", + "X47", + "X5", + "X51", + "X52", + "X53", + "X55", + "X56", + "X57", + "X6", + "X60", + "X61", + "X62", + "X63", + "X67", + "X68", + "X69", + "X71", + "X72", + "X73", + "X76", + "X77", + "X78", + "X82", + "X86", + "X90", + "X91", + "X93", + "X96", + "X97" + ] + }, + "one_bit_lower_controls": 142, + "port_cut": { + "component_bound_factor": "2032", + "event_ids_sha256": "cae6eba5c0ce88e7a9affa9d7bf04b94822a4f34c63952ea8562243fc03e6e82", + "events": 2907, + "inputs": 263, + "max_row_event": 3589, + "max_row_l1": "127/2", + "op_counts": { + "add": 1754, + "erase": 8, + "sign": 52, + "transport": 1085, + "zero": 8 + } + }, + "ports": 675, + "recipients": 83, + "rejection_controls": [ + "omit_actual_incoming_half_read", + "omit_private_erasure", + "wrong_recipient_frame", + "dirty_private_erase", + "wrong_half_read_leaves_dirty_N100", + "native_rank_binding", + "weak_N100_B9_in_actual_prefix", + "omit_observed_port" + ], + "scope": "Literal endpoint projection and conditional normalized algebra/module admission. Native operator semantics, physical admission, omitted-bank effects and full supplier costs remain outside this check.", + "status": "PASS_P104_EXTERNAL_PORT_CLOSURE", + "terminal_Y_minor_determinant": "-1/128", + "terminal_Y_rank": 9, + "terminal_cut": { + "component_bound_factor": "2032", + "event_ids_sha256": "fb4f9c43fa11d7eac431be79e4f137508364dc9201036889195f9230f0a941a5", + "events": 3812, + "inputs": 265, + "max_row_event": 3589, + "max_row_l1": "127/2", + "op_counts": { + "add": 2225, + "erase": 8, + "sign": 104, + "transport": 1467, + "zero": 8 + } + } +} diff --git a/research/p104-external-port-closure/TASK.json b/research/p104-external-port-closure/TASK.json new file mode 100644 index 0000000000..b9d5174b85 --- /dev/null +++ b/research/p104-external-port-closure/TASK.json @@ -0,0 +1,143 @@ +{ + "schema_version": 1, + "task_id": "p104-side-correction", + "priority_revision": 6, + "base_commit": "6f100d4bb5083f8c35d96fd95a539811c62f245c", + "original_card": { + "id": "p104-side-correction", + "question": "Can the proposed P104 joint endpoint flags be realized by a chronological correction program with coefficients, dirty restoration and an affordable complete bill?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/p104-native-channel/README.md", + "research/p104-native-channel/PROOF.md", + "docs/research/community-efficient1000-review.md", + "research/p104-joint-unit-flags/README.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. A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the revision-6 family record and #2981 static joint flags, alongside the reviewed #1991 channel. #2981 is an author-checked source archive, not an independently validated executable correction or a refutation of program-level lifetime floors.", + "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": "After checking live handoffs, pin one named collection from #2981 and attach acquisition/delivery times, source dependencies and coefficient requirements. Test legal access and arbitrary dirty restoration; price any completion against the full channel/endpoint/hosting allowance. Stop with the exact missing implication or a scoped counterexample rather than expanding the static cover census.", + "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.", + "Repeating a correction or physical conversion already supplied by a pending follow-up without adding independent coverage or a different unresolved obligation.", + "Repeating the 208-flag static matching or calling a static nested cover a chronological correction program. Independent audit of that certificate is distinct and remains useful." + ], + "overlap_terms": [ + "P104", + "I-G/2", + "side correction", + "native channel", + "1972", + "1991", + "2586", + "endpoint transport", + "physical dual", + "relay composition", + "2981", + "joint unit flags", + "acquisition delivery", + "static nesting" + ], + "existing_checks": [ + { + "scope": "PR #2981 reports static joint endpoint flags and a matching of 208 departure and arrival flags; archival intake is not independent verification.", + "evidence": "research/p104-joint-unit-flags/README.md", + "remaining": "Independent flag check and a chronological coefficient program with dirty restoration and a complete cost.", + "status": "author-checked", + "source_commit": "3d24b92d8ba057b57cb2d480170ec407520e6882", + "selected_record_sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + } + ] + }, + "scope_status": "changed", + "actual_scope": "Source-bound projection of PR3423\u2019s 675 outgoing ports through actual recipient and dependency endpoint histories, with a minimal independent dyadic product entrance and inherited conditional payload bound. Native semantics and physical admission remain premises.", + "scope_change_reason": "Take the explicit current PR3423 consumer-join handoff rather than reopen the fixed-cover correction construction or repeat the prior PR3044 replay.", + "bottleneck_link": "An open-program saving cannot omit external receiver preparation, history or width costs. Source-bound closure exposes the real interface required for complete pricing.", + "budget_minutes": 60, + "stop_rule": "One source-bound port-cut and terminal dependency closure; no new word, matching census, supplier admission or frontier change. Stop at the first concrete unproved boundary and record it.", + "outcome": "completed", + "evidence": "SUMMARY.json and CERTIFICATE.json.gz: separate SSA and reverse-liveness checks agree on the 2907-event/263-input port closure, 3812-event/265-input endpoint closure and 4027-event/265-input history completion. Eight rejection groups, 142 weakened-admission controls, rank-nine factorization and nonzero minor, exact-half Newton counterexample. All 675 original ports and 696 omitted outgoing ADDs are distinguished.", + "author": "Hiroki Kumazaki", + "ai_assistance": "Substantial OpenAI Codex assistance in source analysis, implementation, execution, proof writing and separate AI-agent review; no independent human or formal proof-kernel review claimed.", + "open_questions": [ + { + "question": "Can a paid caller prepare the265-bank entrance and physical layout?", + "why_it_matters": "The original63-bank contract alone fails at event312, while2032H assumes supplied input heights.", + "first_step": "Use SUMMARY.json initial_scale_bits and event312 witness to bind the52additional4B9 and38additional2B9 admissions to one actual producer with charged conversion and ownership.", + "blocked_by": "No physical input producer, allocation, routing or recursive invoice is supplied by this projection." + }, + { + "question": "How are the696omitted outgoing ADDs to93excluded banks preserved and paid when embedding this projection?", + "why_it_matters": "Preserving all265requested endpoints does not preserve the omitted banks\u2019 side effects.", + "first_step": "Start with SUMMARY.json omitted_outgoing_adds.event_indices in the pinned WORD; bind their recipient histories or a proven replacement and apply the full cost screen.", + "blocked_by": "No omitted-bank numerical/physical admission or improved supplier profile; unchanged-profile599/584stop remains." + } + ], + "coordination": { + "claim_url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2750#discussioncomment-19009569", + "claim_comment_id": "DC_kwDOU-508s4BIhAh", + "handoff_url": "https://github.com/CrocSwap/integer-mult-bounds/discussions/2750#discussioncomment-19009429", + "coverage": { + "open_prs": 353, + "open_prs_fetched_at": "2026-10-18T01:45:32.767995+00:00", + "discussion_records": 2277, + "discussions_fetched_at": "2026-10-18T01:49:10.723561+00:00", + "complete_pagination": true + }, + "nearest_work": [ + "PR3423 supplies63-bank program/openports; this closes actual recipient histories.", + "PR3406 supplieswholewordproductdomain; this specializesactual265inputprojection.", + "PR3416 supplies nativecovariance, an inherited premise here.", + "PR3426 suppliescorrelatedfinalcutdomain; not duplicated.", + "PR2674 and p104-whole-word-internal-grid supplyretained127/2norm and enlarged-grid alternative." + ], + "limits": "No unpublished work or exhaustive historical diffs; numerical term searches include false positives.", + "publication_refresh": { + "checked_at": "2026-10-18T02:05:17.575164+00:00", + "main": "6f100d4bb5083f8c35d96fd95a539811c62f245c", + "query": "\"port\" \"P104\" in:title,body", + "open_pr_matches": [ + 2375, + 3372, + 3423 + ], + "focused_discussion": 2750, + "comment_count": 5, + "decision": "PR2375 is unrelated enumeration tooling; PR3372 is a tail-coefficient cancellation; PR3423 is the claimed predecessor. No additional matching recipient-closure contribution found." + } + }, + "environment": { + "python": "Python 3.12.13", + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.43", + "dependencies": "standard library only", + "native_replay": "not run; covariance/module semantics retained as explicit premises", + "selected_replay": "not run; selected record unchanged", + "checks": [ + "Registered Python 3.12 replay", + "Isolated optimized Python 3.12 replay", + "Separate SSA/reverse-liveness closures", + "Three full/projection scalar fixtures", + "Exact-half Newton negative and positive arrays", + "Duplicate/dependent-row rank regressions and exact factorization/minor" + ] + }, + "review_correction": "Prepublication AI-agent review found a stale-iterator error in the new rank helper. It was fixed before publication; corrected rank is nine, with duplicate/dependent-row regressions and an exact full factorization plus determinant -1/128. Closure and admission counts were unaffected." +} diff --git a/research/p104-external-port-closure/VERIFY.json b/research/p104-external-port-closure/VERIFY.json new file mode 100644 index 0000000000..36d75f735d --- /dev/null +++ b/research/p104-external-port-closure/VERIFY.json @@ -0,0 +1,21 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/p104-rounded-collector/inputs/NATIVE.json.gz", + "research/p104-rounded-collector/inputs/WORD.json" + ], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 120, + "checks": "Source-bound 675-port closure in separate SSA and reverse-liveness engines; all 265 endpoint rows, exact rank-nine factorization and minor, minimal dyadic B9 product entrance, eight rejection groups, 142 weakened-admission controls and exact-half Newton witness. Native/module semantics are explicit premises; no supplier admission." + } + ] +} diff --git a/research/p104-external-port-closure/oracle.py b/research/p104-external-port-closure/oracle.py new file mode 100644 index 0000000000..59cf52bb23 --- /dev/null +++ b/research/p104-external-port-closure/oracle.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: Apache-2.0 +"""Data-only reverse-liveness oracle for PR3423's external-port interface. + +Imports no predecessor code. This computes least literal read/write ancestor +closures, not cancellation-minimized semantic dependencies. C erasure obligations +are closed to a fixed point, including all restoration predecessors. +""" +import argparse +from collections import Counter +from fractions import Fraction +import hashlib +import json +from pathlib import Path + +DEFAULT=Path(__file__).resolve().parents[2]/'research/p104-rounded-collector/inputs/WORD.json' +WORD_SHA='cec1fb3fbd0067b500ad5119a62ba60685be718e769374d7ec8abdd2beaa7e50' +Y={f'Y{i}' for i in [*range(22,33),*range(63,104)]} +INTERNAL=Y|{f'{c}{i}' for c in ('D','G') for i in range(27,32)}|{'Q7'} + +def must(ok,label): + if not ok:raise ValueError(label) + +def digest(obj): + return hashlib.sha256(json.dumps(obj,sort_keys=True,separators=(',',':')).encode()).hexdigest() + +def hist(names): + return dict(sorted(Counter(n.rstrip('0123456789') for n in names).items())) + +def newton(values): + values=[(Fraction(a),Fraction(b)) for a,b in values] + for j in range(9): + for x in range(512): + if x & (1<maximum[0]:maximum=(norm,i) + for k,v in row.items(): + b=dyadic_bits(v) + if b>bits[k]:bits[k]=b;witness[k]={'event':i,'coefficient':str(v)} + return {'initial_inputs':initials,'initial_scale_bits':bits,'scale_witnesses':witness, + 'events':sorted(i for i in selected if i>=0), + 'op_counts':dict(sorted(Counter(word['program'][i][0] for i in selected if i>=0).items())), + 'max_row_l1':str(maximum[0]),'max_row_event':maximum[1], + 'component_bound_factor':str(32*maximum[0])} + + +def rational_rank(matrix): + pivots={} + for row in matrix: + row=list(row) + for i in range(len(row)): + value=row[i] + if not value:continue + if i in pivots:row=[a-value*b for a,b in zip(row,pivots[i])] + else: + pivots[i]=[a/value for a in row];break + return len(pivots) + + +def rank_witness(terminal_rows): + names=['X1','X100','X103','X13','X14','X18','X19','X20','X22'] + columns=[1,2,14,3,7,4,5,33,22] + basis=[[Fraction(terminal_rows[k].get('Y'+str(j),'0')) for j in range(104)] for k in names] + square=[[row[j] for j in columns] for row in basis] + aug=[row+[Fraction(i==j) for j in range(9)] for i,row in enumerate(square)] + determinant=Fraction(1) + for col in range(9): + pivot=next((i for i in range(col,9) if aug[i][col]),None) + need(pivot is not None,'singular rank witness') + if pivot!=col:aug[pivot],aug[col]=aug[col],aug[pivot];determinant=-determinant + value=aug[col][col];determinant*=value + aug[col]=[v/value for v in aug[col]] + for i in range(9): + if i==col:continue + value=aug[i][col] + aug[i]=[a-value*b for a,b in zip(aug[i],aug[col])] + inverse=[row[9:] for row in aug] + need(determinant==Fraction(-1,128),'rank witness determinant') + coefficients={} + for name,row in terminal_rows.items(): + if not name.startswith('X'):continue + target=[Fraction(row.get('Y'+str(j),'0')) for j in range(104)] + coef=[sum((target[columns[k]]*inverse[k][j] for k in range(9)),Fraction()) for j in range(9)] + need(all(sum((coef[k]*basis[k][j] for k in range(9)),Fraction())==target[j] for j in range(104)), + 'rank-nine full matrix factorization') + coefficients[name]=[str(c) for c in coef] + return {'basis_rows':names,'minor_Y_columns':columns,'minor_determinant':str(determinant), + 'coefficients':coefficients,'identity':'Every terminal X-to-Y row equals its nine coefficients times the nine named full Y rows.'} + + +def check_terminal(dag,terminal): + for k in terminal: + row=dag['rows'][dag['final'][k]] + if k.startswith('X'): + need(row.get(k)==1 and all(src==k or src.startswith('Y') for src in row), + 'terminal dirty-input cancellation') + else:need(row=={k:Fraction(1)},'terminal normalized restoration') + + +def audit(word,native): + dag=build(word,native) + ports=[i for i,o in enumerate(word['program']) if i<=4516 and o[0]=='add' and o[2] in ROLES and o[1] not in ROLES and o[1]!='C'] + need(len(ports)==675,'675 actual outgoing ports') + need(digest(ports)=='04b3a0bc022c336c9b177eeed49036f1257ab81ea9d0459b8170075b002a24a4', 'PR3423 published port-index binding') + targets={word['program'][i][1] for i in ports} + terminal=sorted(targets|ROLES) + port_set=close(dag,ports) + end_seeds=[dag['final'][k] for k in terminal] + end_set=close(dag,end_seeds) + # Joining both sets is necessary: final cancellation must not drop port observations. + joined=close(dag,ports+end_seeds) + for s,seeds in ((port_set,ports),(end_set,end_seeds),(joined,ports+end_seeds)): + require_closed(dag,s,seeds) + p=profile(word,dag,joined) + all_inputs=p['initial_inputs'] + returned=close(dag,ports+[dag['final'][k] for k in all_inputs]) + need({dag['owners'][i] for i in returned if i<0}==set(all_inputs), + 'terminal-history closure introduces new inputs') + require_closed(dag,returned,ports+[dag['final'][k] for k in all_inputs]) + returned_profile=profile(word,dag,returned) + need(returned_profile['initial_scale_bits']==p['initial_scale_bits'],'returned entrance contract changed') + check_terminal(dag,all_inputs) + terminal_rows={k:row_json(dag['rows'][dag['final'][k]]) for k in terminal} + check_terminal(dag,terminal) + scales=p['initial_scale_bits'] + for i in joined: + for name,c in dag['rows'][i].items(): + need((c*2**scales[name]).denominator==1,'product entrance insufficient') + # Each smaller independent dyadic factor has a reachable nonintegral coefficient. + lower_controls=[] + for name,b in scales.items(): + if not b:continue + witness=p['scale_witnesses'][name] + need((Fraction(witness['coefficient'])*2**(b-1)).denominator>1, + 'one-bit-lower admission was not rejected') + lower_controls.append(name) + matrix=[[Fraction(terminal_rows[k].get('Y'+str(j),'0')) for j in range(104)] + for k in terminal if k.startswith('X')] + matrix_rank=rational_rank(matrix) + need(matrix_rank==9,'complete terminal Y-map rank') + need(rational_rank([[Fraction(1),Fraction(1)],[Fraction(1),Fraction(1)]])==1, + 'duplicate-row rank control') + need(rational_rank([[Fraction(x) for x in row] for row in [[1,2,3],[2,4,6],[0,1,1]]])==2, + 'dependent-row rank control') + port_rows=[] + for i in ports: + rec=dag['records'][i]; before=dag['rows'][rec['before']]; after=dag['rows'][i] + inc={k:Fraction(rec['coefficient'])*v for k,v in dag['rows'][rec['source_version']].items()} + port_rows.append({k:v for k,v in rec.items() if k not in ('before','source_version')}| + {'before_row':row_json(before),'increment_row':row_json(inc),'after_row':row_json(after), + 'before_l1':str(sum(map(abs,before.values()),Fraction())), + 'after_l1':str(sum(map(abs,after.values()),Fraction()))}) + # Independent integer fixture execution checks actual slice/full joins; no native claim. + all_nodes=set(dag['deps']) + for seed in (0,17,73): + values={k:((j*37+seed*11)%43-21)*(2**p['initial_scale_bits'].get(k,2)) for j,k in enumerate(dag['initial'])} + sliced=evaluate_slice(word,dag,returned,values) + full=evaluate_slice(word,dag,all_nodes,values) + for k in all_inputs: + expected=sum((v*values[src] for src,v in dag['rows'][dag['final'][k]].items()),Fraction()) + need(sliced[k]==full[k]==expected,'slice/full terminal fixture') + result={'schema_version':1,'scope':'Conditional chart-normalized recipient closure; native covariance and B9 automorphisms inherited.', + 'ports':port_rows,'recipients':sorted(targets),'terminal_targets':terminal, + 'port_cut':profile(word,dag,port_set),'terminal_cut':profile(word,dag,end_set),'joined':p, + 'history_complete':returned_profile, + 'history_terminal_rows':{k:row_json(dag['rows'][dag['final'][k]]) for k in all_inputs}, + 'history_terminal_frames':{k:word['final_frames'][k] for k in all_inputs}, + 'terminal_rows':terminal_rows,'terminal_Y_matrix_rank':matrix_rank,'terminal_Y_rank_witness':rank_witness(terminal_rows), + 'one_bit_lower_admission_controls':lower_controls,'terminal_frames':{k:word['final_frames'][k] for k in terminal}, + 'initial_frames':{k:word['initial_frames'][k] for k in p['initial_inputs']}, + 'private_lifetimes':[[a,b] for a,b in dag['pairs'].items() if a in joined]} + return result,dag,returned,ports,[dag['final'][k] for k in all_inputs] + + +def controls(word,native,dag,joined,ports,end_seeds): + rejected=[] + def fail(label,fn): + try:fn() + except (ValueError,KeyError):rejected.append(label) + else:raise ValueError('accepted control '+label) + fail('omit_actual_incoming_half_read',lambda:require_closed(dag,joined-{312},ports+end_seeds)) + start,end=next((a,b) for a,b in dag['pairs'].items() if a in joined) + fail('omit_private_erasure',lambda:require_closed(dag,joined-{end},ports+end_seeds)) + wrong=deepcopy(word);wrong['program'][312][4]=[1] + fail('wrong_recipient_frame',lambda:build(wrong,native)) + wrong=deepcopy(word);wrong['program'][2038][3]='1' + fail('dirty_private_erase',lambda:build(wrong,native)) + wrong=deepcopy(word);wrong['program'][312][3]='1/4' + fail('wrong_half_read_leaves_dirty_N100',lambda:check_terminal(build(wrong,native),['X100'])) + wrong=deepcopy(native);wrong['transports'][0]['recipe']['rank']+=1 + fail('native_rank_binding',lambda:build(word,wrong)) + need(word['program'][312]==['add','X100','N100','1/2',[]],'half-read witness source') + derived=profile(word,dag,joined)['initial_scale_bits'] + weak=dict(derived);weak['N100']=0 + def validate_entrance(scales): + for i in sorted(joined): + for name,c in dag['rows'][i].items(): + need((c*2**scales[name]).denominator==1, 'admission failure at event '+str(i)) + validate_entrance(derived) + fail('weak_N100_B9_in_actual_prefix',lambda:validate_entrance(weak)) + need(Fraction(1,2)*2==1,'strengthened half-read positive control') + # Endpoint-correct omission is detected by retaining the observations themselves. + fail('omit_observed_port',lambda:require_closed(dag,joined-{ports[0]},ports+end_seeds)) + return rejected + + +def summarize(result): + payload=(json.dumps(result,sort_keys=True,indent=2)+'\n').encode() + out={'status':'PASS_P104_EXTERNAL_PORT_CLOSURE', + 'certificate_payload_sha256':hashlib.sha256(payload).hexdigest(), + 'ports':len(result['ports']),'recipients':len(result['recipients'])} + for tag in ('port_cut','terminal_cut','history_complete'): + p=result[tag] + out[tag]={'events':len(p['events']),'inputs':len(p['initial_inputs']), + 'op_counts':p['op_counts'],'event_ids_sha256':digest(p['events']), + 'max_row_l1':p['max_row_l1'],'max_row_event':p['max_row_event'], + 'component_bound_factor':p['component_bound_factor']} + out['initial_scale_bits']=result['history_complete']['initial_scale_bits'] + out['actual_recipient_counterexample']=result['independent_closure']['N100_exact_half_control'] + out['rejection_controls']=result['rejected_controls'] + out['one_bit_lower_controls']=len(result['one_bit_lower_admission_controls']) + out['terminal_Y_rank']=result['terminal_Y_matrix_rank'] + out['terminal_Y_minor_determinant']=result['terminal_Y_rank_witness']['minor_determinant'] + omitted=result['omitted_outgoing_adds'] + out['omitted_outgoing_adds']={k:v for k,v in omitted.items() if k!='events'} + out['omitted_outgoing_adds']['event_indices']=[a['event'] for a in omitted['events']] + out['omitted_outgoing_adds']['first_two']=omitted['events'][:2] + out['scope']='Literal endpoint projection and conditional normalized algebra/module admission. Native operator semantics, physical admission, omitted-bank effects and full supplier costs remain outside this check.' + return out + + +def main(): + ap=argparse.ArgumentParser(description=__doc__);ap.add_argument('--emit',action='store_true');ap.add_argument('--summary',action='store_true');args=ap.parse_args() + for ent in read(HERE/'SOURCES.json')['files']: + if ent['usage']=='input':need(hashlib.sha256((ROOT/ent['path']).read_bytes()).hexdigest()==ent['sha256'],'source pin '+ent['path']) + word,native=read(ROOT/WORD),read(ROOT/NATIVE) + result,dag,joined,ports,end_seeds=audit(word,native) + result['rejected_controls']=controls(word,native,dag,joined,ports,end_seeds) + independent=json.loads(subprocess.check_output([sys.executable,'-I','-B',str(HERE/'oracle.py'),'--full'],text=True)) + for a,b in (('port_cut','port_cuts'),('terminal_cut','final_endpoints'),('history_complete','history_complete')): + need(result[a]['events']==independent[b]['lifecycle_closed']['event_ids'],'SSA/reverse-liveness event sets') + need(result[a]['initial_inputs']==independent[b]['initial_roles'],'SSA/reverse-liveness initial roles') + result['independent_closure']={k:independent[k] for k in ('outgoing_ports_sha256','N100_exact_half_control')} + result['independent_closure']['event_sets_and_initial_inputs_agree']=True + inputs=set(result['history_complete']['initial_inputs']) + omitted=[{'event':i,'operation':o} for i,o in enumerate(word['program']) + if i not in joined and o[0]=='add' and o[2] in inputs and o[1] not in inputs] + need(omitted==independent['history_complete']['omitted_outgoing_adds']['events'], + 'omitted outgoing effects agree') + result['omitted_outgoing_adds']=independent['history_complete']['omitted_outgoing_adds'] + if args.summary:print(json.dumps(summarize(result),sort_keys=True,indent=2)) + elif args.emit:print(json.dumps(result,sort_keys=True,indent=2)) + else: + need(result==read(HERE/'CERTIFICATE.json.gz'),'retained certificate mismatch') + need(summarize(result)==read(HERE/'SUMMARY.json'),'retained summary mismatch') + print('PASS_P104_EXTERNAL_PORT_CLOSURE',digest(result)) + + +if __name__=='__main__':main()