From 60bdc8da8d5209d425457d8b69fb4cbb42f2479e Mon Sep 17 00:00:00 2001 From: Dr Alexander Mikhalev Date: Tue, 13 Oct 2026 09:21:40 +0100 Subject: [PATCH 1/2] fix: delimit the exact command in hooks reproduction --- scripts/test_agent_hooks_publication.py | 19 ++++++++++++++++++ .../agent-hooks/harbour-hooks-example.zip | Bin 30326 -> 30482 bytes static/demos/agent-hooks/manifest.json | 4 ++-- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/scripts/test_agent_hooks_publication.py b/scripts/test_agent_hooks_publication.py index 95086b1..5097df8 100644 --- a/scripts/test_agent_hooks_publication.py +++ b/scripts/test_agent_hooks_publication.py @@ -1,4 +1,6 @@ """Bind hook claims to actual captured failures, correction and executed output.""" +import ast +import re import hashlib import json from pathlib import Path @@ -52,6 +54,23 @@ def test_bundle_proves_hook_result_and_execution_separately(self): digest, name = row.split(' ', 1) self.assertEqual(hashlib.sha256(z.read(name)).hexdigest(), digest) + def test_host_prompt_delimits_an_allowed_command(self): + with zipfile.ZipFile(MEDIA / 'harbour-hooks-example.zip') as z: + tree = ast.parse(z.read('reproduce.py').decode()) + prompt = next(ast.literal_eval(n.value) for n in tree.body + if isinstance(n, ast.Assign) + and any(isinstance(t, ast.Name) and t.id == 'prompt' for t in n.targets)) + commands = re.findall(r'```sh\n([^`]+)\n```', prompt) + self.assertEqual(commands, ['python3 validate-brief.py --chek']) + config = json.loads(z.read('fixture/opencode.json')) + allowed = {p['resource'] for p in config['permissions'] + if p['action'] == 'shell' and p['effect'] == 'allow'} + self.assertEqual(allowed, {'python3 validate-brief.py --chek', + 'python3 validate-brief.py --check'}) + self.assertIn(commands[0], allowed) + self.assertNotIn(commands[0] + ' .', allowed) + self.assertIn('Do not repair it or add arguments, punctuation', prompt) + def test_article_preserves_scope_and_downloads(self): page = (ROOT / 'content/how-tos/command-rewriting-howto.md').read_text() self.assertIn('date=2026-04-15', page) diff --git a/static/demos/agent-hooks/harbour-hooks-example.zip b/static/demos/agent-hooks/harbour-hooks-example.zip index 9ac6960bb4f441cf6b7c8de326468fb0475c12b1..6897df5f7460ad974843615fdf716ae807d963eb 100644 GIT binary patch delta 9123 zcmZvh1ymeOvxXO!5F`NtB)DsWy99^e7TkifxC9^Ef-f2%cyM=z-~^DLhxW7e&+iU$ho8|Xfo4iZsN9I zwapKb^bTRF$&NPCyStcAV|-}b;z=Fgs!73wcP?+-GZ^DmHgi>)&^67o3QSTmSdXp3 zK%f3lEG%V#mMP66{CdW1ukT|a0NmdkAEtTzIZKFqxIX&@c+^!F$~60H)Qd-qTi`F` zRI?Gt4&|&7Rk6ztfPZ_!(+d<+*UTtQkQI)%0ykHadS04Cr~%Z2zePsqHds6dWY`AO z=^{0K#pqI!yZ5e`G|(J25}PP8qtpuPue}<0ug-(!7ivG5dNsG!-&RZmM5XdxTw8y3 zH=M1!8XFhDgRQ{Tz6<*(8|816#sp@IVzC0;e(X;sV`Q~&=50MAw~X9`=cy`jLYl`W zzuuP}*H^ut{@p1!;8TqkuthExBHhJuo7c(0TtYTYIa$Dz=zxsBFN+?h7wK^T`)b~* zR8sR7+~sl%a}R;%gn@A{um>tS|1HaASmmJa6-&9!LvJx4z_01Sf2nK3@ts;vaNhO7 zmK}W6E2bPQS`9j^C=%p3Y9$5Vs`O<_ImYoU2`gn9QCB;`UuGkT%BTc0cRu!ppmF?_I{(=Dm?9Y z*}QU=C@s{?IawAqP|1;viF94KI66=_vF!t$YSxfZ^^5LtgjUmoGnd<=@4<^UXqAYe zZfD7Z6O($Me>Epkck%7eEIdck;GoD7e5X}ZNZb4TW=*kb>23_J1gFiggzC-h!^e${ zP|XyL@t5&c=R1SmrT{uYF*~|Ynj^;^LC89-^2-`LcQzM;2+3x3)5`IVj++GxiGlt6 zG!^?F&8hEkhpAu7;>;zvg}Mr3tsvLkw5c(=tVeOXON+!>(z|LGI3R9Igu%LYi#@yS zZBKofqvk8(iA>SE!reVGuk;%*FQ$wYjUVnsC^@@j(JFgi7FMHN^YDZ!(@))xhJqXwtKh zoRJ0U2>U4@57dmNsk!!S5gA9UKeTB#A^G^JW=_4xMxzJTGdhtgI63U2ux`FpB6zGi zC`G>FG`-%f;QpJc?SHzfEn69_J-`Z{&ct>t* zpG@d2LZdtowU2?5LkX_y!O!l95IO_1WD9Rt^&y5E!otAvA>@+~$Z!vG1P&=-Vl(-k zD`A0M)YFVt_!Q6kq<=?q%1ASCEHjf@#&pBmb67nCk8{azX=Q~8=@);pgwu&ftQ$^U zD7p-q-#<9}fk7I~ZjdX)L;LcNMmsKA{H$%b!Pzu`R%ehfOvsV>nTGok?c93iS}CXa zp(PgIi?0Nu1as_oKVLJzgBqDFZW{aehlkxTX10MD>Y~|?s0l^f77?@83?hcUyksQf zw&gSJfFM|Zs)pMl2>+WgY`+O}ZZCx2S^5YOS*sM~4A-yhf{RNyi7HV=T!&8pVXLpA zGvf{@m2UA=My`|hucng}Wj3((zoYCp%?nFWjEYux8A9-bvMSlgkPaoJQZ71CYvur0a;aOblFgTs^UIN83T zM?uvxACS>7wF{3NVf5h)=HlUe?iAF^YN~9r0}wh=e47d9YTr)Y28~Y6a}+Nkb)EkK z44QQ#OVPiJFqxPu5E<2m7)^S!6nQcoBE%MCpw<)`uL%re!NM$KQjDTS{D?{NY@xlD zqa2!ZRw!swrtAb+?SDxBJ&c$AQ$YZ}8O73-kGO$^vg{+Wzyj)U_d4^D{mq}U`bn7c zk)C&sM_tHi4s>^nxOfr>unNr98m=L~fO3|PZ*#~A>N&4awJ9m9;8n9>I>c&#S-7ar z*$unDfZJe+{!KmL+9M}13_{*d%1N)Z9JLk|#N;oDJ}M3`lG3x$f71VB|2?*en10aj zR)^Nj(O*6Xdvco^#%*#-*0y})W32G#^(3Mu?TKZ<#?cLC1PSo(?J_(?WSGre0GF#e zg-xvW)%pD!iGmDwm%Xe}5-(GPW@-veo>xKNR$OC{K@#*XqNKX@9do?dM39bOHlHq& z^xjJFs=-7ycz;&zpnoqSO3W`Lg-zUU9;M0Ckr4G-iay2J86J)A#b)MWWIRZ*rg8aa z;YREKtpa3qMhg&MRVw14AUqZW5N*Q5Cv!o#`&1gN61l@5Ka~b@9h}+tR|DJMe&<-Sx1Q!@+K3!hjQQlnrbFy{3O6>sDjf_GT`6J{H-_}lgb&d<# z9bX;4y)3QsEX2ZUd396oY=>tjXOqLP2me?!vH}l#i#>1cl%tz`d5x0T956I2nct4~ z$cT2xNXIDx4rRf_va+A-J-To^QfMnosZj6U&E1!s*YgY|x*&|NnM-GDH*P+b5%nsA zu{7NjLL%0*4F-us%#+(_M#Tg1ANJ}6(8hZV40Uhk6Nb4GaLi)Es2AQLjDWE-Be_0w z)-r}fN-I%GMtwMmu~2=Ru8WM~m-3>34{e6GdEx6fz~gjw&HAv#KS5dB@1v$X+-h`+ zP{mVe;Tk(#j#|8FEk^FbiG-e_w5(!^FgBel@kKA_^HI5A;_Ud;;+$cnm7nDtpVejK zY7(;&Iz3lbl2gA%ci4gu8yFR*e+)7~K%UdDTO?h|mZUipZ)#IQu9T-i96Y*c^*jg- zac2Z5t>s;8S|FC+L{EVf35~CDXrbU)PK;0>$t7u$Kj(iYu#m0IzGGAv_wGpd$TM2b zpdsMsL8MtX$%4*OeNe;6mTJp?<}!I_S{Aq zIZ7?%t9rusLeog^I8MJ(*~x`rHRyYmDfF3Hv|r^p$hznCaD8 zU~cQZ`Xtv+*XImWY$lAh?M&*$YGz>r{04v$NJ6!3BQISlN>tw^g#9D!uwJe%6H(FP z+_wXcp3y(HYS*jygj-!)m_h!=u$-mDw|-O1%xzd7M7z&pmmB`ewb#F=d!!X&_^AM2dY7~ZdEdft4HIcCKbB$XSsKKx zNnN2-2cvQSU|gJ9Y3pHY$6}b?fYB?Sw3j{tCILGv909>F3-Z zf+&?gXIj5{dHK=|JUPGN7nyomQa2$d{V6f32VYtOJ0OaZK5Gou8&x%5(TG7!2vbxl zG;r%zWq1aw>Dl)$_#Rn}wQkMz{ChSRxu?5wc{EBs+{U7E(~H(fb|XTM zC38F#f`z#Jr(r$S!ne=a`ZEyqA`UkWUD3y zy=TuVUn05Fyc9SsbJ%I%7*Bew9jp0GCC@-n!Fc0@2BXd*4}omh$ z9jYqpXmraEAk0BvpTlb79V4moVKzJ$b-W0nxmX&w$J)7{c(b?wCMvtHYPcWvmmJPn zf>G>xsRTk*3noKA!pQmcfhhR9UA`gqD=ABwFtx9NOBhz=#DLl#z6QJrGWsFR@FfAi zna&K6e5w`Y?HEGRF8ynNr;zxUVrLeg9g`yP0#AF+InxYC1*d113o+;v$0s%8M4mGm z!cJ?7v7%s|?!d(7)dlQ@cugTlRlATC_dZl+1yN?!`{ze8W0XF)o$Y2lfc`FE3I-q) zw9U|Zh1MVb$(l21!9A5R-ON`{%{CTJm?wM9>I@Crafw31wY+yv?rJ_NXn3Aq>nRN3 z5ng$66N!*R-6EpBQ2SiG5^8@)@Ivi_WGB>iNvlHb8<}RPot1TlT4i}K)V3?=LM^G1 z8PtAJ{*RhY6}zW4gj3DzDP4xzJ7{?HqyCe)N_H(hXgFSb=83Y`35IUc1YG4F=A(f? zOQaysqXF3)+uGY0Ieju_vURQ2)N+`u!|~cI6{=44smq|5<+Z9kIck?}N|xa)?>Vl) z2<;CL?KKp|(uO_BA$qvIO`5`epW^2rxae~-pVqCV6S?Wi9ly?AcrYLx zCkXG?z9g(x-4E0}>l=`+u;6`rg5b`$Q$I5SPFnnG#W*c%ttP`TpoU!(AAqfCf;J%P z*&~`%9?*Ys5?UO~VTY;RyIAYW$j)2aQ$|eo)4e?AOZ9@a_+-UU0yh_)#$=}EdUAAK zOwREea%Z)^lbn7E-cXE{EI*obR?$9D#ShWTy^L3JRC)k19FrUG1{A!}ND)j@UiFs0Jin@IaRO@~o%K0<;_XRJiKZ901<_Ni@A z$g);Tjt&E(on$|imTNJtdo_Y2sw*wywI{UjlNzO|9961f#Nv(;(%4Iz;=UAPoeG~& zM^;?ip3!`6liKwj*?eO=AT6e=^x8)jOdD#*gu9y?nbW(hNR?oymFQ0o4>H`r=N_L> z(TZ|ZGYj4}=(QxCpcu_ti04Cti*_-&z$hQ>cxMZ|PY9kOpcS7hSkXl9_@qW}Ty_w# zqYHoiyCrnps^q!4j779%-@>9fIcIJyH#}b@8-w5TSK^BCSHn(hJ;A~`LgZ5~JU(*x zrWYAEYWRVX@kt|U(2?O@0ms6m4wke*YJF@v8v&wojul-I-~rE#9}sv@Jpabo`l^2Vr$i}7rrTZS z@ma4i4M(r6@qxJIO|V{NUlbdj=`vBHXj-2C?|2%*Re9aQ-Xa_$aO&m@QH`KM1}p0_fHbHTDBRb0Z zRM6+r)My^YPcv(5Z6AE3r;-O#@Fm`_Z4;30mZ43HY3C2QeYfyw|NT2L&-AmA^2k9A zeapT!L3A*Sz+i{X&Q#s7Ow|LxTni!IsM6u)vQ! zwgq;BWfici=sp->>R7)w=F9ZW1Q2p+JUMJEP(q4-9o1msENK-`^2M6(DbBLIzK~%# zF$wiTCMMyjZj_(CivL{B7_wGXq8g6fN{v8FHMWM<2#B89hS?X=cXC@cKmTJ5H#;)O z?WDLil)tE4dfaQHu*|nE0&1@D=8V3Hd#@0xIylK7=RVOkNT$l z0gQRn8s*VzpqfQ^uL*mr+3BEL7^wg^Ppc31jB86k->d8IpuW6&RgEdO`J35BPHd#u zGGTYdbQn%kC*S($MEd*3*bejMUMpmWp#JMM>H^00~`Y&#$ z$qnX7a}@OkDZfhyu++W6xI-cvs}wYwREbzrLUqYIMkNU!rZ06Dv{RP8EIx zjad7Xrl50$cSl(IL`fxV{WjunI>0Q6!=G&+NF>(-Tic&G|12Uo+tTkc^2G7s#(b?$ zYp>6fRmEKG{R0ETN=DcS zd*#B{R`=T11fvwEp1$!8gWzvdKBl_C_KeR3BBaf&Rhq>SUT%%NF&@*LtykzM_K#+k zm^89C3S4Ha>t7R}X5MopUL+^qOXld|OHAHFiAAa-RQkk^j~Mm<6wFtZGEd@244QIK|HOZ-kjcE7vgmay zTPhIyr^ZL8F)=>NHT9>l_I&vWvWxqDMrU^*B4Yqu8T)+=RgwI~cZ=EflSG}B^9sxf zn0g#|f$mt>9*%l(;0vunpP~4jE_X_#tHK(4tRc-Q9+d{GjA2x1UOJeuC3Nb!aE0)| zuz;}{!IAiI#3JQ(DBzpHVHLH}5b|x8$~c)TRKvZFj0vy{?4(}*w>td5=6fXA3 zd59Ze1R6T`tYN-t+hwp?mW@RsEfY;mNN|E4ceq!j%X z<4;ky-&Ko^ND}6R(5tmZxz2rD7tSa!;z-NBcFAQyOt4&YLB6u>eHjPln7Be!5zRhVasmltDtF&WGjv>6+NuIK~}h32Y7xtpO6gAIm;X zH81xZdoWXn($t;7mc?1-VY5NIycbCbh9MPSWo&Zi6 z=r#=>3V?_IPRX@C9GK?$m1yAmT%nKr>yYK{Z!Fd65Ilegp{6KV*Sl3ezvPfa-l9$1cX83pH-X%X$|q`LMhW<1 zeAXZBN!;))`Iyu?zCKX@q5|W!B0mgdnaD2^VsW$v+zE}3AC(pF6mx3DZM^sv&Ch10 zx@S5laM1!pE6DFhUwjSG+w=E>js4A=ET|m4FFOzMot3;2uh*hN{$!zuTYVt8SmgN8 zgYd^(#sz*IA|fS4u`xu*ns5vdJ0?qYIjZaVJtu`1qa7~{3>F^soc$n=NPV+XnB{aGkYe~La3gI?!TQz~!Lx(m*5 zD$64QKbrclV+Gh01H1{QdttZA-tH%2?GuWLlmE29&0DVkJ{d6{v~SS-WY^&!{n0`_ zawoH(L5>#bDd79Fs+8AFH0zcjzD>CVaM$TbFJJp6VqEV)mA_nm=&+ff=h0OBIj5r5KAI5DnTbH&1|TR*3U3YB+#DJQn2fCDIG5 z!a55;ukZy_gFR0D*A8H2V75m`dfQuT+&HcdA3{g9Zy(&!H@2?!t|H;wA}CjOd&!yw zE_f|2>iI`UNIlM`H1r>)EhcR3g-(+3887VJh#*9JeI3+Tp2Tk``uHzLO+Ryr)N(ij zXdN+>J-&od+e9I)F<<8NaXeX#Jjkahis?wn z1z~g2{B+#@bcWhI)C)$_yp`g&tf!OK3}6_4BV^8L5?MP{bHBwOdRnbMmvbSEh?;u1 zaD~akXX1#US+U!3we?QmjyFny>dl{Wzfvc^nuj0~>quP)*D6y5(Q=^d13PaIAU<5UkV7jn=*b1QyCC*QDSMC4pnqq1!v4HyTKhHQG~#2J5E`GrW&JY{;JVn?I`k<}qv6 z;|d}Ft3!|g6b!W?go4=qa0FS8z}DmOH>e{F1$Bk7AjMYD>^IO%??s?~2HV%r4ycpL zlD!@$rX3apV)`qSi6|6wx21uCT(FlsW{;riBlz|&@SXU7K@`Z6EeRBUhLUx0`UoLC z!VG`G>k|J9A4*_B z627JY8Bw5v$U8s<>o`1#5LJROD^dSjKp8Yvq6`&Ks*D9$a)O=%?v9LL|wRvn_}#0E|1lG0QOc|0Hfk)!{spL%V`cWuUhbRRf9>5hXu pbEX!3x;y{9GxN`>-Y~?vfA7;Md_X{aic&v*Q6F!h6N{(T{{RwXV>ti- delta 8871 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 diff --git a/static/demos/agent-hooks/manifest.json b/static/demos/agent-hooks/manifest.json index f1174d6..8b4832f 100644 --- a/static/demos/agent-hooks/manifest.json +++ b/static/demos/agent-hooks/manifest.json @@ -41,8 +41,8 @@ }, { "file": "harbour-hooks-example.zip", - "sha256": "f17baaaf504380209e9574d0990336d517a66f974a6f9bf27bbbab704c9acb71", - "bytes": 30326 + "sha256": "bc5e8277a99dc6a7434b723a5ca0c3f20a34449b6a4527ab0721f988dd4eea45", + "bytes": 30482 }, { "file": "screenshots/executed-result.jpg", From 107ca7e36e08d6b69f70effca254434cda3e1feb Mon Sep 17 00:00:00 2001 From: Dr Alexander Mikhalev Date: Tue, 13 Oct 2026 09:26:43 +0100 Subject: [PATCH 2/2] fix: advertise the published v1.21.20 release --- config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.toml b/config.toml index 155c656..bd2daf3 100644 --- a/config.toml +++ b/config.toml @@ -51,7 +51,7 @@ include_content = true [extra] version = "1.21.16" -release_version = "1.21.19" +release_version = "1.21.20" navbar_items = [ { code = "en", nav_items = [