From 7cf3eb22700dcd224a2cbdeac631240bd0d43d07 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 13:58:00 +0000 Subject: [PATCH 1/3] Initial plan From ce5df6224ad0db76f313d2e4df2d4c79a30e2a7c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 14:00:00 +0000 Subject: [PATCH 2/3] chore: initial plan - mgtp minimal decision artefact demo 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..02c331cdeceaa458399e6cb69fcbb7fe0aba77a9 GIT binary patch literal 2729 zcmcguO>7%Q6rNqLf8+d+K-;uQI|T|cY8(Lvs)|OcYSTuvuGFTqSV-1(cN}kG@4BFxZKsmGrR4O5*5<;pF2T(Y0hXXK}bFE-mEu&3Rgz*o40S? z%)EK?eQ*3*cXx_FTUh_fdM8H6U-%KWXh&I_1Z9bsq)1G~RI5r&EvgDp$!TIn7Ky1b zbvY9F79-Lc1#4`JRg=~@SQE=?$1~bUW>VgB_|iR5akwQKr72x7`sc#u^qgZm!m%xb zvRTVyw!uanZZghHsv8D#U1~VC;7&E0N}Z%86O7j^+j0fWkc)_lF2JW&*Ew^kPV3yk zh0KlhXqC;fYD%BdE!!2~!Pzy>!VTm=mePsxrnBWzaP!J#%dnU&j&`C*fgPf=mc))Qao|RUxq=5CsVA6=jN->9Y>~IUni1qCkV@xcje@d7 z7%3`n1*)kOBc@u^%t$e6YQ>ltEyf$MOx#c8JE>~YNk_oG4I1VwOk!|0H_P!7p5O*g zq=vUw$RzwksbuRlRx0_aQmN*cUKRCpsdUZLtDTW}sbo3^n6<+BLf+RdUCdwbqvtOd zusfMMH&OVOtigKZ`TJuPr^d#(XWNXAU3d7*7~C43-m=9ge!CT?zN>9JB(n7eM=(m! z1&TWeVv+ozy|L1jUdRO^-Mx@sNq2vo=l!AY?)lsY!@K9Rp=F|eBF7BNg&S=4oJKr4 zo&X@RPS!ZE1acMQN!$dh53nzc zJq#P&wuP;M0o&SpAa;h$00yR3*39UlR*bTk8DUykHDim~vYbRnF>c1uizUD-0bWTs zWYX_G8IlgqsP_XFLip@t8uAHfMxjmEvpTnQTe!#NH`+!wm{XF>p}>imFyvsSB_Jiq$;<77oZWSYU(fgE6~hZWw2PZp)s+RRkiQ>b6O1 zVd>a92e|11{V6M#nISr4tU6OuFg;+VEAXys9&|`vxu4$?7KPwwevC8Wal2r2ikQqX z0s;xNCO|9^5%QMIDPqGfEPL)@5tdabrXns^05PX5cjiqeLfdBl1^H49$3Ic#lsQt` zSfxQSYN2^#d!%p>C~8+34U=`0PC0^RVm_2CEO7MjrLPz1n}E zb@0?LxnB=H%w2h$(;wvY)~TzlA>(1c*-D!$gRkGxKJAgjF*Z^OYoIREjBzZHIWi6X z&UO*1X>)Y40yhbv)x6qf2@k+2DgYKlG}P@Hz{SmG6i#6o=ng~Y;x@tg=<-&gcQLK-w|V_u`%T+w-l&ungW$gm2F7X!#kY{aEcpZ5UEw(e1^wQ>?j*YDXY4S zVgcPGZu3x>!~X(wk`F^1!Rv4kwL>UmZKkNns=F7pJs>iwyk!0==-Z$il?ACeu>G>7 zaTI;ef>TSXL%Vmln4SsiiU(@aF*9# zVCU0jW&Vq``j9K?G%aiv{f~F@P6VMfo?4l8rq3u zbogGSO`!Yc*gAGHPPsHbdBGdU;ExJNCI*qp49f_%KX}g*?*{)M#(4&ukyq}UAleZ{ oQJ$(%Mf}YCxHXQC4rMnsBhz$*qhk9?(CW* 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 UCw?R@9a$IHeD}mApSc463!xDY%K!iX 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..826e902cc0d4065581427e6b41d9f60ca049bf1d GIT binary patch literal 2963 zcmcImO>7fa5Pth-J9ZLCLPJAHyM>0bapRy0wNj`e0db&>VpLO6$(Pl}`;u&8@0z!3 zke#$LRiqN3iXc@As8rBiN|Z|U$g#b&hh734N-Yjm+Y3FpI1&=4&g^;}nuXpMbL+E2n0)^o(KBSgs)dQTjqYF6-2xENhsC?HFm z8TDmfKO8=bLVH*~m5j#|^5BSkeBwkriHl@>R6guk(K1RbjJ#pX24nOBWwtSyp)omO z$@ZL)%NgdhJgKGUE^17-V_^_aXRJvr1IK}VSI;rBRL)q_M%rbq90&|sa}3Ljg`eQP z6uvCR&3v{jYI(;>dsp>n?cSvNHt;Kik`xDd=6OPewVGZ^Y~rLQE>PgWy5!zAp#;kz zRW-FNRn>A>RkN0!&)~XMRnO$PTCxAb22}Zga!~^)@o^I?2N-qo%uJ-wVSk|CSccUY zkQL(iax&{Dx-KDPfv9z9fvj=~Merhq#aj-jF2q*3vS`!Hl#R#8Y!_}plA!_|RW0sm za6INq_k)hz2BbtDclWN$U7Ncsejaf{+~h1;be-J?ixqHZ7UmbnS;D$Orf>|?$6f}~ z=!)bzS?p-^!xg=Xir8;TDbNwTgnaPLFC}$&i(6sryh2mUT;19xcims z&aL?y^Y^=>btserj>e{`ldcCB>|hYxbbJSkM*J>t7^+P?LpU41gFPImGY4p5M;v&} zyrFa3>(2Vmo39A-mqh0mxE*$cucXbyE`U|FUU>ykk&46b=d(H4vE%{oVgs@%j2+f#G%K z*uA4a1b&YE7`gXxg>VyGoP((&&Q%4WtGz;mw)RSh?Cq-~q^Vid3-uE?^nWPSI+|wd zB?|}D#+DL|C85M{8r+Tb-sFq*me)b=#lwr~sHsmdp zDY?d)Tc0a>3$$%a&<<4@f7m&;-a7VTZw658fsYbOgkc#nj00-{QVy!BZlzU~VWTdG za?Hw6<`lfg0=qqvk@O>Z0|_>Nx7WJw1?xf<34+c(0R*05ai}VC(t%2V1llV+C-pAp zpAwj=f-k5BMCr{+Yf$RD9j_3W?&wvVHabP=fM*_!qQlUF0ooM)aTo%{{l(aP%NRcY z44WRqXMthc@|6+(J05xBon*%{*;)(*nK3VkDUv6WvP8*IN+n8SpW`-xZ8g^6e7h2l zKHf32OUY#K0L3u^sudy$RV%3w5V>$+5?0|K$&VmFeiZ1x{yFMs$yo^Kj{-^jCy1${ zsr9Sho7vgj&K5 zJIc{5dIYdjj{+w2Ho&AF1Kg^&18&nh03XxifRF2206(X90zRQ90JrN&z$fQIsjc(7 zzGIk{*?YXqdULbZWSJGLx$KFYW%SOl!gRqZoHPbLp_XS-VLNvCWI;DddBcuP82N%( zD3|QcLz3<5;L1BM$#3WZC5-<&4DWtPu~hlcl6|2}X)@2df8fwnm5MSI_3|ZFRa^5{ zLlw0WnpLXdO4$4_t6lO<@oytj;;yTe@Ns+v;y51qz-f&hwmK!yK3!f1S_G&_u<2n-Y0Ltu11kuyz$S-h;hDU&kyrnayMI5?Xf z;YHbr#s=6OUzwS+Fe|e;W^c>pbH!qo88a+jo}S4u!`_0&**9hjMXOLU?P#$K3e)b& znv><(qRvUPCyM1aa>Z;ZH*MJMSu=Ospc3rFA>JZP+rx~Nnf-Vc^L{#KWsSFHin&tG z!jn{#(TuUCpA%9}TpGb>@C}qr_c+RAm+sm)J-`+i0o;G%~*;2`1yHAzbo4fPn zl4-GAp=3QvX*7N&Fi&)Z6fs;f4b05hpXd4X1+u19W`>FP_J2k8dDKqtVg3`qY2|jj z>uT3edam@;6K8`1E#e0_HJvD9cz5e$H-W>o^i}zd`sKp0wY4rQZ$q*?QE^C7e zdqk@4p(~u&B@zfP+a-OkU!WkpHn4^gNo3zaLzM>kNj=Er=Sd)b`8nmvPvQ}mF7;5g*b^3hMjAKz@jeeTri{F0W=rK#)^OB^`?1(Fpe6xpehC1d zsXcja$C(`$=j!b{KULI7_wCpd=W{Euu0Mp4_ygte?7Lao!%;dRg_MZw{A$>uCh{vt@l>@+xS~NxMJkc=s(GTd7>AmQa5V*<1~s+K zts_9#HmE62p?yyBcy~|vKuvj+L1NccXk1OTrgeuL)WSwv+U=`9przhdlsyeK)v^`M z99&Jc#{3h*$O?fX>aI`8(H?cZ`j0vH;k;)a!r=5N3XVV)eAMO$0|`r5w}_0 za(wto`V*Pw-79UfBzgBK;t(lg{70%96molpkvxJvew&o8a2g^@HX?J?Fg@u(G*}bPub%HXmm5O zb{New_9THWfTfsd8uhVDCj}|qrKvhP|8EY4XHg`a0<2D+be|ilU!IE zZ{_k<7REq+G7FQVe9C0|(Ew_n`8xoqLw8)+QI9{vb?CW$XZF>!(TkIprY}qbIkWHl zbUpqwu_D1oT{&{jcj4cOIj^ovRvZ(kt#VW@?M1^6pJ~ zB`Kdx1sMJJ)GIVV`85?FgB$dUSAI)v0lnf;(kNeZc^Zi8mDaR=y|U4kcKhlNXlb*S zfYfc-ie?V3S6cG;^h#?wzh2p_H+091l+)|JVG{?}E3I3;zFzrL`RRTA`;^S{?i<%D zOP*f&;il`ALlZB4Bl94Ng{AOLY&U^HfK<{`6>NxdhXJ4>s2;8^SekM-s4UnX5C;hL zUM|!p3nwNGmbE5xCD-Pb(*1cbk~(iK-Nzu^OBYHtZ4A=ARFC%oyWaI-&l1*7W3_nS zVoxnTc1xq*O(#R7T)3=_k#r}Dx`(a+g>-jV1%eVuq&t)n1?BmY$i2a9Xy&@!<#I_B zT#G$xC`A&ruwJ}(gLEgY&sPm+#i{{GaZM=a)z^OkH-%!+bAEZUs;XAhpw&b*WJ%&+ z7giWjJ>*%BRc)QsLZqTqB3La%E71+D7NUH$0G@}kT5#p>x~m13l1uds+T5GCT5!LD zPv*63h4F0gByY!z$b)xO_NUuP7;^wAOSMl?@L&w+U*E;@_7a}8=*o*35*fg zOW-*I`v6RGAxUf5F_(98$(qxr3nhrsQ@J@aJ40r;na!1i>zsWRT;zZa&5V#9@gG37D zUw>7g;95N9()bay=hFyYw^_=PJ;9~yL-fr&vZ2w*T-vs_(_G06X}eh#rt6lJb9-G2 zvx$RC+tw|2eQZAaF=$2c$c9!nZbSQgGe6jL8#?n+=J3W$=!wIb*P2{28?&G_szvx) zG%DsnE$AIw&ckhOWU=R2!2Zx1bJ{r%U5UK>tXvQ`@a^1IaES%ntRHC$|pHnp;7W1B4n6!byuPNGcUvo8VVS3KpfXzTPz&F#)OE zvK7r7Tq?KZX|T4V4<*D!I;|1j0*CcGO%N@&z3<<}?gX#! z=1>HSaIkZ?I(gX}qEQC9r~RJ0m)!TlV?0Gb3gQP1HfK#1N+;NhD2oa;e+{rUHibLf z)ku0F;=0*~;a%^mCwptL;rEWbpLsU}q?YWxmZ>F&Z^h_$)5#Di7cR$!$-7Pzbq`$u z3h%nZDiD--xzDAPC@4`+GwFLrTvCaG^jc;OrAU5?@W*ts+rGqFfTh4Wy={P@hwv!@Hw^QWlc8WaRe%GX} z;-5ZtC=vdbMC8zujlrkx2Z_P4{a_!&>(B}1oSF}vQ1YSIcRE^@wx!lwo<0r=HeIP>rhwDN=^H6a34-OuV-;s__w%)isa&{CdLJ|K`tmVy%z-K}kR%MDtR zZG!Cgto;BD)Xc%PR!bi54O*A&(-D!YVdn$_i7kHlc!L5T-Az&XCeBu7n1UVYEKeT& zd`d}0GoR=vFHZwkUbGFC#{ZqK0DKG6>Jlc_>v($#DX@?yuAoToS>^B5ORB1z?IL~i z&tXJqtC>{Dv!qiYJ2Wt8tIVYB6(`K^Zu|HNql7?zc5r@}PaEC9`33A^7EG&<&*t*1 zY?}PIfjKZPP8A#+aCyFgl1%ED-zxuoTDg%(U&}3g|KgELFJ5?YCAo7sk^aoo@bvAc zder$Z`(h+RZq5;yNj%eiB5tb{RFoaejE1tbV zfChmGq$JZMD4J59XHc_t8_o&L7A=!;y+oci|A~bW--!hg7%5g1_wFY4JrqIv0On-? zDO9Ad==Si~&%;0c;?2Z?#g`W>+U&(n@3U8){V3UAOB^`;b%0+b(u-p&iF8d%pH0^i z>3W>d<#_s*=KVgRha#iyp(`3Oi0m7{8+niq+Rs+QO7fr?LF3;4!k;~_<$<^t$$J`v zcaCFN28${=tP%S{W$??>7@lFQtMkwll6pdUeL;w+ib@@g<5-A{2MutZ4pZdIn;4p0 zxDLQ4vSsG$lIFA?0;^T3}iO1uMvU3GxP^_dUBy{a+NKAe`qDLzcC#oUp z2|Ztp0phO`m2WTazNiMR8b15i+%#;GLQ5cK@|)7oM+o?plQsO)aP&CvmRh%v>$je|hxU&TF}M`>q^7Vqxy`f#oFP z66p7lNQ*?B5(2#erUL@?!6 z@`Mv$r*Q5ON2S~>k`+8p^ekB;cB1isq!&6aY!?dn;OAL*+%%)`IvxnZcM91NN`8|7 zS+3k1;o^gL9Qy+0^%9`tGk0U-(`9|OXdGnINRrwxUk3PnSXI?uDXHHm$~(#rJO5o7 zUslFfJ3{IZf$r5rNF5_=?`lU_9berVQb#Gt!Psgdtfp7Dgw^e1q{s%a@ B+B!c&3s9-iAqvoI)WSs%*I!Nu4*k9VLVuw|DN5M@J)l6Zxu1G=(Yy0c{k)mo z*_A|-Opz~6!4>uRX6DW8?9A}ZdvD&`f9~oEE4c3b_s=rF?o^b2r-XC)Y~=nNkdG8y z8C7&u_hr>lAOH4GYH6RUOa?|fR8bNf4Wh)K4NZ2Ac20&z!;_KG2+Fkgl+maj0PNB` z0AqR(uv-rS_UN5}Tl6qsuO0#1sz(90>0N+*dJJ&8-VOMe-UGN}%9q$OJ#f`9Ei*or zXYow#W{PD}IV+jXSd&FFUSOHYjFq`*41P{eFp}`sLg{SEG&5sUwczV{(<(Bf7QMu& zFB@htYo+Z+5dCBAiE$v=kCq#9$skL`AK&FXUKZp0kS{r=cSZz^V=r~Mw6 z!of<4^EAv$+3S?M-!5fN#r@r0*Q1qVqz78=X}_nm7HsY0O?((}Q}bq-9i|3Rr#4n0Q*+?&P`OrGV3t^Zi3rS8l6i75{#$0p-RH zm)gO~s@_@dz-)KC^C!4Bt&m@M?o)4tg!u}IP@Qk%3h_K$z4_>HMo*94_464B>Ro!Q z6tw3f)bf0UoR*yLb@S0Nr6jsXroVG3mD5v2gAoJCr89-B5!a2eOwKUlsrXnCg_B0k zN@e3&;xFJkx=}Cya#lP)7N1Bl{Z@(@i)zi6F&EY8D+31#Q%4eJ_y;x;KNBZxC}9p3 z1QQCE;~A4@9(U+~*mTc=?z`tMpHIF#a_!vZm(Pt{4VP;wW5fs+wVEF-5jaBNSpvr& z#K7bXX7LtJCQQma`75!$e);^O`oMSg3_A8qgN~W$JTuU(v!buZ66T_xMbQK!u0stT zTX&Ze;w~o^yBM*|TF`zn-pg8SegA9W7Yb7r7S=*5`C-TLt&PkKw+5GiXHkrd*)H;)9YRsS(YO!TkK@?TdGCqZeqZOy@_Mq#8HtDjh*l&PI<|m^_Cp> zCQh2fF5}Mi;PT;#{G@T16>~X*9ln)k?;K9&bEd^onVj_urSY_dx_Nx$Htu$Vg{j(O zyabQQmv2%oUp9nW)9uX|_N_b0XQ7_Tmba>*(L3ipjYK~)rIeS+xu>8%8PFsF1UMv(K4P4J->!%%lc<|Zy z^$fHQ%Kh#%BZk3o(x(d;^O_lRIg1%Jc0$h~~ z*s4QE%c_IqMox>i>fnPar$I?m>#A}-sB%H9k04j&XoWOag*4&mL1*-& zDi`9aT*#h}&X(t+(`m{1UN;{>uF5?~T!3&rKE)X|ICeZu9NvnLLE(sBH?sL#@prDq zv$+FD5?>AzPlRilW!$#JM(`9k5j#L2LEs>PrwJS)@C<=L0F$&3M=yxS1=ruoxxT@> zpTs_sMEBVV5Yql(ZsB75r;+1#&O?@;-}Zj2&G{Q~{g6X@%1<3nMv61xV?@{KePjY^T+cA3xc$1 z=4}VGr0Kl#DKlDW|=#X=+&)@`@*NvEeTfRMPB`7;39x_zk{di7CcJYYy| zW&kT#6FpJNTWvWNYZ{kly#5ad&4L-6e4QC4$wkf)Wjv+BnrOz!OJbaF;tp?!gJBe4 z_Z(*_*g%DH+>jTrv*;vy9$?e&Rv0j;!K7^PMG%rw?ET4ZFkn71vO@bOi-~IgWN8qT zug^C`{A3UC{To|2nXO!<3=AWyEPTx8AOXm=K z-`(KfNB<^T(e}-pT8LI6`_?r2tctWqNVtSt$n!){by}#OoIaOp^s`DhaPM*gTUNGim7K2748EJBfeObiBppd*6?G zwCP7-o5hwbEqGtGn;3k`q@Uc*1z$zm3Gu==`}~@=6Q5O)6bT8JkPGR82&yi+LbM`x zSwmBjTq2-oAU?FMh2q!QKFIoVUDAZMvGeML5x-@mtO*>3kkXM!8*wYIr=|v5V4Um% zajCi{0Ksf>MiK6<*(9BiOJ?&LD)BlVss5R2Xz&qZH+7|YvQWaONV$I#z-z>>=SSpv z5jh?U#}rkuNN?kp8&rZo8UFV%jt1ybl_}*(WmqxQTL`mx3u(%^?SD(Tr6znMpOa%j zLaTKMpXyo%T!>A>taVb;tE6~_$$ort%$irti0;$^&&x}Bbw7gI*v!YOt9>C9fwLv$?yDhxKrLIdPwj5(ne{U z(^sbtO-E@{4UAIfH@|W`V_k2RN!Ph1beb~`df1MZ3bZ_*4~viTBjPI3o>N+BUyK_x znX7MlPNVHP{r@(nkQ}>4rnhVgi+ga)6N82jHWB>>#EpJCKzi|T!aT%XSr8$YKww)q zV=2hs;+b>*-1^h)PgJz{+==<& z`Ajtu2fh@EuW9aQl}bfM)kP)6vKF6*22J!RcF+}|8IcQu%K8?OkIYZE@2+Tj_>IS_ zkv+hdB74>}_p?f+BBSb}l44ogLw6&36g%h&&~cFqg39_9k&n!8=7}*ln=J+;9dp&B zqk-K0(Aafa=lm*3X|3$jeJ~&+aKUk9hfE%BEL9<9ot)VasL#`WogTTeIri;_J#i_~gN`P&au%AF7hR*7GpmZTi(l;Idhx^_BJpvOVh35}@xhJ^FVyzgzqF_nWB zFAKle1G5&KyyBg~Bs3Zd; znywp3i5^7tu9kbyY)ssdZ}qpdsRnw~N(!A;$Uvr*utT)50@~W`&+tat$ zDRU?@=?U5Dx_FotNpIP}Dwy}p9oJwmOKcmN-nTx;6E@B|Z*=&aj6*zH6Nf*q zl91X!u7o%#L{1>K$O(~lP@d~RrgdJTz~97>HF8|8O$5a26iDu5Zxi5hCs{(KyFH@w zFkTZ;(;)W_u|Fazl0$2LG+zr?MYy)JQOf-u06IHFovqU&wBZQb)F1n(39p#&O248P z6jtg6t~%c2BndMz?6rIf#pUHO>Q+?9@ky$E2*CTk1p7@2;(3qr=qT~_2l1kX;bCS_ zH6B0pr-b3xEF!5)+Na&9DJO2~aV|95qo2eZ6)e0@A<0L|WH(Ud3jWQibFfv}a-teK z30re_&j(YpQzSMXotb+7ERY3wh3}a;yYPk-9zPLjAp=UdM0G@pgh?Bf#SjZ;-j&4; z3Sn|)O5_p&UT#3rCeVd91nPwlSMC1YSA2opGyc!I`xl^`URBTLVQ|{mZ~ifZ}-H3(W@3 zD~`Zg_Ib7<*)sRK_{q1>P%EFnBVyDOU0h+Z!+t%F*0KRm8V{W@cA_}T{wa*K%18T_ zk_e8lWBB2It^=fP`2?tGhPE`vE727mv4aDPj_>swj&eP)v$Glx&XQz*F zCZijO8Jf)GGNzSDCsS#bH%@G!dtOcuvcUQ?6oDWY@PZXQY3K=Fb&M0%phFfa?XXlpay1He;@fYqlC{rt*5 zOn(wP^3%O@w->Y@|Jicv$eoM-8XNj~a3wZW(T3)ZR$@cd2%$@np*79@tWu%KsJiHi zHiQZydl~rpI>-m@@9+7Q?xQA&iXZmAv_nhu*MiBUo=+!}wUG0wAwER4{-iia8x+%k zsIft2++qlzsCCLLS|mJA4CZCDTkF~QP98D%G_S&PMBa=1-3>gFmj_I-7bx#V0v8F8 z?**eXQGOK1tvr0&;$z8Is(Xs}Aar^XKA>6SEc*d!(9go81HAw8tE&1h%G1A6l=qY$ zb^V)idPzBbFYH%$-ivae0qgavkKK#<)Ti%-3B>&Bz`Y(#ef(a`2Ml?A_hJEc@4cRY Ny8He%zdFqC`@fdz`tAS# literal 0 HcmV?d00001 diff --git a/__pycache__/test_stop_machine.cpython-312-pytest-9.0.2.pyc b/__pycache__/test_stop_machine.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33db97d3906abc1220a1aeaf91be9c9358c16492 GIT binary patch literal 8582 zcmeHM-EUOK6`$FA_uIQR1`?bAHl(JklGuENKwCoN7MEHPj!L3Ru@qe`doQr|emFDN zF?M$=lOh!hOF%_yMT*p@%8O<7rRqPxb6*S?L9dYd(1$i}iCr}GynQS@lKSGzhgm$h?iL%hs-=N$p|s287a|`h)A`v zUWiaqj*i5r+Y%p%LyJ~Ql#?ULa%v<6_4-vZk~X6dx0x}BGiDs(teJqg-AqEih69^TejIanZ}vNsWxk50#CO)~T(_;%H3fR9cVJXe}~9>RL_X z|F)B|WmIgZEV-#kYuW|aIP7sDvgnO#YIa7_jb>#|rE-NI6TUMreutuvxf)sYzKaDZ zJ7v2{6=en36c{y(mda60ebX!L3XB=DQnjaYY!>VhvWm4mVC8yXmXJQRh#cLFex^?Y z_v*SCGvhVANJS}X@05EI80iIBr_x$fjwI7hs7WrcdRK2IjMb(><3Njwm8$fmD+~DAFs_xJ-L#bWR9Syo; zbOfU}FnaSzHqW`mY%$P@9LLHNxi*G!@xVJ>O{#Dq{hWk^?bf$RPtrZNg6zV!NL)o z?0{HEv052qtje722AtJ$-ZreuqaiRNS16!SjUNUDL1`J?AHD<_4)t*YI0ccb`LRP%Chk(YGeKrA&FUma$%)U$3sdOV~ z1lf63*?LLMCUZ|ATZuJlce5PZ8Q6gkjwy)&wcC2veJK=bw>9mzvPCwMttpaA4l@Mh z|BKcgIQyf)bE&$}Q$lkxyu>jS6Nc!sK&OB5%&Ps|;OSI7mvyytJa2xSuM{k{4d=jf z;zY$N*mkVI!_M%E!thSQ@I*2^f~*T8JQj`yCs;gT^YLi&U2;MKuJDYv#@T^xW!w=CA}LoZgDBy{ZPl> z1GnrJ{P-@^g2qLH`zpJPv_6fSf$>nydXzE?lsAh_lu(3f_6lrb0sekKt%$r_U54nX zH7<_O6c)WQB{tY-ZU{3w3q zYaftFx

Q6a(X0Ib4^xfe?(1{W`GaVPcjd}+cGcfkcJjuS`2q{kJ^-3@|yfmO>W zkA~Zq9Rfm>dp-zJh*(N7c${p%v1fMA?dki;{a+Ir-SH@qypfzu&ZWQ6p!5w^iTWoT zrTmV*ZD6lcLiFc!#-7u)W$0~X?iE!vezReXDS@^)}E zL=`KZ$o=2&^5kD^Wsm3S@&pPl;VL-R3!lBNX3Aw;eUbswr^3N}sa6cT>guqA*iq=0 zP3n|zb+S*K+J^DPu@&dnwUCa&OuOOF7a(dly6;|j_x9lY(5<0meXp-ro`3wl2jB5@ z`2Cdl>>qQO*bBCQ;6t55p2G+HYnw)I_9_gWODOziuR#TS9iu*sj$nj{$MA@;eu#qj z-7O^He7-O?nP;XE5D5>$k3k2tmidn%YLEkQvuH-{UPSKp+4j$(zfXUfUQT=m0lXIh zycYqy_X)>s`E$>}9_`Ma=)i$S{PvaYR+*)+qBVX8JVPNqJ;ff0AD*i9jSE=27Z$zr zshOo1BMx;V+ngw~xMi_aOEIu2bOCqN_kyD+> zsZLMTYTLqD<*VA;TU51b2(coB zDJHo>;i*vLhgkCs)}*2gb4oT^ldWlk*5qba+7)p3hOAWWsT6%swk=n&wuex*E&FW3 zQ-Riy2!Yu{d-HW6ic>gkeU^q=aJR{z_d}c_{0(gvU0J|HtlTif!rU0Y*u&kOCljeqWVn(il z`}wpF@pVnP*lL=jt?M@Lux`UpNF9#2B8oZL_G?s?m3@_pgbyY3{ zcddNoqNT3TPAoq@ZdFWISKz%j;I|VBBgA=^i#c()mrayx?oh)u?$CZ>dm#!wdL3KG zxwq~Xu^|}YE%@^tpJ3*#`!0AG0P|5gz@Meid$~sB_(? zh}KS9@R83ILX-vZoF{ys!sEnH+!-1!4DZAY;g}&fi=A8`VtKBhCQg>C=0wRl#eN3u zcx?C&A^J+Al>U`;|AUaLUn@)RIvO4X=X#Yx9 NqrIzbae7Eh@IRuro0R|n literal 0 HcmV?d00001 diff --git a/commit_gate/src/commit_gate/__pycache__/__init__.cpython-312.pyc b/commit_gate/src/commit_gate/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2f51b2af7d30f38d73c81d50b177407b65941696 GIT binary patch literal 305 zcmX@j%ge<81PxynWyS&N#~=<2FhUuhd4P=R3@Hpz3@MCJjFn89%%u)MA?N(u+{_XM z_r#J^1=qav%)C^EG6OwBg+~oj6kJkEQj2mk^D>J|GLsdOAu1C~OEU6{GD|8I(t&#P zs#t-l^$h$pnQpPi$EV~c$H(8|j*l-(Eh^5;&x?;=$?zHEf?tXH8Tq-X`bDLAd8tME z<@rU~`pNlu#U(|FnRz9;AbxR1egO_KkQ3uU*69})B?HwU`0?>T=at0A>lIY~;;_lh lPbtkwwJTx=+6eM^F)xt#z|6?Vc$2~H0iS3icM&U41OTbmUJ3vJ 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..d8410834703a4690df24576cbd0b4b6b09a3423e GIT binary patch literal 1240 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 UzE6!%yYv9X?M_h))o1Db7jMsgOaK4? 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..acc699f024d390aa6b378d5816bcabaca1c93c4d GIT binary patch literal 4202 zcmai1T}&I<6~5#7@y{4+uyKH}o5|)66V^aB8}ip|(u5?6sAHdTmJ38Zc%)F)O%6^~J$sy;>P3oJzOj#6pWu2k(Cfk-RmsprmkY=e^Q zMZVm>bI-l^eCIo7{?*VBKu}7r{;K{lgwTIU$1R>pV`~%|b4W&GNTy^@ni`|vKb`hu z=rNi?G9$BTCc}=g8D@-uJ~zh6-anu*uk3@`C;OrH%K@kZG7mK`2cZrYJn@G7KVj?h zS|+0!!X?R2gn{gYnpK4Vl>Q{hilN|)npJf}O$v7vEUQUFz>2P=^M zxuck#rOFN_eWxEGoqDjFLIsLJ@bvWb$gpDMaaI_`c|}mi$&(0ol!7j(SpnzMil`^G zoB~fq-ja+dzs)PUQ5l|6jg+9mTZ3_=v~X8S!(`&(DBPP>4JD&n^n_x>87olR%WBxR zhed-ri*-cF?FA^W#h#RwQF?Gbn^kbnl!ov0B( ztWR2guaBYq6`YzJC!NP(K4h6$oAdHga7H(moVcYZX&>;2%n_UNcF(&gS z%gU5%t>61iMyA?8%A|Uj zIv|Asq_A;r`s7ZeWD7PzT%_n?&65;eFj9&OmW1V#l7@ywRkniA0-q9-X-U^D-bR;W zgwcy}5B9@-ZCk`S2Q$vDxS5O-`&c0A}`xI!<6~Z!{hgl&t6&M_pI=Tmzm|U)!wuJxcqJJU^y6d zXRogD`&Rg#VUp;#H>EO3VzaX=*_PNxf)O>OA_FAlOhJV4g%^zO)-7~)byU4DM z5bVDZM!_Z=2A#=zPbNpTabZAX4jI)s)27$Q^istpAEP2wv(IEbwm^~;vx=Fd2WS}n zTnkcY1non8;PX=+3Vn$v_$x5?=r7R}6=$cr1~o~xZKx}TaAjoZsxXeVjF1ERN(hd* zb%79W!lLjrn>WTkJP!QkQ?f}-R z^;-9V(8HDl{WrGXn|%H-mSZ`e8*dV!7%<(`3KpvY=evv(z|N?F4u`EL;32g5o! z89`$Oj!n0TYSE=XP=*h|iUe8u9#ka+B+~L;xpjXz(q7)(Rc`Nm$#X$&192?pK&U=c zkVmi~nqZ*ClGbBxsq&87>A)qR;eB5)a=|WWTG0LfNUG)e(4y4*sn=f^|9u zepW}rJ9IR@RY#~!N8}y%4cFEgy!#lY*Bvc-frjC&V9Fa1yIwCvFSU1Vm5><&x|7HAi{(y7I}ZqDWkJi4FabG5)d9u4kxba~6%N^U z5I2+Su4aDS^(h<)O?pMT8cS^7#rxp_@c~j1pS65$=4f$F#%MLVBTgW({MEG4V(oMh zVv?)AvLsN;9xb1nHCo}?Xk{I2ZD*0d3FCQP0Xp?oUfJ?ia$Pba0lDgN79S<2{Ft1w zK~|EgP6DZuRJxpE_rel3VBe%6!X9K%+-nmJCf;kuK|9V`oRkCZmMu=#KtQ&_=Y~fI zE}lC-DqbHL9{JVK)i@97tCK!ekL42h_E)rc_XLF1AYF0JX`k2%Ru4-ikHMr)P+tcD zCtUlK3Tp9Lm_9+)eFRtrT5Lq&_va^9L-Eq(a%As9Vl~oN8Z5{5uN*kG8tX3&z2Z=0 zf4Qlx+_JX}D+{aPc)9gZdDnrJgU42P^}ph|2v_>_RU?XiuyA-Sk|+%V(}tQ#mwxaz z&-TxqdUR@jdhrNMEc>2xKMk#WzbH4i&v?te(8I?2jVrqjJ@a+G@JDBF%-wu+b740G z`Pv541Njx1k(l72e0?!Q%T?xG9fxP{O#>2E!NYFoZh%^o3ec;55{0iSu)V^1xoFg-GSYy25P$Y1DbFl3Rgqf=BR zF~+3d6e3K_i;-a|w})il8o+ZokcoGq)`ofG3LAdBIre-0HSI880HlWR?TOIONF<8vmu%0%Z! z7cZ9TZxXsuxird1JmkQgv{~tH*Dk}g0 literal 0 HcmV?d00001 diff --git a/commit_gate/tests/__pycache__/test_determinism.cpython-312-pytest-9.0.2.pyc b/commit_gate/tests/__pycache__/test_determinism.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dfce41a4e0fdec19a5305a654bd481c4c9a59550 GIT binary patch literal 14367 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 DC+7k4 literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/__init__.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67c2f6ddb99d927387f11dbd054461362e450d6c GIT binary patch literal 451 zcmZuuJx{|h5KUUDqLhMIm~Sm=?Xn{zc2ptQx>#v^QmiJv$aVth1iylvjlTl_peqYw zQJFg7@Fj-caDIN)`MtY)>Gz|+$KA)Hdh_RNbNP+%2dwuzcnD-L4P-bC>(-#Xc)m20 zqf4>0aIPtjvl^~TQ(;X8sxdoZQFMi|9FflIAxLy+a;24ZDgl~VG*vuPnQ}EKo5fnP zXhMLun3PVDhPZSo8UM_{^EOFQmKhp51XF7L1-y{NBBL5oqPb?aL;lbQek literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/aggregate.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/aggregate.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c7c4607723e3ed6414a5259f58b1e5de61f8e90 GIT binary patch literal 2557 zcmb_e-ER{|5Z}E!f5u5j2my?1j<0}IVmn1@2>B=1s?Qsb&YNvcvZNDMg-Lb z)RlEdJX7b78D>gOW<_~yjA&!BrJF|7?>|FKHKS-$R5eQ@Dc#Vir7L2Uc{r0w$s{X| z5;G-Um6N(ETbe2k=bbE+(i#Ud7Q&4-VPj}bJu+W%5!;a zF?pxuxVu%|7Sp?7Zj>7aEg0TBoaY$dj<-uCUu!v;9x^q|7ytf1=06&6E}+8N<*>Y{Dd$V~S}|i^#fRb+9oVH`C9Z zOGDT+Yh26Fm<6uTSTq`=M2W4Nuc1MUrn7cXF;nS`rAZZUBo=n5VjXD!bL!xwy+8`+ zp&tdBR~kbL-q7-%$j?pfMR|JH^uW#i3r+2XQ$SV%jnn>5hh~T8f?r7sbsY;r$Lb>< zHNQ?75IzfZ3JUAgnh!b-7}5~N8Dy;iMa9<~DBP`b*20_@*70yJ;Bl?v;a|YxUI!xg zM{D4z8HP}8XMm&UhF9SoKtgg}fHcf|^4^>$=T(JS4qzD&kizG^c@Imx@7;H+iJJH2 zaE`M8#Fe&gN8x2V)_kpfpR2+3Uo_-=IbQY5x~u8n*a`{Zo%;58Mo+4uY-~(@RadNy z`Cr4g1MopDOGTMzA~gvs4x=X7P)tq@4<$r1V*#`(IboS;iJBS0>W)rpf|s)50fiM2 z5U0vPm}VTJOqEDQ?3wDpz;X!QavP9Agq;d<5n$xh3B>Be7kCC^biGbMS$vP5z!A>& zJElukHmxP@pgWw+MdQSQH4Bv}l6v?&@%4^rhBlcd{Zk?8lt7(o(cYw~$Vu8CU0V$S zGi?F#2l~5!ehT*7zEbQgUbywvVz6hm%;5b=V-tP_W_u~vO>`@pAkCnaY-Ss;vzTmw ziI>~@8WVYHYq)Q|sd!~Bcq_jc?pr0Tu=)z@bXQ{b|E&x^Yh|eW_Sxdu;^eIl7en0@ zDpz<%9*~yf*0bv(P<+`Y2J&pl_T>}w5L3Tjj(c+vYTwZvRvVv0$zqdCj zr!J{-|J07>MZdbZ8w4mj_W~;7;{GrF(;v?rn;ZXnaG^C`KxJ59*CKye%SPOGpjuJk zJ|ULvuZ}cBwHq8isB|gopwe!BI<5uXu3MKdcEh+#$0c)A(hW!`8W9Lf1sjf@rJwE6 zEiFZDf#q$)PuNcc*~JL6*Y-O?5>sIZSQbdmb{era)plE(X{ZEqZOp^fVe^V%k$s?w zGR<&5RhyGIwr}mcNF0_Ks^~o+1@t(8T6REM%)fm<*i+ivQ+Rh}YZ#z6KYBmhSK8XQ zAhfJ(2|<+S+wOKa_^8Z334Uh*dH9KL;Mo}WH3x2NQ5D|r*Y z1mcff{APDy@Ie4=-?!W%%g1sx@-QT^r(0*j8{pe!* z(Ng>I(w-Bg@WArc-OItf59>Vv_XFf{xmU|Ry9Y;_Xerzg1G}C#+5}d{GAP2Rz33A;)9kFF(TK VubYk*>L0niI9hIP#csmn{{e8li$4GW literal 0 HcmV?d00001 diff --git a/prometheus/src/prometheus/__pycache__/fit_report.cpython-312.pyc b/prometheus/src/prometheus/__pycache__/fit_report.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c38d1700ff12808d8dfdbfd8da0e9741935b36f9 GIT binary patch literal 1175 zcmah|&ubGw6rS15ucnP{Y5D`JIEspaHaRJxQmEEyP@<-VLP3`8&LlhSW;f1Eswpe< z&_AGfsRvKq#DBp5!HalW_Ug%7wLN+A%_gZ81Ru=XH*em|eDl6fb|4gKGM@=s@xU+V^Y=Vk zO5Wg1lBXhQG3Bz3BrdZ(^ zR=v9NsGN5I-ic{wCXA!2;0{n|P`tH-kW7bWFA}(Gg!m*jyD0#=xx^F`E$%Y{P{=kD zlsk%S*pg8a_{0f1zLEf(fYq7m2wy^;k)UzwKVVNI)w{oIsB!*JIv&@r{p*SG&`AS6 zpi(Lx-nKnXtpr6};Qs09q+rwo;8uhCl>5zo)zqNsC0DN12*d`bl=)KkO2hcIS#hE9 z718m5m&(gPY*n1VmrB^&SMz!<-Jt!?T>FHwiegg9O1WH-!l|6fH@LET#FyLMIOp{E z?ur6jpM@c>fZIifd6YZ<_QlsM`EvQzr)OU;FGQoWQMR}bshMc>QZzhu1cj*PWb~(R z`hbMvn-Clzg$D~E4vo+ZQy=?^c%2C|A!tD7!t^UF4UC!~)pwZ{R5Es~yB+RPVxQ6= z2)5qSs}?|?@I}ufpjD4bVhcuSUn^WH?vN(mW`3d?X}1{Re!HWUqI+D*#M!=-;(W4T zxwdrUqI6u=vaJC{39mx`Zt=N6?r+-qq^A7<8eYOl8%tR+4qHS{yCLoL31V2gqIP58 zr0$i*0wzWvj>k6iqd_eLg2W`GCv@#?aJ%Su1dUEdxrzPfQSSVg3)hd*=4fX30Z>(( zjiyLM=A(-@qH7D$_|%)(x0iktvLl&8luc*E8Q5RKwUQZUEsF+@WhFq93xo!eR3tEd sglV+fyMAVUJAaP3Uf=Sx?P(&M-kQj=((vGyNu6D)D z%9e!;I^+;hgA!U$0)>PgN{cW37kcicR0)V_Zaw9uR)K&|eY4WaN$`lBnK$#^o2U1F zGk+wLaRjaN;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{uPgAtm(DU2Qlw-&^ahJy?7? zM}~=oUcQ_E@#3SEhbxa(AFloq{q5Y~ot3AFE29u-kHRRi(8-U%FDlJg1YySN5QIKD z;xo1w^G;1B4#0`%eP zTyWaa7}##2_t1xk;~fQ~+X%yN|3*{2jdpNGZ8fjCwYubLcCBd>xUE3RCRZEkUD7@3 zz&E|$#a$@q6w^;-#fZ)*yb!t}nTL{3o`Wgx=OxwfMARDKQPP^3z$+A1%xA(PA}O$~ zBCu%c@U95W1!P6IQ8(a7p-I0YX42*)D8M)5UjczlCNH(XBNc2UKgr(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%rVHA5q1CmH+?% 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..6e66b45aba276ac57bd226b97f0f50f3db370632 GIT binary patch literal 1600 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 U0WNxQwu1{D{D|w|-e5BR2mI>ck^lez 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..21860b0e7148a3eab49f4affbd1193694371b018 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..3a5781852e3474680eeca9f76d3af0a4bf47e758 GIT binary patch literal 183 zcmX@j%ge<81PxynWl96-#~=a2gBTx~85tRin1L(+_y{u0 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..71f2e716f04cdceda2046652d86707ecb0365008 GIT binary patch literal 1787 zcmcgs&1)M+6rWwKwX1K%ahimt$s7zpi7gRY8Xw%MrFF3nt%IC2VK2)@J3^~SyUWa| zvV4h50>-CUCs|NX>B+^H9{oS`;-VhR_EN|xHw6a*Idx{Fl|-?jhc*NA=FR(<_kQoa z-QN<4C}6Ag=4X371i(vv3D(SrIlUqS&;b_EfhAdTRnlc~hH6StmOyPr4@*Ohs;fey z>6$nrdIYJJx!}RcS-Cvn1MVEltAT!UqQs#zyjdYjIb?bBr6*AmX=g?ILBiM0)>Li` zeW$4%-(_xo0i==g&x9-CA*4-@yllM z2@Ca#WBP7O&Sw1(i{@)Vrp0OWe2n-$U1g*L=vY@74Z~Q#m`d<*ObKZ?xCG<50W#9o zVu4iwJJ5Vg+-jYUQlst^fLxGJE}Kz&*(JWh%iycbM=%NFo3%&x9~4$LjIY-UzkpL7 z>D~9aGOKD1*BuApT*Jjraz)o66q~j~7x|r(UGGfUq^O_{_J!n=ptcU)p#19XJ0+X*) zT-)(g)*i>KAzw2LKJ+{VW25jDpAkRI@?gPmgab`+jOwVZqNA82{6`huY0JZp?Q;y7 zmj7ePF(ZSJBuTGjMN;0zfh0W#&mw<<=u40oXu&Kj?=J7lJ+-U$Qr*;n*1vM+*H4Zv z^<(*#b`py1ecV}UFZ~|+@I+B}R<~Do*0+I@Pk*}t)LG~b`iw^D;JkhPub c+t**qvUKY-1myI9bA#xVd_l;$#e!(u-(Y!%GXMYp 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..b6515969c24eebb7c6b4af0b1db78f7c377e08e8 GIT binary patch literal 8546 zcmd^ENo*VE6`qajXkX$bO{_W_saO(8$&#(espUm>tVG#_Her)aDa}}-#0~$9Vo@av zB@GY-C{P6r5En=RrIq3Me{*d!{(Hx zt1x;zWL_4o@+N-zMF*q5I4ae|IE`=6yX{|?t{te-oiLvJmE*XS=5ZstO7kvDJgAfdtXPfFQYM& z(v;kEQBn)(d1d>6=$Mj*@UzjECZ^3BVA4jo;GMaZvgSOXtVX)>&_NA7RKYwqE4F`q$pmc!J!KLPuswzaIbB!O1s9{IF_g(IBZ?11PpH=$ELN2F}zDs#B-v^;r)krFx(|S;b`4{Sz6#yG3+N`pm z_TjRcRPtaA$%{1#MS~&&$w3iPS_WK^hGoX(@<{0%KoFITz)=_4Mhx(rJia5R{;Q6UtVu}u}2;;vUFr})?ZVKZo!;X&0fX&q@N7H6O^U4{s z^d{|MXRB+IPAi**R%^+fn%6l;(`G?)LpDp%evdVsZEZp8F03k31BcM-P&l*!@TWc; zvYps#piySZtPG9}U<^m$2VdgVKWO+0(xV>uk+~8N;Dg6D9`GS}oM;`$;sGC>9{UY; zPwurQgu5fD187`L2pfXOYCT;SZ1_IpXaEopu$KfY9Qd?Wdkh{+^}v7=D(#iD!T}Gk zFbHeO{u^rvZ9Hq~g(LsjS~`IhLh$Zu>1e`QhW60?Ue*%AXxIv)`{B;4vrBCl;UEaw z;SJ)S;iEg4b&fm)I^+av?cH?(z>90s&+ zw?%XzveK`&MJi%sOThD%RbWaEtzfY!Rb6&dh(KFM$zg5^5pn`1Q{O#Z-{ziX95lX* zTSCW1k2z;|W|zR8=-b>9x9yX@XE(QmF22?+xue=`EouBD?1YZ>&cK)rSUUe*%aQfOkSBYu1+ z))R}vIZ2Zxn8P6Gr^ru`oJ2B;iIKgAH5C6;I0<3Tie#6)mn?TAM{$Z*E|>e4{)K9Yr9(Y%a=b{0_ zZzaQ7)eGoiUZJ0y1zTo`3Fxf-xhV{(7!9p0xEJ1e<_Gg6nj(|eLGv;At8dXQ@E7|I z>W7bQjOnlZLZ8py0Vl(ba{pwQ&?)Y=S#?f-RnjvBsQNW~idLQ8t?EudX!0+QeG_Iv zZL5##2V;8T{Ef$}!55cDZ;K5puUEteFOOElhc7Pz$kT=XwR1ppF|u~9A_Ant^OjX$ zN>wVE{7uw1SuX{ZTHBW@;uE@XWGxOv7oS**SHvS*0-m?50#m9|$>eXMzR7wisMOjv z$DLRk(}e_%d#oZRwgfzHSp}w4rIN|t6hPl(y>wGZ>;gK1!RN309>D>R-8v)C9I$S$9DIVQArY4SX@HJYf`RHdmR{gh{W;MlfZ zHf*8I+%zy&wiuGbb^;o*&4z#pZTt#|zAh@5Tk(gX3%Vbt;J3zaL$;gz7^Acs=*A9U%G;1<|!jKr{2U&z8XiZvNH3 z0)Z`gu=V|3@Y?$D3;Ij1RD-WBkA5yTud;gE;Y!ORTP=}FOQhP;T@{~PKJ$6|fyzi_Y#}xh#kK literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/test_fit_report_classification.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_fit_report_classification.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38845db891c12aa56ea1c477e4647bf4eee19430 GIT binary patch literal 8748 zcmeHMTWl298J?M)-JRX>1>2ZFxMWFb%L27o8!$*XlqL{dT1y2gB=<5}?~L)-d+V9; zE;c(AX(I*HNF}N&^1y@BKBSiO;71-S^#!Rfz6H~1A0qW3;w_5v#8dzOoH;YI>m@cy znx-wsJOBLWpZ{Fuc>c@z&R<(wlLC~RpZ&r7T}%-Ei4|THk6CXK1>vrs3nPLq>QY`D zk?1{AkaLnK6rv+Bkv)lz#OV`dL@|_!PTo;)pXd&F&gr5NZ>swO*9h)U(cBeiaL#C* zhgoCMBf2~vVf?(r?sUG{KqFwJdYY%w=t}RP1?-gALC}Jw0y3BDu8W zDxSu)yKQvJ%z{ln;E0{Pr)g#=V8LI^r9o^k^_tHNN`1L@6`mMCe*~5REvBN znU`5pN7iL0T9a$h$%BI6#A>lSq7}8h1rUS@PmgIcsz+z}kM5|5He~MT`H~XEwGdiZGwxEt<5c3B31B^u#UdNn6y5 zY*A0%qF$8i>B_zM449=8*AsfO7B@v&Q|xxWP@y;7#%001rtqHl{a2zcT!*g-E)gyX zt_WN*Trnp)Eu_`q$M_EY&7$ST@+Hu)+?|>=UYY{ufU4THd}%bB*NWMK;U+XIJ7%ERZ97ZH1vhh! zkP>mbaHR`bTQjbg^VuSGKywLK#Sz#PGvP{qxNCHjdqa6vhj96^xwA zC%hq<#HY|FISMbcWy5Zs2tGG#NQ!y7vxx)v?@0vz6NXJN`=>Vj821~@u#>M{8ajVP zyEJt9;uo>#-PEFWVvfQ7$FwH3ikXFchvt*y6pYpdmv7b(ud5iZs~E4VG+tL5<8^g$ zvWgEeURRgY>Y9wdhg`y{K3$Tb16ErJ*j2fT@fsU0vuD0ntKW5z(=ZldJL^0h z$4nffb_Jt$g+^^m$LpeYWpRR~;}EqQ(s7jd=`mxTo{mG*MrBOLA!>UpMs1I!QJeD^ zwK>0G4E6}p@nNFMhsx02&(g_PAmQ6IE;*!0bPO?Y$IW8aHWL^h_k=&iMwhtI}s%wA~;y~}nk3+}Zz|KIbwhtK-BEQA6< zZ^Lb}qv-8UqNdam^c$9Hl9dnj-UOeAFIa*vcpJ6}zTi-sW~=KX#+&FR_>A?AdlFrP zq~57_)so&Cs9RnGmG{K&-Wn)~Pdf>~q_+>dvFvCr)7KwtN#>$%(kzyzY;8PijT4&F zP~aNPlb~h30>HW8MvEnITW%bDlWyj0@+u0qTe)$gkkxpCLcwH$E!{m_R-d#mY@23C zX>lftXzu`rt$_)l*7yi;V1{S|<2?dgnTde$M47bJGigj)N#`IS&>;}|6u`(4%dp)T zI~sCZ0n{~ewxMgNpNbf{ezU7a=aA^d}um`>={G)a6qpsb5>b#$MwC|<+;%CuFTkPifPZhEIs(ABRv^x#t$7 zqu2pF=Iko4H<%O^09--^U|~qc`xNFe>&c)4&iaoT^GNNulU`EyEXs#xRUnJ%o>_HC zJ-jC4??X?(YAdwH_+`{*Y?!Xfhc`xlj080LAAnWeJo8{HBup`Or7 zHI$lv;@98<@r({Ie0nbDM!*M#a=Pz9C*(CGbl>(P_SdQVE^$G&<3&J?_Tfqz=ye zTzR5o7TvgR5_&SHXmBKzH(Y4k{=0?x0E-Ox7y!mza!r1 zyF2jCz}?gDoSv25kG~gxzx}=T1!X05>i)4mcdvB4zA9Y!SUCM@OcbjkcrWpnlwPNl RNsubyk@X!>aX($xe*tWloe=;4 literal 0 HcmV?d00001 diff --git a/prometheus/tests/__pycache__/test_input_hashing.cpython-312-pytest-9.0.2.pyc b/prometheus/tests/__pycache__/test_input_hashing.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3105ee474080269c877810e0d17f441235195460 GIT binary patch literal 6405 zcmeHLTWl2989p;Rdtcu}Y^N!#3rQIoe7_;#DyeWOZ3I%AN|mK*vfdfvHG9)JV_@A~ z$%IsZ8VMs+HAqNtDpdhF4?ObNr@r)M$=WfU@(`&HQQj)3ss{C;|9{S$nXy??N2TJ0 z@%TUgIsfHc=IsCd=lr>)B|+d>{>SfgZ)t@54J-1Axy++?6+%{tNoI(tm}*{`QF$3E zXjxSuh44&75t8UkluKeWF)OyvDINLc!XBTOoT*sRrn=oy!!Mtr+3Raa&T3hQQR8EV zOl>_R_;pp3e7xa&YoTqXtGQ2X5^WTK;88SJWUuu z#Ejllmm;u=ni(_WRV}CRTG;NAV-C#xCE4be)v)YWmhUMhd=uN-=l+aq5i?PXRwLCY z|8B8rjQum>G!FNldP2jtwcD-u70sl?DoBgt!i5xu*S~U57Pg=k#rk?*!3e2;~ zsH+hiLk{vh#|L?$LiFSt}J!FcCcI-)LD9JDvj*0&Kz}q2>yp5K7~MrWO%7H!F zt}_Zc&^Y?#oA6b^#~>Px=q&Lomq`m>;PxQ44Czcy)MO9iXq~r;x<=c;9z6{q89_3> zt)ofN(WIWD7)qSD@xv3pc<1Loo&Fic0Olm#EMru(jSO`{Mf)(;VdmwgZDk6U_Pn*o z25>t^SM!awN2R?T{*|O4kW%AOgOQ(K)>hkbPCvxKN0@RVa=$4}Oy;DNxqFegf z50b5y>2D_LTF=TXkjoP*vsb3Jv>tdjMO9QhdQa>5U_{g!KI@4;1taQ-CA)#HL@Ow) z%zEk`0~(KD?xZ0@>Mg|z~YkCMGdx05xnl8rgb_BfvzfDG9^UNCikuep}>T5^xqy@+P=e{Oi zKk8~o&JVH^fkI)PorGN!ir8L$9`N*v{{IhfEM)KW{#(J+2HG3k>Ipbwll#hKD?A$b+aw~_2cvJXibh#sZz^CXT^rv2FV zT_oSZ77hX;?vDp6lMFLxH)_*EsM^D$DxLxiejdm%L(Ga!f*5DRHh^r8r}z6uK5HMn z)$!ZT)$VKETOED(I{Mc7HaiZ~+eepA0C~`}_j;w#qt`Y4@{xLvelMwSY50ETHi()> z?_sm3HGI|+f2!#>Bc52YLGks9CzkAnrbEx3lE;9vuO5a-#~4E#|K01;N3`Yv^A5|Xbjji38#S{VdNWxP%n@#GznmSV1y9r zYc}gW7()F+%FZz09Wnym@b|Ohd1@F4!LcXtVkK)4|G4%)tYq@VN#S9@nK*~)ilgR=^7IMEL%1m8CriM0j-$FtF|2VU-v;8463{`A zEOpOjOxLHuvh!9UBV2D2*rhX8(d~2T<$wi0vAJVu@zVi1jGc}k8AakJ0UY&rWCA;r z06K;?m<9;E7bn0$`kL1w(t%Mr4lPfn0S9)Z0dRJ+;pD~)JlD#5KRN}rI1u&+xaIqX zDZ%|@x~?6rC(~;u>dC`f8orxugQzulP4FHCo3#_3T(X`R7%;n^JW$t$>d6DQ;`QXv zmWJ=9+aPKUUK6}W!RA)nlS|eU0|RFNU*G%d+F(7of2~qa4sL1qZn_Pk*5Eb4dlYQe zAm2f4kW1DR1GAwGe)TZ!=Quy<()2w})G*9a)-WL7bT1}&g6Z@c;wqzG>>9XU=%>~> znzP|r!fSG(ZkyPdxLe^Sxx)CCbt14=;EKl47D~CI6E$;`-)h7Rae-_&o&G7m-#yfe zy^l#4&xiQ|o@bqWpWP<(4HRLP`Z#v9P%;>QB4hZIHm3wh%ULf$7A z<9{WI&q?S~>_Y5P+l96jWo3AE;@ZUO(Q8N7)Q_VdML%x)sO?Uykv?*F^pATQUB@@b zkG>!$KTow@J$~i*)wi#_eZBL;?i<}7?z^$?R!^gM_|CDrhZ?Er<@m!$Sm}M(9#RfH LN=1|*KCu4)<>0A~ 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..48816591ab046c1b1168f4581bb04c7d5fd64c52 GIT binary patch literal 8708 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 M#^tqPnQy|s0Ln!@egFUf 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..a3d5f35137b74ba82df4d9756931239909f48fd4 GIT binary patch literal 11640 zcmeHNTWlN072PG55Ah}IE!k?!IFFi+O-iEttnAoxf@G5=VQ_Nr z7K|D%$tel9oQ%KaU@0B1D-}vt_Ee@f^lYGccd9B~-BZnTD?H`tjmKk*r>92pUgUae zr3#>Rk`HLTQ0sPMjU!gu~rtPWa6wSpOY0$uPsriMtI#v+-w@AnM(Nw| zj69!rXhE~iVbtZFk|QtVoH=1|D@eI=F7=;Ur6D)4!QiY^a^_rpyhPjdIc^n4ExEKB zLuR1X;H>mkkv+$$O}75)EeV6u0tRP{k=R=_8nsrsyoJI`F3G*_5!J0eqMWHMVwWs2 z5=#*PR4Beq3Az)6k+dR-BiXeON~o$#G}_Z1Y%`SI^9a#Lcd=%b1pYTT-H}msVJM;X z>%u@Lspu7A*Rda;e)Ema9}ySS6NDGtcW@}Hfk6-xM6VKi6RDI)Cp z1e23aXrg?6D3wsCy_xdrZfa3ff&fSmmvuirlf7e`J+srEX=fSM6Dp@u}przI?534a$5u+kAnqtucqR|}6 z>d#Rf7AJ&Z_(aqul_T3>NFn&Chrr;CaSwtG*Bv)J*E}}@*8-ouHQmx#XzVHkkBoIa zsEgcuxlq@7p?j=zeD?!?Xnf>@j%lHJq7}$^$3*Llzxkek_g$7}8I#Tk%~#?qSFl*K zdKMaunAHY5hh4E!5SVB+#Z3nK!m$j0uy0z}I8g;;eBVUXcOYZpq!%W{z& zpvto40wtK&w}4FL1+l4p#;k=*WUlgyy za*-C$^4gZ``=;e$4-t!&OH8VUEn|zWcIXawe@GjWGV+2J7G1V^Y~NTcF^`vTES9$- znJUX$k*J5KHb2U1hDHCO>s>R{+tv)YClIf~ zzUWmd@@6v<5R`xjVTRqySVPWbj6w=tcd{s%<-Xh6meQ=-XltZKTrBT`&52OAE}-wVP}|nhwsS{IE8M4B zTK3VqM;C^bq^1kUy1RY|v4_Fa5s&Vp`xv5@9g=m21_1;$GfaAA-K#X;6hBojE+igLdb|XRr%#sLE8;ua@&V-Vka?z zY(_$z-7s>`BiVukftZ{EGUWl)V)UMLKn~(A_y(#yrqXH;qbv%&#O*aZRh-;mcCpQ* zrWI90-U8We@KgT)WQ==Q-#q=|zWddUlYRGV8YU0lZvWCF1l?nuU-`J|mnPpVRK0TH z_}FXX?)#Nh36u;Ru7m7~{@hkD^P`uzrcE%5( z2kX9zm8_s(v2y}8V8ye*FKz?nAiI3sfWb8izkQ40my=xAUF(Kk0BXs*ZU}ld(Cd9_ z&7noFZUh4S`3^aMWdwq0@!v$CM`+b4xJ29~VF)2(2^Kvu z3>}0%SB0Sn1p*q@D!Q1|`z+z9Q5dt~Pi(Sve01XVE5Dct#r|XbsW1Il@>3Wu0<-#i zAa>w6L%p9T_kChF-E*PXv=Bq=i52|F&iG^Z1na(wm8_s(v2#KU8nEJ7;1{=na*(Ci z6WOGDL{ZB0ilXi{jsj7qQ*RR4;h`vVX7MZxkw?Itpk5YR;zYVi!xHZh&es4!QBMqnI10)4yxYSU83FIG6p65U3wtT^H z7rFN;{=)ela?VTM3*JkW7b-vEKWe+W`{UhLJ3j81bbRLd#PeC@CzZFoh49`x?SHB( z)Et@Pj())%{VTWaVIcJ3k;_LuJbC%#MD>k^YYjIxU)y}MvC!0Z`|zD@g+S+6#bdX? YZ+aYBLcDzY<9ZJto3HiqE%dYe8yEJIKmY&$ 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..a28e20547325338858060c5b0ccd2dd84e8417da GIT binary patch literal 645 zcmZuuy-(Xf6n|%juY>>+T^Nue1X4W^1M1KLRqenOi2-%WVww0TF0s#gcTq4(B&$M# z{srB;q5diT2hc4HOx-G_6BF;wF(A|@`TgG4?|qzqH=A`JDgOP8Hwf>IQ;9P*CYxmZ zfCwVihc2_|ByP`Pkkq;}3?kK@d7fi~$mJzF%6@H_w$B=_pJN$gH6iUfawYJ`7`K~9m zYoMmse%yoLLkEvjyyxX^vPDoB0WG9s8@p%fk~(WexCKiG*p!F9Ni#xP&VEv zow96Cn$udXha>+~B;3bAnsW4q0?+)ONTtFsPSv*Y<*CU28#7x;-|i+8amIt>i^|$r zuItY+T%MF IV=I>M2qXKY@c;k- literal 0 HcmV?d00001 From 4ea42b9de21074e03b67ea90ceb51556af6b7599 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 28 Feb 2026 14:02:26 +0000 Subject: [PATCH 3/3] feat: add MGTP minimal decision artefact demo (deterministic, replayable) Co-authored-by: LalaSkye <228581229+LalaSkye@users.noreply.github.com> --- .github/workflows/ci.yml | 4 ++ .gitignore | 7 +++ README.md | 40 +++++++++++++ examples/minimal_decision_demo.py | 67 +++++++++++++++++++++ tests/fixtures/golden_canonical_bytes.b64 | 1 + tests/test_replay_decision.py | 72 +++++++++++++++++++++++ 6 files changed, 191 insertions(+) create mode 100644 .gitignore create mode 100644 examples/minimal_decision_demo.py create mode 100644 tests/fixtures/golden_canonical_bytes.b64 create mode 100644 tests/test_replay_decision.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1a42fe5..015641c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,3 +27,7 @@ jobs: - name: Run tests run: | pytest -q + + - name: Run decision artefact demo (check mode) + run: | + python examples/minimal_decision_demo.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a8e9569 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +__pycache__/ +*.pyc +*.pyo +.pytest_cache/ +*.egg-info/ +dist/ +build/ diff --git a/README.md b/README.md index 3117775..186f71d 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,46 @@ Deterministic, hash-bound commit authority gate — stdlib-only, no network, no - **CI:** [`commit_gate_ci.yml`](https://github.com/LalaSkye/constraint-workshop/actions/workflows/commit_gate_ci.yml) (Python 3.10/3.11/3.12 matrix) - **Proof:** Determinism + drift-fail validated across Python 3.10/3.11/3.12. +## Deterministic Decision Artefact Demo + +Proves: same inputs → same bytes → same hash → replay works. + +### Input parameters + +| Field | Value | +|-------|-------| +| `actor_id` | `demo-actor` | +| `action_class` | `FILE` | +| `context.description` | `minimal demo commit` | +| `authority_scope.project` | `demo-project` | +| `invariant_hash` | `0000…0000` (64 zeros) | +| Ruleset | allowlist: `demo-actor / FILE / demo-project` | + +### Output artefact + +``` +verdict : ALLOW +decision_hash : fab8740c920489154038063620e1453460e1ea1549d0cb1f0cb2dca0ce860360 +canonical_bytes (base64, first 64 chars): +eyJhcnRlZmFjdF92ZXJzaW9uIjoiMC4xIiwiZGVjaXNpb25faGFzaCI6ImZhYj… +``` + +Full base64 stored in [`tests/fixtures/golden_canonical_bytes.b64`](tests/fixtures/golden_canonical_bytes.b64). + +### Reproduce + +```bash +python examples/minimal_decision_demo.py +``` + +### Replay test + +```bash +pytest tests/test_replay_decision.py -v +``` + +--- + ## Scope boundaries `/prometheus` is an **observability-only island**. It must not be imported by any execution path, gate, or pipeline code. It observes and reports; it cannot allow, hold, deny, or silence anything. diff --git a/examples/minimal_decision_demo.py b/examples/minimal_decision_demo.py new file mode 100644 index 0000000..a7ebff4 --- /dev/null +++ b/examples/minimal_decision_demo.py @@ -0,0 +1,67 @@ +"""Minimal MGTP decision artefact demonstration. + +Proves: + 1) Deterministic canonicalisation — same inputs produce identical bytes. + 2) Stable decision_hash — sha256 of canonical request+verdict+reasons. + 3) Replayable reconstruction — stored bytes can be reloaded and re-verified. + +No randomness. Fixed inputs. Fixed timestamp (excluded from hash). +Run with: python examples/minimal_decision_demo.py +""" + +import base64 +import sys +from pathlib import Path + +# Resolve commit_gate package from repository layout +sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "commit_gate" / "src")) + +from commit_gate.canonicalise import canonicalise +from commit_gate.engine import evaluate + +# --------------------------------------------------------------------------- +# Fixed, deterministic inputs (no randomness, no live timestamps) +# --------------------------------------------------------------------------- + +REQUEST = { + "actor_id": "demo-actor", + "action_class": "FILE", + "context": {"description": "minimal demo commit"}, + "authority_scope": {"project": "demo-project"}, + "invariant_hash": "0000000000000000000000000000000000000000000000000000000000000000", +} + +RULESET = { + "allowlist": [ + { + "actor_id": "demo-actor", + "action_class": "FILE", + "scope_match": {"project": "demo-project"}, + } + ], + "denylist": [], + "escalation": [], +} + +# --------------------------------------------------------------------------- +# Evaluate and serialise +# --------------------------------------------------------------------------- + +result = evaluate(REQUEST, RULESET) +canonical_bytes = canonicalise(result) +canonical_b64 = base64.b64encode(canonical_bytes).decode("ascii") + +# --------------------------------------------------------------------------- +# Output — regulator-readable +# --------------------------------------------------------------------------- + +print("=== MGTP Minimal Decision Artefact Demo ===") +print() +print(f"verdict : {result['verdict']}") +print(f"reasons : {result['reasons']}") +print(f"artefact_version: {result['artefact_version']}") +print(f"request_hash : {result['request_hash']}") +print(f"decision_hash : {result['decision_hash']}") +print() +print(f"canonical_bytes (base64):") +print(canonical_b64) diff --git a/tests/fixtures/golden_canonical_bytes.b64 b/tests/fixtures/golden_canonical_bytes.b64 new file mode 100644 index 0000000..db15a73 --- /dev/null +++ b/tests/fixtures/golden_canonical_bytes.b64 @@ -0,0 +1 @@ +eyJhcnRlZmFjdF92ZXJzaW9uIjoiMC4xIiwiZGVjaXNpb25faGFzaCI6ImZhYjg3NDBjOTIwNDg5MTU0MDM4MDYzNjIwZTE0NTM0NjBlMWVhMTU0OWQwY2IxZjBjYjJkY2EwY2U4NjAzNjAiLCJyZWFzb25zIjpbImFsbG93bGlzdF9tYXRjaCJdLCJyZXF1ZXN0X2hhc2giOiJiYTEzN2RkNjM2YjNiNzZiZGI2YmRlZmQzNjc0YjQwMTkxMDY1NGU3YmY3MWFiNDEwNjYwMDg3NTU2ZWE0MmUwIiwidmVyZGljdCI6IkFMTE9XIn0= diff --git a/tests/test_replay_decision.py b/tests/test_replay_decision.py new file mode 100644 index 0000000..466241d --- /dev/null +++ b/tests/test_replay_decision.py @@ -0,0 +1,72 @@ +"""Replay test: proves stored golden canonical bytes are byte-identical on re-evaluation. + +T-REPLAY-1: canonical_bytes from fixed inputs == stored golden bytes. +T-REPLAY-2: decision_hash derived from re-evaluation == hash in golden bytes. + +Fails if any single byte differs. +""" + +import base64 +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "commit_gate" / "src")) + +from commit_gate.canonicalise import canonicalise +from commit_gate.engine import evaluate + +FIXTURES_DIR = Path(__file__).resolve().parent / "fixtures" + +# Fixed inputs — must exactly match examples/minimal_decision_demo.py +REQUEST = { + "actor_id": "demo-actor", + "action_class": "FILE", + "context": {"description": "minimal demo commit"}, + "authority_scope": {"project": "demo-project"}, + "invariant_hash": "0000000000000000000000000000000000000000000000000000000000000000", +} + +RULESET = { + "allowlist": [ + { + "actor_id": "demo-actor", + "action_class": "FILE", + "scope_match": {"project": "demo-project"}, + } + ], + "denylist": [], + "escalation": [], +} + + +def _load_golden_bytes(): + b64_text = (FIXTURES_DIR / "golden_canonical_bytes.b64").read_text().strip() + return base64.b64decode(b64_text) + + +def test_t_replay_1_canonical_bytes_identical(): + """T-REPLAY-1: Re-evaluating fixed inputs produces byte-identical canonical bytes.""" + golden = _load_golden_bytes() + result = evaluate(REQUEST, RULESET) + actual = canonicalise(result) + assert actual == golden, ( + f"Canonical bytes differ from golden fixture.\n" + f"Expected: {golden!r}\n" + f"Got: {actual!r}" + ) + + +def test_t_replay_2_decision_hash_stable(): + """T-REPLAY-2: decision_hash in re-evaluated result matches hash in golden bytes.""" + import json + + golden = _load_golden_bytes() + golden_dict = json.loads(golden.decode("utf-8")) + golden_hash = golden_dict["decision_hash"] + + result = evaluate(REQUEST, RULESET) + assert result["decision_hash"] == golden_hash, ( + f"decision_hash mismatch.\n" + f"Expected: {golden_hash}\n" + f"Got: {result['decision_hash']}" + )