From 6d8c7bdfa02141959d63402c64008f07577af78e Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:48:59 +0000 Subject: [PATCH 1/3] Initial plan From b2defc54c70be5c2591aa1983628c3bf1d3e586d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:50:40 +0000 Subject: [PATCH 2/3] Initial plan Co-authored-by: LalaSkye <228581229+LalaSkye@users.noreply.github.com> --- __pycache__/authority_gate.cpython-312.pyc | Bin 0 -> 2729 bytes __pycache__/invariant_litmus.cpython-312.pyc | Bin 0 -> 4091 bytes __pycache__/stop_machine.cpython-312.pyc | Bin 0 -> 2963 bytes ..._authority_gate.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 15029 bytes ...nvariant_litmus.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 20520 bytes ...st_stop_machine.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 8582 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 305 bytes .../__pycache__/canonicalise.cpython-312.pyc | Bin 0 -> 1240 bytes .../__pycache__/drift.cpython-312.pyc | Bin 0 -> 4384 bytes .../__pycache__/engine.cpython-312.pyc | Bin 0 -> 4202 bytes ...est_determinism.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 14367 bytes .../test_drift.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 11254 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 451 bytes .../__pycache__/aggregate.cpython-312.pyc | Bin 0 -> 2557 bytes .../__pycache__/fit_report.cpython-312.pyc | Bin 0 -> 1175 bytes .../__pycache__/hashing.cpython-312.pyc | Bin 0 -> 1585 bytes .../__pycache__/io_jsonl.cpython-312.pyc | Bin 0 -> 1600 bytes .../__pycache__/redlines.cpython-312.pyc | Bin 0 -> 3916 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 5100 bytes .../tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 183 bytes .../conftest.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 1787 bytes ...ion_determinism.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 8546 bytes ..._classification.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 8748 bytes ...t_input_hashing.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 6405 bytes ...ative_injection.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 8708 bytes ...redline_scanner.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 8198 bytes ...hema_validation.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 11640 bytes ...test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 645 bytes 28 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 __pycache__/authority_gate.cpython-312.pyc create mode 100644 __pycache__/invariant_litmus.cpython-312.pyc create mode 100644 __pycache__/stop_machine.cpython-312.pyc create mode 100644 __pycache__/test_authority_gate.cpython-312-pytest-9.0.2.pyc create mode 100644 __pycache__/test_invariant_litmus.cpython-312-pytest-9.0.2.pyc create mode 100644 __pycache__/test_stop_machine.cpython-312-pytest-9.0.2.pyc create mode 100644 commit_gate/src/commit_gate/__pycache__/__init__.cpython-312.pyc create mode 100644 commit_gate/src/commit_gate/__pycache__/canonicalise.cpython-312.pyc create mode 100644 commit_gate/src/commit_gate/__pycache__/drift.cpython-312.pyc create mode 100644 commit_gate/src/commit_gate/__pycache__/engine.cpython-312.pyc create mode 100644 commit_gate/tests/__pycache__/test_determinism.cpython-312-pytest-9.0.2.pyc create mode 100644 commit_gate/tests/__pycache__/test_drift.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/src/prometheus/__pycache__/__init__.cpython-312.pyc create mode 100644 prometheus/src/prometheus/__pycache__/aggregate.cpython-312.pyc create mode 100644 prometheus/src/prometheus/__pycache__/fit_report.cpython-312.pyc create mode 100644 prometheus/src/prometheus/__pycache__/hashing.cpython-312.pyc create mode 100644 prometheus/src/prometheus/__pycache__/io_jsonl.cpython-312.pyc create mode 100644 prometheus/src/prometheus/__pycache__/redlines.cpython-312.pyc create mode 100644 prometheus/src/prometheus/__pycache__/schemas.cpython-312.pyc create mode 100644 prometheus/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 prometheus/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/tests/__pycache__/test_aggregation_determinism.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/tests/__pycache__/test_fit_report_classification.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/tests/__pycache__/test_input_hashing.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/tests/__pycache__/test_negative_injection.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/tests/__pycache__/test_redline_scanner.cpython-312-pytest-9.0.2.pyc create mode 100644 prometheus/tests/__pycache__/test_schema_validation.cpython-312-pytest-9.0.2.pyc create mode 100644 tests/__pycache__/test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc diff --git a/__pycache__/authority_gate.cpython-312.pyc b/__pycache__/authority_gate.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fc933faceacc2c1eef61d1bb9ef896f89c0786a GIT binary patch literal 2729 zcmcguO>7%Q6rNqLf8+d+K-;uQIt2#Ci9(^`n6)zM$wJ{;O)s}cqJ@I#7+}_N7jjuoyL>5o(F~G^mz)Y4=QZ1AeEhn@=f>gI@bs1~#_-!MIn_OFosdXZ>m0!- zMHeXUAc$r1hxW!=S8^%ii)8mwb}iZcahCT7zI*5M01WS)&$^Zhd$9~NEEjID(Q^jz z=+p!NiM6xFfhCZu2#@0?NFI(6@gxXO%VcvOLKe=QyKsfSfMyxW0BSD<0>9i|5O{zC zLF_@;=++Uo1_o>!?}6AIHUk)#T2V8@%UV9nB4&tbMb(TfYpZe+A^E5oMK2ZuuNZj6 z;gE5!`&2+WJfq$ZSP0;=n`y`=pc#cWY0vB2(rw|Mkl$z<+hR^ZGKT^uiq;KeDl!o7 zyJkp2?3e;9Fy=;6=v%FEc7nP9JD^y#Ccwf0c?R=skbN+wcgzjq^wDkEGq{RC#8cfi zX(cEfJLdp5U7$Z@#Ue9An~Y^=W(KDF%yb3bb)^O!l2`8M^#n!1KbjZeOw_oYGulN= z<`@Bi1lkZFR)`3AOBNKdS-=37x_Vm$HfCt$`Qj@EuiL#LZPv*15N3`{tC``3&avx?;X6C{%-V9@7wGB zhngd&f64qh@-TDtaYlcT(VM5In?uIKezTc0*9Kp|rG45XiDPV~64pRnrWxZ{Aq!*{ z`rYjkRMW=TR0(bpLaWp&+a=rwrzinf5YbS#D*zWaol-c3WuQ9(or~M}=aUC+40RqY z$chh$QJm2OVu`dOr0>N$i?v0)j!7Yp8;z0vYBO#8pkGAkc>*lPhU>OalxT7k9UqNIyUWkIA?ar+sbIJv8A9HXr4 zGKvLso4Ad`K@R^5&~ZKtarm#p2x^B>$l6R%lT~*=YWqN>RC&q#RnR-29F_&CG0=J0 z(l~~`=Rhox%>?N?cyILUvyXbmB#ck~X#RBk2mA5FrRM#HgIe<(b9|3-^I_kCsqyH0&Ij*#>|OsK!~{=)GxExP6GSVd oD9TectZ0At5M^*P5>|R{UEd_oZT5wH9lC##!^-e80z$^{FT}K!MF0Q* literal 0 HcmV?d00001 diff --git a/__pycache__/invariant_litmus.cpython-312.pyc b/__pycache__/invariant_litmus.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2d36056737169d412d5898edbc0df47a267e8b4 GIT binary patch literal 4091 zcmcH+U2GG{d3U}3iT@Jk7g9KeD+h5&oB*Y8Cw>}YCxHXQC4rMnsBhz$*qhk9?(CW* zmZQ2Ym69G3sfq;B(F$GrK*c>EwGVykL#wJ%Uy=(a+!ZH9Eib&KBu_k)elzwuT!eUP zNAfq{eDlrheE*;S9td~^7!xl(S6>45FSf9UtA=d+1&})e77_v$v6K}PBFv7glyf8; zBBRM!Ip<6`ML`mV1nj&aU>9*bbX3nLT%76#s)so1RCijy4WEk%56oVe8!`g+{YFf9 zC4q=j?e-(KX6%0`)^7CUKq7#Hi6CxFG~%X26AqCOZYIsRg|tk%aO({@(aLEp#62nF zHdwdKN#XXw8r-02*A=QNnwiY1X0BkMf0l2fC@~4mshVn-Y6|6b!z@sOQdz|?)Jc`l zh}Sz{FAQXoS(9z5IRhyM8txy7CeOyN^pBkFkB_0Q86}$yBb}mwi=$)7fy*OTVyMf= z>Uk3OPACS!NY_w4LjgrO#Y|;XEsYcnBTCX_HiA%GM;FdlX9{#ZrxC-5c!3NbCR9_h z2$MX~Fws&fG0+5=)8Y6hlzbBLK4)5rheb<{X@wlj-nfz@c&w1mk`&vsM@^l=#x9`T z5r_bW6%rB_6AmmTWb8;dv7B(tIm0f?eW|LFVi44z=4=f`tYAi=I9b=JqC>IY z2^&m=mlt|7dXDtcf~FDLJEPO--juExCRJ3;>|tvoqvzj9tG~DA1Cjh3W&X}V01%@U zzzyLa@{UT|d*yf~w7Yz+;tTyaN}FxAZ|Jh-?7~JLY;WoEGK5FML1f~@(h1lhF2Ecd za|0$bjO*8bp8MhmF$!6;*lzn;N-EjTpFt}nN&1QH~CctDA+lf)fLl{v*7GB#Q3;OEevb30h8ZgtDk`qP$kg1Dz{dA zO+P(f350H3sGeZkVSh1{;`gITaC>mYtUgl=O%^l^7S~L0)vTIR&7!Z6&l8F!bl55S zfT_OdP{EO_-fSX$5;2dOQ79?;H61BAIKarowtQyJP*d=cIi%)56NWmGCB+sq1Cgua zIq)M0-Rj2zMuxpft1c~17NSTg5Nf&dfTpI4K>|LLohb8W*`7+nk%>%GBZ>!q%-*fqzHbc4i`qCo z*me4Y@d(V})8oc>u8z;*W3$%)JJfe|yl}Yh*aU}tJ$!n9ywKM-ahSs+;bOL07 zv+-L1cZ3oIOG)e$rtHMTnX2Gn4WF_D?G1bLlF4r5qa@kY0!!25;MmTRgdG@e*Tj-E z?=amqr`cd*C5L^+qZmp1Y4p25I}ShNLjYxA zEf8ATzjSnA{7GQXN?^}wVDFQ_ftA34)j+sB_;lBv`>xMEd~oQ?UEK>;md-2qdWA!;HOKro!Tu zF-mo1PkG?JZR0cHS9P=gL@WtYEZuDzwxi5Lt1>U81u!+shkQhZYi9&uUM`7KjW%s- zF3Gl`=ba_U($mL4ZQ{*Nlch*LN@B@rOF+e&2TGF3GAAEJNVxM-$uY%};| zxhUL>%7R&MasCgl+F?K7t*>&v;Z>dX$*J8owl!~AhjxPO@7OzU{ff)hswlu2WS`+d z88Y9s*Him!Y-^r(Y5O5;-P7PT^mSeq4BH0qHobOR*S2j~&b!QmHnrq3d+NA^J+@U# zjxQSQ78SzXTU@SH;yI+e*7czYs2tUX2pU5cd?P%&K{tqAFXTKk*qq&n7wvA|>0#(M zQzmqRwF(~Lw~Vr?j!vCKeUYOmM-**)ZwWnNmFEO!VLc;YRaSn(R<8uC7g=eTfzpLo z+f@BTv7I-s(D$0G+Cc}4$G?=Ds*H}atUNMlUfa9b9oY@RHslL0Ijwy-M|f* zi#L9khDZ8GW22Tl3F(dJFK86`&d0H{L&Ia1OMym0!@$plwfX(kWsRvJ`O#(Q#gij3 z%ViLSrZT`^CDk~*$+6*)*y!-Z^U-SS7i8~dd4V=Dz~b0)LMhj9*j-J(?3r8QK_ccY zyyZ~wEEnBiIgoh+jA}Oaz@G&64`Pm9fUVQ;GfqNcEDM`K!QZ}w?+rZmp{K!)<<7o8 zv_8VW?|gD7x^gJG+!tHkF}NBWTJ{XB`I~N?TRiva`Esn{Zv+r*Di1wt-t$6`ojnV# zO0ebD)Z*0L_SGO-a8!K3rFTDl|K7C+M<0FrtKHwL_(QkHSNwYy;B3pS_+tF-;Qhhn zZyo%~-@V=d=QsUA3;JK(*Sr zxl?*BuVx7yWF#mF0*x^+%)nU&P67bCY9{SvOIAg>1-G@!FFhx!|7K3nQD9*u&-gWf zb%!X5|CXGhyb%;c@7F@x*TU{imn=3f;7tLh%^-lK4>wclBwd}7nG5}bh5@;%W*Wu#cyN-3ZxcB}5pB_Xv*lIoa Up7@ctbYxv%^W77heC7)LFQSzXs{jB1 literal 0 HcmV?d00001 diff --git a/__pycache__/stop_machine.cpython-312.pyc b/__pycache__/stop_machine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79ece8cb82b3f7f08b18293a1d9885db40256bf9 GIT binary patch literal 2963 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 literal 0 HcmV?d00001 diff --git a/commit_gate/src/commit_gate/__pycache__/canonicalise.cpython-312.pyc b/commit_gate/src/commit_gate/__pycache__/canonicalise.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c5ac9fd14b8a4320586e50c5c4b48f7f9e49e187 GIT binary patch literal 1240 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 U-={{XU3!4xcBd$Y>a+Cz3rw?qEC2ui literal 0 HcmV?d00001 diff --git a/commit_gate/src/commit_gate/__pycache__/engine.cpython-312.pyc b/commit_gate/src/commit_gate/__pycache__/engine.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8707219d869ce6db5df12de6d27f37beb4f3adfb GIT binary patch literal 4202 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 literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/hashing.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/hashing.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d21c26033a27d9c92f7903b225d4af1317fe8ab8 GIT binary patch literal 1585 zcmZvc&1)M+6u@V8SD%(*2`8>glV+fyMAVUJAaP3Uf=Sx?P(&M-kQj=((vGyNu6D)D z%9e!;I^+;hgA!U$0)>PgN{cW37kcicR0)V_Zaw9uMumV+eY4WaN$`lBnK$#^o2U1F zGk+wLaRjaS;wS5*iqJn&2%0jTjNgYz9~o#18Q4&4yoLQy*;0&D%crd4t) zOs|_(Nw@7?$UcE~gL)0-aAHe`Zkgys?%EBH66p`pD|Ipv5uUgaipxbr>cWvCN*#mC zBSl!R*Fg}Pv=Um?wVaG5qCs3>?nfgcjPi!wfF;`N3Ns3{uN4kP`ant~Q*T@2z#$9xOhc zBg4c(FW=4oc=6H7!<9#?4_AMQ{&sHg&dSrol~D+^M`4s$=;X)X7nNo#f-qxs2tpqn zaax^GBW)(_U^?#MHUcg$1DA>y3U=FyfdgtTNn-J_#Hzid+0;N@s5JgZG_>sf1|11Mmsp8wwl-6T3vEAyVkS`+*Y7uldBE&F6kb1 z;G5p>;w}_)is`4aVnk;YUI^Wg%tOg1&%u=U^O9Jcvpnx0BNc2UKgr(J?$z(s{?wLUhJwvQE(`KAStp_2NoYM2gU2D9 zt#a3~Ga(Tv6b!diD6o^D#3U#_;(nOFB9@j5@~<35S8J}(u<6H)fGGLor=c6E7~_8x Y6>H--!t;Nl*f<=+3*)62e%rVHAB>oQb^rhX literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/io_jsonl.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/io_jsonl.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0085cb031c98adf344d998eb3202d4543df57f8 GIT binary patch literal 1600 zcmZux&1)M+6rb4-?MLL=ZfmFD7PcgAQHv!K6VlSA;MRq<2?{h0C4wT>npL#2w5!gH zP-Ir%LZJ>AV$*^s6l!{MDj)JM_}oh&F_>)*g`Sd=Z50eU_038vsiCvzea&xXp5FZ4 z{5~;ZA{eWuzq-#Qg#H#zJiw1e_adk^A}EIlCQ=3GaHOT2MC9*KP9_RSr75M<_3Rh7 zZf0*-pJ#4bb?#PN?m8@OnqN9LVOD>x=vEwN*&eYP)a76jhdZ?DdM@K`Ap%)`o!9C- zZ9WqTWD7XTqc1d2GW@!KfM}z;sD=4(K8P~hmpcLh;|gj?fwYXiejlNh9LVKCyg%EQ zoq^L*0)^qN*#MW-@%g^Z#ktWa>#;S`fzlb|5NnLKK2VT>h$6nupq3Z~_!hc=E+K{+ z5=M6rhEK%q$#+l#Lj@N^tt@-2SW&I0!|T+8cm>L2`9+Jk1Dlbp>@x5Xr|%QwM@bH0BE}&Ul2Yk`L+Lz)hMjwC8y3ZaNC?^(&-GN zh0Ivo_46XJO1jnzO$z_N@6uP`e8ErVfY?BPC12Y3^r=&M{Kd#XbAz z)tOTy8;hIEN9X6->pSZ|1e>3Qljo17X4=V}5t#IbU1bSL<8iR3=5A< zl$_qUadvKG_t+GiwDa21oc!BcAP(l#rFpFocLL0zA^#F^<83tJUU?iPkT7^(fh;RS zb7+)@oEnBufMNy_yf2M-!;KgN9EXnESI0Td&&9LlWNeLefCC9SHnFdD23Y{-r1Inl z5nDu$PsfND;u~eqG+yLw(-^SUTyK3PdKu^`XlZeOKwwKWyVY=c>4h#Y`m}0u4qS!T zK``t#gO`B$l;_u+CcCym>#!TV5w1rZk6*iN!3t}&$(;qp?N!(`ej>!;m6Ra=J?MUoZXG82TlTP-P3fWJvrwQK?>R8%%p zNWEGM)#$-W$$gmYua>E(A(KHs7W8ESH6u_&VEQHmW&|P+VgvnSB31kT`nT7Al-k;k z)}Gv%+*KY=%|B8Ol`H?{wWQAO*-!Q41LMB2ePR2X-Q`Eqhx+1?ZamQLYun1!#F+}1 zGX&y9h#nIce;~iRbX7jMs(y?#=x;5bCw?KHkNyOm13=VLQC<&G7km^Y-P1p;`lMcQ oKBDsw6Hgg?9mKJWF+P!GtaMF;lYb)PG@;|^?yQby=|uqi3x2G2H2?qr literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/redlines.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/redlines.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4e1dff8ed859c5ab0b25c05484e568d6784be477 GIT binary patch literal 3916 zcma)9T}&I<6~1H7cx+>1f=vJil7WOxoCVy3rio~jlm)V(-9Spvw##m04W2O!m>KKN zIQ(eb^}|-{T_F`qkxbM|MXRbJBGRHhrEgU$^`$Rt$*SI49=7Vf>>GhrE9I%@UjN`A zqV!rbbAQg?z2}_o9{F$q^Bk|1_>DJxNVhB{MGTx{9TQfu+0Hm{+YCHEl|9Ls5IZ z-g~fWN~V#imFQ~*_tsWSyv>>m{WDL*E={qGBGkZ@J_!prYDz} ze2{?S(Tf+O7kg7n($tcqs0lfpw0gax>I2YCZ7`+r;enw$!`+}}(Mn_0jCM<4le(Bv zWid9y*IIA(LBhaOgeY z0>0CW&iBv)2T}R)&*bEsgbl-D5rtKV16{g6W2{@U)I}=-@up!@nwPEkjHXXZnjTN4 z6*V@UG^QXbyb`o=)r8oBpu`Z}28P&?lIo%sH>Re#tdH7lc*YFcKrw>L`jsb(Il z3QcAc((8r$dQzUBQsf)U9W<|E^xR@Bb$hQT4cNVT13D#=Q(&7(qbZ9vPHbFy9Lk~t z7*WfebLvvWOB{wt_yuqa;pur1e%8=*B4RbkhGIfzz977jQgz~zQ}9s;k5ySAuF~m8 z>R=2$CH|MZMMTD_Dnx|LX3{({=;`vjY7!5%xYQLA^h@|eI+-L+&`fyhZo(x@niACI z<%VfGk-(8{<4%~RUNZj*uPoa0qQHsl+q;oBKW~2AycODP-$!mC{Dr$KC$6@xjTDZ8iPGe7Qu-MYIk9dE0 zmER493pevO*ZVg3FM~b1t?g^d`ry|2XRZBvh-vIoCc`kzTJtvs-pGM?sTs{Bj7tiW?xB1@hM4)1FUYK-0f3EKw z^n3o|7Y0xI0P1GIh*34P+7AD zg?r+tAON7$F9AUz@H1k@&7`?sBh8)hFm$^FJYL4(eGP{ucI)8%`OE?>rP`(LZeW&4iPwem6O;{glAW%-r{m*cB1 zOn@*+X5c0P8UV~xQH+A0DJ3=2l8gkP8cT61jRK#d#Vr6l8u;H*$3n&mrX^#GAX0y8 zZ2YZ}p`qc?*xiAN+Yug9uqXT+@Dib%uM{sx;E-}+>?gyc5uSL>R8q4Tnh+srEU1`x zR6RYfVi`~}L{-%jo`MPqRCg7l>1&dP!--NgKpNt*sm3(jgwjB>vOe?Cqkj;a6jyjP3Z^v%_C?Tv`nk!ujySwk<3B<8Q)e*N3-GJPY^j zqo5G{q(0|fJ@-}DmDP#DWPbAD2T#AB^A;OB06#pz+*@=37Z&r250{@_&fP8sn%DaO z9_T7Iv=jpQK(Xy~v8}tht*wg7g)l9SS>*utZmEiXpczTo(%?ofr|$rs zHv3t6(uh2~s$=vf?3eD++QTv=D7I@B4{O||QfgCPoQA5qUmAjhmliZ&gNwOFG$rXd z#FtVg_A}Uc9{}Zk)rO;lr3`&F<?3>`UK0!o zaUXO6>zvc7#i|2_48#SX2GvW%M*>G2Mg-;sCjN*-BCy(u_@JzWGK-XS+D^~YunPLt;;(ne~=w3Hn$a)@=MzteOu!@&DXa1P|eK5PIEuZeB(Q{Hnwqp z$M?hRa531Fedp`&nSJCE-YlWrZp#}0kgL({vwhoFh7X*MR&UO~=R%D@#CbY$1H~38 zH;_wwIdc+0(i9GwR U02e(t*Up6we#EtNZ!j7E0~B51asU7T literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/schemas.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/schemas.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea3e317e48836da13901c73f122a9849b24b2d38 GIT binary patch literal 5100 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 literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/__init__.cpython-312.pyc b/prometheus/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51efd99a3b64a998576d896b5083473c3cb7741d GIT binary patch literal 183 zcmX@j%ge<81WBJ3Wl96-#~=a2gBTx~85tRin1L(+;wmz% literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2f5a16b9e4d4936bbb8d927b73754650fdf3b64 GIT binary patch literal 1787 zcmcgs&1)M+6rWwKwX1K{b((~x$s7zpi7inQ5+B^ErFF3nt%IC2VK2*CJ3^~SyUWZd zvV4h60>-CUCs|NX>B+^H9{oS`;-VhR^is$vHzh6Nx zbs%Yy?7-25X0_^@!kTN^Ci2A2Jy>g z@i7neN?`hKQ_f~th(}{ukZExey%;00PnS7q13J=GhQlxtaHbM`91}ts4lcoXu7QlS zIbYyazz#ImiCeAHVQSQ!0FVn3%4IVOlU>3TQ3j@RAD>AW->f{k|Ddq6W_-O;_!*pv zNN>N-m3dWjxb8Rz=Nc}4oGZExq1dz?Ixp^|?0RR)#>LC|{SZba!DYQBiwEf#mW^?O zhx&+bB4&OI{1pcAA{M>CsvsICEM?p) ztbV(6e|hPFUqUQ?dw$k9F7(N9L443@F1*6`nV|E%*v(_*rthA)z*NJq+@fJHZM|++ zsqGLJ|H5k;quXV}Yx=b{2|<|Ju9L;6fo+OdWF%s0Ad7NmVQ!e%hrx%oNmzIw^f57| z;@S>Vd3zkQhL~m;V(3K*##-SkF(WL@^Wed7L;y_*jOwthen+uD_)ZnxYKw!9?Q;yd zR{UehF(>_yBuTGjMNU+K#v4`-Seq&cm+J zF%BN}KDl$G994Shm950d^i2DD>w0^xHMftujZUNcwDa^}qjzoLXtp<<-%9nvK-PAy dZeM*Z%hHY05RlV-!S$mP@;P5FEav>i{R4swhZ6t* literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/test_aggregation_determinism.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_aggregation_determinism.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..17fcd4e557b85bd30aaefe801840073c378ed451 GIT binary patch literal 8546 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 KsfaSf2lgMv6{&6j literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/test_negative_injection.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_negative_injection.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..796794b5ef4818da02fbe4a5e9c5e6355aa00670 GIT binary patch literal 8708 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 literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/test_redline_scanner.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_redline_scanner.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1acdea0c0e3df5360fdbef93eb6022e093af8fe5 GIT binary patch literal 8198 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 M#^tqPnQy|s0Ln`}UH||9 literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/test_schema_validation.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_schema_validation.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b56eca5f687314e8e8a810f564921b5de427b872 GIT binary patch literal 11640 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 YZ+Q}0M!bCclX?#yTd4K&E%dYe8)=@CAOHXW literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc b/tests/__pycache__/test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e361162d758234f1b1a372ff41cb13dbea3c0417 GIT binary patch literal 645 zcmZuuJ5S?45T3QeDUImiIAde9O2!|E zAYxr;GmB2*b{qytr9HtQaxS1fnKRFQGL)Upm}p^wv`gP;NQ%0!0rWwxM^5A_Mj?5TBGs0>mP}P``AlUj{b?jW4|L(sW6OF_0{-XAa>#{X$U0F1?@kUet-jtr+@5Nmer&7O8 zaSq+rM1F#?;(F#iq^HI)G(W{ozX7ZpyGH7DdLt20ugibpBDr?4c`}||#@GYE1&n~P H1xt7X)J~<* literal 0 HcmV?d00001 From ed1d026bcc9f3f8a61fba3b292fdf7c44b730bff Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:55:16 +0000 Subject: [PATCH 3/3] Add MGTP enforcement-grade verification: DecisionRecord, evaluator, tests, CI drift guard Co-authored-by: LalaSkye <228581229+LalaSkye@users.noreply.github.com> --- .github/workflows/ci.yml | 31 ++ .gitignore | 8 + __pycache__/authority_gate.cpython-312.pyc | Bin 2729 -> 0 bytes __pycache__/invariant_litmus.cpython-312.pyc | Bin 4091 -> 0 bytes __pycache__/stop_machine.cpython-312.pyc | Bin 2963 -> 0 bytes ...uthority_gate.cpython-312-pytest-9.0.2.pyc | Bin 15029 -> 0 bytes ...ariant_litmus.cpython-312-pytest-9.0.2.pyc | Bin 20520 -> 0 bytes ..._stop_machine.cpython-312-pytest-9.0.2.pyc | Bin 8582 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 305 -> 0 bytes .../__pycache__/canonicalise.cpython-312.pyc | Bin 1240 -> 0 bytes .../__pycache__/drift.cpython-312.pyc | Bin 4384 -> 0 bytes .../__pycache__/engine.cpython-312.pyc | Bin 4202 -> 0 bytes ...t_determinism.cpython-312-pytest-9.0.2.pyc | Bin 14367 -> 0 bytes .../test_drift.cpython-312-pytest-9.0.2.pyc | Bin 11254 -> 0 bytes mgtp/evaluator.py | 111 +++++++ mgtp/types.py | 37 ++- .../__pycache__/__init__.cpython-312.pyc | Bin 451 -> 0 bytes .../__pycache__/aggregate.cpython-312.pyc | Bin 2557 -> 0 bytes .../__pycache__/fit_report.cpython-312.pyc | Bin 1175 -> 0 bytes .../__pycache__/hashing.cpython-312.pyc | Bin 1585 -> 0 bytes .../__pycache__/io_jsonl.cpython-312.pyc | Bin 1600 -> 0 bytes .../__pycache__/redlines.cpython-312.pyc | Bin 3916 -> 0 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 5100 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 183 -> 0 bytes .../conftest.cpython-312-pytest-9.0.2.pyc | Bin 1787 -> 0 bytes ...n_determinism.cpython-312-pytest-9.0.2.pyc | Bin 8546 -> 0 bytes ...lassification.cpython-312-pytest-9.0.2.pyc | Bin 8748 -> 0 bytes ...input_hashing.cpython-312-pytest-9.0.2.pyc | Bin 6405 -> 0 bytes ...ive_injection.cpython-312-pytest-9.0.2.pyc | Bin 8708 -> 0 bytes ...dline_scanner.cpython-312-pytest-9.0.2.pyc | Bin 8198 -> 0 bytes ...ma_validation.cpython-312-pytest-9.0.2.pyc | Bin 11640 -> 0 bytes ...st_smoke_mgtp.cpython-312-pytest-9.0.2.pyc | Bin 645 -> 0 bytes tests/conftest.py | 5 + tests/test_mgtp_enforcement.py | 285 ++++++++++++++++++ 34 files changed, 476 insertions(+), 1 deletion(-) create mode 100644 .gitignore delete mode 100644 __pycache__/authority_gate.cpython-312.pyc delete mode 100644 __pycache__/invariant_litmus.cpython-312.pyc delete mode 100644 __pycache__/stop_machine.cpython-312.pyc delete mode 100644 __pycache__/test_authority_gate.cpython-312-pytest-9.0.2.pyc delete mode 100644 __pycache__/test_invariant_litmus.cpython-312-pytest-9.0.2.pyc delete mode 100644 __pycache__/test_stop_machine.cpython-312-pytest-9.0.2.pyc delete mode 100644 commit_gate/src/commit_gate/__pycache__/__init__.cpython-312.pyc delete mode 100644 commit_gate/src/commit_gate/__pycache__/canonicalise.cpython-312.pyc delete mode 100644 commit_gate/src/commit_gate/__pycache__/drift.cpython-312.pyc delete mode 100644 commit_gate/src/commit_gate/__pycache__/engine.cpython-312.pyc delete mode 100644 commit_gate/tests/__pycache__/test_determinism.cpython-312-pytest-9.0.2.pyc delete mode 100644 commit_gate/tests/__pycache__/test_drift.cpython-312-pytest-9.0.2.pyc create mode 100644 mgtp/evaluator.py delete mode 100644 prometheus/src/prometheus/__pycache__/__init__.cpython-312.pyc delete mode 100644 prometheus/src/prometheus/__pycache__/aggregate.cpython-312.pyc delete mode 100644 prometheus/src/prometheus/__pycache__/fit_report.cpython-312.pyc delete mode 100644 prometheus/src/prometheus/__pycache__/hashing.cpython-312.pyc delete mode 100644 prometheus/src/prometheus/__pycache__/io_jsonl.cpython-312.pyc delete mode 100644 prometheus/src/prometheus/__pycache__/redlines.cpython-312.pyc delete mode 100644 prometheus/src/prometheus/__pycache__/schemas.cpython-312.pyc delete mode 100644 prometheus/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 prometheus/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc delete mode 100644 prometheus/tests/__pycache__/test_aggregation_determinism.cpython-312-pytest-9.0.2.pyc delete mode 100644 prometheus/tests/__pycache__/test_fit_report_classification.cpython-312-pytest-9.0.2.pyc delete mode 100644 prometheus/tests/__pycache__/test_input_hashing.cpython-312-pytest-9.0.2.pyc delete mode 100644 prometheus/tests/__pycache__/test_negative_injection.cpython-312-pytest-9.0.2.pyc delete mode 100644 prometheus/tests/__pycache__/test_redline_scanner.cpython-312-pytest-9.0.2.pyc delete mode 100644 prometheus/tests/__pycache__/test_schema_validation.cpython-312-pytest-9.0.2.pyc delete mode 100644 tests/__pycache__/test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc create mode 100644 tests/conftest.py create mode 100644 tests/test_mgtp_enforcement.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a42fe5..4fedf7a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,8 +5,39 @@ on: pull_request: jobs: + forbidden-file-drift-guard: + runs-on: ubuntu-latest + permissions: + contents: read + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Fail if forbidden files are modified + run: | + BASE="${{ github.event.pull_request.base.sha }}" + HEAD="${{ github.event.pull_request.head.sha }}" + CHANGED=$(git diff --name-only "$BASE" "$HEAD") + FORBIDDEN_TOUCHED="" + while IFS= read -r f; do + case "$f" in + authority_gate.py|stop_machine.py|commit_gate/*) + FORBIDDEN_TOUCHED="$FORBIDDEN_TOUCHED $f" + ;; + esac + done <<< "$CHANGED" + if [ -n "$FORBIDDEN_TOUCHED" ]; then + echo "ERROR: forbidden files modified in this PR:$FORBIDDEN_TOUCHED" + exit 1 + fi + echo "OK: no forbidden files modified." + tests: runs-on: ubuntu-latest + permissions: + contents: read strategy: matrix: python-version: ["3.10", "3.11", "3.12"] diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6020c2f --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +__pycache__/ +*.py[cod] +*.pyo +.pytest_cache/ +*.egg-info/ +dist/ +build/ +.eggs/ diff --git a/__pycache__/authority_gate.cpython-312.pyc b/__pycache__/authority_gate.cpython-312.pyc deleted file mode 100644 index 9fc933faceacc2c1eef61d1bb9ef896f89c0786a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2729 zcmcguO>7%Q6rNqLf8+d+K-;uQIt2#Ci9(^`n6)zM$wJ{;O)s}cqJ@I#7+}_N7jjuoyL>5o(F~G^mz)Y4=QZ1AeEhn@=f>gI@bs1~#_-!MIn_OFosdXZ>m0!- zMHeXUAc$r1hxW!=S8^%ii)8mwb}iZcahCT7zI*5M01WS)&$^Zhd$9~NEEjID(Q^jz z=+p!NiM6xFfhCZu2#@0?NFI(6@gxXO%VcvOLKe=QyKsfSfMyxW0BSD<0>9i|5O{zC zLF_@;=++Uo1_o>!?}6AIHUk)#T2V8@%UV9nB4&tbMb(TfYpZe+A^E5oMK2ZuuNZj6 z;gE5!`&2+WJfq$ZSP0;=n`y`=pc#cWY0vB2(rw|Mkl$z<+hR^ZGKT^uiq;KeDl!o7 zyJkp2?3e;9Fy=;6=v%FEc7nP9JD^y#Ccwf0c?R=skbN+wcgzjq^wDkEGq{RC#8cfi zX(cEfJLdp5U7$Z@#Ue9An~Y^=W(KDF%yb3bb)^O!l2`8M^#n!1KbjZeOw_oYGulN= z<`@Bi1lkZFR)`3AOBNKdS-=37x_Vm$HfCt$`Qj@EuiL#LZPv*15N3`{tC``3&avx?;X6C{%-V9@7wGB zhngd&f64qh@-TDtaYlcT(VM5In?uIKezTc0*9Kp|rG45XiDPV~64pRnrWxZ{Aq!*{ z`rYjkRMW=TR0(bpLaWp&+a=rwrzinf5YbS#D*zWaol-c3WuQ9(or~M}=aUC+40RqY z$chh$QJm2OVu`dOr0>N$i?v0)j!7Yp8;z0vYBO#8pkGAkc>*lPhU>OalxT7k9UqNIyUWkIA?ar+sbIJv8A9HXr4 zGKvLso4Ad`K@R^5&~ZKtarm#p2x^B>$l6R%lT~*=YWqN>RC&q#RnR-29F_&CG0=J0 z(l~~`=Rhox%>?N?cyILUvyXbmB#ck~X#RBk2mA5FrRM#HgIe<(b9|3-^I_kCsqyH0&Ij*#>|OsK!~{=)GxExP6GSVd oD9TectZ0At5M^*P5>|R{UEd_oZT5wH9lC##!^-e80z$^{FT}K!MF0Q* diff --git a/__pycache__/invariant_litmus.cpython-312.pyc b/__pycache__/invariant_litmus.cpython-312.pyc deleted file mode 100644 index c2d36056737169d412d5898edbc0df47a267e8b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4091 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 Up7@ctbYxv%^W77heC7)LFQSzXs{jB1 diff --git a/__pycache__/stop_machine.cpython-312.pyc b/__pycache__/stop_machine.cpython-312.pyc deleted file mode 100644 index 79ece8cb82b3f7f08b18293a1d9885db40256bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2963 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 diff --git a/commit_gate/src/commit_gate/__pycache__/canonicalise.cpython-312.pyc b/commit_gate/src/commit_gate/__pycache__/canonicalise.cpython-312.pyc deleted file mode 100644 index c5ac9fd14b8a4320586e50c5c4b48f7f9e49e187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1240 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 U-={{XU3!4xcBd$Y>a+Cz3rw?qEC2ui diff --git a/commit_gate/src/commit_gate/__pycache__/engine.cpython-312.pyc b/commit_gate/src/commit_gate/__pycache__/engine.cpython-312.pyc deleted file mode 100644 index 8707219d869ce6db5df12de6d27f37beb4f3adfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4202 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 datetime: + """Parse an ISO-8601 UTC timestamp string to an aware datetime.""" + try: + return datetime.strptime(ts, _ISO_FMT).replace(tzinfo=timezone.utc) + except ValueError: + raise ValueError(f"Timestamp must be ISO-8601 UTC (YYYY-MM-DDTHH:MM:SSZ), got: {ts!r}") + + +def _within_authority_window(request_ts: str, decision_ts: str, window_seconds: int) -> bool: + """Return True iff decision_ts is within [request_ts, request_ts + window_seconds].""" + req_dt = _parse_utc(request_ts) + dec_dt = _parse_utc(decision_ts) + delta = (dec_dt - req_dt).total_seconds() + return 0 <= delta <= window_seconds + + +def evaluate( + request: TransitionRequest, + context: AuthorityContext, + provided_evidence: Optional[Evidence], + decision_time: str, + authority_window_seconds: int = AUTHORITY_WINDOW_SECONDS, +) -> DecisionRecord: + """Evaluate a TransitionRequest and return a DecisionRecord. + + Fail-closed: any uncertainty or missing evidence yields REFUSED. + """ + # --- Guard: decision_time within authority window --- + if not _within_authority_window(request.timestamp, decision_time, authority_window_seconds): + return DecisionRecord( + transition_id=request.transition_id, + verdict=TransitionOutcome.REFUSED, + reasons=("decision_time_outside_authority_window",), + decision_time=decision_time, + authority_basis=context.authority_basis, + ) + + # --- Guard: evidence must not be None for any non-REFUSED path --- + if provided_evidence is None: + return DecisionRecord( + transition_id=request.transition_id, + verdict=TransitionOutcome.REFUSED, + reasons=("missing_evidence",), + decision_time=decision_time, + authority_basis=context.authority_basis, + ) + + # --- Resolve required evidence level from authority_basis --- + try: + required = Evidence[context.authority_basis] + except KeyError: + return DecisionRecord( + transition_id=request.transition_id, + verdict=TransitionOutcome.REFUSED, + reasons=("unknown_authority_basis",), + decision_time=decision_time, + authority_basis=context.authority_basis, + ) + + gate = AuthorityGate(required) + gate_decision = gate.check(provided_evidence) + + if gate_decision is Decision.DENY: + return DecisionRecord( + transition_id=request.transition_id, + verdict=TransitionOutcome.REFUSED, + reasons=("insufficient_evidence",), + decision_time=decision_time, + authority_basis=context.authority_basis, + ) + + # Evidence is sufficient; apply risk-class supervision rules. + if request.irreversible or request.trust_boundary_crossed: + return DecisionRecord( + transition_id=request.transition_id, + verdict=TransitionOutcome.SUPERVISED, + reasons=("irreversible_or_trust_boundary",), + decision_time=decision_time, + authority_basis=context.authority_basis, + ) + + return DecisionRecord( + transition_id=request.transition_id, + verdict=TransitionOutcome.APPROVED, + reasons=("evidence_sufficient",), + decision_time=decision_time, + authority_basis=context.authority_basis, + ) diff --git a/mgtp/types.py b/mgtp/types.py index c5da10f..a643033 100644 --- a/mgtp/types.py +++ b/mgtp/types.py @@ -1,6 +1,8 @@ +import hashlib +import json from dataclasses import dataclass from enum import Enum -from typing import Optional +from typing import Optional, Tuple class RiskClass(str, Enum): @@ -32,3 +34,36 @@ class AuthorityContext: actor_id: str authority_basis: str # map to Evidence enum name e.g. "OWNER" tenant_id: str + + +@dataclass(frozen=True) +class DecisionRecord: + """Immutable, canonical artefact recording an MGTP evaluation decision. + + Fields are sorted alphabetically in the canonical representation to + guarantee byte-for-byte stability across Python versions and runs. + """ + + transition_id: str + verdict: TransitionOutcome + reasons: Tuple[str, ...] # must be pre-sorted by caller + decision_time: str # ISO-8601 timestamp; injected, never generated here + authority_basis: str + + def canonical_bytes(self) -> bytes: + """Return deterministic UTF-8 JSON bytes (sorted keys, no whitespace).""" + obj = { + "authority_basis": self.authority_basis, + "decision_time": self.decision_time, + "reasons": list(self.reasons), + "transition_id": self.transition_id, + "verdict": self.verdict.value, + } + return json.dumps( + obj, sort_keys=True, separators=(",", ":"), ensure_ascii=False + ).encode("utf-8") + + @property + def decision_hash(self) -> str: + """SHA-256 hex digest (lower-case) of canonical_bytes().""" + return hashlib.sha256(self.canonical_bytes()).hexdigest() diff --git a/prometheus/src/prometheus/__pycache__/__init__.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 61592dcc696afbe04dbca5a0d71cb843fcd31fe8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 451 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 diff --git a/prometheus/src/prometheus/__pycache__/hashing.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/hashing.cpython-312.pyc deleted file mode 100644 index d21c26033a27d9c92f7903b225d4af1317fe8ab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1585 zcmZvc&1)M+6u@V8SD%(*2`8>glV+fyMAVUJAaP3Uf=Sx?P(&M-kQj=((vGyNu6D)D z%9e!;I^+;hgA!U$0)>PgN{cW37kcicR0)V_Zaw9uMumV+eY4WaN$`lBnK$#^o2U1F zGk+wLaRjaS;wS5*iqJn&2%0jTjNgYz9~o#18Q4&4yoLQy*;0&D%crd4t) zOs|_(Nw@7?$UcE~gL)0-aAHe`Zkgys?%EBH66p`pD|Ipv5uUgaipxbr>cWvCN*#mC zBSl!R*Fg}Pv=Um?wVaG5qCs3>?nfgcjPi!wfF;`N3Ns3{uN4kP`ant~Q*T@2z#$9xOhc zBg4c(FW=4oc=6H7!<9#?4_AMQ{&sHg&dSrol~D+^M`4s$=;X)X7nNo#f-qxs2tpqn zaax^GBW)(_U^?#MHUcg$1DA>y3U=FyfdgtTNn-J_#Hzid+0;N@s5JgZG_>sf1|11Mmsp8wwl-6T3vEAyVkS`+*Y7uldBE&F6kb1 z;G5p>;w}_)is`4aVnk;YUI^Wg%tOg1&%u=U^O9Jcvpnx0BNc2UKgr(J?$z(s{?wLUhJwvQE(`KAStp_2NoYM2gU2D9 zt#a3~Ga(Tv6b!diD6o^D#3U#_;(nOFB9@j5@~<35S8J}(u<6H)fGGLor=c6E7~_8x Y6>H--!t;Nl*f<=+3*)62e%rVHAB>oQb^rhX diff --git a/prometheus/src/prometheus/__pycache__/io_jsonl.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/io_jsonl.cpython-312.pyc deleted file mode 100644 index c0085cb031c98adf344d998eb3202d4543df57f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1600 zcmZux&1)M+6rb4-?MLL=ZfmFD7PcgAQHv!K6VlSA;MRq<2?{h0C4wT>npL#2w5!gH zP-Ir%LZJ>AV$*^s6l!{MDj)JM_}oh&F_>)*g`Sd=Z50eU_038vsiCvzea&xXp5FZ4 z{5~;ZA{eWuzq-#Qg#H#zJiw1e_adk^A}EIlCQ=3GaHOT2MC9*KP9_RSr75M<_3Rh7 zZf0*-pJ#4bb?#PN?m8@OnqN9LVOD>x=vEwN*&eYP)a76jhdZ?DdM@K`Ap%)`o!9C- zZ9WqTWD7XTqc1d2GW@!KfM}z;sD=4(K8P~hmpcLh;|gj?fwYXiejlNh9LVKCyg%EQ zoq^L*0)^qN*#MW-@%g^Z#ktWa>#;S`fzlb|5NnLKK2VT>h$6nupq3Z~_!hc=E+K{+ z5=M6rhEK%q$#+l#Lj@N^tt@-2SW&I0!|T+8cm>L2`9+Jk1Dlbp>@x5Xr|%QwM@bH0BE}&Ul2Yk`L+Lz)hMjwC8y3ZaNC?^(&-GN zh0Ivo_46XJO1jnzO$z_N@6uP`e8ErVfY?BPC12Y3^r=&M{Kd#XbAz z)tOTy8;hIEN9X6->pSZ|1e>3Qljo17X4=V}5t#IbU1bSL<8iR3=5A< zl$_qUadvKG_t+GiwDa21oc!BcAP(l#rFpFocLL0zA^#F^<83tJUU?iPkT7^(fh;RS zb7+)@oEnBufMNy_yf2M-!;KgN9EXnESI0Td&&9LlWNeLefCC9SHnFdD23Y{-r1Inl z5nDu$PsfND;u~eqG+yLw(-^SUTyK3PdKu^`XlZeOKwwKWyVY=c>4h#Y`m}0u4qS!T zK``t#gO`B$l;_u+CcCym>#!TV5w1rZk6*iN!3t}&$(;qp?N!(`ej>!;m6Ra=J?MUoZXG82TlTP-P3fWJvrwQK?>R8%%p zNWEGM)#$-W$$gmYua>E(A(KHs7W8ESH6u_&VEQHmW&|P+VgvnSB31kT`nT7Al-k;k z)}Gv%+*KY=%|B8Ol`H?{wWQAO*-!Q41LMB2ePR2X-Q`Eqhx+1?ZamQLYun1!#F+}1 zGX&y9h#nIce;~iRbX7jMs(y?#=x;5bCw?KHkNyOm13=VLQC<&G7km^Y-P1p;`lMcQ oKBDsw6Hgg?9mKJWF+P!GtaMF;lYb)PG@;|^?yQby=|uqi3x2G2H2?qr diff --git a/prometheus/src/prometheus/__pycache__/redlines.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/redlines.cpython-312.pyc deleted file mode 100644 index 4e1dff8ed859c5ab0b25c05484e568d6784be477..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3916 zcma)9T}&I<6~1H7cx+>1f=vJil7WOxoCVy3rio~jlm)V(-9Spvw##m04W2O!m>KKN zIQ(eb^}|-{T_F`qkxbM|MXRbJBGRHhrEgU$^`$Rt$*SI49=7Vf>>GhrE9I%@UjN`A zqV!rbbAQg?z2}_o9{F$q^Bk|1_>DJxNVhB{MGTx{9TQfu+0Hm{+YCHEl|9Ls5IZ z-g~fWN~V#imFQ~*_tsWSyv>>m{WDL*E={qGBGkZ@J_!prYDz} ze2{?S(Tf+O7kg7n($tcqs0lfpw0gax>I2YCZ7`+r;enw$!`+}}(Mn_0jCM<4le(Bv zWid9y*IIA(LBhaOgeY z0>0CW&iBv)2T}R)&*bEsgbl-D5rtKV16{g6W2{@U)I}=-@up!@nwPEkjHXXZnjTN4 z6*V@UG^QXbyb`o=)r8oBpu`Z}28P&?lIo%sH>Re#tdH7lc*YFcKrw>L`jsb(Il z3QcAc((8r$dQzUBQsf)U9W<|E^xR@Bb$hQT4cNVT13D#=Q(&7(qbZ9vPHbFy9Lk~t z7*WfebLvvWOB{wt_yuqa;pur1e%8=*B4RbkhGIfzz977jQgz~zQ}9s;k5ySAuF~m8 z>R=2$CH|MZMMTD_Dnx|LX3{({=;`vjY7!5%xYQLA^h@|eI+-L+&`fyhZo(x@niACI z<%VfGk-(8{<4%~RUNZj*uPoa0qQHsl+q;oBKW~2AycODP-$!mC{Dr$KC$6@xjTDZ8iPGe7Qu-MYIk9dE0 zmER493pevO*ZVg3FM~b1t?g^d`ry|2XRZBvh-vIoCc`kzTJtvs-pGM?sTs{Bj7tiW?xB1@hM4)1FUYK-0f3EKw z^n3o|7Y0xI0P1GIh*34P+7AD zg?r+tAON7$F9AUz@H1k@&7`?sBh8)hFm$^FJYL4(eGP{ucI)8%`OE?>rP`(LZeW&4iPwem6O;{glAW%-r{m*cB1 zOn@*+X5c0P8UV~xQH+A0DJ3=2l8gkP8cT61jRK#d#Vr6l8u;H*$3n&mrX^#GAX0y8 zZ2YZ}p`qc?*xiAN+Yug9uqXT+@Dib%uM{sx;E-}+>?gyc5uSL>R8q4Tnh+srEU1`x zR6RYfVi`~}L{-%jo`MPqRCg7l>1&dP!--NgKpNt*sm3(jgwjB>vOe?Cqkj;a6jyjP3Z^v%_C?Tv`nk!ujySwk<3B<8Q)e*N3-GJPY^j zqo5G{q(0|fJ@-}DmDP#DWPbAD2T#AB^A;OB06#pz+*@=37Z&r250{@_&fP8sn%DaO z9_T7Iv=jpQK(Xy~v8}tht*wg7g)l9SS>*utZmEiXpczTo(%?ofr|$rs zHv3t6(uh2~s$=vf?3eD++QTv=D7I@B4{O||QfgCPoQA5qUmAjhmliZ&gNwOFG$rXd z#FtVg_A}Uc9{}Zk)rO;lr3`&F<?3>`UK0!o zaUXO6>zvc7#i|2_48#SX2GvW%M*>G2Mg-;sCjN*-BCy(u_@JzWGK-XS+D^~YunPLt;;(ne~=w3Hn$a)@=MzteOu!@&DXa1P|eK5PIEuZeB(Q{Hnwqp z$M?hRa531Fedp`&nSJCE-YlWrZp#}0kgL({vwhoFh7X*MR&UO~=R%D@#CbY$1H~38 zH;_wwIdc+0(i9GwR U02e(t*Up6we#EtNZ!j7E0~B51asU7T diff --git a/prometheus/src/prometheus/__pycache__/schemas.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/schemas.cpython-312.pyc deleted file mode 100644 index ea3e317e48836da13901c73f122a9849b24b2d38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5100 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 diff --git a/prometheus/tests/__pycache__/__init__.cpython-312.pyc b/prometheus/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 51efd99a3b64a998576d896b5083473c3cb7741d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 183 zcmX@j%ge<81WBJ3Wl96-#~=a2gBTx~85tRin1L(+;wmz% diff --git a/prometheus/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index e2f5a16b9e4d4936bbb8d927b73754650fdf3b64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1787 zcmcgs&1)M+6rWwKwX1K{b((~x$s7zpi7inQ5+B^ErFF3nt%IC2VK2*CJ3^~SyUWZd zvV4h60>-CUCs|NX>B+^H9{oS`;-VhR^is$vHzh6Nx zbs%Yy?7-25X0_^@!kTN^Ci2A2Jy>g z@i7neN?`hKQ_f~th(}{ukZExey%;00PnS7q13J=GhQlxtaHbM`91}ts4lcoXu7QlS zIbYyazz#ImiCeAHVQSQ!0FVn3%4IVOlU>3TQ3j@RAD>AW->f{k|Ddq6W_-O;_!*pv zNN>N-m3dWjxb8Rz=Nc}4oGZExq1dz?Ixp^|?0RR)#>LC|{SZba!DYQBiwEf#mW^?O zhx&+bB4&OI{1pcAA{M>CsvsICEM?p) ztbV(6e|hPFUqUQ?dw$k9F7(N9L443@F1*6`nV|E%*v(_*rthA)z*NJq+@fJHZM|++ zsqGLJ|H5k;quXV}Yx=b{2|<|Ju9L;6fo+OdWF%s0Ad7NmVQ!e%hrx%oNmzIw^f57| z;@S>Vd3zkQhL~m;V(3K*##-SkF(WL@^Wed7L;y_*jOwthen+uD_)ZnxYKw!9?Q;yd zR{UehF(>_yBuTGjMNU+K#v4`-Seq&cm+J zF%BN}KDl$G994Shm950d^i2DD>w0^xHMftujZUNcwDa^}qjzoLXtp<<-%9nvK-PAy dZeM*Z%hHY05RlV-!S$mP@;P5FEav>i{R4swhZ6t* diff --git a/prometheus/tests/__pycache__/test_aggregation_determinism.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_aggregation_determinism.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index 17fcd4e557b85bd30aaefe801840073c378ed451..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8546 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 KsfaSf2lgMv6{&6j diff --git a/prometheus/tests/__pycache__/test_negative_injection.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_negative_injection.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index 796794b5ef4818da02fbe4a5e9c5e6355aa00670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8708 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 diff --git a/prometheus/tests/__pycache__/test_redline_scanner.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_redline_scanner.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index 1acdea0c0e3df5360fdbef93eb6022e093af8fe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8198 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 M#^tqPnQy|s0Ln`}UH||9 diff --git a/prometheus/tests/__pycache__/test_schema_validation.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_schema_validation.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index b56eca5f687314e8e8a810f564921b5de427b872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11640 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 YZ+Q}0M!bCclX?#yTd4K&E%dYe8)=@CAOHXW diff --git a/tests/__pycache__/test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc b/tests/__pycache__/test_smoke_mgtp.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index e361162d758234f1b1a372ff41cb13dbea3c0417..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmZuuJ5S?45T3QeDUImiIAde9O2!|E zAYxr;GmB2*b{qytr9HtQaxS1fnKRFQGL)Upm}p^wv`gP;NQ%0!0rWwxM^5A_Mj?5TBGs0>mP}P``AlUj{b?jW4|L(sW6OF_0{-XAa>#{X$U0F1?@kUet-jtr+@5Nmer&7O8 zaSq+rM1F#?;(F#iq^HI)G(W{ozX7ZpyGH7DdLt20ugibpBDr?4c`}||#@GYE1&n~P H1xt7X)J~<* diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..601baf6 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,5 @@ +"""conftest.py — Add repository root to sys.path for tests in this directory.""" +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) diff --git a/tests/test_mgtp_enforcement.py b/tests/test_mgtp_enforcement.py new file mode 100644 index 0000000..cc42948 --- /dev/null +++ b/tests/test_mgtp_enforcement.py @@ -0,0 +1,285 @@ +"""MGTP enforcement-grade verification tests. + +T1: Golden determinism fixture — byte-for-byte and hash equality. +T2: Cross-run stability — 100-iteration loop. +T3: Fail-closed guard — missing evidence, out-of-window decision_time. +T4: Surface area integrity — no runtime mutation of authority modules. +""" + +import base64 +import hashlib +import importlib +import sys +import types + +import pytest + +from authority_gate import AuthorityGate, Decision, Evidence +from mgtp.evaluator import evaluate +from mgtp.types import ( + AuthorityContext, + DecisionRecord, + RiskClass, + TransitionOutcome, + TransitionRequest, +) + +# --------------------------------------------------------------------------- +# Shared fixtures +# --------------------------------------------------------------------------- + +GOLDEN_RECORD = DecisionRecord( + transition_id="txn-golden-001", + verdict=TransitionOutcome.APPROVED, + reasons=("evidence_sufficient",), + decision_time="2026-01-01T00:00:00Z", + authority_basis="OWNER", +) + +# Pre-computed golden values (generated once; must never change). +GOLDEN_CANONICAL_B64 = ( + "eyJhdXRob3JpdHlfYmFzaXMiOiJPV05FUiIsImRlY2lzaW9uX3RpbWUiOiIyMDI2LTAx" + "LTAxVDAwOjAwOjAwWiIsInJlYXNvbnMiOlsiZXZpZGVuY2Vfc3VmZmljaWVudCJdLCJ0" + "cmFuc2l0aW9uX2lkIjoidHhuLWdvbGRlbi0wMDEiLCJ2ZXJkaWN0IjoiQVBQUk9WRUQi" + "fQ==" +) +GOLDEN_DECISION_HASH = "3f55453de918d9228eb4e1eda60f9d2e4555834f2ffc2e70b1e5ff6d0bb9a254" + +# --------------------------------------------------------------------------- +# T1: Golden determinism fixture +# --------------------------------------------------------------------------- + + +def test_t1_golden_canonical_bytes_exact(): + """canonical_bytes() must match pre-computed golden value byte-for-byte.""" + expected = base64.b64decode(GOLDEN_CANONICAL_B64) + assert GOLDEN_RECORD.canonical_bytes() == expected + + +def test_t1_golden_decision_hash_exact(): + """decision_hash must match pre-computed golden SHA-256 hex digest.""" + assert GOLDEN_RECORD.decision_hash == GOLDEN_DECISION_HASH + + +def test_t1_golden_hash_is_sha256_of_canonical_bytes(): + """decision_hash is always sha256(canonical_bytes()).""" + cb = GOLDEN_RECORD.canonical_bytes() + assert hashlib.sha256(cb).hexdigest() == GOLDEN_RECORD.decision_hash + + +# --------------------------------------------------------------------------- +# T2: Cross-run stability — 100-iteration loop +# --------------------------------------------------------------------------- + + +def test_t2_canonical_bytes_stable_100_iterations(): + """canonical_bytes() returns identical bytes across 100 consecutive calls.""" + first = GOLDEN_RECORD.canonical_bytes() + for _ in range(99): + assert GOLDEN_RECORD.canonical_bytes() == first, "canonical_bytes() not stable" + + +def test_t2_decision_hash_stable_100_iterations(): + """decision_hash returns identical digest across 100 consecutive calls.""" + first = GOLDEN_RECORD.decision_hash + for _ in range(99): + assert GOLDEN_RECORD.decision_hash == first, "decision_hash not stable" + + +# --------------------------------------------------------------------------- +# T3: Fail-closed guard tests +# --------------------------------------------------------------------------- + +_SAFE_REQUEST = TransitionRequest( + transition_id="txn-test-001", + risk_class=RiskClass.LOW, + irreversible=False, + resource_identifier="res-001", + trust_boundary_crossed=False, + override_token=None, + timestamp="2026-01-01T00:00:00Z", +) + +_SAFE_CONTEXT = AuthorityContext( + actor_id="actor-001", + authority_basis="OWNER", + tenant_id="tenant-001", +) + +_DECISION_TIME_IN_WINDOW = "2026-01-01T00:30:00Z" # 30 min after request — within 1h window +_DECISION_TIME_OUT_OF_WINDOW = "2026-01-01T02:00:00Z" # 2 hours after — outside 1h window + + +def test_t3_allow_verdict_with_none_evidence_refuses(): + """If provided_evidence is None, evaluation must REFUSE regardless of gate.""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=None, + decision_time=_DECISION_TIME_IN_WINDOW, + ) + assert record.verdict is TransitionOutcome.REFUSED + assert "missing_evidence" in record.reasons + + +def test_t3_none_evidence_reason_code_is_missing_evidence(): + """Reason code for missing evidence must be 'missing_evidence'.""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=None, + decision_time=_DECISION_TIME_IN_WINDOW, + ) + assert record.reasons == ("missing_evidence",) + + +def test_t3_decision_time_outside_window_refuses(): + """decision_time outside authority window must produce REFUSED.""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=Evidence.OWNER, + decision_time=_DECISION_TIME_OUT_OF_WINDOW, + ) + assert record.verdict is TransitionOutcome.REFUSED + assert "decision_time_outside_authority_window" in record.reasons + + +def test_t3_decision_time_outside_window_reason_code(): + """Reason code for out-of-window must be 'decision_time_outside_authority_window'.""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=Evidence.OWNER, + decision_time=_DECISION_TIME_OUT_OF_WINDOW, + ) + assert record.reasons == ("decision_time_outside_authority_window",) + + +def test_t3_decision_time_before_request_refuses(): + """decision_time before request.timestamp must REFUSE (fail-closed).""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=Evidence.OWNER, + decision_time="2025-12-31T23:59:59Z", # before request timestamp + ) + assert record.verdict is TransitionOutcome.REFUSED + assert "decision_time_outside_authority_window" in record.reasons + + +def test_t3_insufficient_evidence_refuses(): + """Evidence below required level must REFUSE.""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=Evidence.USER, # OWNER gate requires OWNER+ + decision_time=_DECISION_TIME_IN_WINDOW, + ) + assert record.verdict is TransitionOutcome.REFUSED + assert "insufficient_evidence" in record.reasons + + +def test_t3_sufficient_evidence_approves(): + """Sufficient evidence within window must produce APPROVED for safe request.""" + record = evaluate( + request=_SAFE_REQUEST, + context=_SAFE_CONTEXT, + provided_evidence=Evidence.OWNER, + decision_time=_DECISION_TIME_IN_WINDOW, + ) + assert record.verdict is TransitionOutcome.APPROVED + + +def test_t3_irreversible_request_supervised(): + """Irreversible request with sufficient evidence must be SUPERVISED (not APPROVED).""" + irreversible_req = TransitionRequest( + transition_id="txn-irrev-001", + risk_class=RiskClass.HIGH, + irreversible=True, + resource_identifier="res-001", + trust_boundary_crossed=False, + override_token=None, + timestamp="2026-01-01T00:00:00Z", + ) + record = evaluate( + request=irreversible_req, + context=_SAFE_CONTEXT, + provided_evidence=Evidence.ADMIN, + decision_time=_DECISION_TIME_IN_WINDOW, + ) + assert record.verdict is TransitionOutcome.SUPERVISED + assert "irreversible_or_trust_boundary" in record.reasons + + +# --------------------------------------------------------------------------- +# T4: Surface area integrity — no runtime mutation of authority modules +# --------------------------------------------------------------------------- + + +def test_t4_authority_gate_module_not_mutated(): + """authority_gate module attributes must not be modified at runtime.""" + import authority_gate as ag + + original_evidence_members = {e.name: e.value for e in ag.Evidence} + original_decision_members = {d.name: d.value for d in ag.Decision} + + # Import MGTP evaluator (which consumes authority_gate) + import mgtp.evaluator # noqa: F401 + + # Verify Evidence and Decision enums are intact + assert {e.name: e.value for e in ag.Evidence} == original_evidence_members + assert {d.name: d.value for d in ag.Decision} == original_decision_members + assert ag.AuthorityGate is AuthorityGate + + +def test_t4_mgtp_does_not_redefine_evidence(): + """mgtp package must not define its own Evidence or Decision classes. + + Importing from authority_gate (consuming) is allowed; defining a + parallel implementation inside mgtp is not. + """ + import authority_gate as ag + import mgtp.evaluator + import mgtp.types + + # authority_gate is the canonical source; mgtp may import but not replace + assert mgtp.types.__dict__.get("Evidence") is None, "mgtp.types must not define Evidence" + assert mgtp.types.__dict__.get("Decision") is None, "mgtp.types must not define Decision" + assert mgtp.types.__dict__.get("AuthorityGate") is None, "mgtp.types must not define AuthorityGate" + + # If mgtp.evaluator re-exports Evidence it must be the *same* object + ev = mgtp.evaluator.__dict__.get("Evidence") + if ev is not None: + assert ev is ag.Evidence, "mgtp.evaluator.Evidence must be authority_gate.Evidence" + dec = mgtp.evaluator.__dict__.get("Decision") + if dec is not None: + assert dec is ag.Decision, "mgtp.evaluator.Decision must be authority_gate.Decision" + gate = mgtp.evaluator.__dict__.get("AuthorityGate") + if gate is not None: + assert gate is ag.AuthorityGate, "mgtp.evaluator.AuthorityGate must be authority_gate.AuthorityGate" + + +def test_t4_authority_gate_class_is_unchanged(): + """AuthorityGate class dict must not gain new attributes after mgtp import.""" + import authority_gate as ag + + before = set(vars(ag.AuthorityGate).keys()) + + import mgtp.evaluator # noqa: F401 + + after = set(vars(ag.AuthorityGate).keys()) + assert before == after, f"AuthorityGate gained attributes: {after - before}" + + +def test_t4_stop_machine_module_not_mutated(): + """stop_machine module must not be mutated by importing mgtp.""" + import stop_machine as sm + + original_state_members = {s.name for s in sm.State} + original_attrs = set(vars(sm).keys()) + + import mgtp.evaluator # noqa: F401 + + assert {s.name for s in sm.State} == original_state_members + assert set(vars(sm).keys()) == original_attrs