From 6ccf340d29f25fa02fca402b129e26bf408919f3 Mon Sep 17 00:00:00 2001 From: Jeremy Silva Date: Fri, 31 Jul 2026 10:22:26 -0700 Subject: [PATCH 1/2] add optimizer docs hidden from docs build Signed-off-by: Jeremy Silva --- .../optimizer-experiment-comparison.png | Bin 0 -> 35415 bytes .../_images/optimizer-insight-detail.png | Bin 0 -> 11151 bytes docs/agents/insight-driven-optimization.mdx | 604 ++++++++++++++++++ docs/fern/gated-nav.yml | 5 + docs/fern/versions/latest.yml | 5 + 5 files changed, 614 insertions(+) create mode 100644 docs/agents/_images/optimizer-experiment-comparison.png create mode 100644 docs/agents/_images/optimizer-insight-detail.png create mode 100644 docs/agents/insight-driven-optimization.mdx diff --git a/docs/agents/_images/optimizer-experiment-comparison.png b/docs/agents/_images/optimizer-experiment-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..0120adbdb754533ba507743190a96afb548ada32 GIT binary patch literal 35415 zcmbq)WmsI@(q(W6F2UWs(a^ZNg%I2V1Pj64-8I1p7M$P`T!UK^B)BvdEI@FFIh}jo zZ|=-|KjxXq51!C;pWbJm+N)NrS{3z5O&;?(>GNmLo?$8~$h>~`4BqkCGdLMkWZ;z& z9E7lE&jOz*%1FNPH2$59GEXVn@_6C-VNlxPOX#z3LIviaAN;7HgoRNAds!TVV)L;r(-XH@_DAzo2M^SxcXwL6Jix25+$)=-CXdbxl_VyQ2~VYw z-->;=*__tiTb5U~zGtY^GcC^X-fw8%EB?%SkXgH%AEP}5{ars%Rd~UOfQ-Ss$yVL& ze3J518955-YOk}?5!_DJWVNA?jO-Fvv@Y1_xLRei%(N*s+l&+7oEtn;6Mr~2Td+vu zkc%hJm?F}B8)O#EQp`LMN2W6@?%ab!L_igA?{wqy2ik*q<7|g5xRrQ%)iAC0c{ZtY zN{KCHN$hNlx1Y7V;`RN$P8X|XmeYXQ_fWKLF>dkik+^iP?=R*|K=v)$sRU2ePq)?K zhm@YsAfC?ajTj=fiW({XfculdlFetP5WyYxm&=a51Wzl+{%MU=;{Lw1cSmh$cfE-; z(yv#31MBWj)>P9IIsYNOeF9FH5Pxcq9dw3mSVw=3&yk+*fx(*6Np--(LCS?-Ood>p zWTBs5kXMY!nwNZZbw_Uk*(@g6O5Ox1ui2mWlL4}6Xk2=_dA#6jp)M1j!*6C^%Zin{ ze(IR0j@lGw6w@3JiC!&hDz^Qu8=X37TCn`QLAG`+$34nkPyg}TgxFo- zMWNqCxd}(A{`<0XpNpS5Ac)XGh1stRE48I;-_zm#fcpT3(N>03-Te9Y<(02}Tlb3D zW{o^nkl_Yvbw42!nfN*_!Zws`bX=nP(CV{YW2j7TG+UJ}%Toxpn64rnd*i&BMV64P z3ho<^nLRAw--#QjbR&}K0gpG+&eN&_9J6{>*&E{mYbr~x!d)POOlXALZTF|6C1=;? z)9Rz@Ybw!`ECbCL37;x#&a23)9EaZlTL* z406f2keaPe%BfE9Cu~*CwEeh0XZroFR?@1t5Bx9da~UQDU3Y)bFAEY%iRV~l1!d_j z@c|p?4WERHLgnko&=K#YeQPY+T}!_OZ~v<(E%HvA7ayZx%&>3G&FM$r0uePM19^tc zXu`@19FdbIO9Hyg{?Q4YE)*x4!wuH3FO&--L=kHt2t^Oof{{6Uq1Zcf_^zVxeScHy$F_t47DGP?dDlw*TR=bR|?bJA74^j zukX($$WG&f8iEi|w5K=$G&;QkU`BITb4eCU^!$f&?!~MDsL1bjuf$@J@$(0sNs-JV zht8W{7Gk-6mwHOV>!J7~eDF2}@(G*)Q~&~7_&+}(_R@!tyNqer*N?E4^L-G%`(2-Q zA|hV2Lo=}kY}cOMZBZZ$NTwyO&vKvIReXSz#gycDvlgifA2zVW{kdFn5cqwU)^*QN zR4*#EqaJXpsT6Qf+4P#!+Ap>qQwr{c2x)mr8I+w$ZZ#=O!~x4S&J^naS}UFa&;fez zKWf=w-9Z3g^n-p^H#|DuZ*d^@8VntKkVYGJasxV-<)|T-i?-Ft#!OJL+ueeV?KG3B z-w{LE{@qCFGLt16{lqu*H;~?JYtJCUI+syhXpwUi9?RVQxPDFs z+deF%^2|jZ&ZqYTHd5CN(L*av-?of$ zwiSX8VHgbBtj(%j&N9gfe6uX9o@Fnit4K^d&Z}|MKm1jsGvv2+a-Y+e9 zO>X+-&whC|BTdr82T>qTZND5_q;UNq$>O&jMx7>nIvDSswtw1) z0TEhdImvykPnXw0GJI^)%Y-4L&K5i-{VH+EnVZ3fT3He+_jm@$MJNzlmA|KB_2Ejc zz7ix;_TKE|t|g}KeBle##E5KZ?&MShLjw^;&WTSCugeA0=`e`7@)}hTLy;tH#<1|- zG`2cZxX+tD)t^0uw|YRSbAw`>bWOuvjEJ}cNjbR@fQK}jCHpozh6!RAp-LvSs-c&- zxqD^$d%iYBr2?kaveE-LvG5&oW!d`d?EcX=m|G&Hi z*k1sXc3#A=*D2KYAd|hBjVde7{Q7B@YSM}mfZwi>Rv-u~W3fs3O6yktevkNTHYjbH ziN6>3+wMR!7~6#Hs9D$xZDv@eFiX|5WGT*eUo;yau~OOC9pjx~567l5UI=i;Mfg!cyqiRRXb z9wWbtpGDxC@JPw zF9AlbqfZIoWZ9UL5rL!d?;7doQHSNfYyx18W-Si@FE{xO&~8QOsn1X%&2Sp|$z*}N z&VMYx@(WO#~el*Sjzms5mgy-0q?e8<#l8GwlHS53Ga2ES90(0iC@@!f7Llsdx>{nggq zqENWLVtL&K)EsFy+-*b$Lw^GlRQBRuhpPC=?Eiy&{WlcORjGSiNt`JO*CirRqQGJ+K0FZ#0xjA&$FpKnk7X&EBX?WuSp&h6QT|KqdpM zfU{b8Zq;p4eA5Ul;W?iVSLF-G8wl`!R^XtCq==0_F~cIbpU|LUszeWkOxrc1uXCnRN8>I0MxaCrMFX9wRTHiv)H1uYNZx-88WY2OE{}BqClk7N3$sKKkpXBb3AT8 zQ)A$;0;NomM}e9%nukauOA$jU(lhoRv!zL_NfaDn!C+FQ1}1Bh~#$J0>|5jtn{ z+mnfa$9e))0J;2NV|#ISo+5wUNf< zQLoIm0jWSOu4iGSX0)0Q(OLRS284ZbFJ-#3U8fXnZUAEYLSV&J)54FUB?j*S(!c+q zeq4KDj@VpCdbQ*tI#AlNmL3M3900%loh(;Ut>!Tydd1!}?R>sF`ByUeMKZSnaLax` z+%OOU=&gmmVeT;ko@1X5z?+nEqR-w;$eV8pZJVmF)kB|%-nU;h&MaycuklXY1_X1i zy=?TMtV4w@e$NjW{d*c#^OItK%1c!E_L8-?gX5t7+-w z+CfT#4|T(gm^ZF6>VTMF&e^(~zjwtyXPC4vbI>po@@tSPAd6C@8sOR+#{o}1i&y*`fH=oz;8B_KG5wJ>=8N|iS_2XoxIloUAauVdt<mExwA~ z+z0}LQDeRbXMoVmG zQ&}B%T&XPq%39W*K)p%i%TRKvyq#)=_%PIH3kNxM#AO&XH~0dz$?Fz%pf;l)Qy2|P zP5tc9>BRz#7d~oUw9DjJ2eN=_@RiTnopF)K05O7B?n^~P@;`I$t%TQdc*^1d*fYNw ze{9ozS5%gy5X0Val-zGtu4XjWw%gF}@$zeQo8=$UUO6(mH;TvXsDPw$QEl@QxNY1y zlK?*<_ncKdZ(685kW1*RaI}=@xbD(pKpet!P|pA&r|TiQ1ir#S^DPS?@dNmlqyix3 zEoI+g0;%*`>@Q3&Tnj@xQ_g9JUX38 zv$H4&qvX8~g4>7eC*CJ^o4$U$TlNK@-KfA`ZZ9LFld?_`Ro59yr=r(sChEiD!i|gX z%e5M#hP=EyJns&hreFKtdWR&4-IlI<)ZYcG^Z&B>IJ_==4DfqSSTHDgQ^1(DbjKl3 zKBU+Qy%+C*Q)@lrTckI6GdwMf5Z|@w;LA9`XLz)WuEZ`Jea3*7>RT3dqIKXzm+U~c zxvb-Lt07O3a-_L&og(rp-JJDq+ewT8^~Cq~)ccR%gh*xmmY;q#YBQ|H_fwMJgYgtR zM_75s%AT9G03cqHwA!o*K%DylrjbheW4_jWI?T$)A731(^I{&Z*2FP)3*_Qh#l=HR z7#r7<#8I08>5$DYnvwEqQ2fzJf5HLY3HcZhLkJT@FLecVxfKAd&6Y)t()SVtr5hk^ zW=d^+>W`HJ&RbUfU^}r116~7qe^=T7%v|R(k!QX}|x;rTw6) zZOTKKqz2Vn7rYTk7cGq?NbhGC(tdr8w>LwgTy;DtPi5p!o()2Cgxp9-8GJD>P`l|k zYCR}E+nH7;GWIkTA{yxy5~C{WA#u3B25q*&9|}YhRFPdsWuIu_P7x!TF^w>lGM9)v zZ7L9nzXwD5smL~hFI-hBO2%D|?En#f&%e-rcfMKt`kvs5a)}Fdz$fg|9XJ`qt<>4J zU)`3;3^gz1`;r8L;y*U_HN`FX$MMf9*o1O4&eKK-EF#%uPFQ^;G84YUG*mtcAis9z zNM2oX)#>h+j64|WO}G{8>>497js(?o!}kMf()3@Mxl52qjB4o9+KixEApYB1#6@_& z(5wvnuI*F<()hbReD%TuNvb|Sd7(#Mr?(ZC-$hHzsiDpCKXZRjId*ITGCW)^BOoFN z#UD)EluiT!WP_>bVT(zerFuR0@w{Zlc*`WI`cNUX4+X0;JqWenp{xs=h#xY3*^t!8yUcCA0v&eHH{SXgG5`IRZ4^GaipDm3lCWL6pH|r@Z3ag<4@bM1N z4QS>|^_9u1uaxt~UYa`W6X4C*nWwF_`R(>Hy2YRRwv}3!pc%Niumh%(?}9v*KZv;0 zG%T~l@3<%(sivz-D{QMf+?@x;A7ibAK#Qn5h3;su8be>nbI^(BlHa#7jKS;cv22A+ zaNwiL8mi^kv?z1LqJ&A6-?u_BEuj2;cY?LrMj+E_`b=Brp4U77BuxM_-NPsrIc&Do5t1Ekd&T6mB3MGb^_43XL=Gr6d1H2 zu0ryhtl21CEel(AIc_5ceI(#)Y)nNW?&A+&s!+OY@vcpbEJ)JkG)Z|9vJm}G^xb>3 z<l%)(gGE;YM{mcm^&rU*zAIAf={_4!W-YZtR3G>i`ijo^opX3BlwnAa_X_?7hZ%HJ zs>0fJwAQX(#A#FTUL2z|(qzTzynlwmFMeOX{yfub-TxQqk9eD)t$n z4(4w^yrb|P&~QSm5#ui-X@*Ic4|3hy=CXIMo)mtB26xsfXGJu5V%&1|g^wt#o{P^A z*@d_nvh~5wX*}>?@6IGaO#E=E^R%w^Kf4+Y>pUR)wLw^40sPHAyi?Lw!+n*D1&(;>9DQ|?^b?KMV6sROdNdv(l0HHKA7A*mJL=42 z9Rf#@7fD1XhTTpOjPS3#@D`g*`%#;dEkDt~mb8Z9LGk0?rUdbwf#z9!+5rU;xf>H)x1eoeHNN9AI;*f- zSPi4v9aMkX#wOq=&|j<%(;sw$lCnDFY`INb$ityT63UR&zkKiEi=85rSOa_tLt=*R z00+MHcsHR`xeCrL!W#1QK9$-MIYUy9S79uCSM1lL*Y$dYvW9H#3D5`U8UOwfWS3!Q z!*)KdW8&x5%bg!MZHsS6_Q0DT(ZUSn^O5wKj79K6hYxGEJV2V$_TxEJ&!q_?A;%F{rHj93=cVTzbqyJB9ldUH%2LR)Q=CEAEc2)1+G}h66+1EW?N*_x{*gbAV%oUbgI~->xHAIsfo>CY zMSPgdH_QF&RYYHza0mSN8%M)$=na7~d~=f3BZffF(k8=1If~;EX=Blr{7dJ>p5)5s zF>U9#mSX_MMDdZkLlci&D6cnbg_QpmA>ZIz!G3X;(A(%%vKl(?)0=`-+UH5bamBTC zk>bd8%*LI}*2q}A&)CVpWxM~bYd?(7iJ%al&<I9I){blw^?&4!Svoi--nHe3k-kJ0Ka=|%b~XWaaVOqjLHABooynN>;532S_v1|n z8J|2}{6tbVj!qyH5%flD$I`>6`O|v4n$<1!^~i|KcsAARd`k|58Ux9(mA_bgaUSe# zwaPGBx$FGq(i(2T$kF^$2|t}a(iO5Z$|My)&^I6BH^>i`N^<>MP02_yBab?lUJNgB zh12s~<9V4NP6{=aZ-Iu@V?EclXa5Mcn@0y}s!R)-)f8P0g7eSJhQIY*U_S_i(>G5i zmg5`irp4f`nxxcX9KSOQQzq|yKIP?r)l14w$}RQ9VSw4JX~kW66Jg2uv94-B38$B5 zKij<2_a0&*G*PYP@iELv=OapJeBL8hdX&v%5%v(Z((*F&N1_uzp&y=8g%+})r@n|hF%SQeoz1VydK|5;Ky*Aff|x-}bk- z3ag6(+ML=_uFrLmSt$;*>@jY-O^cOg^#G}z%Mt2p(HfVMR-r4~01W~(g?dTo*L9wQ zh``?GQESQKSc_TcJ0N_&?HH|(`(*QSAnPO)%(!^oR7pZ%+UH>7TZUt64Ml|1sF#FB zPA1)Yb-t1;n4_Y7#T9fXwu9`S*mIjLPcny|M+b#U_`7x^LNeAcNL}X_BknCW5(4QQ z8aHpvi%9(7%ck=lMy3d2BpcIwNFpf|v;00e@GgEmLO~=?b?mE6k72x*$fNtzC6p2e zHp^k)i2`xuY!-tm_K-Nz3G@ra4~tMed}96OhS#Tk(}gDrV-vHaVyngmlyD( z#VkdEQn$|RCSnP7Kh_5=MjPJC@rm~PP>9f${;)TW$@@ssDH8mdV;LQynaugsZzR>YDXmwrY-wvX4=S>DrqpRW{_=>&bbUgAP6-fnx!V~ zC@E>kK^dJY>x!Gd;;UHl1EsBHYU$IE#;9@V3Am@N9B18K{Q+&vH(C>mRF4z7HKa-X zh5@xSVpm^g@NE=V?5|(RxoXO^G*64q?4+|vF9MUK-D;ds3hWr9_Aq8XYUU!Y4Bf|f z1~q?q(=}5rq}uo9C_$MQ?gN$INNub?oEzOBiMkLM8hDW?1i@)BPzVXak$W?B!=jGt zv~LWLhwqkAJbh%1u%9Pbg~%O})+fSv!_LoEERiM2MdXNwgK9Lk6*b*REb&eCk&nuX z7uS*W+Ut*ocLM}swSQLfXSJ{mUX2&;hJR$jXjd#XkdCAE<;c@i>gIb)`WX^V>Mdki zylg9JjGM+u7M|dso-iMIuTc)=4LU-uvkyVQp%+0N zs9ye2J;W{gfMNC#?Dk#SdDYU%yzezJ^vA>atL zmLntT8==p{u9j|tyJamNE7Nq_Gf5g0-b`$dT839m?;me+cE{>CyY3ZvnT$0t-36U~ zF*=alQmnxBm2mcNhs4_E`fSfuD1@HwTo4PZ&HnsW09YhCV+Svk9JEcO9>XPgUERKy zK=v9E6AI%cp7nX#&03lpMT6N;T575b3gF5GcB=vrkYDsQKW4s@liVSA_~>-FmXC2B~We$Ms1f_3Sn8}HyF#N+|rg`2f;uB_Wz)@@fM?>Wz#zuxYw=@Ub zptKbE2WPm!-e5pi!nI$%!sr}RlRqgyiN7Y&Xz#+s_HLf(O+*Im2YEB9J?wr_d&F!> zU=jAC!j8KoAgH(fYJhC(>x#={S3mxe?M&{z4ulPf#C;6@8G?o_z$%R0?EPm`UlBau zV)nMAdh9sLGcJW{TRPdL8oy-iZHMK+1vH^qB9b595fzgXD^kAeYgPzl=ubv7ae_N_ z2nSUJKLXJm?XBm4dgu%6RaShrFCbBCAIk4I*D5(PEqEJ-4Ef-IBZ?{x^( zUYoq9S(DV?1s8`9nQTk*leqB;#4r;S@-hy!RN>GMd&++aXAG2MDd=R`F_D%=V z#;ZB%0Oq5KSK28CYPlEH23A8)83!2SjOL7T_k44GL&s=AiI$BZqUEG$K*4N+wV_*; z+W?hwj40uMS3-e4&Gs>}%zi~vEBx`hzN^UOVlZg(*WDK1-Pj94DQ@w{xhmf2>H-L9 zadqU*5``y70vXxpZ!f;Vok71+4WpwMS6qr}JsaJ)Gj46_aF^8mJX1ow)a9UOwD*MJ zQV862P3!N`!xeUxlYA8o>xIMGQUFgIR4#45XGWJ|*L?R7q4<&tDOHOR)F7A3(eC?| zNKSF5NUh@dIw6CI+bbZ7XdKOZJ&OqLrm@Tz9?|%FiUryciRW+1~nik%p5)6dN}gi)xMKN6cbyBXx|HadFY3HNx-e+kO-Lxo{#2EkffD z+Yj)@&-)j3K#8ZcjqLBw(p0=mJ`ovvm1(DTw)aMONsOP?4zcI?c=^du3 zLA17MbGoVGQc)+1i7W5-OWo`(zFJU8mKUoH`**~D;>$J zy4c5&QhnLCn^fL@qYRi1uR)E~4t7?i>-sSAndly9p&SqlRz|T;UP#`dS|lIP0M$^V zHJw{Hf8BD?_`w%RH^R|y4LCRHHEH8kamQ`R3~SBBgsWWYS<$5(WNqEy!L|0!Ww$%G zQ?v64F4Uk~3PxHkA*lXTnyq+0-3<2Jt8ndey#`#bH`K4xVnOfT_FY&SMpl^-Bbcr1 z=~DtteSE(kJSHN54j>O7FNvhV0LOG@I-c&-OP9Y}gY#_i^&4KiWv;QQNxi}FxIl?m z9O8F4+P`z}G`5-Zl)c;nB@i253p7A+2&sdMAMw4+dOlYeWB%{zk!$7x&euG3>BRBH6=_3hE(EPg z90$#?*E9D=4)NPscUsjA@hhzX2?CDR=I~R@2;w(F)JIz;O4uk{agG|sPCgVN5rOep zmP*}deN0!#3Z4hLh*c;T;YeIIbw0b%LPFN_Wf_X`P`b zl66w9DzmVKm9z`hyH8g(K${#Re)(N1cYcVry)|i*y*4si#sY#snFtZxTVi?!sCBpN zZ|D2L&Pb5`>T)d`?}zlJ(UVdk3V#>6vn>)N!=nMI>|Eq%Fq9j0vTO)LaCN42eY1O5 zg;0PxgnMw{3P;^~c^<v?LO2JXs)dU@xrCdG%Bpx3W>UXHyh$&&j?MwC`g)y4hU}5f80-J5m(RqK!%is z%xy`6`xeiX8m`1v@$ps(4xZEFjAjm5gn&z-26GOsHoqs(4HblJEF=%V~nWve^ee2R||vK?*(-pT!@+jC^&pA6czCrPiZC+XgJjdObnY^H>!d8+kn+Z!lX^>Yu=;qr zO9E{mj_=8O_(7gGJ(Z;nzXVO84ahs4wv>{k+E=b;3(s*3tKZH!D6jPu1umdNt(1xv zsz=&8TN^kLDqcy*V3Xs?1lxXeV1r|dXzXjDL~Ujs+u9|6CtG^ak|5KPm&dVj##=QS z*0m@$XSm&OmXb$eVp($zLVV~zB+iG9X8xA~Cp!hsiV z@Y7{ggc;CBAeI!K?B(1cpppW(;xNb@>%q;{t1v=fq_m*jpEpm}dVBwP1u{F`SyS<<+KFYj5A*B&mDx4! zD4dj^%FHhr)MdnTq0uI&fnXoyjO_yTC!Qf(ch0;x;NHbxh8|u)K>pwzNPkrLZ(J$q zjW8SBwEbUtOkPEE%J(Hr^I&%uUyYc4%f`D&8nob^dM})jO_R#ue}(P2Mzdzj_4W^K zK=zI3u^^Nugy`4j8!TI7IJ##odp~?s-Hx-iT(?D~GrCONerlz-b*QcgGl&+I+tGb$ zlduWzM4$gG)0-~j7!dOFZO*FJ=~ad|*)sCB4aMZ#@pJwE+12g+j_eei!la#|+eOn@ zLmmx}brP&aNBA-QyLtBTXnFge7-2Z$ivCXtM4?^_DQVgTMKq5t^EqkGH@h#zJaF_U zS+SZ3>Rxa3Yp~<+gHQ80warigOPfIz2{Xb@?`U5#`jR`2h7)KwN@o3=c4M;oP&^KL>r5L%-JsXrFn!dK~gv88G?!RbaAV*i`zAvFs z3Tl-@9quBSwXZAO^fos|nGvVC70b`L8R!2_%HOI3T`o1R5?^zWr9Y7Uvm1eNz;UlP z`Lfwq_w_#A!S4_^JKvMc#>n(v=1a++&n!i?E$~jV1V9YalruMm%{nbBXFkcYgKqHyH+vmi&7w+b#^o`)K6iXp=6eu~{r;;-aRXXQt}VIDHw zCT&=}*ZX#A2EHQ3rfR2-cVn3o*T?)sMF?%+h{vsbk6Za6hAn!YP>>QEclmfm6h8hg zrZX_DP3vlzsSc;l?6Y^F*w&}~>i=Yt7+Lqu>yOm8)zR?rJ#gjhjc~}W>>tjBg`|FB z7&d@Mte`lyi#khvYa<{?H+P(7S8s!^nnHgnS^$ z+Qcw)MS?#mm>@;Pb&w21bZzeq{`x$o5Fl0!CIA z%YlHlW8}E*T64Wb;47@D=2eW1$;wznuD<(cU0$dzhS6`)2&+Z4t((mg-N+TXhb!Sq z?WoDQdeU+QTP(W`bL$jUsHYq)g1RLQ_k_&g2Ha=pw!1&6q&l6_5nJ6^@6>X>VZ1@; zjSHT|CrG;^MI^V2Xjmp;0or6TR699Mev$UNr9OgwT4afVbUAb4Qreupr*4^UTRqfO zF_2`m%%B20YEG?Aa4)k))Z4-LAj*=a|By`w*@@I2FmA7v%^IT_LS#9ix;%7!-iYK~ z8Fsx3oFS~mSL_)rW`s=si>R7@mS6cCPd#wzy`9a_`*5vXmoYl;;}JM4f2BW-n!KQH z-qNE)#dAz|HxGuW5Z2S4YExQqZb*z!kEs~)!bOzI=t3P-5x)2`)Pi<6;F#pQS@G`_ zb%FkuQS=Tj68S|{M$`2+D$rJ-Oz)aQ1BcRY@DVvi!g*Z-Vw{`Q3Qa{bVWhofgX0lP zfKry`Ba!fu4Kh#h85(aWa=jla**&=b;`E)`iiZ0l5#=2}I&$l5GZhq!$0T7FyVd!z;2p4DJB0N?KRT+=aYXXY8?c-eu*gV|q(89o zKCUjOqe^%BCu@nNE&qZCn6E@-Zs>2;IKo3&eT*e1h+)ngE0m1qiQ9Yrk3WSm1_r2| zegB5eOqf&U@SlJO9DT7i!vFXHFLb;2mYj&Wb_Lfm%5D$-i3qlixAr z*#G5lA+^X5{Kw$91b5EK%k=Y_Q^)Bh-O))w&uIzr@9M*O9Z=ceVHgI6r=kf}c|6tO ztXNjeeo);m`4$$#)3f?nO@WaR9@cD;b0>?b$icNm;~O|o*IB3OJ#}4YQKZlFqP<1O z4?oE)bo@{5%`&3O$!i~7SKa1f+**w*<}RihN0@SQM~cBqgU--LdP?m4FL1~R(SyEc z*s|p!LWF~P?M`i;YNwS0FNLgrlI)avp7+QZu^A2aUQ5s6ywPcWY!&MpCc5IdkKf+7 zChpn2eC6WWHfzWO={(W@s6K{nE!|p@g1!C9XlpLN zilV>uGi)tl25ijR}EnR8?SwPtW@OXHP@qlI#5Y*UB6z5cC6O|4ll! zqX?hp>?e)O&ZDmJbvT8Fbz{A+wWy*}N74NfNos2P0U^qs?M;BhO3lo(Aqj$n@z+)I z8-mVB6WKLK@8YMTeIzFWKkwm)<-?}6 zoK!;uJqM*i8A)luEo!~F+*XS+Y~zsStQydq3a7EPd_xHHymNkF0mkHrmc95N)o@hF zJUV-Y-uGIwWizVm>J>haT<>V@rfW;{4D|SGM+999P5IkE{v&a432b`rVL*u({nxiy zeKx&Zvz6$;q%dwf1Hw{Nu-`i)?IPXb*H)3a*0>`b(Xt>X!-l>H3~HI&sM?OeigY+Q z3JPU$z!rtMv~MikT_&ml@+RI`F7;Vq3-qCF84Cgo3ym}rQU5rufPza6flzEv_dO#b zj)e0Ii5<=>1PLn+xRRjAAXQEgV)lYS1Hf&d{ITCXlI%W=n|l4FR6R{3$}+z~x6O|p z0b*Xq5$ycHq&tMf!09pNBW|(QYl-glX{GJgIoHXh3CsdJ8q?<+#V-tkcas+Z4B;sdAWsKHeGigT&%A-&dBper&nbhwhn z0q^B%9Qp3yjA}&kog$YQS|YeX4Dyp!kjfT3mWMdImV-w39yoflLbz($sf_oVX%^1` zrB2(>%4(mUwCKDm;eYsisdoxaKvfE2AzJb)J4O3q5BMm(zHdW?$a(BFkqs6vfm01{QjYIHMOW`{hw_vb(0>nkf8Epn zWqsyggUZDcYbcHmuhDFT?71D>T)THVc>F-W7t}2U3~;J17Yf%s?z{cux7J7>CKLSM zEXcj}{qeh_NWnLvoN3FRo)LwZV9Um69k6~XjanY#{Q@0a37DnNxA`2xrUhXhL4f6h zRUU3|1f9elA)kWCh|nkNG&%We3}ZlSo61T@9PVp=S3E{k@jD?~x}RD7+727pD*0*~ zd!6y-u-eZ;J_p$~E-+#?URxUgvo1=bf?~e$G4P0nZ|Xesmm3yBN>0?rYKo#YNCI)2x@S-Ut$^lw)~i zqtfHX%QfG#({$a2$93!g<^VbSKc!26b?=C3{dX!f@AC~y%z1jdjA?RG=9 zMHvxnNG?Na&7#^x)LkktXNEpE5>TfN}Gpgw+E$1OcHeDmx-NZ1&vR`BnENJLLlv2#W2YZl@;}YO~LAM^nRV zyOd*G52F7#0ZusJy~3m^yiqA%-5^UB98A;~Q~URB+}5%O(tYr=0Usvvq^)AvB7r%| z>g8|}aAS{>CPJF86?aIOGJI&XVKf)9614)NO|i1rT5`lGoUh~d9!BtuJH`|$)`;>g zLz?01R?d%sNenDfig)Xj`S!?a`8o((Z-aTK!RV`Urz%4xR;g$dfzCM2~KVE?f1v=m$JpO!NOrpX8U#Sp$5VNh6U@ zpl|pxB_m2Jr_Us)4}l>;^}Xg=Nd;LCc2r8hQB~T2ZTC@R(+PLELb|WK6IUd96fd1; zyG*2d=h^0eA>ix3o}b)vnV~G zo90Ep1UD5}@{qCq5jBd}WlVuP>H9N6KWW(~b5t;S`Y9RQpqO)axukJD=Ga&VF#TeY z!B^hr9jbhfe$j(M^}#W`{FF!26Bvq3*&B-n7JmJ=PRM5s?o zR)#p1>G-bK#vc@u{8$F1jSOE{SSE`U7~sgH+*d1l)&m+T@2jyKz%gwbt=#<)RIl6T zv=}>7K%r5cCCnRz%H9`=NPa^-LJv*<_^ueYXQ(mq)RVJ;s*fL=hLtLqf8giQ#ux>B z+~#1{d;YVrwS|Uk(aU+dhtzsY@?+X!aJ4Sc*oG5kDgNxRO}+2LI%=lNuP?GDlYedR zmx>E#T{Dt{k?`>g#*irQu_gzi|JdvcqWwpqeKzj{3hrrd*FmD(43U2<%C_jRSsL7b zA|6I_{;THxUx_22xx-Af+p^=rEiJ9GRTjd5^$m z2bAD?X<|Ob3gd8%gS7WrY`r|E%%f^Cxw>efh`0pa46E90`GL znnQvcqjs8ZS&rvM6bojq!Kqfb7S(K4U+r?A0FhX&8RdtBFeXADUHT0NjB+&@62f#; z7IruiPgHXJIb2=#Dqw(rn2MY*;Ck!(Hw3RwC6D17O#oO4#DA%8L5p(KJ?Pq=*ca#m1 z<+w|dTh&kz1xSrehrcG(R!mraMUY}I1(K6*+j0lOw&>tU+1B}YGkj367qjb+rj4+@OFXwQNU z5p{U33k#NY2d4-fFQk0($6yn2i>W^Bjkc$skl1Fcma!w%?~yhRxP-E_TUr8|tsIS< zPx^_NYE{}I?P4YFO0ubM6*q4;7m=UhBgmZ{~I(BVc z`FQ+CjTzyCoa#Ircz}xRkDR#6D$PY))2H`)cd}r*@m9C(K0=mQX44_7weDS>Ig|!F zG5sx9zW|}lscm>0A~F;h5&AZU0>@MvsvLH&jN$yE=UL%GK^UQaDY1~Nb#ziwe5D^T zln+6^dyVM8iJ80~Yp4=g5`p!9^!C24%MT0me+3(_UsAT3gxMj8PD zY3Yjq6a%r{W=#Prk;Vq3K~>;H*(*NxpAg`xgH(LAOuHwjir1&0ir!myb{FqtKTed z&%*{2-V=4pms4L6;v+y&{fo1xY{}UU-}$@L=RGU>8G#x`jI$?EVGtoi-Ei9~OcvYJ zDirG4G|O}wk$_0e|U>I?x{5_YVkq=$BBy z$1R&n`^|yq;2d`1X>-zS37Ck7%GK-fawqFLObylz_z(?rUT^=cUyR8R92C!(s2PB* z`fTr!N=A{_4~1P~I$?yBezeGb_Zt!2a#)Zalap2L0sqim z%!dX4JL(n9?xZZL5cY%^QH}9q`sKuf*%T*GM40=u$`mPf;xfFWYuqbAMXz$Xwn1b_ z_q5S!w(dTrc6PI8$`}YqhQ3Ib#1)!5mp%xMhP}iyRJ95foJ6!8dazm+_}Vst#CCItXemQnds7|N4@B;tSzk1Yx0v#IL`hJLM{DDLKPMlV>QwMp+{Y|K8a* zT%esjp7P(@=KpnTKb55SAou;&ZkUxKAM@`ITApFnxvyfKJa*=F!6!Z^Rzq zp2hk&-b0OPmLRP*f|6EQs$jC0w>-*m<23`2;OKscAxSd zy-jTcdoA2x-M>aaR~C5Ro@D4Q%H%k37NlbPy8#pH#J?%CnAKd|2qj?XRoipdp?`QDwev;Ah1L>t1G9Xh8{w z{@zTHS1Vz)3R3=sISqxsxpIk6q+1ZkL>BF-i?uj;FnqFlJ(-5!*pe0gR`AA8qj}Y& zjQv^i$%i%;%9f>W@`&%cD)i5P7w-pd!;svWKD{u@P6qzvz)v_G1PJH+PwqH|>7le< z4?2p)QS9Fxv`dnE2sxwYx<9a;qsCGyF^Me|GDt(sf(u&(3ScEetJvfLX zDYK$-GwH>Yw-;Q-t`^+??O5M8=zcN6V}s3+tY?+#8ui=X731Fz1vpD7skQYi6RQ*8 zD3hq&?{HwDQik(zoZqudi(c6($T@+)rFJyx*J?p`xCnCt+O)zaSzd@!!(?G(m-=(P zD1o7UxPE+!OnXjHkKhp{oWQm|KnmVL0mn(9T*Pl8R8P?3BG$ySE&ZY$B=?LydhDKK zJ;gV*k0WY2P^-?tJ7MCr#A@b;xxuXtqv`4*cMuV>%hr;Tg#X|BL|jX`&j zhN0hqs~9G{ci>C%Sg!q3SSVtN_LnH<+{eF!oB?^g1=NlMwXNRzwx$!-eX4-!81YP2~)x6l;>3a2XKQ5Ib|ltHO5rX-+f2 zE7uoFzHulLCAZNFZo-0W!eW-@s4-1>ZxiRw?WyM6At|kr&q`49AMnNifaN&NT-S>|#XjVER zX`RCPk``kg3<=#fy{NR2h&fU|Ef!wS6pF3V@~M}vHajH$NXR^&l!U|^VVTp;b(;@fydfOUT&~3{${2a6xa?u!QIBW&cFV;rq zxVO0_--@Eo(pvdNc0?4@fqFxp0_Rq?fK+{*`yTDW9EaHMGh8gsGL4JZ0BDg>lmA!2 zsPk;L=>y+VkYk;$*yGb}2-EX#mrg$fSn^fxMl|M4WD0jA9;_PVU6dx5lU-;Px2$b+ zU)St#{b;5cr$E#-O}S5K4Jq%K|Eq^@3;P~u@H64~_kQ)ChC#d*a_OpSzN<+X)!+Q@ z;(@%7pKtmFIYE15&6&p$JQ0(d2zFM0%91iENtwy3tZ*dQ=Y`?gVzUSK+9@jGQ znCE1~Hfw}x*I_(`$DD1=7wcHc@r%*_Sdl#4>+$pvl9yKD()YOe4%D_&NDm^C^1N8n z$<`_q%nghkRxI7NRA()1M|$i-_S@ApCTt8iPUibY(9r0U!p4&>@kDl!Z|py>w)2Pk zEu2YoeOuSq1AXLGlein=hS9rDE=$U>N3><44;YjDHo5y0+nHKk&83qe69wr~yH+Jy zUeQG&BbM$ge)FPHoiO94*hmv%rhoB(8)mD!)m8D>`tOrxvlGf2)tb#{W!NLRLbny8 z18s@zfqQ>d`Dh5qrneFvLAum;Zb^=4_nF`O{Q9>ehd&8R`|(UdbjL1G8d_H}K5V#k z(t{PA11cLQ2=Bw7B3HvI{1-t!vqo-RLX+NirZt8V?ReA zpboe;O#3cjKQz51l%y%UQ2x68y5%%m%Kf~O#V1qjmkk?bwqv&~wm8Q??ORFofzR*h z1ex@2_<@hgb^sqsXIpCa%q&M))a*rWWsfE9@$JBkr$U{SnDQJ0Hi{KKME{+0M5pdE zxtJ%zDv%Ythjv?Nqy+?>#pX$l9C}o5Cr`H_tv_kGnqA0>DvAUrR6a$jTq{? z5)m!j(-K0;YVr~S=i?cF|M6?kYi>6d17p4eub+Be>|&m6iX8IOWnq{_CI;j$EI$;z;KueCe3j5Y8tn%qeTafHBnP zoBO%X$ab}1Lx`c%7{ZTzjgn^xb3p35DR9DRlw22TJ-V&)m`_%?u>Y3WmF4E&-y z?b*WJdUo_Wz}$N)CW2zJ_9?cJRc)Sbf_EAOE#uU}cw8;j8@bv=gKLuz!c4lcuY3aN z0f|clYREkUJk0i`=KQMv(ljKnE~RKgo9C8A(I#RgewQ02MKiA5`!SsXi4ou+Sd%wK z6%2~K?L8TQpBvB!P#o&ibFuye0WB5Iju*WV&b*ikyEX!{OXen6?CA4%_tCJ(L3wc| zH;M|1#MRIJmf=MWB~&r7WnG5ZM~&Zv&@$E&pJeGtt>1>prWs1ydJ=6+(7;w63+gDO zQE+v*DPJszsUhzLm>UBbugC@pd|M(3l-W?9ykdBp>nKuhaPMKd95_jqRMX!Dy&#|? zlqeIJ{iUJGxzHO_DQ71OOLpvXOMYlNBAbf`@j0sVaeDbxG6OV>*))7SC6H^}P8TN~ zyib#v@X-wqi)8B4K*P^Vr~1GMT0hyG5`i)a5r4THnrGL0p9mMp&@4|gRjyWE_#=%AWiEPsVYH+$Y=1M`U9)(bYIm$`jmktC5QQB z?E7SCQ?W!#W%RI7z1-PV?8OAQ$Nc2z)4)NE6Cv3wE3atU-rVcD{^$SNE#5T8AJm5Qsa~?QWEI*$m6t{Eq`k%Jl ziBNnxMlcfKXtHi2G9sXrvE*LIfz*OI32Afm^#eGgvuGJE`2~b#Ou!>W=-SG3HS6Z^ ztj?prk}-6n%rcAdvRZaqvDZ>6KW02Mm2`r_*JE7W(F*a_=NBh?HnANhq@AR?j{7{0 ze^=UeD+|#<5eMG<$#SbRuA(AZhFJ9vfdp(tC9%3JY*db&-Kdbn1)yEh#9j{6n=w;` zye%QvQjLUCEZNVMnt=d?r}M4dQe5hvvkO#qUxgZAO^Q={t>)O! zG#^3qghgC5Y}Niiq5MrlJUxzinWuhT_$9hWl{60b@$c(CbOv2F&aah_X&@G=#uCeo zwzMWj@Tg1=qUgE3mF9c(uJiQyQBMuPdnqa`On#vI!pY%BkOjbLerzmBJ9dbmY zvRCaY%4D3y1%NKsvV=hQT;5xFj}sy`Bn@WAUG7c>y`a+guUG?=zCdXbSJ~{qBpCG` zQ!*vKwE|+^>u^w3Ff)+x;q!SjiIFTf6)nhFUc8c6V<1Dc^AA7C%GM*4JUj@YLOuQQ zmR_dX5mbjid|RdKGqNWnFQ8{Id)r!`=kEFr68a<>kjc_ZS?2dgCYZ{LK?i>q^njvbYF72nzW8fo9SY%Gd zJ%vgCJauvivnp*%PF>HM`IS!1iOQh1@h67)xK%}XOEZZK7P>)kY87;{6a`0>6<(nY z>xyKEa_@Ho;1FL$4?YpQ7hj7Z;0=TqfT{~&&$13vvFZU#=bgWxRsVdX0tjk{%(S2K zStF5bFgav7X_e@AG#jdRbX0aeYq+@dFQBY9Nvq^eP^C1bVIE_qp@|c*wCL0fx32Z! zb4!M~?*-aJt)7nEhW%DT@*oyIMP<9d*25?$t*mkb79xlTL=KedX;w<$D7gM+-zj-N zDV$DC8#plPw^39S1mEW@c7!@Je(f$~U4`6|n&oD5tt+XGL_5K(Y zI3#210;OgU0)go)MU?S@CDddG3HbMu=yl{ zF3-ky+1Bm?XSbOi3U~9QOg(J}OQ84UCFW8t?GZEjQ^DL6_kKT-{GVALOv>oC&@1|D z>I3pPs_AG@<0#Ron|Bd7d4Hs5*{OaJ*@xIWeUkdQ`30@vf8I|n$?j`0JAN;HKeX5F z+U)Oy#kU8lhrHt@p5NwE-C;pee zV5XTXu?MaII>bMy9(Yav`IqS{ueV?iW!psn_JlHe22BX1xjuo__-fm}U+JHsQNZ_U z3EKJ7r22^j@et7Uba)?viYeUw_6;;@o4r1A2pY7z7uXY8=5o-eC%EtTDLVWP z98kBwe{O*?Zvfi#-_*1JJ80|w|CfN?SJTojBWyjRqkCr?DYN^!d-)-nv%jK2DuK+$#WNQkuWCnsGzvJWDG?DbpK2*;|NE%ab92 zwoumBa>)UVN)X#}3*cTJ95agm97P9fQO3LZ#+_#GJ@5@k`1;}IZ2}O{f(I-oVkkwD z+Ia>Fmp{#USW6&FD-U$o*AN{fI{D0|pv{{D0!ZEvl_Auj<~EV4NX3oQZ?D@7IF23Q z>@!*ZR>J{78;NzqAVBWf*Oe@9(zZ7^>=1Bkzi6Y$+&Yo#0i{kKx z!s^ACwjvfBi@8(^ximotP?}jxm1cUvl6(m9=0$O~4dUB($z%NhlCiI2E|kugb|)`J zjP37?|MffwdX;Se!cvLHqB~ae_L37|Vvqrxjgpk#rc@m`EQj}j0OS?}PId3z4RozR zQ3IA-#0fx#9iX>SUj)1vARjHD=&u$eUvA@4rwrZ3q11HvQ~>IAwD-o`P;eapfAlb2 z})`633i$3}O z`eMa7y{YNP*zAXLV(-gkMV!S6h(Oj^P5A}th5&y$G=bC(xWW4WUp?3WG8n<#?8yVT zdN+L8!<2797&_H5i@6b8Yytp8C@3@iO!Ox0q20F{SvycVOx%h zc0!V`upek|*T}(!1zq%GQpDE?U{iqWKBLC2o9_7M-S|eM8}1A-!vq0m)(m>~Ans&u z1IRw*K|oEmHJZWSThOODoaQQxqygmZ#A*Ql6yhYA2GLZtAu!t_0QG_x5I9XO-%kfD zWC12$qO0fWQgQ@@+kWQ5Za~u9VrErIDUD}7!7CO1UR3|d4O)>z9Bt> zOte1FMoASZ#DL=gI~@zGtHIG{feM1Kfh!OLSMUv3hWed?ATh~%1%j%CJz$y_5hKu^ zPJ$e+4#ZWoxdbdCy`Ea(Us!d(@+!~;?vuI?VAv@2;fbBlb2883`$HLvw=E!T+W|O# zZvnI@&l8}+B0}l>>gsly&))(yBvyKTvJex&7$Z{YoMGjvkAx6TI4uOvPX$mha5>)K zP-#>99uBVMg9?JUA^+VVI${X>#?y9}j~JlQjOxEy&EmVhGQQag=^EH(1N^TbR`#1} zK=vwugB2bD=y|oKx1*6~!0==bFAyou0!^(DnETC)kl4LDb%529uXGLQ(SZ5eLCksu zXmAN@`8;`m^1-JaJsb&cDFk*T=YOfG?+=!M&IlcliE9=Rsj-@dj&yz}rV0ZG z>sVk>o}4EH{QU!V#E89xE;1^+&reuqb^QU=umC{UKbrenAgq}p$3rd=-UII-N$@Yg%ex8H$In(xfB09f`wJ!5>jstT5!}2R0M1o z{jkHR&uzYqZxa#UU}S^-e%%~H8Jpm;8!paHtP|0CWeSe(%3%QI@| z0&VOIOz77xuOR3t=#h#8W-HUO2rRk3B8-Opqp`R6V1 zTz3V)P}zhaY!r0i@8dWAp^tW^_^FiLfTp0u`nX;N5)05hSXmUZe+T-OThqZ)uei=( z#QD!gMA_pu&P0L$_#xLl@VHc2ob1kZDDnOH^;tPHKp1Sh5p8(lP4BX*z@wMH1QCDq zMoInx$50_{?JtTM*z}-K7#Jxz|#c zp?Lx5Ir5`ig=>?Zp8d5uY`_Thpm?9K@)tPF7QcRGg*w7)Wv09v86Xzc04hTg0r@6NK=0<@|L4%-xpeFNTB1C2ga(`G=T)7XhpC5CM z0%ndG#2-Q(0^BQH4nzlVpA8N)OCz*qoq*>&m0Fn)qHIP$7|xC^aQtt7+9)a5mRdK1N_$XAbJc7(JiuX5Z3tP(G<&zY zcYx_xnqw%+%uRLl_JuBZGZEmYaJc;fJE6ILS3n~Gp%lVbVvu>rik=YxpOpz_F2v~hjait>wiI*>Cv&cY8(ej4%kCu)3E&2Tfg$=Zy0ed!o z2}^NL3#y9a%*S|_O=sk^7f@DTdw)aq z!&Md-x==Y#cy+MlC0RDCFNp*@s7(jNvy~sH2j14ZTN219h`T)~r&)35(JqwHgYfF? zuL95wX97OQ)e%fK1w-J$lLfl#6o+w$=eZmr+@MQ!5rT-*C+_LDVT!#wC5%Q%`He<&5b3WbPoAv#%cydS`t z_g?CWuVlE8LRiP%prT)ZCCbt9xF336U9;>yWy8$^T^Q--S69E->j?UD$M0KG&x z1UC_Sj)u#Jv8kBd|K$hRKhoz3?*QRPm+uB>2<{hOP&}(beI6zBv5*Zw|@XBEld-1^?E~6e864g76JY;TzcsnoA^ln zZJq(%=*JM0kg6t!d(rU4`;WrgrC`1UQwLTCm6O$*7gdCa8?(duO^iVHR${GW)-;t| z@DNwxn*c_HGMr@_J4xggL>#qA2egip*DB^b~JB1*e3Y% zJ?P(De;;Z@+wb|J=Xi&!Ud0v*SY`MKpmlr*5w5uxqFpl>6@hG50JNOEhna~+W(_cf zpGx??;sxSfgEniGDjHV_G>2POV|DlN?@$us!_m;_P+v{)XBe*9q~ekhNIegT50FZc z0b%>?z#=t2b|Yw=Jo=)s{yG)!hdMMmrPz2Z<~#)XJQ&{F_sigeQUk7Q(>kJl^Z^wO zm%j^7Hbeh3*hR-hpg6+SWWP3M$QUgBo9QjJQuy?6OiXwI-?KrRmo3u)$e@sY&8sj@ zqecK+%Y}o7M4cLj43LxvsK9f}z944VMc#{xntdkp>Op^`lyTwoYs92eSHTh_wb4)m zH)_B0_T|@=tpWL!Z1piE?n#0Rj-2&REkCI2VO;hVdp{}^0~ytHdHPss)HOS`fF~sI zjOm#e8Z}C&U;4q^MGC((@}B#NpbQE`*;h4}s=_$Ax@Ec00E{}9;_s6)cS@`y^Xvx& z@d0zlo4aXOQUNmO;>j5@PZD*E^}KyCFV2aF&+q&|PJ#Dr)0wR2)vIFCg^J4eix6R_ zI$N%Bc7Emabr!@j3ce4wV$X`ErVwp7YxlTjY8wAJQ-zKmOs{4itQ`u$y6pO(2ups4 zy$sCqfR0Eozu;wBNbj%#!8jux-K+DcpZ5k$2i2A~&iFDWn$NclUeytT7PTk-Dc@Gv ztg~KOoqD`zbOK6FdC1RM{aetT*Yz|5%2nmneLhB?g0ijU8^4c!5y~KvOmI&vM@7q^ zmGh1_EK*j7b(t`WxJ5L?1LzTS;PaSRIA;pTqZ?ZPJ78uSg?PQtmo765Z$Q3~ws&#P zggggGBM;WsjCyXm0c3}V!dI)X^VrXHM> zq@W7yW?oJ8!1+##Nspo(NWXWW;)(o>l?iLX03lzeHPDOm01m4NoYiaptxW7D6|J+b zMrA&$2IazQYlVD6=VZmOMZ$OIqJ)DXOuPCx4xR48uLCN7Oo_gAe?+CP8-cm;Or=J*o`I9m2%FjuVs;QgQe1=EBkk%6ck z&EUN)>W`t{Ax6;o9>#%6-3h~QuhEwpd`5TAAXQiovOOktWvbmrCnc7BN%g&n>=8y^ zUj7btIUvNLd?Xjv=RnG3n1XLjE+ev-Y?@K&v>=0pO~RId;NWbn40C2yGAHkfe^ykG z5HL|`smMgT-E!?G_-fz614QZ#gv<(Z)VZaG_0DQ%4pR;Fz~djB0_(0!x58{2Tzq&t zac-$zm6b!sTawBas~?oLewSVz;08B>StCmGZ;4q6u^yrs{;9NNbb|X|`N$stceDW* z23=Tn;OuBCHK1co|b)zO^||HaGHtQ0;?>Xmy9IL_w3LKi~}M4CcV4} z;<@wV2;GIoui%Jt=!&K(v-**?4MHe%TwsRVjlGDarKM1a}Xjjw^+PC zr#D$i^P7jmsEtXJVa4Rfd4CKN15Xdve=7!4 zb-m#FJ@B5_QbAL9K1%%?IAI1lj1C~exTn~Q`HaUdR!nyIZfUo_6|Jz3H_5}woh%rF zFW#`t6N^}bkS}U1Od_giR_4)0^UhV#-w# z5f^;l;0qm*pfPMxj@Veqr_!gB^)3ZN0o}vLb|WQvgdgP&rJJ2xCqaI|3Eg4Uh!!BZ zllJQ~ELQq6v7CzUoK82rI><-)bozJ?Y<8}#*RRL+k9%gi`^IbR+0VavA159E1zuWg zQ`*2jdvTg7!)!JBo64Z$*nQ~(i)oXVrktjq7Ze6NJdJyO?=9N7J)DJsWPLeVMeOb& z-#19S4*vb#4F;*}tzu3tTz^VD8# zdFgNQ-uSe$o3?IQ!mwd?x-tlmb{X#Vck5N-v*dMDy(UZZMa%F~!XiLu`e>IMb2{1S z!-tsz-{Q6gZjki?cgx6D7 zPmo_Q4ChGOjDnm7>J@5L!aFWiQ%D@eNBHZk!`ZzTm;_&39%GH#>?0MouU{UEZKH5$ zeIr^u-s-V`249~gN<(7(MlHJ3`i(kTWv$wizs3^sOaqVA_bI=>LQ-KRC>b)AJep1q zP^9^w`#nq4KtFe^h?}ESM8tY?7`@ZcX>Vr0f)o*JfKEOAe9Nl+IM*G2O0_Eb84GHH%VUv)qpR(z;RIxk<)&AThXe}3BQPB>UVTQ|(+PC_8~ z{Ag5dGMuc&RZ8%3@$BnCf$iDs9S?=QnzH_|(|LPFWZ zE;VY@Mxzc|)V%d9{Mmp?{C(y5enD6=-z+khyTxmPqJ3E~XQb3XXTF<#)uFxcRN3n! zh-jGcmrW`uBEaBbWFO`u6EG~0f*_LZPEl32Jgf^-&E(k-8LN`HMf5XG%QxG7V$N=| zoN{5RF%H~zF1}Y+bUE{-8uQU1$5!Mr`;t#6I$`K6m&I)-hZ59lFLo?~MmUb{P`x5L z%BKqlTZ%l=k_GG_FBz4#0+r*#-ik+=o7lg}KBvJx-uy#!tmnt#D;81h*t92em})^Q z)Dae~-D>%f%f4S{R4`X{q9e+)|H^j`EiO?b_&AB=r2L3tw*IGekaeJSsQH=Ui>f43 z^3>4#tiCN0=;WxuuGJsrS5^Wr+Gmb2;wfZ460TP#5F(oLBYQt-6h&`tG)a6v=zO8( ze*)Lwe!j6P8saO1&CA~j5Y|j(#$Ua73oudo%L@iyCB)XRtl}-yTG|THoTd^87RQ~@ z&$>2C{9S8AGWCiC5yQv-q(r@%Zau(h>n0yBl9M$%$Wj|D3@3oC3>5UNKHGQSU3qTt zK8emQjib$$T!xL{=1Pdugs!QwaA~%2A}9CIsSmz}tepQ`R$@`3*{iZ0EklEKT}Ye_ zRh<&auZuh#uXt3&<;%#wHkcRc4cyeF#}>g1B(VE9OXNg>XDHFHrvCZyY_qy*vPF9I zGdi#$5~f~M|8-`4P2~Gtj1(`nrZ=YfggGjTtgs^G+;uMN0$3{oSAdzC-U)v3YJ@oR z1CPjd<9ZcuYDL`m3DFke`qTFmz9Vj9pq~mRl!b~Xd9mm&V)}nXmZ&9z%5er`E6w_H+B&%WrJ-(tvInJ-pl2 zZ5u4~11-Z8`hv_mqV-2a2=FKHTVCbEFhJ1X{DtXpjtU>l8v5rqaf|<(|KOY%FwDQ> z>TDu;-{}_#(NG%VNG@K)Sp{yhGj|_PyY=v1gK?pAoj2U@A}*Ts%6EOS3g4KnH;I!y zhZ8$V>}toe2|jdSMc!G#?6Y#A<#m^l1=CHxj0lut54`#6wxL~X(L*Q*CIqf}j+PlM zbv#X|P|g(6nyySCbE3w61FTN6t#YGA0WQvs zkA!Cw!PAWM0q7Zexy2qk(@tw(ZX~uIiqZfD7=L4t%%L{~M-efTw65;?xV&X-vv} z(eC&*cpE$mY}W;7lRyJ7q)R49ueLp66^}dT4?!&X zeskwf6^s6)AJDvn>y*j1BPHQz8F$i84^|XUK(0r&$-X(jJW7iM!6+M@unQ7{$zM)f zeZ|{T3NeC*v!4VlHb;+mLeT(yxVEGh?(cJOko(_0)1|s=;le_i@R= z2?(dXgoA87NXL_(+9SUha3E zUd(ymr}FEWCwjyd5QnqS{nn=H4Fb8$9;cT5QWE>Gh2w9WO0e9m*7aH+=q^Ai|jh-R*uz|QFxM`RB>!JGM+Puq&h`qc0?~htcvjUFO z965L3zNQ3-45`2psy&cP$O$Iy54ON>c*8y)?$XWCjplw@qx&)cF+1~D7gwtNm*GYsT^#4`ehXVAMbvFbw)uh`$u5Pw)y;nWqD zeZ0`5j&+>*#S*i)MkM5}v zV0^J1Re_g%pbuiaq)i)f6wrEd>x%!<^G6tn;@<71cD*CQ7Ib4Fc8DVmK6bA@X{jIS zCO{A~nd<*ULH*T;4L*nX&rr0nVsU&OuY=i05^znoNLsC)X7JOmUd%76B>2)DtcKLs z`=S?jYD_wBS%%DvFVxnYScW=UvrN=F#<0!xbOVJ|Pyl#ZI48!>-yb$Sw?xz5Z>_5a zTS+1Mg0FSz9QMU8 z#fvzdAJ`|}w|;9h`&xILFwxwG-Nd&r7@a$^!`x&Xo>XIzSe5r|0c(KUCpv%h;OKzK z{_G1 zs0vSc{N0)1w%JAQOw_9C%X|8T4+j#P)~70csJn|1xOf|Xz|&<-p+gwlvCZN4S(nvp z5nXTp33&Y3>`8m?%CgT!{$eE7HhMor{RguSI}O*Vg>85+Q#1d|#`y>tp~rj(=M>g; z-oVV&Rs+Y_;(Cn?Ok{j^!&4vqJUuCn+rt#a73a&m#{JE2TS_t&qtr*%V4y%DInj>%NjC=U2 zEFK ze029Z2e+o@ZGd@Aeoh ztsWubkGvO3blN^J*xCPnPvy(Iy7g#9-M|!W28#YhB(G5bbkqk-fFg8O5|4@H6{vjZ-Q5S7 z{d@Z#D~>isRqf93IgA=K?b3YzjQ03>Y>kuna_wPCh#){-5IjXVQuSb9Bf z+a9We2LqU2=DddYP1_4IjfC-sJOb22z#;u8&OLXr!1^Ud%S-_G?3ibdyg3Lv@s{(4 z?#+M-D^7d8#C$7*qa3flw2y94Dta&clCp_N=;3yc(W|J&@xGFoPi={M*wlO@ z1UvWc|FU6anZ1#V5BDkmQwnZaz+_pz*+d$D|mBMgi8Xj6KD2XMgAow_x?AU z@qdcUK2WVl#^DFNKW2+c6RRELFE0}}1sx`JTOl_>D3qUF&zbpxBZOZUDjBGQ8(C|a zCL#QmEvd7Mgauvy(2BgW&E-U?UzMyDFMxZMCe9aY$Wp$`P(c*ahcOR$# zFdB3_Jm=J_WKyVl{_S$rY51E@My_QrQ}yk~CSOSG6h(S`ttR!G6h!wX)3o zQR`C@e)80+i#fT>$WIZ@@1O9xKB(o*|J9pf`ELVMD(s%-XRyKUqzTxsgSuA+J+laS zlD26M5L#Ede?eBofWVa_rbC_0M_^;F;*g;0k1^0T6>eDhJ@G7EMlN8vfYe{ zBS$^IX=^YX_6zJoFZ9Sffk6eysa)To^Y=XrtHD=~IdHTK6i7~^H_sJ$DhM2=oAi=! zhFw5$#~i3rA`c&U7Q8=!&w$IKlJP(wLTqE@2{61CUDiiR*^iy>P+Z))b%#*?=@ZQ! zUbPbbPc2pIl@>j9mrV-cgv`0u=%(c%C<8RtEVjI$#WT}sMYG)4NJi)2;>FyYI1#XN zYJ>T0M-r}y(rtJDTnKJ*8`eEk8KaUh4!B7EEE_}nx-^#cgNWX#eGO zagF_i!eoD@Ftb0WdVZK@upUvP>U%L~rI{!FRJ;~pV+q{Bz@Sau1&(a&vB_~@uU!Nw zXRhxxEzW{2(M@<)B3LZIO^-bhYNMGk1!lYNzvj}f?#7`LGn^lKUq2m^KZ2`>W z{nv~cz)qmTqB>v-Rz5_qP5X=)M9YE*XTmTV33M<1THMdJWn?$_UbD z_#I%~5Rg29Ds42q&j6<&H(9jNGm$A{hY(qvvfIbbSIaOSXrXKCE`7lqcA?ss z{~)a>Xn6vhxIDkwxU0=cEc*4eJTSEB+(s=1DY57Y}2%BNLtW05Fl;9c<)~)yvHNz(g1U(Q|z~wDy{mX znOsiFXIJ{Iy!?JtoMJOB{XG@ZTZ+puoMto3e|;&ZXcY}UuIGfTdy7yg8dTeH*ndqo zvvExGdmBuqBa~2czEBi4HJdc{`Z$ZXn`#0B-2NHlPli;p6QlKMYZzzQvB!9rg-387?$de_s6Rwezpo7 zW^SGhshBAnXeG+4PBwg%G{%VmUMDlb$J8v5b0msb70PkFjST=<=2T6H0 z5JZUUwIf`CZOAY27u!(uS?fjev8(lH7*-SCC-;bc_MZ>kFMhqFnPlx4zw+s)A;dlD z8pRrYTx)DHx|yRhKi}%jw|{$Fb%bi z9(nFr4`gxLc*=wyG!ihgpWQv1@^!|>8QGb_JWn%_Jq6N= z=X!;*`cvPA7;cuI&~pi+;ncYo=oxWd!L1+rTK#1NP_}=)+nRD@b9HL@x=A|f|63;x zDZJO3RQ9`C&~Ry@u>LQfPCf8J-M$)6Fn0OteGJ+-+q4RAbn0m_Y|%O=Dsyoj6xcpg z5Cj^P9*0UGL6SLgfb-{dyi)RV9Z*Gz8DI>6a79dj`DZ-Tgzm^wQGCSsQXtpuG;wA{ zjnt8gHFe1sC|vxy4X(uojqatGk4m4@&#v|!#Q0xG{e5-&$R9mRcI#u_3KOGd0wy1u zf;!f1!Xa^*DM@DBZ>1TpUIj({hulPcK7cWn0uygaUA0-HWROl7uI)B0Qx=4cS6?lvSv$M+ zK0KW@U1-Uhp&g)}zq|AK@9zWjjB7dG@);v zpIPwIY$_F%B)-vtauXQXz}A+v*Rq7ws#aWC$OyTUVNyQv(T2u9s^JRXKt z-&Q7Ha~VR9A_~@$d6Gh-l3^JFQV8jjW5LhKyRcjQbMaivX^YGC;RWv;OdBi$Dp~b* ze#mhFwayGn&dg_-1%Vcw=&GGiEd>?7ZDITKyy75bmMX2|MG)ub4wwxYkXSUFqD0?h zIPI2a&Ah=xStgaKyfMfslF6eC50+#r!rWnJKe^_o8XoxY;}_3ev*%QxhV{?~czCby z5ofqxY=-YwY9UX5gne&WegEm8i`9?CrAy`q4pdF8cj&=2uSh--KR4EM55-iM~ssJ-!k&_FRn2&LrK{Kk$5G7o4N zqy@R>rYj}Mvid<$q+H10lg`1m7vjF#7vbV2ey5fc1*_QbmX=@;SG18KG}Cm|LN6ZM zNfxNnEpOd(Y`Ltdo(~Dcz^3p0#%Osz_{$GviE&2ce literal 0 HcmV?d00001 diff --git a/docs/agents/_images/optimizer-insight-detail.png b/docs/agents/_images/optimizer-insight-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..22865701b7925ee9e40d1c9e3d8148fc6deb009f GIT binary patch literal 11151 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 literal 0 HcmV?d00001 diff --git a/docs/agents/insight-driven-optimization.mdx b/docs/agents/insight-driven-optimization.mdx new file mode 100644 index 00000000000..8b37be83c85 --- /dev/null +++ b/docs/agents/insight-driven-optimization.mdx @@ -0,0 +1,604 @@ +--- +title: "Insight-Driven Optimization" +description: "" +--- + + +Insight-driven optimization automates the agent improvement loop. It turns +production traces and evaluation results into autonomous experimentation that +continuously improves your application agent. Where Intake gives you +observability and Experiments gives you a comparison surface, the optimization +agents are the layer that reasons over that telemetry and acts on it. + +This is deliberately *not* an implementation of a single optimization +technique. It is a common front door through which many optimization +techniques can be distributed over time, all built on the shared flywheel +components the platform already provides. + +The system introduces one first-class entity and a family of agents that +operate on it: + +- The **Insight** is a named, persistent description of a recurring problem in + the agent under test (AUT), backed by the traces that evidence it. The + Insight is the unit of action across the whole loop. An experiment or an + evaluation-suite change can always be traced back to the Insight that + motivated it. +- The **Analyst** turns raw traces into actionable Insights. +- The **Experimenter** turns a single Insight into an empirically validated + pull request. +- The **Eval Author** builds and extends evaluation suites in response to + real-world usage. + +## Before You Start + +### Who This Is For + +The optimization agents are for engineers who own and operate an agent and +want to automate portions of the agent improvement loop. + +### Requirements + +- A NeMo Platform deployment (local or remote) with Intake enabled, so the + Analyst has traces to read. +- The optimization plugins installed in the same Python environment as the + NeMo CLI. From a source checkout, `uv sync` installs all three through the + default `enabled-plugins` group. The Experimenter and Eval Author + plugins require Python earlier than 3.14. +- Access to the code base for the agent under test. The Experimenter needs + a change surface (source, prompts, tool definitions, model selection, or + runtime config) and a way to run or evaluate the agent reproducibly. +- Traces in Intake for the agent under test. The Analyst diagnoses only what + it can observe, so an agent with no telemetry cannot be analyzed. +- Model access for the optimization agents themselves. The Analyst and the + Experimenter each drive their own LLMs, which is separate from the model + access your AUT needs at runtime. You can run any LLM you want here. +- Train and validation datasets in a Harbor-compatible layout, plus a task + template and an output directory for artifacts. This is what the Eval Author + works from and what the Experimenter uses to validate changes. + +To install only one side of the loop, use the convenience groups: + +```bash +uv sync --group insights # Analyst only +uv sync --group experimentalist # Experimenter and Eval Author +``` + +### Dependencies + +The optimization agents build on the following NeMo Platform service +dependencies: + +- **NeMo Intake** is the first-party trace store that fuels the loop. The + Analyst reads execution traces, evaluator scores, and user feedback from + Intake. +- **Harbor** so the Experimenter can run candidates through an evaluation + pipeline and construct Insight-specific suites. +- **NeMo Experiments** acts as the primary review and persistence surface for + candidate evaluation runs. +- **Platform entity store (Postgres)** is the durable storage for Insights, + analysis configs, run status, experiment runs, and candidates. + +### Compatibility and Access + +- All Insights service endpoints are workspace-scoped under + `/apis/insights/v2/workspaces/{workspace}/` and depend on platform auth. The + service checks workspace access before reading or writing. +- The plugins register themselves with the platform through entry points + (CLI, service, controller, job, SDK, skills). For a fully local platform, + restart `nemo services run` after installing so the platform discovers them. + +### The Shared Profile + +Both halves of the loop read a shared per-agent profile, `optimizer.yaml`, +discovered by walking up from the current directory. The Analyst consumes only +its analysis subset (`agent`, `agent_spec`, `workspace`); the Experimenter +validates the full schema: + +```yaml +agent: research-agent +agent_spec: AGENT-SPEC.md # optional; falls back to AGENT-SPEC.md, then README.md +workspace: default # optional; defaults to "default" +agent_source: . # local dir or git URL with optional @ref +task_template: ./task-template +datasets: + train: ./harbor_eval/dataset/train + validation: ./harbor_eval/dataset/validation +``` + +Relative paths resolve against the profile. An adjacent `.env` is loaded when +a profile is found, without replacing variables already set in the shell. +`NMP_BASE_URL` is the base-URL environment variable for this workflow, and +`--base-url` takes precedence over it. + +## How It Works + +### The Loop + +The optimization agents automate the four steps of the agent iteration loop: + +1. **Observe.** The AUT is exercised and emits traces (and optional evaluator + scores or feedback) into Intake. +2. **Diagnose.** The Analyst crawls those traces, clusters failures, and + writes or updates Insights. +3. **Experiment.** The Experimenter picks up a single Insight, hypothesizes + root causes, and generates candidate changes. +4. **Validate.** Candidates are scored on a training split and validated + against a held-out split. The winner becomes a draft PR, and the + evaluation runs are recorded in NeMo Experiments. + +### When to Use It + +Use the optimization agents when you want to: + +- **Diagnose real usage automatically.** Convert a pile of traces and + evaluator scores into a ranked, evidence-backed set of failure patterns. +- **Turn a diagnosis into a validated change.** Hand an Insight to the + Experimenter and get back a candidate PR with evaluation results, rather + than a hand-written ticket. +- **Run the loop continuously.** Opt an agent into periodic analysis so + Insights stay current as new traffic arrives. +- **Keep evaluation suites relevant.** Grow datasets and metrics in response + to the failures your agent actually exhibits. + +Production traffic is the best fuel. New agents can start with staged replays +or generated cases and improve coverage as real traffic lands. + +### Core Concepts and Data Model + +**The Insight.** + +The first-class entity of the loop. An Insight is a +persistent, named description of a recurring problem, stored in the platform +entity store with these fields: + +| Field | Type | Meaning | +|-------|------|---------| +| `title` | string | A short, human-readable sentence naming the core issue common to the linked traces. | +| `description` | string | A paragraph describing the problem statement and the situations in which the failure pattern is observed. | +| `agent` | string | The registered agent name the Insight is about. | +| `status` | enum | `open` (default), `resolved`, or `deleted`. An Insight starts open; you resolve it when fixed, or delete it if it isn't a real problem. | +| `trace_refs` | list[string] | Intake trace IDs the Analyst cited as evidence. Drives the evidence view in the UI and lets the loop find similar traces. | + +The store assigns `id`, `created_at`, and `updated_at`. The Analyst aims for at +least three representative traces as evidence before filing a new Insight, and +when it finds more evidence for an existing Insight it *appends* trace refs +rather than restating the problem. + +**Insight persistence: platform versus local file.** + +When no profile is +discovered, the Analyst reads and writes Insights through the Insights API. +When a profile governs the run, the Analyst reads and writes the shared local +file at `/.nemo-optimizer/insights.yaml` instead, which is the +same default the Experimenter reads. Pass `--insights-file-output ` +to point at a different file explicitly. Trace and feedback reads still hit +the live platform at `--base-url` either way, so the local file also covers +deployments that host Intake data but do not have the Insights plugin +installed. Each run merges into the file (de-duplicating trace refs) rather +than overwriting it. + +**Telemetry hierarchy.** + +The loop inherits Intake's model: a span is one timed +operation (LLM call, tool call, and so on), a trace is one end-to-end run, and +a session groups related traces. Insight evidence is cited at the trace level. + +**Experiment entities.** + +An optimization run is tracked as an `ExperimentRun` +(agent, insight, config snapshot, status, rounds completed, winner, summary). + +## The Agents + +### Analyst + +The Analyst reads telemetry from Intake and emits Insights. It runs as a +single reasoning agent with a set of read-only tools over Intake: + +- `fetch_spans` — survey spans, either grouped (for example by `session_id`, + to fan out across many runs) or flat (to drill into one session). Filters + include agent, status, span kind, model, provider, tool name, dataset, and + time range. +- `get_span` — fetch a single span by ID. +- `fetch_scores` — read evaluator results (verifier and judge outputs) + attached to a span. +- `fetch_annotations` and `get_annotation` — read feedback, labels, notes, and + metadata. Negative feedback is the strongest starting signal. +- `list_insights` — read existing Insights so findings are de-duplicated + against what is already filed. + +Its method is to survey sessions broadly, gather evidence (starting from +negative feedback and error spans), cluster similar failures across many +sessions, check for existing Insights, then emit a single result containing new +Insights and evidence appended to existing ones. Give the Analyst an optional +agent spec (`--agent-spec AGENT-SPEC.md`) so it can flag divergence from +intended behavior. + +### Experimenter + +The Experimenter turns an Insight into an empirically validated candidate. +Internally it is an evolutionary optimization loop that runs in rounds: + +1. **Baseline** — build the baseline agent (`agent-0`) and evaluate it on the + validation split; build an initial goal tree (a weighted capability rubric + used for trajectory scoring). +2. **Analyze** — read the target Insight and perform root cause analysis. +3. **Propose** — generate a small number of candidate improvements targeting + those root causes, each tagged with an optimization type. +4. **Implement** — a coding agent applies each proposed change to a copy of + the agent and runs an integration smoke test with a bounded repair loop. +5. **Validate** — score new candidates on the held-out validation split, + optionally adding a qualitative trajectory score against the goal tree. +6. **Select and continue** — keep a diverse Pareto front of survivors and + iterate until a budget or convergence condition is met, then pick the + winner. + +**Insight mode.** + +The Experimenter starts from a single Insight. By +default it reads the local `.nemo-optimizer/insights.yaml` beside the profile; +`--insight` names another local file or a platform Insight ID. When a local +file holds multiple Insights, `--insight-id` selects one by exact ID, exact +title, or zero-based index. The agent referenced by the Insight is used unless +`--agent` overrides it. The Eval Author step builds an Insight-specific +evaluation suite before optimization begins, which requires a task template. + +**Dataset mode.** + +Pass `--no-insight` to bypass both an explicit Insight and +the profile-local default and optimize directly against a dataset. + +**Train and validation isolation.** + +The validation split is *hidden* during +candidate generation. At run start the validation data is moved into a +held-out directory, and the bash tool the coding and analysis agents use +blocks reads of that path. Candidates therefore cannot be tuned against the +data they are later scored on. Validation data is temporarily restored only +when validation scoring runs. + +**Evaluation and rewards.** + +Candidates are scored with the Harbor evaluator. +Each trial yields metrics from the verifier, and the aggregate reward is the +mean across trials, with failed trials counted as zero. Metrics are normalized +to `[0.0, 1.0]`, where 1.0 is perfect. Live and production datasets often carry +no verifiable reward, so validation on those relies on curated metrics and +trajectory scoring rather than a ground-truth verifier. + +**Output.** + +Everything lands under `/eval-and-optimize/`: the +run record, per-candidate agent code and metadata, per-round analysis and goal +trees, and evaluator results. When configured with a git source, the +Experimenter can archive candidate branches and open a draft PR or MR for +the winning candidate against the baseline ref. + +### Eval Author + +The Eval Author builds and maintains the evaluation suites the loop depends +on. Given an Insight and its evidence traces, it creates an Insight-specific +evaluation suite that can be used to validate optimized candidates aimed at +resolving that Insight. It runs as a library-only plugin that the +Experimenter invokes in Insight mode; it is configured through the +`eval_author` section of the experiment config. + +## Get Started + +### Set Up + +Point the CLI at a platform and set model access for the optimization agents. +The examples use a local platform; replace the base URL for a remote +deployment. + +```bash +export NMP_BASE_URL=http://localhost:8080 +export WORKSPACE=default +export AGENT= # Must have traces in Intake + +# The Analyst's model reads a gateway virtual key: +export INFERENCE_API_KEY=sk-... + +# The Experimenter and Eval Author drive their own endpoint: +export EXPERIMENTALIST_API_BASE=https://inference-api.nvidia.com/v1 +export EXPERIMENTALIST_API_KEY=sk-... +``` + +Confirm the plugins are installed and discoverable: + +```bash +nemo insights --help +nemo experimentalist --help +``` + +From an agent directory with an `optimizer.yaml` profile, check that the +effective inputs and credentials resolve: + +```bash +nemo insights doctor +nemo experimentalist doctor +``` + +**Write traces to Intake.** + +The Analyst depends on Intake as its +observability store, so your agent must have traces in Intake before it can +generate Insights. + +### Generate Insights + +Run the Analyst against the target agent's traces: + +```bash +nemo insights analyze \ + --agent "$AGENT" \ + --workspace "$WORKSPACE" \ + --base-url "$NMP_BASE_URL" +``` + +Useful flags: + +- `--agent-spec AGENT-SPEC.md` — append a spec so the Analyst can flag + divergence from intended behavior. +- `--insights-file-output tmp/insights.yaml` — read and write Insights from a + specific local YAML file. Trace reads still hit `--base-url`. +- `--verbose` or `-v` — stream the Analyst's tool calls and reasoning to + stderr. + +**Confirm it worked.** + +List the Insights the Analyst filed through the API: + +```bash +curl "$NMP_BASE_URL/apis/insights/v2/workspaces/$WORKSPACE/insights?agent=$AGENT&page=1&page_size=20" +``` + +Or view them in Studio at +`http://localhost:8080/studio/workspaces/default/optimizer`. + +![Studio Insight detail view showing the Insight description, an empty experiments panel, and a table of the Intake traces cited as evidence](_images/optimizer-insight-detail.png) + +**What good looks like:** + +at least one Insight appears for the agent, each with +a clear `title`, an actionable `description`, and `trace_refs` pointing at real +Intake traces. + +### Run an Experiment + +**Convert evaluations to Harbor.** + +The Experimenter validates its work by +running evaluations against your agent so that it only keeps empirically +validated optimizations. The only supported evaluation backend today is +[Harbor](https://www.harborframework.com/). + +Before you can run the Experimenter, express your agent's evaluation as +Harbor tasks. This is more than just a scorer: it is a container to run the +agent, an input, and a verifier that scores the results. A +[Harbor task directory](https://www.harborframework.com/docs/tasks) looks like +this: + +```text +/ + task.toml # resources, timeouts, and env passthrough (e.g. INFERENCE_API_KEY) + instruction.md # the prompt given to the agent, incl. where to write output + environment/ + Dockerfile # a container that can run your agent (and the verifier) + tests/ + test.sh # verifier entry point -> writes /logs/verifier/reward.json + score.py # your scorer(s) — e.g. LLM-as-judge +``` + +The Experimenter relies on a classic train/test split for validation, so +create two separate directories of Harbor tasks, one for train and one for +validation. + +Two things to know about the Harbor integration: + +- *The agent-in-container contract.* Harbor runs your agent through + `WrappedAgent(BaseAgent)`. Its `setup()` uploads your agent directory to + `/app` and runs `uv sync` on it. Its `run()` executes the agent with the task + instruction as `--prompt`. +- *How eval scores reach Intake.* The Analyst and the Experimenter both + read scores from Intake, but neither Harbor nor the verifier pushes scores + there; the verifier's reward is written to local disk by default. The + Experimenter uploads scores to Intake after the Harbor run completes, and + each verifier result is stored as an `evaluation_results` record attached to + the trace in Intake. Pushing results to Intake requires a platform client, + so pass `--base-url` and `--workspace`. + +**Kick off the Experimenter.** + +Hand it a single Insight: + +```bash +nemo experimentalist run \ + --insight \ + --agent \ + --train-dataset ./harbor_eval/dataset/train \ + --validation-dataset ./harbor_eval/dataset/validation \ + --task-template ./task-template \ + --config \ + --experiment-dir tmp/experiment \ + --workspace default \ + --base-url http://localhost:8080 +``` + +From an agent directory with an `optimizer.yaml` profile, most of those flags +come from the profile: + +```bash +nemo experimentalist run +``` + +The Experimenter's own models are configured through environment variables +(see [Models](#models)). Train and validation datasets are required, and for +the Harbor evaluator they must be local paths. The loop runs a baseline eval, +performs root cause analysis, implements changes, then validates and picks a +winner. + +**Review the results.** + +View the experiment in Studio at +`http://localhost:8080/studio/workspaces/default/experiment`. There you can see +the originating Insight and compare evaluation runs across all the candidates. + +![Studio experiment detail view showing the originating Insight description, a run summary, and an evaluations table comparing candidate agents across train and validation splits](_images/optimizer-experiment-comparison.png) + +The Experimenter also writes intermediate artifacts along the way. Those +land under `/eval-and-optimize/`, which defaults to +`/.nemo-optimizer/experiments/` when a profile governs +the run, and `./tmp` otherwise: + +- `OPTIMIZATION.md` — the report with per-agent breakdowns and round-by-round + root causes. +- `agents/agent-0` — the baseline, with `agents/agent-N` as the candidates. + Each holds full agent source. +- `results/` — the per-agent evaluation outputs. + +## Additional Workflows + +### Opt an Agent into Periodic Analysis + +Instead of running `analyze` by hand, opt an agent in and let the platform run +the Analyst on a schedule: + +```bash +nemo insights analysis enable --agent "$AGENT" --workspace "$WORKSPACE" +nemo insights analysis status --workspace "$WORKSPACE" # omit --agent to list all +nemo insights analysis disable --agent "$AGENT" --workspace "$WORKSPACE" +``` + +A framework controller (`insights-analysis`) reconciles on a fixed 60-second +loop, finds every agent opted in across workspaces, and submits one analyze job +per agent that is *due* and has enough new telemetry. Runs are incremental: +each successful run records a cursor (`last_successful_run_at`), and subsequent +runs only consider traces newer than that cursor. + +### Configure the Analysis Schedule + +The global schedule lives in the Insights plugin config (or environment). +Defaults shown: + +```yaml +insights: + analyst: + enabled: true # master switch for the periodic controller + frequency: daily # daily (default) or weekly + run_at_hour: 0 # local hour-of-day, 0-23 + run_on_weekday: monday # only used when frequency: weekly + timezone: UTC # IANA name; e.g. America/Denver + job_profile: default # jobs execution profile for scheduled runs +``` + +`run_at_hour` is interpreted in `timezone` (an IANA name) and converted to the +server clock at evaluation time, so runs fire at the intended local hour even +across daylight-saving transitions. The controller still reconciles every 60 +seconds and submits a run once the scheduled daily or weekly window is reached. + +## Command Reference + +The Analyst lives under `nemo insights` and the Experimenter lives under +`nemo experimentalist`. They are separate command namespaces that share the +`optimizer.yaml` profile, and each validates its own part of it. + +### `nemo insights analyze` + +Run the Analyst once against an agent's traces. + +| Flag | Required | Default | Description | +|------|----------|---------|-------------| +| `--agent` | yes, unless a profile supplies it | profile `agent` | Agent under test the Analyst should focus on. | +| `--agent-spec` | no | profile `agent_spec`, else `AGENT-SPEC.md` or `README.md` beside the profile | Path to a markdown spec for the AUT. | +| `--workspace` | no | profile `workspace`, else `default` | Workspace to operate in. | +| `--base-url` | no | `NMP_BASE_URL`, else `http://localhost:8080` | Running platform instance the Analyst's tools call. | +| `--profile` | no | discovered by walking up from cwd | Path to `optimizer.yaml`. | +| `--insights-file-output` | no | `/.nemo-optimizer/insights.yaml` when a profile is found, else the Insights API | Read and write Insights from a local YAML file. | +| `--verbose` / `-v` | no | off | Stream tool calls and reasoning to stderr. | + +### `nemo insights analysis enable | disable | status` + +Manage per-agent opt-in for periodic analysis. `enable` and `disable` require +`--agent`; `status` takes an optional `--agent` (omit it to list all configs in +the workspace). All three accept `--workspace` and `--base-url`. + +### `nemo insights doctor` + +Check whether the current profile is ready for analysis. Exits non-zero when a +required check fails. + +### `nemo experimentalist run` + +Run the local Experimenter loop. + +| Flag | Required | Default | Description | +|------|----------|---------|-------------| +| `--insight` | no | local `.nemo-optimizer/insights.yaml` | The Insight to optimize against: a local Insight file or a platform Insight ID. | +| `--insight-id` | no | — | Select an exact ID, exact title, or zero-based index from a local multi-Insight file. | +| `--no-insight` | no | off | Run against a dataset directly rather than guided by an Insight. | +| `--agent` | no | profile `agent_source` | Baseline agent override: a local directory or a git URL with optional ref (`...repo.git@main`). A git source records provenance and enables opening a draft PR for the winner. | +| `--agent-spec` | no | profile `agent_spec` | URI of a markdown file describing the AUT. | +| `--train-dataset` | yes, unless the profile supplies it | profile `datasets.train` | Train dataset. Local path for the Harbor evaluator. | +| `--validation-dataset` | yes, unless the profile supplies it | profile `datasets.validation` | Validation dataset. Local path for the Harbor evaluator. | +| `--task-template` | required with an Insight | profile `task_template` | Evaluator-specific task-template URI, used to build the Insight-specific evaluation suite. | +| `--experiment-dir` / `-o` | no | `/.nemo-optimizer/experiments/`, else `./tmp` | Local experiment directory; writes `eval-and-optimize/` here. | +| `--framework-skills` | no | profile `framework_skills` | Directory of framework skills to load into the optimization agents. Repeatable. | +| `--mode` | no | `local` | `local` or `remote`. Only `local` is implemented today. | +| `--profile` | no | discovered by walking up from cwd | Path to `optimizer.yaml`. | +| `--workspace` | no | profile `workspace` | Workspace for traces and run/candidate metadata. | +| `--base-url` | no | `NMP_BASE_URL`, else `http://localhost:8080` | Running platform instance. | +| `--config` | no | profile `experiment_config` | YAML or JSON configuration for the run. | + +### `nemo experimentalist doctor` + +Diagnose the Experimenter setup: profile, credentials, Insight resolution, +datasets, and the experiment plan. + +### Models + +The optimization agents drive their own LLMs, configured by environment +variable: + +| Variable | Used by | Default and notes | +|----------|---------|-------------------| +| `INFERENCE_API_KEY` | Analyst | Required. API key for the Analyst model, reached through the NVIDIA Inference Gateway. | +| `EXPERIMENTALIST_API_BASE` | Experimenter, Eval Author | Required. OpenAI-compatible model API base URL. | +| `EXPERIMENTALIST_API_KEY` | Experimenter, Eval Author | Required. Model API key. On the gateway, `INFERENCE_API_KEY` fills this. | +| `EXPERIMENTALIST_SMART_MODEL_NAME` | Experimenter, Eval Author | High-capability model for analysis, proposing, coding, and curation. Defaults to a GPT-5-class model. | +| `EXPERIMENTALIST_MID_MODEL_NAME` | Experimenter, Eval Author | Mid-tier model. Defaults to a Gemini Flash-class model. | +| `EXPERIMENTALIST_FAST_MODEL_NAME` | Experimenter, Eval Author | Low-latency model for lightweight steps such as termination checks and summarization. Defaults to a GPT-5-mini-class model. | + +## Troubleshooting + +**`analyze` returns no Insights or aborts on the trace floor.** + +The agent has +too few (or no) traces in Intake for the target workspace. Confirm telemetry is +flowing and that you are filtering by the right `agent` name. + +**Periodic analysis never fires.** + +Check that the agent is enabled +(`nemo insights analysis status`), that `insights.analyst.enabled` is true, +that the scheduled window has passed in the configured `timezone`, and that at +least 10 new sessions have landed since the last run. + +**Insights are not in the platform.** + +A discovered `optimizer.yaml` profile +routes Insights to `.nemo-optimizer/insights.yaml` instead of the Insights API, +as does an explicit `--insights-file-output`. Check that file, or run without a +profile to write through the API. + +**The experiment cannot score, or rewards are zero.** + +Confirm datasets are +local Harbor-compatible paths. Live and production datasets may lack verifiable +rewards by design; rely on curated metrics and trajectory scoring in that case. + +**No PR was opened for the winner.** + +Publishing requires a git agent source +(`--agent @`) and publishing enabled in the run config. A +local-directory source cannot open a PR. diff --git a/docs/fern/gated-nav.yml b/docs/fern/gated-nav.yml index de0f479ca9f..aeb41b79e28 100644 --- a/docs/fern/gated-nav.yml +++ b/docs/fern/gated-nav.yml @@ -111,3 +111,8 @@ contents: - page: Cluster Setup path: ../../troubleshooting/cluster-setup.mdx +# Publish inside the Agents section of versions/latest.yml, after "Optimize Agents". +- section: Agents + contents: + - page: Insight-Driven Optimization + path: ../../agents/insight-driven-optimization.mdx diff --git a/docs/fern/versions/latest.yml b/docs/fern/versions/latest.yml index 888de0b3ce6..2d01d7eb744 100644 --- a/docs/fern/versions/latest.yml +++ b/docs/fern/versions/latest.yml @@ -263,6 +263,11 @@ navigation: path: ../../agents/deploy-agents.mdx - page: Optimize Agents path: ../../agents/optimization.mdx + # Gated until Insight-Driven Optimization ships. Uncomment the two + # lines below to publish it here, then drop the matching Agents block + # from gated-nav.yml and re-add inbound links from Optimize Agents. + # - page: Insight-Driven Optimization + # path: ../../agents/insight-driven-optimization.mdx - page: Secure Agents path: ../../agents/security.mdx - page: Plugins and Skills From adf28904879ee873d1c19a51746a79b431ca63b5 Mon Sep 17 00:00:00 2001 From: Jeremy Silva Date: Fri, 31 Jul 2026 15:39:54 -0700 Subject: [PATCH 2/2] docs: drop studio screenshots from insight-driven optimization page The two PNGs were the only binary files in the diff, and pre-commit's stash rollback in the lint-merge-conflict step fails to re-apply a binary patch over the working-tree churn left by the earlier regenerating lints. The Studio URLs in the text still point readers at both views. Signed-off-by: Jeremy Silva --- .../_images/optimizer-experiment-comparison.png | Bin 35415 -> 0 bytes .../agents/_images/optimizer-insight-detail.png | Bin 11151 -> 0 bytes docs/agents/insight-driven-optimization.mdx | 4 ---- 3 files changed, 4 deletions(-) delete mode 100644 docs/agents/_images/optimizer-experiment-comparison.png delete mode 100644 docs/agents/_images/optimizer-insight-detail.png diff --git a/docs/agents/_images/optimizer-experiment-comparison.png b/docs/agents/_images/optimizer-experiment-comparison.png deleted file mode 100644 index 0120adbdb754533ba507743190a96afb548ada32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35415 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 diff --git a/docs/agents/_images/optimizer-insight-detail.png b/docs/agents/_images/optimizer-insight-detail.png deleted file mode 100644 index 22865701b7925ee9e40d1c9e3d8148fc6deb009f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11151 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 diff --git a/docs/agents/insight-driven-optimization.mdx b/docs/agents/insight-driven-optimization.mdx index 8b37be83c85..ba446ccd16e 100644 --- a/docs/agents/insight-driven-optimization.mdx +++ b/docs/agents/insight-driven-optimization.mdx @@ -356,8 +356,6 @@ curl "$NMP_BASE_URL/apis/insights/v2/workspaces/$WORKSPACE/insights?agent=$AGENT Or view them in Studio at `http://localhost:8080/studio/workspaces/default/optimizer`. -![Studio Insight detail view showing the Insight description, an empty experiments panel, and a table of the Intake traces cited as evidence](_images/optimizer-insight-detail.png) - **What good looks like:** at least one Insight appears for the agent, each with @@ -444,8 +442,6 @@ View the experiment in Studio at `http://localhost:8080/studio/workspaces/default/experiment`. There you can see the originating Insight and compare evaluation runs across all the candidates. -![Studio experiment detail view showing the originating Insight description, a run summary, and an evaluations table comparing candidate agents across train and validation splits](_images/optimizer-experiment-comparison.png) - The Experimenter also writes intermediate artifacts along the way. Those land under `/eval-and-optimize/`, which defaults to `/.nemo-optimizer/experiments/` when a profile governs