From f62be06dc5f3b31d70baad871ae4f7c4788379c1 Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Fri, 15 May 2026 17:50:59 +0100 Subject: [PATCH] Task-Owned Shell Windows --- assets/pixel-operator/LICENSE.txt | 121 +++++++++++ assets/pixel-operator/PixelOperator-Bold.ttf | Bin 0 -> 16984 bytes assets/pixel-operator/PixelOperator.ttf | Bin 0 -> 17272 bytes assets/pixel-operator/PixelOperator8-Bold.ttf | Bin 0 -> 18624 bytes assets/pixel-operator/PixelOperator8.ttf | Bin 0 -> 19944 bytes assets/pixel-operator/PixelOperatorHB.ttf | Bin 0 -> 17204 bytes assets/pixel-operator/PixelOperatorHB8.ttf | Bin 0 -> 19076 bytes assets/pixel-operator/PixelOperatorHBSC.ttf | Bin 0 -> 17112 bytes .../pixel-operator/PixelOperatorMono-Bold.ttf | Bin 0 -> 16744 bytes assets/pixel-operator/PixelOperatorMono.ttf | Bin 0 -> 16972 bytes .../PixelOperatorMono8-Bold.ttf | Bin 0 -> 18624 bytes assets/pixel-operator/PixelOperatorMono8.ttf | Bin 0 -> 19872 bytes assets/pixel-operator/PixelOperatorMonoHB.ttf | Bin 0 -> 17120 bytes .../pixel-operator/PixelOperatorMonoHB8.ttf | Bin 0 -> 19020 bytes .../pixel-operator/PixelOperatorSC-Bold.ttf | Bin 0 -> 16716 bytes assets/pixel-operator/PixelOperatorSC.ttf | Bin 0 -> 16968 bytes discussion/index.ndjson | 3 +- .../AGD-0036-prometeu-hub-ui-direction.md | 193 ++++++++++++++++++ ...ometeu-hub-initial-retro-shell-ui-slice.md | 153 ++++++++++++++ ...ative-shell-launch-and-lifecycle-wiring.md | 107 ++++++++++ ...-0063-hub-mouse-input-and-click-routing.md | 89 ++++++++ ...N-0064-retro-hub-home-and-fake-shell-ui.md | 100 +++++++++ ...LN-0065-pixel-operator-font-integration.md | 88 ++++++++ ...0066-hub-ui-slice-validation-and-lesson.md | 96 +++++++++ 24 files changed, 949 insertions(+), 1 deletion(-) create mode 100644 assets/pixel-operator/LICENSE.txt create mode 100644 assets/pixel-operator/PixelOperator-Bold.ttf create mode 100644 assets/pixel-operator/PixelOperator.ttf create mode 100644 assets/pixel-operator/PixelOperator8-Bold.ttf create mode 100644 assets/pixel-operator/PixelOperator8.ttf create mode 100644 assets/pixel-operator/PixelOperatorHB.ttf create mode 100644 assets/pixel-operator/PixelOperatorHB8.ttf create mode 100644 assets/pixel-operator/PixelOperatorHBSC.ttf create mode 100644 assets/pixel-operator/PixelOperatorMono-Bold.ttf create mode 100644 assets/pixel-operator/PixelOperatorMono.ttf create mode 100644 assets/pixel-operator/PixelOperatorMono8-Bold.ttf create mode 100644 assets/pixel-operator/PixelOperatorMono8.ttf create mode 100644 assets/pixel-operator/PixelOperatorMonoHB.ttf create mode 100644 assets/pixel-operator/PixelOperatorMonoHB8.ttf create mode 100644 assets/pixel-operator/PixelOperatorSC-Bold.ttf create mode 100644 assets/pixel-operator/PixelOperatorSC.ttf create mode 100644 discussion/workflow/agendas/AGD-0036-prometeu-hub-ui-direction.md create mode 100644 discussion/workflow/decisions/DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md create mode 100644 discussion/workflow/plans/PLN-0062-native-shell-launch-and-lifecycle-wiring.md create mode 100644 discussion/workflow/plans/PLN-0063-hub-mouse-input-and-click-routing.md create mode 100644 discussion/workflow/plans/PLN-0064-retro-hub-home-and-fake-shell-ui.md create mode 100644 discussion/workflow/plans/PLN-0065-pixel-operator-font-integration.md create mode 100644 discussion/workflow/plans/PLN-0066-hub-ui-slice-validation-and-lesson.md diff --git a/assets/pixel-operator/LICENSE.txt b/assets/pixel-operator/LICENSE.txt new file mode 100644 index 00000000..0e259d42 --- /dev/null +++ b/assets/pixel-operator/LICENSE.txt @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/assets/pixel-operator/PixelOperator-Bold.ttf b/assets/pixel-operator/PixelOperator-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..745734f6c92d6c2855e477a32a00f98d2936db1d GIT binary patch literal 16984 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 literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperator.ttf b/assets/pixel-operator/PixelOperator.ttf new file mode 100644 index 0000000000000000000000000000000000000000..34fe947b8d4e7efa8e57798512ff15b232a763de GIT binary patch literal 17272 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 literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperator8-Bold.ttf b/assets/pixel-operator/PixelOperator8-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..10225eb8e3fc16375d26763fd3bf303ae7fefeaf GIT binary patch literal 18624 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 s$lqsU?X1oH_%;G? zUjAn(Pp-gq^60+1x_JJ@uU4%R89$obpBTo+Qi-t_FI<-x9zQB;N=o@Lxt~1+uRm$e zpJa`cNRuS>N}W$uV4RE3ad(QdR}v!en)oL4jhZu*bGh?*PL)8DuUkaU$7vGVe63l% zbdfwDUc-z;J$XnBJ5A_T4q`{#5wtyVaL#dbERC=B;@ly**b&K~Uyt}9oIS~~-}Rg( zZS#B6$A0~eXZGR1xS;L#6`XYrbDe*^`JQvWhHDGPoOtzXbo^xBQlfMGx6*5k*Gg2O@EAk z_H9XBvyXGKtp{QX-wTgmJih1rKo5*Jv8R4S8=t^9_(FW0WDvf@03Op!d^@}GiIF}{ z;?5?VuaXtOkb1dUz9?UougF39hTJRvD&Lp9Q|44V=Qy*R`A(a&#<|kD#<||{#q6uiiV`o9@lwulJpXDGf7#)5MXx-_3tJ|Bd{?{5|=7`A_9PnZG%|BmeGvU%n^*u6#Cseg2y9+VR-9GcKc# zjy^K_@aPXm9~}Me=)I#WMwgE+e&)$%9ygi+w}0c8leC};x=svlJfbhy!Hp-9C8cGP z$}1|Xs%uiUb@l1VQ>LDE_8X?1GyPm3^vv^S%|5?z&fE){E}YlgGJiqq!nQ?=mn>a& z(egK5{H7IeUfI6tlGT^4dCS_%*1dK8 zzU4h1xcP%4AG-CUx5=KppZes3Pd+8bUUsHAbKy~2oZFpy zoWsro&STE=u}QHRv30TG*ymzLV#nQ5ccHt{-R2Itcer16A9PQ|r^lDaH^oQdpO1e# z{%HKAL^4sIXi9V>wk1B1IGD&Ko=;XK7bZ6+hmyA?4>SNW%tN*)tyk=6(@|vABhijg#d8y`=R5DeYnx2}Q zT9mpXHI%v~b$ja0)c(|=)Uni9?Tp%awaaQ(*KVsFs=cH3{@O=te_s1+?Mt<<)Fta` z>!#Puty@&LvTl9d#=32FpRT*R?qJ>H^-^C^Kehh6`j-0T^=s;{s^3)KT|ZpEzy67| zq$|=>(+kpT)0@&arEg8&mcBFn)%5q$52c?-Kb1b7J~{d9$+IUfn*8a>hbKQiB{pU5 zl;J4{ryPT4qgK$`!9~3yPD84JN33J~sM9pw?~ILCxZbH%u6J^`8SCr?M(NnP*3`^& zYkFpmFL&hBstjN&M(m4qM8`N7m&xUvCXQ0FDETlBG2~&~8{}M(y4G}S8;#Gk`wk#`_c;m?YLgTBNHJniJ>G0nd@vbygj~Y0b=>9CM?lTL+n@=*+FM7#aoT z@UIOsnLoFI(xw~QX0~1AK#xw*XV;^=!OPA5kAd~iM03;PYz;1bo0a?2{vB~RAA zX*tXAGpivD8>d@Sm>sg?aB!&D{mx#RC^KF`f@(7ogS6xQM%wXy>e*qQv%Uc9rRW8; zE>Xi_RjPB=`SQc6kQTCXzE)>U+0{391bmyx#=xpWew{Js5ZBTxz@@Pju7fwglgQXa zm+H0PN_~oY#}&}9&TBmivZAk*`is8Y5&9MW%t>VcAE?xjyUSGuQX>Djmj0H*cRJpV z%`ZWQUtLI_Mrg#L&W5)Fa+_ExzNmAZ@QfKlPyVr)KJ3 zD=gK7@9~ey=AYA~Yk<(s<&uK`aUN<;E!?15CtvB-oU<1S?^oMW2e2AE3Qm879-X1j z7)&rRjM-s@nY1utk#mzl#zE7`-8kuZyjveT$BbWWyjd-mrngzIZ)@P3WI<1-4)8pF zR2>#%!GPK(SKzlLzzF4n*kI){vNe#Wl+yI6Lb0%rl7w4JnQ)O#l zR8nKKunI{Xg_2V3fG~<%OoLWKH1W^piW~t#!3uRvAkC2##1R#bHCcgtb+i|8B8W?C zx6`81H=K!ZD;X@OA!%Yq?SPeE9dx4>r{{#)XOOF0WXy#R;gbeDIw@P|N92lnH&PkN zNC^l12{IdBA|cW=f#Hr6C|p@Ar0XKGAuqKS_$biGr>mskAF4LB8yybHqm!x;2{Ncr zHEv=@YG%XVrKW`Mu@3YD|DC<)Ki~A!B&8Y*5La@}7~(m=Bp?HLKup8t8rPhfPDtgp^v9*n2M6&9%cn*VI#sZ4?h1eCHBGkFn4I|EvAZxt__K_)#9dHTF zTA(L7Loqoh2pbagZ_TT&R6+y9e8ePkF#Nm~c!1U{90^F_vKME%DV@`V3E-G%Unj#^ zO94o!79OvlEm#jQjDlDyr;d#^4NlQRh%~ev9m5^ToE$|QAkxRRNDXD?wZ!^}pV9B> zUs%GE3-GfSgh)jF2^>u5S0%n}c{TDWbDa8>ae8=^<~E7~{tY@9=!?oyLd5kwlbk3Q zh6iwf3#b74h2|=aH**D04qRhSjeS%+drut*crF-UrZbrFGwoI}oB`0??8=3JMQ^+~YQy8mbQ25~$+S;Xl z7`^l<=$BZhH4%XqY@8fr{)z{_!I&vGKA64$vhd)wjJ_ZOQ!|Z?Knph3AjBI~f_Jiq zZg>(RKh!z)&%h(KZ554)t<3HSWH32H=g|05*%^MumD@$p!Px-W3Y^`f@aipInO?V%6_>D>_yRObz`iM+!0v%o9k!FsJ~)5=RgRH4D! zsa3HfG$j3BX($fU`_+Gl4s9AWN(XIRh$V%tHrOHyl=0+ftb>+d-07Oa)>focjgSp+9;IU&@Pf2+*?#dnT5PT zro$N3I@GU2it0ehO$*x^&@V=U3J`RHb%d@=nGu+)=>4o+7&K-szfK0P5sXu*DP^Qg zj*M4dfxp473NZ|+le_8p;GdNOFvOs5;OmMWMYRI>FpABoy|6Qc`eQ7=j~GgcO)4eL z*b!YXab8Oi7t-n(nA++dv%8wLIYw&$Mg;H+ILlQchJslJ0bw6$9}AHV5P=dw3&=@3 zhH+~!1X?qdsbUDLSei;P1el6!(E-51E6T&`$faNaF2#3pHFnzk@K(*jZH!E!kKx|x zoBo99qjR%r(U?=TfewA#Ob2UJg9xT30fZ|HaBmQY9LE2+enC|N8j5`Cy=psCs6vtM z2$ZHytLu&Y5?$|E{a@q|n@om-_Q81r4%PoyfJY>y0ZSjyG#dK8;*8Ne=hoGOA`-2| z0EeBze5+o8aj-fDae0X%YefBmd_fjs5#%9Xj7wutKl?H{a<$=}Kni05ex3O@?c)Um zjO1UfQvG5OGE%pEF~m3M75I_s!Iu+K#wy%kGW-B&LcSSsC|DJEcqyi# zN;HYE5!jIHZ&NGjRlIJDfNd{O9U|=PIz6aCeSfhl6qXMfDMze}n*40-U65y?TUuG2 z(&Sl81%G8u(-=W)6<)`h%=Zo~Fc5?OWG8pSCs089@d#N;G^cCyGn;_VR*266hSzaR z0jmkT7sp~zzNA;d1AqyfyUj$!MENoZO==ncazSi(^d*BsL{&%tI_i0v9*}6QuE2}+ zY4CrB+zDq@kA~kxqTl?|;n8_8foLBn6dgrw;Y;Eemc7QdL+SWjWELpj8?@KVBX6Z01wPlbYNxW>0@ z`D%${SNX^Tx~_=eq3#_M4at>j;tDNd5_p6D_zlThRp|-zOK<`!!oR)K_k0L zj=7L$DG$c$-mhOU8vR)8DZpjy6M-TlGQeev`)W^JRWb+juMK+2L8lsYtbe)sfQ<+X zj6Wa;cCO9tn(kWy4`4(TdCUbsJ9372&>Fyi02Nzk*B5yu_TgSsniel>s$~Xiga^!6 z}PbsaU# zNQc0xJO%pdW?Vu6^!u8?Y6XM@8V;
n_A29){oBjp$#DJAx-N)jONtb?cSb9 zx7LF`#|!PCuNlkFla-X7b9};@BlQ>79<4qms()AsfnlEfad2*SL~{r13;Aee z9o0iysI1|Jp>S?s56T?c$7;RxR~Wy!D(rKq`MJ(q9lQc4qhR!sOW@vsUtJ&cb2t*k z$otZq(a<-2Y!=zZMbWpMD0t{M)WODYw3^Y4)Z8*Zql1~8)_T=l^9_;JEJjmPLMsNO ztV24EW&yOX2ynujyncR*Iniun)ivzr)l|-}C@hVI9s#bd&2@aXS&9OU-VYU8nY^ zk?z!GH=2&v$79@{i#QIfeaxRkH{~?X)d$sCt%O>o_SekKC(aCTE;v7p-RKiG!^(`L zcB^-@?64cofNSU#mgqnTNcl-%Hrsi0ef;F;QeJ(tJOzrZ2E^X^0<8sv!34hLpF5lR z$Ou<~d@Sex04EMwZx}C8E;!blKrbYAQ+eTxilBy8UBOe8rlxtke+b^WKF&0y*MoBI zEfVqq4MIZ_SXp1F9`~I-AjEkSyeB=*kiv71bM(p7)Y!67ipCbPBX!1BSXDLYxNNC7 zYQ6*`GZLE{`dJLaA5V*+jfRwy$BX%{KFZA^7}RaC5iA3t7bphJ{!RGL_j&|A}F@#Ty?%XkTWQS*2hkQ`Y!O8J- zL1_Zy`N7ZB4-j49^D{gh^Lh}oP-tHb=r?)S!*9ZfaGJGBSz(qj}FJ|jg>UWE(r%oN9aa(|zLyYU3i z-h`1f{ogk+&tG+ltuII=7d3$yU8qXRH%J1qSY!!`JAFKN26&~6Gjoh`U7Iv-k9aJ<{ zHN8h8oWo2)$OGc2?>f-Z`gcsY7bx)Q2Gb^e`7|T206)vcOvi6UZ7?oF_oKh|}>jxMhrTjnLq( z0DuwpFYt~{IJ46`Q20{TXU+RO+uC@hsRq$o5a!z~1XAx7KMK04oxPD(on zcHZQKtYY;TT@T)>K?XF{!vv{0%P7JdK&%-4V86oPXXyFYlZ&K7=L)sPhqTp-W>ca; zyRyo;cg^rE&v<$L7N(*MQQc@oOKAQgev3Ybo&V@O5Eo5lQNHD(6Y#%>EzjNKPBbK54in8nVI~i+b@yX1;uW^ zT#hZc+U-}!;RP?a{TZ?#H302`0=|ie84tG~$T5laZa*P25;wX1q^wWe;r0vUnB*~T zKP3&xKDS>eM1vKM30WIJ*UM@cSM;%PYFE*Doi?eC+q(`)B_7g?(G`cvb{I6da%ELaA0fZ zyx!r#%-q$h+va5!EocMjk&&UTD;6&7b{B#UuUjxUylJ7Mwsqm(9_YD)5P22jqu#=;lPuEjD4wj=Y4uBuGv`;V2| zu@~T~Bq~!1Rk;XVLkWI0sZ7c-$2|j2u&U5M&O~*t#f)7Yp1wDriZ)_Q-;8>F7@oyv z@Eq+3Jdra}eTKQnPsgCon2-2afV{=*v>3nGumpX_Qdx$mT@DX89y$K?$Z2no zRq{qT5ms4)8nISRMqPLl{P4|kDkA+Yi2pO>t%&C{@moA+$=Py_bjrEN!{^Hdr~wzr z+vH;D!tcj?POg#n%O~VHxdHS2Uy|G8I(eUbO#V$iiRT6XEl4u<7&izw#lu6cPM( z_;Mfe!>#b-cW4dTicB+tit$c4fV_1%BIsT6Zn*-#6ZBbm4}Lr7DtWK`QT`;~3X=Fm zt}K4gDist4Mfk0slAtsw3(Do^K}9eFzb8~BcgfvBbucri32J4({5D7jbwPd55X=f1 z@%uo(li$k|@@x5}{0hGwbC3L|+$Ud`@8P$D?v?M$)v{MUh+h+WQ0~Vs2{i@H_Qx_irT_qP6xeZ4!%x^w%5Yr4CJ2L}p!Y;%%rdUaEFa_+jaO_BX| zk^Rk){Zk_Qm*(~h-(pk;Y_r}r!^Y#x+;wGJbNhuG?5YvloOQ`?@AlrpZMsRFHN0hD vQ)(MO3r^ZLJV+%Mx1G4iZI|hG(IO0IxC9s%F%kkE?ECA=OlY7%rN;x5=6bNn7G;Jxh)Hak@%ER(7K*6TDw-3zAG^wRl ztQZj=gN0FiOou^yRYimjB4P%aj=&v;={Op-R)mO%2n-9?iZg4uLhgLuzxR3EJXDr? z(tFQ7`=0af|MC5gz0WxnM?^~HfVi@D!-gv^eoyyFzY+nu9S7d_`PUH*NxkcAN$ecB8B53P4S(Xj&$j= zH5}n-e3tJ-N6}p8Q=k{e@q(S*1AChfwhZC;Fg`DL^>%htj-JvbQZNU{FLZb8?Ze1} zXfML~UQb7N<~J90){2~q!-8-3_3j>M`uh4Gik$y2cya_I6+VB`XCL|B|2y%{iq*fD zl7h83QJy;V*-q|%`t#P-+@Xm+*GnXESR^s_V#9Tb#TUO!HQIYw97Y0#rIda{y5JB!woKkdiw`YW!Q z;cvQMY+pcG@rR6|6K{9Rm*lW~9aQg^2SN3FPLWgU%ykxk z>N4j-XS37pY;m?aX{QTR-xqtrQmygkc=J3@sh%69n)_AmXzpKgkLA9Xdo=eix$ow_ zlY1z4U+&)AJ-I`<+jF1D-IN>5y*t;N>(0F^m&sk1yLzH}A~xYn$mmm}PmVq@`uOP4 z(eI2tFuHbh_2`P{jz4$IXa?N=l{crrIv?mdF?{h8-Czedo+v0RDxOtRT2@|BSyf$= zOx4bwbJE<_)mA;{rNB4^TjWH<*SFkcJJ5k|KVq=)`Pcy;^^^bM7a70C*(qM_odihUJdt9Yp5 zXvMLL*DJ;==T@$(yrlA)%I%f?mG@Mhs7h9~R$W%LrD|u@XR5wfb$``x)ic#nU0OY- zdO>w#_3G;F)d#BYtA3>ViRvF#kJU)c{F;q5SJiB*>8aUQb4$(Png?qht9iQSc+Cqn zuP5Wl%H--~Tk?wJp5&L4N0N^wpGy8D`F!%V9>>|16(IQyA73+A-Xxf#et zyo$9W$GB1mwAWSD>1S+W#A%r5bH*l0UGI%n*Bjq2F+?eG#)5O3tLjtDsd}d&i_IN+ zqcxo-y;yrluLkEh_@uK4dOS(Vj#!V<+;*~@DpJ#&YHq^OWj9UD$N2X#Q_WR%EtDA_ z2OpKU&pAlbq$f&AQ*A|3pgYlL#GL4(ejTSF)^0HX*H2&0u3-)gix17uOOE;L_L#*8v4U5E+~9QoS~-m^)d=#TCA8Es`KB`kHC0 z=;jU)Pxv!CMm+M7MI0NJ5<`o&l~!E zU<0Xv?r}($f}}=QdM$qAwWM#ZvHqyzSJmrZGb{z%kt$t?e_HXeLh$WeB2~a0$D!ub z!gZ>3@|9}F*id+%+Lk(iFQ)0Sv0=pyt1S}?3}!0S3ia^cX3(Mq;2HD@MIim4VSH45 zCI7lp%ylckg^tUyi8_n=mO4;@5AhqjHx6?@F`}@Aa1c;!l#R&6xCFZb6OblVZ{;&G z){(C&rRh_Jf}u$z33!1pAv{8{@h_iOi&DlYcmz?Sa*_iGN?m~^BkFz-O(TTSba{FL zjTPh!GUCtYiX6q-$qIGOK$;~h@FyC8wS8zeS88ZC#)-f`t^KBWr*A;x=TU zQ@FC2PuI#ztp!*`RPyO6Dd0oZrgmc>hVlqj@Cjui4CQhr7sZAv7XtTES;+5LJ8D<; zN%Ws#dMXP9Sf($+uiN3*L2Lp-!2^677=nM(ztrMtbGEsW_ZTa7W;JLBo(`_{&v-LD zT6H>k3=_kQ1vKJg9D4XPLxeiFx*^tm53<&)V;`?p-vJ$H)`ojVX(%QO1z}383>zOV zg9aG;)hDYWzI-~YnScx~_LPQfX{@J$5tW(sbu8=w;}M1}HSk0!O~G=2iit&H595U* z#l$Njgy^8{2n=^9Jw8g)xgI9j*g~00U?0Z(2+oLm;wz04)EpawX$<}CF$a|NOt zxW<_3`>1#j-vXZV&c`|c^{(gF+p~S~`XYKI9wdkiuvUxplrU#gzqA%4%7Qr<5J!M{ z-gx8>ksN=TPiPj^Csi`OpXQx$vnU>&>8!D-e0o02GZ! zFAm)oY{di2&|W3PCgeNYe(F(C&?^Jatg1J*13ehrcOUS9ra>iSArwMepaO)fw1PDN z@)T`_P5DJk^T#li7NYI;oa?)@i4P28$PXbVOw=~mCzc81@ln?!E&z_e zhpmq=YS2e$33rGmvet>jEE{WBx3PM#s8zYGyo{78v_^~AFb&CU!WA7e9?=i{&?~7i zt)*?7<*0f%5RZTh4k+UIXsn%vz#PZt+4xWeW*dU*=|%Mk^(JNwALYb1Ez;uqk{Up{ zvtRCzb|E_Z4Wbo;Otz1WMxo4x_9U6Xx{b7m(nuyG6zW-PRKGTvR2v#63+h6@Knbcs z&c7{ zyPCDe$N@bf863tJDq*ebLZ3D91CiZSs~SI8+0s-R zKLC4VkoJkvi2ap^H<4e#03gM0ay1ssuR1=^svg~YLIqk>7GMq#SNstZtcwtJ5v?@(DSEZ`qtb{DYM%0g1D%6#Eg{tZc@E=} z$#KxWjoGUIF*7=15lN}H5(5NL1pA6dqj`?4GYXAHv=+U4YMh4`D;~A}gMl#r;)aNF zn6kle)D!uHY>Wq}gTokVctwQLSPYH`6y{{eiKt?L2m#-0UQYS31j0x1GA2u8ipJyy zm4|+>HIFY16r+-u*rpnWkyO_SDW(j_;Ls4GA~P(t1yL2JL^Y>n)R^WMHi%U_7O0u} zO0S|P!(4UV3@K~t%UZVr`K{P;qT9VgsIRY~fdhe}3> z>imzeAR~e6Qq9yg^lE&^Q{OS1kPqe+yDq{DfhI$e5kIs=BnI;uKd%zNHlIcPTw~0i zl~);|e5eI^RrU2}=2hcD_!vL%o`{9y`a^csO~MALdcR0V$9N-=0G{yHG!a zhXoepS`#7!&Q_~3B%;AKJW!|IX6~)=hINNs1H=lk&mY&5A)U^mfI5{8BM>npf=z=4 zqfkC+L@3jdPJ$scX;l5{`luS=&mfWw~m?U+5`Tb-KfV#z(jUi{JoT*@T6mF|N%sww@*L zDg!)_d!3U)XD!f&p$tRA1-U?O%4`j8pq!_3>myb#ic3@PLH`zwl*`}9cEql%t{6Y9bvc>U^&(Cb5znB_;GO|96Q#ru%zf?$-zpRaJkc6Rtz>a`Hn$3?;sMb5HCsQejO2HJ-l+p*9B!bRFpBG}nP%)_D*8 zM5`;_5n#^7$|EX&<_qW=4+%`mUmc}3_F|12z{Rx1*FT3~2=X8gyd^@YwnnTz??0(4NPDmd$8RufPTQAFQE6d7~I z%*vduc_QvijA*LHn04xH$Ou5IMjMPt+o#hJo1P)BkQ)5?l|%Gzn}6ZYrx|}{A9;)4 zkM+Lw5UT;_F3?yI_V-ThPb6{v@yY$Jr*xiytt=hCF2emJAH#Oet~$^;I}t!t;KjoaD!A53%S|;lF9BWMhoB6dR?$r7IVb|A;PpB0caq?rD zhI(sPL~6uJe8V&BhD1B9{T9t&zesxS?_|CuEAWHdNhfMWfjiRf1Ms)|xi+ z01A40$khq3`k=~X<(Y)*rb+ts{buQ;eqYW=f1aE{|0Me8pV@D;Zk*ybsCEpTBaUNq zfyL&RjBT{`L0kfC%>5wE&l;6s+ZIMeRzPT}8{#5*BR2IrHq2&nwE9K@9!N|>o6Pm3 z#g#10`>e;5rd=5WIZZzxLS|X+LdS@Hz%+8wVf17*xJ`@cl{4rz(x0bW^iP8!SI8d>;{wd63Wy7Sq2@uWP|h?pGUGC_3-rPdU`w_+ zl16Cu(H_PbFymo_(L4_fvjxhgsO2~~)Tqq{OsB&My6jp=q52HQV;p<4c_0{tx-}ct zho-?m8;8y7HyFt4k6=LieOpX#Yv{)6zp8nvt(gVYvyH7$*+5G+d+9<8jGf1i!RpZ& z_{{5%@TvWBMtf@|- zbyeULetw9o%P{`Z4OOQmKbUp#pjL5F3$Rwg#*&uTj-cS-MWHVRxxk|2P2~bx1_Rv4 z63h+=e7-L#%^243vp!U z!=%j>=0A}KFyHmpwQw&lm`mHI1*Tii2&x?h8S<#>OvcHWM1$20TOa#+%gcugBUlaN z{)VVN^?W?HsI~j#^M9t;p85PUR2TSCpJJX6Rt4bQRtDC$^cf4+FZv1*=h9@ ztxIWRqbH3=z$uyGvvvN{0RHZiqP3BY6~qySMMyO^^~>A%{e+Za$&Zhyze?;gOK+BL7%qWU#V{3a zbF{_2YRcB%!TLue_L}QV5zZBLf)AlhXK2&Mg|~#dieTe94o$yhwdKCVs65%{LO;_g z-`7LlHMDArT9R1y=R}Y#yu?4BYf_2=Js)stAY0a(36I@fW>ma%YVy!i0{mNG% z@PQcy=NPEyJ5*L=MLrLS<4PkVj&TPRn%4Qcu4wV@0Yo-WTmhrgtzl^y3>_i<`u9&+ zEfBTT4cEDdP>#tpU`)%>SciH}WPFr;xkJuDysI;Y81t;I89tk{xaAXK;CG=sr~S{F ze)GoA#0Y3SZ)o^&75qVWY9E6Mdq0HX$K2Bc7d8gtT>sv&Mi{jVBBy^3h2@F44$y&z zX@LSg;1BC))DdN*8^9k`Hhdu_LN+|>rt4(Evv4|5D>c7kTzcE7`b_fKvP7RtK2Ofq z^)ibP>WAZq_E`EobRzLnBj4)-(dv2MwqC{o~iS-bC zLvF6$B32unkw2SvfM)QiwJov@>1*L&2BOH+H*{pK)#zrWRO!?gc=D7>!*$Mj#Urk2 zL0)4;#L<24(D9WA&Te51xH>JTQHq4!A$*a#j-U-%&*m@lOrG%|!wxXe>HFGk&Vjzx% z6JJJx_Z2MzU9{aRyyK+VBo3j)gHT(%_U$!5t&7d{=b8{cX1WSiWG?~UlWQTCuOgQE-Z zzEOwlz?+#o&yz*chE~7+J|F|K0ke#~cu8|P)+aoDdno$r_TX1fuEli&avjdHDMoCBzRnT0nq(z@mCc#1Ovmm_+S_)cx3S~KJ(-MmK~Kky!H(VD zqPC9yJ(+=l4ZVBMU4EvwdZ#(u&O`6oj)CjEzW&~U-k$D`U0vR_>0Wen_I9sn@Va(& zW_n0-uqU1A_d2}w{h5w|U3)U#`rhvD-k#mwHJSciZ_)bojc0mIiyJ|DV4!dJswGQ0 z?TMhn^A`8^?^t4~?Ow7E7cIf*OV%v*7ImKKEp2Q(_nf7TO)DYBWzhd#$WLot3T@It zv?#Fh4+bSLX`~GLLRB|G=`{K>7y#1{Wy0ryEVQj#wV}5M+V0|;XGh~RENm!`$v|=_#k?-H3?cgjIt8EFq8BmD#-HY+od5M%_&9NLgx)Ljo z)yULItasF+N}Pj?Iv2I#Jml{As2Dw|lhaT)F2I`hLcGzo2(jucyiwNxH(89R#z?gk z_2e?tAItH!+e$>RRdOEU{aX;<&X=|FRyf~!tmj_<$GZ?7{x;z7BH0A5zXY-1GI={3 z`*OU?e5G6^?~r!68Zr4=*@ApDZPBZlom27Ir)Pxj+I z>(9&k@$U5j`GCACugN2hi~rFehyM^D;S@N9cvrgEndOu?rSem!%qhqF*p+yX`T?iP zsdj3dq`V-%c2Z8QGaGNzp5)BM`_(VXZ*Vu`mso}U1y(+e$UnTfcmaOmG)!#YTy}c{5x1=*{7qoVE^!N4@ zq|NREv&-nN&v9kvUuFlP;z z-Id$=GkY=xgStyx*}to2M`DoQ@e2m~dnx47#&u10ze4v-Ovou04V8 zX@EExI~Pj(d>rq=_fX$pPxlRLZ(k!)P>b<_9lJwJg)0iv^vITsw?hXNLi-tK`G|9 zH%|OH@}^R_EjYJhU4tV##(Io$>1X0L&iBM?{`habC*F?xTi;FF&2|r&-oQ%ig6{goF80`BYMOvNd+6Ry+D@3*J|V%`HXx{J}>vmee!^O zMZPAvpg5=qjtk}l3xbYdb#Q)gQE+L{9rOl+!Oq~C#AAtriDwc&%hY5VGskC6$jr^O zWtL{{%{-9#a#LN?35aKrjNB=ol|AwWP`zLN4OG7o6a{5LV=x<3PYuor)&*U`hG1im z4f;U!J&8vh)#^-rW>zMnRF}l5=3dC{&wVrZNbVcCujl?f_qE(ta}VY2%iWv1E4Mp$ zbMB+LYjWFj@5~M6`g2$0dUKcNE;>5>XyRyaRK_14e{B5G@o$gsAOGt31LMobmyIua z?%;Dznr6W5-+2iNT=0Qzkid%H_yRj5Q|W@jqT-U$vT5ZNl~vQLYieiI)i*TGoORss zuR|m^&z>{)#Ca#Z{^a?mw6wM@SlE7Q$7zceFIjr}vNxRZ#^rBXv9j~bRcEb!^P0Du zea_l*&wJ~-^Dnq?{oA@Oy7-a}m%jZS8@uJIcfaSoAG-0DkKcOR9k+ktlmGmwJ3sxI zyYBw%zkGhrJ@YHRhWYdsma`%1Pd#>QYmGf$SuCb?C99ZU~0!5OgowZUz{p5UQie{e7%iCKxx#6aT4#C?gU z6aSq&KG~T(FS#LkRr03fJ;|q1sZ=JlBDE>CD|Kt?p41bm7gK*q&q%LGuS@St-9mS)?_ZL52JYJG0nO(BJWVmFs3HdHOaEMUYT4Sd%ge4VyQS>jvWLo^C_7m8{Ir5;ub;Ml+6SlI zH|^lGKb6ld?<~)jUswLQ@^6(tUy-PoUC~)FRPnKjhbvyHoKd;FGFy2|<=)Bzm9JJc zR&`cwth%=9o~oy+j!tizzG3?H)Avq)zPhA(VfDu9>#Ogs{(AMZ)kkYGHLGgY)~v62 zd(EbrftnB3?5%mYW`E7&H9xF*wYH{qS?xgWj@r9w@2P#F_IEQXXPh=;OWP#zy78A-!;@XWE#$H*wJuJ!)*=s zH$2)f-tg;&R~n8sRyLl{IKOdmV`t;q#%$xYjiZfsHXfcieP+wd%Vu6b^Ql>>SuOBv zAW@2jl&S|gByT?RveH|T&cbWxT zv14+GFXdNVs6PBDvX@kQQU^(?l?LUfc}`O;KkZeNUUeEka`p-fk5cX|jh7|qF`On< zbc@Z=14zRGs*6!)cjy!rb*4mrxaM?HZGF`?SE<&i=PKAVI1Fv7flR3;4tm7x7$2%W;=fCk!wQC!9!c!nWZI>qdpmMVCk(2^bPurPH8`=S+fXnKcfM`>hQ z7L-&DH8tWIZUvq!{>@)1)C%xgSg=Vg&g^9O=1?cIEzytMx z59Ega?bAfnlMOP#_H=3IWIVtE@#B75h?r7};G-EjBvpPbdfPjcqNfSvLW@cfB6+&7 zM?Q~LYFY3Izf#_)FAXC!r-H_`?U7FU1r!~Z58lZLuJTc&oK%quKqI=>FalUA2}(yv zq1(7jL<%7;_*hhV%v$-8=*$%cqN?8FFpTY5=%)!3+$W}M1~rAja&(BkP6P5Nj~~M= z(uj2HBBsf7-44HHGeaY)nCML}Cv_@m3i+rd(o|1$)*?L;GDjr%Q#+tWeG_#^O>#ME zEI1q-uAB?MmdZk|gHhC?8gDp%qMfNM0Pf-v#~+CQE?}_g6}kvK{ezRm1u6a%Q@4a0b=@b;F+3saoW*52O3X9h9tI>h8!t^L(`yK#w@OVVGF&O z5fC)=*nLO#z^*ZWXI@j!AOaK3oA9MK&}Ot8ZU-Phfz0EPtd76hz9N9?8(>0lht)O&NW)Yo4Wk~}5ZJ>UY|@x4 z)F}mk957iKzC#oypD$P%AM~Y_6jX@LsD>k*R!vQo1AP#Kl{*D+vgZ_~*rqceN!r>) zEwc_{7A@dBG#H^R3RCcu3h~G4ANU~ z{uP=KHwtE5tT85I3hOPj;bV0}qKh3DCNuz9q*t3UqSQWFR<#E>h0OR+ zli*n)IFuEKmW7Ez8e<-_P^Z8{HL9?NO)b)}CMJ>vVj{P`z;K+!#sWH$1U3SLICfyF zG5CQES(tIWsWt?6s?jRVrI0LE>YBZEe4su7; zn>8nO!0L)53S64#sbg|;U@DpE8;m|y2u@~X3<~OGrsC1u#Vu`)Yy(~uz0@n!KI(_O zSGBADs5)ld6X|$jO=(KCJYxMR(f|rvfAk6SG1ac(33aQ4x8z-^fRr` zU<8&rSWrT#V3Y@T2x~H{Q)vTytC2m?8f)OOjVh>j=23HhE5tB3jP=WLy0A5osY4@{ z7}J3WWX!Ti!-5qhR{h!u`mc{!tw%iPh!EwPXb1z)Td=4u(~uG#iwp})a44bpK)vA0 zevmcjt{{RF-1>e%$?6_$!ALwzWxBf~UE;pKoFCar{n32O**eURiaf}Vu6D%mhw;D; zsRkR{<+sss9mX)`i-$2H^nS?EE4(7qIruBoJgkwemV?Dj!=r4+WXfI$5>CfxW7(2E z4_nd7_@F;9=5iZCRy&2!+@kHtEaw*J``V-0iJ0u>7ud+9ka)b%_m7e1=#2E}cV+a}f#}s)^a|pbVjuGWK7Y+)=;6i+!b9~VL%_{HToabO`E^fnJ+QQkK zBNRjnYhrH+x}t`f8jvP2Jeb0UmfMJ3h_@)Ox!DOcjakt0mCrAh7imS>o+D})< z&RHOG=G>_aoS{9e1{zc#@*T$6oWDwRRaWqMWuog5nNZj3d@Qkn9AOp{YtpZ!yx8l| zV=DxVtjTMZqUuZ&L=(ie^DW0K>P7OY{DzUFGOI3)s`|E0cUhUCfJCi&y+-*f$+=_l zs$NRo$SJ>O9a7awiUTVwL~<-zW^fZN(9Kly+w?GI7hn%^IR{<5&t@K+OdLh1_CcMu zY8KMWM4WH^54aqSJ};CNO{yMAX@#gS;FGFUR~MXH7!uLLQf#okh`xKF+wK zhodjnp?1H{2l)by_k>uIhq1M8EP;GuPe3pn!@XEE-gNZFNfXOgJm;2w|iC zo<~PxUdQX4UvMK=j$09xK+ul%I<3fzs#QwFD6MqhTx5~eheu(f4gPfg!O>-=V(i0r z7=KOpy7}igzgmZZTLlu;GKnL+j6CJ=oO}9eXCJR_eC#+yA4D%-;VYj|q)iins8#t) z2&x}oA06LvhsHif{n7gmUfP0$K4nPV9(bwCtuPkL}r=nsdiXf>un zdHvjqNlc3HLh9bM#hOeV2Qo8rFdn0}F8jpWTKpcPvFgRQ59c*}rN+MN*gG`n2~g99 zGnOl3wsLipM|EmMt%j|64n%++p<6dMND;W?%iy9A8f1*K+B5lWGR{fQR7r1{pgSjj zysgPUb>k>*BiUnZts-Vz5iUcAu)c|yk)N91t51$ zMo5M6;;|9)+e(I5z?MGtoOMt{#jr7HPu;58nZ?PI)}Tg<^Kgs{ zERGf;M)`>>?dt7(e8jk0y)2H8#^Gdqbdco;YhTLf)c9C61wKZylRDUq@KK4=wT(PQ z30aTN|Jt)};IDD+bwJN0Mk?2_hmRg5i6M@lIgYDSkQI?9Xq^sfRrN{)!dLSbYFcH~ zBP0PRzF3{9I!#BJ!PBB{xo=#OrkgPZIpv5_s_k7mCv}85PD2wh+v_Y~Y~;aN0?>8b zu>q|g4bPOz*J`hk4t`WRv}cZ*Odt>6O6h-=NlZV5(MU)!P8G!!=sAp~lse-ci}i^( z7o!4h7~{ma7?p6$8TolV($IVbHN(zc#s>}!|)OXZ}@-ZjLH!z5QAy&j`MraYy1bg&s^*t&kzm@_rlG-G!2&qm+ z3s2e+22DqNay`ZBAJl2PCVazsDx|J@n1~o*2UIQNChUQBjeLdvR_gWPaRS-Zzm)<# z8~4un6e-H+Bdm;7D-r8?eymSKX&)W`V(Z>>aWgc$65-KA``O^w>l@n;pD~wV&s!yc zOA($;5paf%G-&b*Ujlc8PjHQbRk4z@RMDdOHCAuA5i7kEcGOBsJyyL8q~Wh7tc}$a zCaD1|dfox3bueK*SN%=pb$JeK3F&$N&7&9dUpMiq zQ9hAe%!g@zKE0+gV`G7cY7=xyF^N4&3`z*6lpUCvi@E%s?_WNCtxi{ydHI!c+_feX zb}ER~afU=dM(8kB!|AY-IAXp}rA75C+R(dWZLD^i+$d_pXBPnTct>QO_HsoVtVH*M z$(SP4OtBc?ys18k@V$mr8*p4ZR^W8Ab{Lr|1;xE+ECH^`w~uyUAMzz_jD9r^!Hkaf za6}g1ln%FDEdvDBxK`^z7#k-ur$-eV1BKY{Y-u@#eywvESThG;toz{!#~*QX9m2kF z{d#}h9pB)OUHcp1$E<5%CDay%J>D+ONyG%foAO`|0o@~R&7u6?7K=xR9~GMWqfD&`ryPPe z)vU$~g<*I8*|GLmAVbbiBkJ|?50(uJi!w?lPL)q*#j!E)$@Q;HM{ zIan$DntNxnIydJ1w636; zeEWR`C!%`7#^|29YK-IHG|)k<1#uWzs%w&`!ytR;cq7sepAVr0ICa&rdtQg<2V@B! z;sQ*@nqB#2AsHW!x{*(Z`Z7G3Tjn0{Vtn}FEF74RIBfwdF ziDa_ifEGc^%T%h>e$2L*5z2c%CY}QrU!V#_g}hPu)D_>;^Z(70WM0vZ7ZhI@ zb>uuhmMJLTZeR$9@yt%R5KA3xq6pJ;MQ#C9nD8ew>2O(#s~~ zx*wsB{P&yud&Q7kXUZW7b%OrFSpm2h{Z#9Fx)@Z6#rqk1L2$+GP7m`MQH{b|nRyW1 z_^1c_7(i2<$vUQQQQ1~sK5e$g|Eh4#!D@ELEBFOvR!~Ma^injTKSpgrz7Ri@(e6jP zsENN{|F|2t!~nU5o9t?(IHj6UN<`RPKubjxlW<2L^P0gfvjzldVY zVgaELseFfvFQ>6XJ}0yP)tTx!na?>emwy+^SDMrf{Ftwxfeib!|B1k}u5l52t~Fa*Opm`Ngw2oFCWo5a3^*(*xa1N0gEG8g^2@#C6H?{d0W|7rvjaUM!WSN)U-HU*_U?Grx8^lCuu|02yy?&AR#63e z@Hf^-1O}!Qdr+)fgc`1!jJORNHvOO%^oic+x9aa4=fUH-az4pjiU-}ons}nB?<%mB za*4K#K=pgxI;pAVM2#=%rdjPmeAIalr9nE3W#d8VS>KwN0Xh^$K?(G61=7WMW2dTq zUC{<^zD6^W@rX)?Sj@Q^j@mTsDxQHdbQ6_p3PeydXr4;80nfNGE;` z^LdCl#nXA_3j7bU^JAT*qbITl%HihKH2U~%o3pilv0AyOos@sz4<)5dWJXX9@3H0E z!HsS|kov@RZa*P~i7&eSq@0|b=Jr!kpS;5Dr==|UDYsuBHOU{l{bD&THP`Kz$tkHj z-TpLrUE23sE-mRBAzhF{%^YCX!0iXpmRRTZ6H=b|q}xx*`ox27KP7F+C2l_rey(%- z1u`%B1-D-;OOuD(ewkdH>U8_l&<2^yE3z;`^p`? zy_quyx;Jm{-j@5soi!JSJ^J1Mhliydy_Vdj$VkxMf}!-FG(1O44w`!bhg z2XUfju>XwtnZB((y#u7VeIVOAoaxT29PaHN*}9`QvvRP%e{f)1=HlMr!OXmsE89-W zENE#1>5-A4ZA)8Qd)$qn!~0qWhc~x6YTH_`LZepP-g-t$W?s)pnT2g_OHNtXwqP;D zI1l>Y3HfQwbD>RIh*qJtGIEYugEm+#E3iiPJ#XvI-oDJaL%qY@BZI@4a|Q_EO#V{isa{!%lOJnuoT%_^^P(F=+Dh#o}G2;0k z8>?3=Ub<><0BRrJ+`CleThP|hcIqj-`R^y@F&R2mkFPDYDRhDy_$d@9@o$T0c};JW zFnVd@rGMAh7drIF;L^X&-{t>^0rD4uLm=D#A416gF7h;e=~xeS!D1jG5{ad>*!uT+ zHUY#>VN6tjdZ!4pG$qK`Wtf{UN8YYPbut~LC#0Wv;gUdUihgTgir_2e-VOi34Gvm?_!c=ENU#?8aGtysVSYY-H{?QDFK?4Bxd=FYiEKcQc)PqqHcB^s z>*6zVoqT}5^dL9M4fs`&yD`)Le)&iF2l+VWXt#Tn6MGg+{)M za37P$<@@-RpYO?&@*DhG#E;}D`GI^1Q1FV}EKkb;`7x~eviz5PL@q~2Ujc9K17zF@ zUw)_NsBHkC5oDBi$syp{RfwT?%X{Q%{HDpL<-PcwlU?#Y`K|m;9uAWD^`IPnd?y_g z1cmrrlH#BwC=JTwC&9F!9KU^1Dfi0*K^1TGkM^?+}*^G zMnqi^G1W+0M4MVfq)}oF6vao1lqzf~rApTtF~TaS2-KpVwV(cx?DYHnopT?v4}#Tt zH#7Ilx##@euXFCb5l2K)a+|oaeC5ikuXu0g=`V>~+<@NcSFN8nf5RiGi$t7N_`SKk zv#saD*Pi|(kwk|`?1S6d`g-zt%#@4kaJ_h2$1PhcUp)KUA|*p2a}I9LwPmZ$T$aPN zXYg6L9UZAy@>#%(Bbv_+)o4fMU-*|xjKSuP(& zoAAA^w$9vv%YXHh$fCU>$uIPD_w_eE*!q2uWwS8f5%5yQS@1!ib z9P{Mq1D|f^`G-GVu|i~YD0zP(jj_cNV=oTOOQc7KWK~fyemU?fH$Yk|J3Q zjyY5D$#S&#JMK=69hHPgyehsKeZ%Gq;auf>mZ*x+8y-YA2>mqovR;zw}yB+Gu+bLzFt>!y$WdW~oH z;e&BO+wUtlD-JWypKq=c=UbRtFy<}H(edNPIrR~mv(AX}{wKr_Ijc;;GidW=@5`Mu ztDJmYykcd8v8o??-RI4hsq2rMM2@~b3uI_u`Ff-c2(I(yN`tR6{-#dx5q^BwyiWXx9vE+YPwj&`hX1l1Un5z#FJk~d z(~W;Sd-02&K3(F@W}L5<<%l6^xm7+d56BngkQ|nWV+$vY)ZrE{ipuG8o=JFA@a z&UMa>PMec+x}Dw5t+A(K$70XNj(cfuns=6WjyKzD@LIe>-b3D_Gp5cs2XUHlyyxzW9kA z(1ROKB#VkmO3PB^6_r)hHMQx?l&PnkKJAR@XP$L7BJ|8z=gvN_?)(cbte-P?UPI&j zrUlIl7cE}Wa?#SaEqnX&i!W(iap}s-R$adO9c!+*@~XA(T(|z}Yc^cF@w)48*mUDf z@7mlZd;aWw@BhfYyFPXIJ)imXU;oYDe)itaeg3}tzwmcoJou$U4<7l-Ll6JFGn1Gj!?;KLvM=$&%M{!f15iDSp*dHHdl2r@U0DfX{UmdbXyUw-YJ z=FE0hI9r@MoX8^8ca`(FX-9zs8;>q}| z_^SBU_-*lf;)mkT#9xm8Hc_0In^>0El-Qm4%fyky^GQk8C0mkflQ$>#B_BzCFF8__ zEIO;Gq3Ft@>x*tKy1nRN(UV2PMgLt~T6{tACBypxv1tnLP z>?zq-a$m{Ok{3#2rPE87mEKg^QM#}60sI{)Jzf?sn_G5C+0|utl-*tSK-mjr|C36m zW~Y{>Hl#ME`ct>1?o8dCx-WG&_081FiFIsXA8ma@8AEC#q*xFR$*Z-cx;h^mX>8jaNb9>EQHJ_<@pyuJ4$7-IgdA+uxc3SQ1+WEE1YFF28sNGWA zRlBG5_S%PQUr5K(Rq5&Jh3PBP+4QaH+tVLUA4nfgKb9U$52c6GuVy53R_20COXi-; z*D}vdiA}j+O7D~hrVPQdQ7dTe;G$j;XGZl5eqtL(hn)J+9%p1U<$5PqxZa7qW~{Rx zF-phQHdW8eG-YNE@^A-EuE-*6#hBw_8>3?!jLQxVI`tf-U{Ug69DK;bxHIHzk=mwA zQ!_r9nbr7YW;W}m88e%k66hNo%noL8*ppMAMYsgo?C20c?|K7gz6n~8yx8w`NYU+iseiftqYg9T?IQ-p)g{?Vb>QG7P?GH@zdG=UcX;3*06 z6JG;q1?c|Ec57$$f zD9K6@hM-d8??G08Dr41cMox!}6$?1Uxf-~^F+P+J_`?i99!(Le(G(hFw8!u`+C%Ar zCDu6B2B5WSYM)xwYpg~UU#-u(N*&TQ@^wa(VEu9j0NCumXdGROc?0M>75Yl0#OgED~_ z;QG$UiM>WTQT}L;;0b?GdS+k-bjhegN=AE>B?Aj;jo`2KwF2sm?^*2>c%H8sss%7L z!caGKyHM6x(bdi{u`5H%@a0TuFinLDNVE}!q6SaZGA;(bITbP2w-d{gi3PM5!1Xm| zxlzM+2YjMb#!4XJhH_RuVaa}M3FJjSDI$=BI73EhPpW&;=NqA*?o^+M9j%%TTb8OK ze#bVVU;PaI=b4_Wq*MYowwj zDWiNzvmbwG8750mZ%XKiVH5~Mt~aVhXJ}uXYkUT?jnB{mXji~bDnJhnfZVDbfr7xE zLR+^m)N7ziMwaG~3Wy0D0D>_f#<2+fMU0+?en`W|Z17?ZBul1g2O&N)1F;K~LWb(! zNQwwrm|^HF7+<0o%=nphw9isc1a1Kz$YiLlB78uaR1Hv&5oim)xL_=#i;>Iff+0&~ zhv>5(@d}zWe5mgrZ!p(jtd2p^RzS0j>wZ*aK86^ni4(&h05%ZfWsCq;+PSfK^)0mN zU99MAxH0DI4nRaEOYo!xK?n1eqlkQ zsVJSaRC+*`x4@`- zXw#5=I4{AdtDd0s9(}{e(wvduSslUoZA74e>0J!%CUHVRG>r&Mm$`*7SwU)E2;v_o z8)05DE~nZeNq`PTK{VrZWOIT_K8W4TlxxIZHJoU|0}yurfQ)CLflH`JLY<=~f(L5- z0v6O9vnPgKFRDBG9Q8)pfdy2lLDC$t;($p;;8{KEShWv3Ugb1!az*SYl|>uYSfqBv zIH0yguWp`cqozh*Of%&NP_l?1w%A5E`&hiz4=i5FLwQoq08FJBXh}K_S{&mdnx;XC z`L?e0QUM=?<-?%9{n-rJm=%?k)^@66&|gqx`Pttuuz~`>udfIvsLgei2fZM7AOpf; zwRT~$QQi5qr>_@MND*7=BBf_!yy}{j6~;0mX++seYXwYZXjkic*5-lLs}>4#v^$`9 z_+@w()Yl{V1B_|p*rYMSj2+cA2=Q8on4`5Igl&Be*duwY8ThK3d>^N_=;BD(ClBI; z<*v0GTl)t&46+p6fx95?H!BRpCO?a+or4Y9iA~KBy5B5+ zVGeV|Mn=KFK9pDb8$8!o2S-2;vVBJWP_iEECER_uM0R zBK~dc2y&;;=^D&-8X_^?)_sxOMQR1 zS_034w0vkGMXC@+C8ddaF=T}{8Oc+=wSyv1*o+KfR-3w)VJaI&Vl_~DDWSnlLs;W- z6o$fIaI+*F6S3iFj-o9vU%>Ffu?4Z65{krjSbb232RRBde#<$^7&^o2IJ|+q2ewWf z=^7}c0nD2m1)J0ceGwuVOF#XFaK_{&GmBLxgLBBU*>j+e@edJ*zMy~O^OEmrstUk> z-v_xtYXy3PS~h5hb?rxt2HBcUS#F@gwkb8t{Be6x(VCZgLN*Sw0?_CIxaw<~m;sIm z#(^e(pp5&I)G4B>$^;fhsdB4~u8A+qG>7Q=mHRiXP5z5 zKNy)&L*^GbriH4RniCLESehf4vqsqVBQ@f|?xB zG_q%$!HPCREVc@VjTS}L!SonL5#7h&9;>c~NL7Opim%m@z@Oi1GlOjNyO zxMDA$Zz}pT{Ge7>I;q^~TAemvRJ5O&JfM>XqIC{;Fko9jodZ~mg1W0rD^+(<1*tg= zM&htb%U%S3H5HW6F!*6Tqz3~hjM1;flyl&MCdm)R>z<@vbQ$^N7yEmse*K7uVC)4V z3Sy>>!D_#{nqsUm@dg!=7E|Dx+l?&8p(9qW+#fccf8R9k@bpj=_>Oh>n$WduB z0>R42yvh%vD$wg|oQXZ8*Ayo9mPj*v_8jK)$IV#yLi`B!n_5x7)?@4}GnPK0{oUjH z6KRY;29gTK<6Z>e91r^?PCEgdHGv&#gt0Qv8kG{J4}f8HHadbS=X8Y`?!9Pk1NRmt zo>rkPn0qR^ic_ctrmYQOANXx{grR8g$IUq)iY|OZ4DJ9_frI{xFTKaXeJHIqHR8aA zLM&W!+q%=jb_Z;4`9T9m?5OJ4*N?Ba zx=HjF=`YY5`px<=qMt%et!8Z1%=(&DcChdt!u@-Y12BdjXTP;0V;9zrVGSeJj-vgT z729a&$sbTV!gyB2?6>!{Og(~_XDvj1)evxEua6tL;vBBK%nDd-fqH`1+B{*C3F6Cs zNR~Me0Y-gIlY^yyjQuwHe2wvs`D6Nh|A_P#$T{dA10VgqEsysPtqjKbM_{%Q2LUIr z2;8@P#puG1-O;rHV;JHEJZt7ovVGpAVjavyw7P*qrYz7R%VjgB& z>kNfyD`bE(9%g(Dp^ZD92(B*f^bKlSM$`lA6WTDcPeH#g+em+bY|%e~4Kt%Nrz1bm zYi)+rRhw_X{;rFW+Jrcl(yUDUQrj}C7;9a2WnmMK^$Jrc*|mj%nK-Wbbptnp5L-8d z{JF1S@4q#hMehn=3i#Ik?(zNcH5h+P#*Bx42A)^MTw42)sScdAR&c(5}oKfmt9^A6Z+)I`Pll5>YB0iDAy z4|9TeYGNp?^7n|Rwq&GlqD}%mFyjei$Pim7TO-4Q{)h~u>C6g#9posBh{ytJ=U%?cLXr}s5&VO*cTIr**pySQ9gaT zo5TKy-mV$Pr!UuqW5ydjAmfMq1@Om?H*%SL{Gt#}gq~}o@U_l<-rB|DaJ=S)=haR( za=h>7x`r~(NJRYHV1E z;fCP^1wM;)7-T>%>f|5>*cvZbOHUXBU_0g>mEL92t%m|1@^$^TP*xGy-bmD}DH!ST zY&t4H#QB0c8U{%k@uiidFNcCT+;uSViuHG}rxcyykJo3Rg7K(deHpm}1g*ITH7V%f z8tIgKA-)L7GdRHB9Q?Y?@M@md!tW}>BfTEG3%sX}9HzS?=EfZMF7X^3pVOLXKg8&V z^qXhpFb4GNihx<)Z0Zred43H08N(tc@KKtua|oKwlNWXWDJd@=U_UAr?)9L5*!B;b ze(Yc1X>-7M$-vOHj-RiLZj3zy&#<`z+zUjqR6VkO0UxMdRF8--N+~KBT`iitt;w77 zxNhN|fzCyCqQq1_n1w+|PUM061fU7e>maiU&)mU*T&oY*eX`{Jz)4-1XC+(ZGT;w= zL3glNKZJj%QSINUo}c7+fm2}t5@~3>M4@@`}cElP9@|x+(s99G58aa#? zao3Od4Gm_`m-{W$n=X(E*&VCO(H!NtxzKF}|wL$rXv zazYc2_LwK8)Gp$%;{!^ssRNNSsLAu}C)llqwsnsglxOq<%Of|`vaV7YT7ihTe2$1K zIH+N&5QmByzuCpZbkk4^pP};ij`bO;Q|-tC@kINvC^pA$#zMbX6LPfy%QyFQa94(R zEa^o>;2k?Q_{MV?_NfSWfP@hnIk9!NjhEMAci6To8)Bcb?YPvtXV`W^PIEWgc2erxkJxsJ zw75^&c1o^~d$wIJ%i>?M?F!kHD3x`RlMZ~^qz~U&@nnnKg74MnxkYxNFNa^3;+=># z*(N)6oF{d7C$CL<^?JYb%S!2%-Lga$%J~@0Hyol@w+2@|xdB)DEKJ@IdnC6LrJ`Y^X zRlMzrb3QOOKwfi%twy}vI9Fs{t|Qmhm&WBMz5#0yT7}uvu#I*cSE)t9qrwn%j&(39qqX;!ra-F z&GmY1UTbfzt$)X^oY&gj+1cII=Ut!c?e^+gTN}>z8s|0ubbo(OU(39C?RFsGaNOMP z-fiHS`E#$u&{8O7(L7LPMwL)omvL14m zwL5m_I=riTa=mT+-M!v=bX|h$9gNPGba&u81Tq!`0n7=8x2WlL0X$8R>c~NPp->wk zUaEHi=3t?qh<&{4Tjvm2%gXL92)1`yu0=U$Y?#}yU=9bLk`XVUV?0ZqVPsNLCd2jS z{7%S$`~lu7Z)#~0cqaAN@<;V+p|SRNx4bo57O4FX@ozbW;R|^C|MPzN{k%$3lkSJ{ z&1rhY1jldC=U|2FB3mZ#baN5jtuDbE&SjFqbCngS2dhwp)Swzo;~vu#td~y16VKCd zM{7Esdp-+0n4Zj#b5IG*l5=G?s>eFSrVH?`Y%P8|6C0 z;2UHU;{Q$ZF4-(?cqj1lGJvZv+^t1D*rCulkdw{5CqzJvEczbfCA4`Sc+BX~pfNqG!!ho0d~ z$2+HI$-bhUT{{{YE^a7mZQs$`zO!>{M{ajnd)Q8{Xm9K7?n-9O=~8pb>8b3pa9r88 zNPAVJy*<)i9ckYjwv$&Hs9ol?&YXG;j`iWVvc9mLyxNTFH>Yd1^yYTuk~{U3xTbeU w*S5q?e#bA}+1pJf=Qmu^XwQrE+}Mci2p$gBK=cHMKZbs{^dg?4|F^*Z0u&mLasU7T literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperatorSC.ttf b/assets/pixel-operator/PixelOperatorSC.ttf new file mode 100644 index 0000000000000000000000000000000000000000..06783f817298fec9424a151f161574def024da33 GIT binary patch literal 16968 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 Sg2$61f0%zUkKzAU;eP;KEKPy{ literal 0 HcmV?d00001 diff --git a/discussion/index.ndjson b/discussion/index.ndjson index ba91153e..9ece927b 100644 --- a/discussion/index.ndjson +++ b/discussion/index.ndjson @@ -1,4 +1,4 @@ -{"type":"meta","next_id":{"DSC":36,"AGD":36,"DEC":28,"PLN":62,"LSN":45,"CLSN":1}} +{"type":"meta","next_id":{"DSC":37,"AGD":37,"DEC":29,"PLN":67,"LSN":45,"CLSN":1}} {"type":"discussion","id":"DSC-0035","status":"done","ticket":"task-owned-shell-windows","title":"Agenda - Task-Owned Shell Windows","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","task","window-manager","shell","lifecycle"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0044","file":"discussion/lessons/DSC-0035-task-owned-shell-windows/LSN-0044-task-window-liveness-belongs-to-the-task.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0034","status":"done","ticket":"system-os-domain-facades","title":"Agenda - SystemOS Domain Facades","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["runtime","os","services","api-surface","lifecycle","fs"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0043","file":"discussion/lessons/DSC-0034-system-os-domain-facades/LSN-0043-systemos-domain-facades.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0023","status":"done","ticket":"perf-full-migration-to-atomic-telemetry","title":"Agenda - [PERF] Full Migration to Atomic Telemetry","created_at":"2026-04-10","updated_at":"2026-04-10","tags":["perf","runtime","telemetry"],"agendas":[{"id":"AGD-0021","file":"AGD-0021-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"decisions":[{"id":"DEC-0008","file":"DEC-0008-full-migration-to-atomic-telemetry.md","status":"accepted","created_at":"2026-04-10","updated_at":"2026-04-10"}],"plans":[{"id":"PLN-0007","file":"PLN-0007-full-migration-to-atomic-telemetry.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}],"lessons":[{"id":"LSN-0028","file":"discussion/lessons/DSC-0023-perf-full-migration-to-atomic-telemetry/LSN-0028-converging-to-single-atomic-telemetry-source.md","status":"done","created_at":"2026-04-10","updated_at":"2026-04-10"}]} @@ -34,3 +34,4 @@ {"type":"discussion","id":"DSC-0031","status":"done","ticket":"runtime-mode-separation-game-system","title":"Agenda - Runtime Mode Separation: Game and System","created_at":"2026-05-11","updated_at":"2026-05-14","tags":["runtime","firmware","hub","system-apps","game-mode","scheduler"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0040","file":"discussion/lessons/DSC-0031-runtime-mode-separation-game-system/LSN-0040-system-pipeline-separation.md","status":"done","created_at":"2026-05-14","updated_at":"2026-05-14"}]} {"type":"discussion","id":"DSC-0032","status":"done","ticket":"system-os-lifecycle-process-task-contract","title":"Agenda - SystemOS Lifecycle, Process and Task Contract","created_at":"2026-05-14","updated_at":"2026-05-15","tags":["runtime","os","lifecycle","process","task","shell","firmware"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0041","file":"discussion/lessons/DSC-0032-system-os-lifecycle-process-task-contract/LSN-0041-systemos-lifecycle-authority.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} {"type":"discussion","id":"DSC-0033","status":"done","ticket":"system-os-service-ownership-and-module-layout","title":"Agenda - SystemOS Service Ownership and Module Layout","created_at":"2026-05-14","updated_at":"2026-05-15","tags":["runtime","os","services","module-layout","vm","window-manager","logging"],"agendas":[],"decisions":[],"plans":[],"lessons":[{"id":"LSN-0042","file":"discussion/lessons/DSC-0033-system-os-service-ownership-and-module-layout/LSN-0042-systemos-service-ownership-boundary.md","status":"done","created_at":"2026-05-15","updated_at":"2026-05-15"}]} +{"type":"discussion","id":"DSC-0036","status":"in_progress","ticket":"prometeu-hub-ui-direction","title":"Agenda - Prometeu Hub UI Direction","created_at":"2026-05-15","updated_at":"2026-05-15","tags":["hub","ui","shell","system-apps","lifecycle","design-system"],"agendas":[{"id":"AGD-0036","file":"AGD-0036-prometeu-hub-ui-direction.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15"}],"decisions":[{"id":"DEC-0028","file":"DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md","status":"accepted","created_at":"2026-05-15","updated_at":"2026-05-15","ref_agenda":"AGD-0036"}],"plans":[{"id":"PLN-0062","file":"PLN-0062-native-shell-launch-and-lifecycle-wiring.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0063","file":"PLN-0063-hub-mouse-input-and-click-routing.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0064","file":"PLN-0064-retro-hub-home-and-fake-shell-ui.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0065","file":"PLN-0065-pixel-operator-font-integration.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]},{"id":"PLN-0066","file":"PLN-0066-hub-ui-slice-validation-and-lesson.md","status":"open","created_at":"2026-05-15","updated_at":"2026-05-15","ref_decisions":["DEC-0028"]}],"lessons":[]} diff --git a/discussion/workflow/agendas/AGD-0036-prometeu-hub-ui-direction.md b/discussion/workflow/agendas/AGD-0036-prometeu-hub-ui-direction.md new file mode 100644 index 00000000..7b00eacf --- /dev/null +++ b/discussion/workflow/agendas/AGD-0036-prometeu-hub-ui-direction.md @@ -0,0 +1,193 @@ +--- +id: AGD-0036 +ticket: prometeu-hub-ui-direction +title: Agenda - Prometeu Hub UI Direction +status: accepted +created: 2026-05-15 +resolved: +decision: +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Contexto + +O Prometeu Hub esta entrando em uma etapa em que a Shell precisa deixar de ser apenas uma superficie funcional e passar a expressar uma identidade visual propria do Prometeu OS. + +A direcao desejada e uma UI retro/minimalista inspirada em console portatil, fantasy console e Homebrew Channel: baixa resolucao, tipografia pixelada, poucos tons, bordas marcadas, componentes simples, leitura clara e navegacao confortavel por controle. + +O alvo inicial nao e criar um toolkit completo. A etapa deve estabelecer a linguagem visual e um conjunto pequeno de componentes suficientes para validar a Home do Hub e o fluxo de lifecycle ja construido. + +Componentes iniciais esperados: + +- Channel/Card +- Button +- Panel +- Tabs +- List +- Status bar +- Footer/help bar +- Focus highlight + +O Hub deve continuar respeitando a arquitetura atual: + +- Hub renderiza e navega. +- Hub emite acao. +- SystemOS/Firmware executa lifecycle, task, process e window. + +Portanto, a UI do Hub nao deve manipular diretamente VM, process/task lifecycle ou window ownership fora das facades do SystemOS. + +## Problema + +A ausencia de uma direcao visual clara cria risco de o Hub virar uma UI desktop/mobile generica ou um conjunto de componentes sem coesao. Ao mesmo tempo, tentar resolver um design system completo agora pode atrasar a validacao do fluxo mais importante: Home -> abrir app Shell nativo fake -> fechar app -> retornar ao Hub. + +O problema central e definir o primeiro contrato de direcao da UI: qual experiencia visual e interativa sera validada agora, quais componentes fazem parte do primeiro corte, e quais limites arquiteturais nao podem ser atravessados pela implementacao da Shell. + +## Pontos Criticos + +- A estetica retro precisa melhorar legibilidade e identidade, nao apenas adicionar decoracao. +- A baixa resolucao deve ser tratada como linguagem de composicao, escala e foco, sem comprometer leitura. +- Navegacao por controle precisa ser primeira classe: foco visivel, ordem previsivel e acoes claras. +- A Home precisa listar canais/apps e acionar apps sem assumir posse do lifecycle. +- Apps nativos fake devem existir para validar janela, retorno, fechamento e estado de foco, mas nao devem virar arquitetura definitiva de apps. +- Os componentes iniciais devem ser pequenos o bastante para evoluir depois para um toolkit, mas nao acoplados prematuramente a um toolkit completo. +- O Hub nao pode atravessar as facades do SystemOS para manipular VM, process/task lifecycle ou ownership de window. + +## Opcoes + +### Opcao A - Slice visual minimo dentro do Hub + +Criar uma primeira Home retro consistente diretamente no Hub, com componentes locais simples e dois apps Shell nativos fake para validar navegacao, abertura, fechamento e retorno. + +**Tradeoffs:** + +- Pro: entrega rapidamente a experiencia desejada e valida o fluxo real de Shell/lifecycle. +- Pro: evita desenhar um toolkit abstrato antes de entender as necessidades concretas. +- Contra: pode gerar componentes locais que precisarao ser extraidos ou reorganizados depois. +- Risco: se os componentes nao tiverem limites claros, a implementacao pode misturar visual, navegacao e chamadas de lifecycle. + +### Opcao B - Definir um mini toolkit antes da Home + +Criar primeiro um modulo formal de componentes retro do Hub, depois construir a Home sobre ele. + +**Tradeoffs:** + +- Pro: melhora consistencia e reaproveitamento desde o inicio. +- Pro: facilita testes isolados de componentes e futuras telas do sistema. +- Contra: aumenta escopo antes de validar a experiencia principal. +- Risco: o toolkit pode cristalizar abstracoes erradas antes de haver uso suficiente. + +### Opcao C - Prototipo descartavel de UI antes de integrar lifecycle + +Criar uma tela visual isolada, focada apenas em look and feel, sem acoplar ainda ao fluxo de lifecycle, tasks, process e windows. + +**Tradeoffs:** + +- Pro: permite iterar visualmente com baixo risco arquitetural. +- Pro: reduz chance de alterar indevidamente SystemOS durante exploracao visual. +- Contra: nao valida a parte mais importante do Hub como Shell operacional. +- Risco: o prototipo pode parecer aprovado visualmente, mas falhar quando integrado ao fluxo real. + +## Sugestao / Recomendacao + +Seguir pela Opcao A, mas com escopo reduzido pelas respostas da agenda: implementar um slice visual minimo dentro do Hub, com Home manual em 270p, dois botoes clicaveis e dois apps Shell nativos fake. + +A recomendacao e tratar essa etapa como uma direcao de Shell, nao como toolkit completo. O primeiro objetivo deve ser uma Home visualmente consistente que prove: + +- dois botoes manuais para abrir ShellA e ShellB; +- ShellA como app/janela verde simples; +- ShellB como app/janela azul simples; +- abertura de app via acao emitida pelo Hub e executada pelo SystemOS/Firmware; +- fechamento de app como comando da propria app/janela; +- retorno ao Hub apos fechamento; +- estilo retro/minimalista consistente em viewport 270p; +- uso de mouse/click como input inicial; +- respeito estrito ao limite Hub -> SystemOS facade. + +A extracao para toolkit, a lista/grid de canais, Tabs, Status bar e Footer/help bar devem ficar para waves futuras, guiadas por uso real dos componentes. + +## Perguntas em Aberto + +- [x] A Home deve priorizar grid de canais, lista vertical, ou alternar entre os dois via Tabs? na verdade eu tinha pensado em montar os dois shell fakes na mao mesmo, sem lista de canais e coisas mais sofisticadas +- [x] Qual resolucao logica deve orientar a composicao visual desta UI: a viewport interna atual do runtime, uma escala propria do Hub, ou uma convencao derivada da Shell? a viewport toda, 270p. +- [x] A fonte pixelada sera um asset proprio, uma fonte embutida existente, ou uma simulacao inicial via estilo/render atual? podemos ir de proprio mas temos um asset pronto em `assets/pixel_operator.zip` +- [x] Quais dois apps Shell nativos fake devem existir neste primeiro corte? ShellA e ShellB, uma simples tela verde e outro tela azul. +- [x] O fechamento de app deve ser exposto como comando da app, comando global da Shell, ou ambos? na primeira wave comando da app. toda app vai ser embrulhada em uma janela controle (como no windows) +- [x] O footer/help bar deve mapear acoes de controle de forma fixa ou depender do item/app focado? o footer fica para uma proxima wave +- [x] A navegacao inicial precisa suportar apenas controle/teclado, ou tambem mouse para debug/host desktop? vamos usar o mouse primeiramente (como clique) +- [x] Quais facades do SystemOS ja sao suficientes para abrir/fechar/retornar, e quais lacunas precisam virar trabalho separado? eu acredito que estamos bem com session e lifecycle, qq coisa a gente vai implementando no caminho + +## Criterio para Encerrar + +Esta agenda pode ser encerrada quando houver acordo sobre: + +- direcao visual inicial da Shell; +- escopo exato da Home e dos dois apps fake; +- componentes minimos do primeiro corte; +- comportamento esperado de foco/navegacao; +- fronteira operacional entre Hub UI e SystemOS/Firmware; +- se a implementacao deve seguir como slice local do Hub ou exigir uma decisao separada para toolkit. + +Com essas respostas, a agenda deve virar uma decisao normativa antes de qualquer plano ou edicao de codigo. + +## Discussao + +Entrada inicial: a UI deve ter aparencia de sistema embarcado/fantasy console, proxima em espirito a Switch/Homebrew Channel, mas com estetica propria de console retro. O objetivo pratico e inaugurar a identidade visual do Prometeu OS validando a Home do Hub e o lifecycle de apps Shell nativos fake. + +### Analise apos respostas iniciais + +As respostas mudam o primeiro corte de "Home com grid/lista de canais" para uma wave menor e mais direta: uma Shell/Home manual, em 270p, com dois apps nativos fake montados na mao. Isso reduz bastante o risco de criar um toolkit cedo demais. + +O escopo recomendado para a primeira wave passa a ser: + +- Hub em tela cheia 270p, com linguagem retro/minimalista consistente; +- dois affordances clicaveis para ShellA e ShellB, sem lista de canais generica; +- ShellA como janela/tela verde simples; +- ShellB como janela/tela azul simples; +- fonte pixelada propria usando o asset `assets/pixel_operator.zip`, se o pipeline de asset/font permitir sem abrir outro problema arquitetural; +- fechamento como comando da propria app/janela; +- mouse/click como input inicial; +- footer/help bar fora da primeira wave. + +Isso enfraquece a necessidade de `Tabs`, `List`, `Status bar` e `Footer/help bar` no primeiro corte. Eles podem continuar como direcao de linguagem, mas nao devem ser criterios de aceite da wave inicial. Os componentes realmente necessarios agora sao: + +- Panel ou frame de janela; +- Button/click target; +- Focus/hover/active highlight, mesmo que inicialmente guiado por mouse; +- Channel/Card apenas se os dois atalhos manuais da Home forem desenhados como cards. + +Sobre as facades do SystemOS, o codigo atual ja tem pecas importantes: + +- `os.sessions().create_native_shell_task(app_id, title)` cria process/task de Shell nativo e coloca a task em foreground. +- `os.lifecycle().close_task(task_id)` fecha task e marca o processo como stopped. +- `os.windows().add_window(...)`, `set_focus(...)`, `close_window(...)` e `focused_window_belongs_to_task(...)` permitem registrar, focar e observar janelas. +- `ShellRunningStep` ja retorna ao Hub quando a task fecha ou quando a janela focada nao pertence mais a task. + +Mas a superficie ainda nao esta ideal para o contrato da agenda: + +- o Hub atual cria janelas diretamente como `WindowOwner::Hub`, nao como `WindowOwner::Task(task_id)`; +- `PrometeuHub::update_shell_profile` retorna apenas crash, entao nao ha ainda um resultado explicito tipo "launch ShellA/ShellB" para o Firmware transicionar para `ShellRunningStep(task_id)`; +- `sessions().create_native_shell_task` cria task/process, mas nao cria uma janela owned-by-task em uma unica operacao de alto nivel; +- `WindowFacade::remove_all_windows()` e `WindowOwner` exposto no Hub facilitam um corte rapido, mas tambem permitem a UI atravessar demais o contrato de ownership se virarem padrao; +- fechar apenas a janela nao e semanticamente igual a fechar a app; para Shell nativa, o comando de fechar deve terminar em `lifecycle().close_task(task_id)`, e a janela deve ser removida como consequencia operacional ou mantida coerente pela mesma facade. + +Sugestao para fechar a lacuna sem criar toolkit: + +- manter a UI local no Hub; +- introduzir um resultado de Hub mais explicito, por exemplo `HubAction::LaunchNativeShell { app_id, title, kind }` ou equivalente, em vez de o Hub executar tudo diretamente; +- deixar Firmware/SystemOS criar a task nativa via `sessions().create_native_shell_task`; +- criar a janela com `WindowOwner::Task(task_id)` no mesmo fluxo de launch, preferencialmente por uma facade de sessao/janela de nivel mais alto, para nao espalhar ownership manual no Hub; +- fazer o comando de fechar da app chamar `lifecycle().close_task(task_id)` ou emitir uma acao equivalente para o SystemOS, nao apenas remover a janela; +- manter `ShellRunningStep` como responsavel pelo retorno ao Hub quando a task fechar. + +Com isso, a arquitetura continua: Hub renderiza/navega e emite acao; SystemOS/Firmware executa lifecycle, task, process e window. + +### Pontos que ainda precisam de resposta + +- Confirmar se a primeira wave deve abandonar completamente grid/lista/tabs/footer, ou apenas deixar isso fora dos criterios de aceite. -- nao vamos nos ater no componentes nessa wave, mas caso seja necessario, podemos criar alguns. +- Confirmar se a Home manual tera dois cards/botoes clicaveis para ShellA/ShellB ou se as janelas fake aparecem direto na Home. -- Um btn para cada shell. +- Confirmar se `assets/pixel_operator` deve ser extraido/registrado como asset de fonte nesta wave ou se pode entrar como follow-up caso o pipeline de fonte nao esteja pronto. -- jah estah extraido +- Confirmar se a decisao deve exigir uma nova facade de alto nivel para launch de Shell nativa com janela owned-by-task, ou se o plano pode aceitar um uso transitorio de `sessions()` + `windows()` desde que fique encapsulado fora dos componentes visuais. -- vamos tentar usar o que temos. + +## Resolucao + +Validada para decisao, pendente apenas de confirmacao explicita para aceitar a agenda e iniciar o artefato de decisao. diff --git a/discussion/workflow/decisions/DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md b/discussion/workflow/decisions/DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md new file mode 100644 index 00000000..c7b5da5f --- /dev/null +++ b/discussion/workflow/decisions/DEC-0028-prometeu-hub-initial-retro-shell-ui-slice.md @@ -0,0 +1,153 @@ +--- +id: DEC-0028 +ticket: prometeu-hub-ui-direction +title: Prometeu Hub Initial Retro Shell UI Slice +status: accepted +created: 2026-05-15 +ref_agenda: AGD-0036 +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Context + +AGD-0036 resolved the first visual direction for Prometeu Hub after the runtime gained the basic SystemOS, lifecycle, task, process, and task-owned window contracts. + +The target is not a general UI toolkit yet. The target is the first executable Hub/Shell UI slice that establishes the Prometeu OS visual identity and validates the existing lifecycle flow with native fake Shell apps. + +The accepted agenda narrowed the original "channel grid/list" idea into a smaller wave: + +- a manual Hub/Home surface rendered in the full 270p viewport; +- two clickable entries, one for `ShellA` and one for `ShellB`; +- `ShellA` as a simple green native Shell fake app; +- `ShellB` as a simple blue native Shell fake app; +- mouse/click input first; +- app close initiated from the app/window itself; +- no Footer/help bar, Tabs, generic List, or complete Channel/Card system in this wave; +- use of the existing SystemOS session, lifecycle, and window facades unless implementation proves a narrower helper is required. + +The decision depends on the existing operating model captured by the related lessons: + +- System apps belong to the Runtime/Hub system pipeline, not the game pipeline. +- SystemOS owns lifecycle semantics. +- SystemOS owns shared OS services through domain facades. +- Shell window liveness is tied to a task-owned focused window. + +## Decision + +Prometeu Hub SHALL implement the first retro Shell UI as a narrow, local Hub slice rather than a reusable UI toolkit. + +The first slice SHALL provide a full-viewport 270p Hub/Home with a retro/minimalist visual style inspired by portable console and fantasy-console UI: low-resolution composition, pixel-style typography, limited color use, strong borders, simple panels, and clear clickable affordances. + +The first Hub/Home SHALL expose exactly two manual launch buttons: + +- `ShellA` +- `ShellB` + +The first slice SHALL launch two native fake Shell apps: + +- `ShellA` SHALL render as a simple green app/window. +- `ShellB` SHALL render as a simple blue app/window. + +The first slice SHALL use mouse/click input as the initial navigation and activation mechanism. Controller-first focus navigation MAY be added later, but it is not part of this decision's first acceptance surface. + +The first slice SHALL treat app close as an app/window command. Closing a Shell app MUST result in the corresponding Shell task being closed through SystemOS lifecycle semantics and returning to Hub/Home. + +The first slice MUST NOT introduce a complete UI toolkit, generic app catalog, channel grid, Tabs, List, Status bar, or Footer/help bar. Small local primitives such as button, panel/frame, text drawing, hover/active highlight, and simple window chrome MAY be created when needed to implement the slice. + +The Hub MUST remain a visual Shell/Home program: + +- Hub SHALL render and handle local UI navigation. +- Hub SHALL emit user-intent actions such as "launch ShellA", "launch ShellB", or "close current Shell app". +- SystemOS/Firmware SHALL execute lifecycle, task, process, and window ownership effects. +- Hub MUST NOT directly own VM execution, task/process lifecycle policy, or final window ownership semantics outside SystemOS facades. + +The implementation SHOULD first attempt to use the existing `sessions()`, `lifecycle()`, and `windows()` facades. A new high-level facade is not required by this decision, but if implementation starts duplicating cross-domain launch/close policy in Hub components, the plan MUST introduce a small SystemOS/Firmware helper instead of spreading that policy through visual code. + +## Rationale + +This decision keeps the first UI wave small enough to execute while still validating the important architecture. + +Building a complete toolkit now would force abstractions before there are enough Hub surfaces to justify them. A local slice lets the project discover real component needs from a concrete Home and two Shell apps. + +Skipping lifecycle integration would validate only aesthetics and would not prove the console OS model. The first UI slice must exercise the route from Hub/Home to a native Shell task, task-owned window liveness, app close, lifecycle close, and return to Hub. + +Starting with mouse/click is acceptable because this wave is primarily about visual identity and lifecycle integration. Controller navigation remains part of the broader Hub direction, but making it a hard requirement now would expand the first slice beyond the accepted agenda. + +Using the existing facades respects the current architecture and avoids inventing a new OS API prematurely. The guardrail is that the Hub may compose calls at a local boundary, but visual components must not become lifecycle or ownership authorities. + +## Invariants / Contract + +- The internal composition target for this UI slice is the current 270p viewport. +- `assets/pixel_operator.zip` or its already-extracted content SHOULD be used for pixel-style typography when the existing rendering/font path can support it without unrelated architecture work. +- `ShellA` and `ShellB` are fake native Shell apps for lifecycle and UI validation. They MUST NOT be treated as a final app model or plugin/catalog contract. +- A launched Shell app MUST have task/process state created through SystemOS session/lifecycle pathways. +- A Shell app window used for liveness MUST be owned by `WindowOwner::Task(task_id)`, not by `WindowOwner::Hub`. +- Returning to Hub after app close MUST follow lifecycle closure. Removing a window alone is not a valid app-close semantic. +- The first wave MAY use local Hub UI primitives. Those primitives MUST remain scoped to the slice until a later decision defines a shared toolkit. +- Game cartridges MUST NOT be pulled into this windowed Shell model by implication. This decision applies to native fake Shell apps only. + +## Impacts + +### Specs + +No canonical runtime spec change is required before the first implementation unless the plan introduces a new public SystemOS, Shell, or asset/font contract. If a new public contract is introduced, the canonical specs must be updated in English. + +### Runtime / SystemOS + +Implementation may need small integration work around native Shell launch and task-owned windows. The preferred path is: + +1. Hub emits a launch intent for `ShellA` or `ShellB`. +2. Firmware/SystemOS creates the native Shell task through `sessions().create_native_shell_task(...)`. +3. The launch flow creates/focuses a window owned by `WindowOwner::Task(task_id)`. +4. `ShellRunningStep` drives the Shell app and returns to Hub when lifecycle/window liveness says the app is closed. + +If this cannot be expressed cleanly with current facades, the plan may add a narrow helper/facade that coordinates session creation and task-owned window creation. + +### Hub UI + +The Hub UI should be reshaped from the current button-to-window debug surface into a first-person Shell/Home surface with: + +- retro background/panel treatment; +- two clickable launch buttons; +- simple hover/active visual state for mouse input; +- app/window chrome sufficient to expose close from the app/window; +- clear visual distinction between Hub/Home and an opened Shell app. + +### Host / Input + +The first wave relies on existing host mouse mapping/click input if available. Keyboard/controller focus is not required by this decision. + +### Firmware + +Firmware remains the coordinator for state transitions between Hub/Home and Shell-running state. It must not delegate lifecycle authority to visual components. + +### Tooling / Tests + +Tests should cover the behavior that matters architecturally: + +- launch `ShellA` creates a native Shell task and task-owned window; +- launch `ShellB` creates a native Shell task and task-owned window; +- closing the app closes lifecycle state rather than only removing the window; +- closed Shell returns to Hub/Home; +- Hub UI actions do not require direct task/process manager access. + +## Propagation Targets + +- specs: only if a new public Shell/SystemOS/font contract is introduced. +- plans: create an execution plan from this decision before code changes. +- code: `crates/console/prometeu-system`, `crates/console/prometeu-firmware`, and possibly host/input/rendering code if mouse/font integration requires it. +- tests: SystemOS/Firmware tests for launch/close/return behavior; UI rendering tests only if the repository already has an appropriate surface. +- docs: post-execution lesson in English after the implementation is complete. + +## References + +- Agenda: AGD-0036 +- `LSN-0040` - System Pipeline Separation +- `LSN-0041` - SystemOS Lifecycle Authority +- `LSN-0042` - SystemOS Service Ownership Boundary +- `LSN-0043` - SystemOS Domain Facades +- `LSN-0044` - Task Window Liveness Belongs to the Task + +## Revision Log + +- 2026-05-15: Initial decision draft from AGD-0036. diff --git a/discussion/workflow/plans/PLN-0062-native-shell-launch-and-lifecycle-wiring.md b/discussion/workflow/plans/PLN-0062-native-shell-launch-and-lifecycle-wiring.md new file mode 100644 index 00000000..852d7155 --- /dev/null +++ b/discussion/workflow/plans/PLN-0062-native-shell-launch-and-lifecycle-wiring.md @@ -0,0 +1,107 @@ +--- +id: PLN-0062 +ticket: prometeu-hub-ui-direction +title: Native Shell Launch and Lifecycle Wiring +status: open +created: 2026-05-15 +ref_decisions: [DEC-0028] +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Briefing + +Implement the OS/Firmware wiring required by `DEC-0028` so the Hub can emit a launch intent for `ShellA` or `ShellB`, and SystemOS/Firmware can create a native Shell task, create a task-owned window, run the Shell state, close through lifecycle, and return to Hub/Home. + +Source decision: `DEC-0028`. + +## Objective + +Make the launch/close path architecturally correct before the visual slice depends on it: + +- Hub emits launch intent. +- SystemOS/Firmware creates native Shell task/process. +- The Shell app has a `WindowOwner::Task(task_id)` window. +- Close uses `os.lifecycle().close_task(task_id)`. +- `ShellRunningStep` returns to Hub/Home after close. + +## Dependencies + +- `DEC-0028` must remain accepted. +- This plan should execute before `PLN-0064`, because the UI buttons need a real launch target. +- This plan may execute before or alongside `PLN-0063` if tests can trigger Hub actions without mouse input. + +## Scope + +- Update the Hub update result shape so it can report launch/close actions, not only crashes. +- Add native fake Shell app identity for `ShellA` and `ShellB`. +- Wire Firmware/SystemOS launch handling from Hub intent to `sessions().create_native_shell_task(...)`. +- Create and focus a task-owned window for the launched native Shell task. +- Ensure app close routes to lifecycle close, not only window removal. +- Preserve the existing task-owned window liveness rule in `ShellRunningStep`. + +## Non-Goals + +- No generic app catalog. +- No reusable UI toolkit. +- No game cartridge window model. +- No background/minimize/overlay preservation semantics. +- No controller focus navigation. +- No public spec change unless implementation introduces a new public API. + +## Execution Method + +1. Inspect current launch state. + - What changes: identify the exact update path from `HubHomeStep` to `PrometeuHub::update_shell_profile` and `ShellRunningStep`. + - How: read the current firmware state transitions and Hub update result. + - Files: `crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs`, `crates/console/prometeu-firmware/src/firmware/firmware_step_shell_running.rs`, `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs`. + +2. Replace crash-only Hub output with an action-bearing result. + - What changes: extend or replace `SystemProfileUpdate` so it can carry `LaunchNativeShell(ShellA|ShellB)` and close intent while preserving crash reporting. + - How: add a small enum local to the Hub/system profile boundary; keep visual components free of lifecycle mutation. + - Files: `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs` and firmware call sites. + +3. Handle launch in Firmware/SystemOS. + - What changes: when Hub emits launch intent, create the native Shell task through `os.sessions().create_native_shell_task(app_id, title)`. + - How: map `ShellA` and `ShellB` to stable local app ids/titles for this fake-app slice. + - Files: `crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs`; add helper code in `prometeu-system` only if needed to avoid duplication. + +4. Create the task-owned Shell window. + - What changes: after task creation, create and focus a window with `WindowOwner::Task(task_id)`. + - How: use the existing window facade first; introduce a narrow helper only if the launch sequence becomes duplicated or leaks into visual components. + - Files: `crates/console/prometeu-system/src/os/facades/sessions.rs`, `crates/console/prometeu-system/src/os/facades/window.rs`, or firmware step depending on the smallest clean integration point. + +5. Route close through lifecycle. + - What changes: app/window close must call `os.lifecycle().close_task(task_id)` or emit an equivalent action handled by Firmware/SystemOS. + - How: keep window removal separate from lifecycle semantics; do not treat `close_window` as app close. + - Files: `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs`, `crates/console/prometeu-firmware/src/firmware/firmware_step_shell_running.rs`. + +6. Add behavior tests. + - What changes: add tests proving launch creates native Shell task/window and close returns to Hub. + - How: test at SystemOS/Firmware boundary rather than only manager internals. + - Files: existing firmware/system test modules, preferably near current lifecycle/window tests. + +## Acceptance Criteria + +- [ ] Launching `ShellA` creates a native Shell task/process. +- [ ] Launching `ShellB` creates a native Shell task/process. +- [ ] Each launched Shell app receives a focused `WindowOwner::Task(task_id)` window. +- [ ] Closing the Shell app closes lifecycle state through `os.lifecycle().close_task(task_id)`. +- [ ] Closing the Shell app returns firmware to `HubHome`. +- [ ] Hub visual code does not directly mutate task/process managers. +- [ ] Existing shell liveness behavior remains intact. + +## Tests + +- Unit tests for any new Hub action enum or mapping logic. +- SystemOS tests for any new helper/facade that creates native Shell task plus task-owned window. +- Firmware tests for HubHome launch to ShellRunning and ShellRunning close to HubHome. +- Regression tests for `focused_window_belongs_to_task(task_id)` behavior if touched. + +## Affected Artifacts + +- `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs` +- `crates/console/prometeu-firmware/src/firmware/firmware_step_hub_home.rs` +- `crates/console/prometeu-firmware/src/firmware/firmware_step_shell_running.rs` +- `crates/console/prometeu-system/src/os/facades/sessions.rs` +- `crates/console/prometeu-system/src/os/facades/window.rs` +- Existing SystemOS/Firmware tests diff --git a/discussion/workflow/plans/PLN-0063-hub-mouse-input-and-click-routing.md b/discussion/workflow/plans/PLN-0063-hub-mouse-input-and-click-routing.md new file mode 100644 index 00000000..a0e521bc --- /dev/null +++ b/discussion/workflow/plans/PLN-0063-hub-mouse-input-and-click-routing.md @@ -0,0 +1,89 @@ +--- +id: PLN-0063 +ticket: prometeu-hub-ui-direction +title: Hub Mouse Input and Click Routing +status: open +created: 2026-05-15 +ref_decisions: [DEC-0028] +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Briefing + +Implement the input path needed by `DEC-0028`: Hub/Home must support mouse/click activation for the two manual Shell launch buttons and, in Shell app view, for the app/window close command. + +Source decision: `DEC-0028`. + +## Objective + +Provide reliable 270p mouse hit testing and click routing for the initial Hub UI slice without introducing controller navigation or a generic input framework. + +## Dependencies + +- `DEC-0028` must remain accepted. +- This plan should execute before or alongside `PLN-0064`, because the visual buttons need clickable behavior. +- It depends on existing host pointer mapping if available; if unavailable, this plan must add the narrowest input bridge required for Hub clicks. + +## Scope + +- Confirm how host mouse coordinates are mapped into the internal framebuffer/viewport. +- Expose pointer position and click edge to the Hub update path. +- Add deterministic hit testing for `ShellA`, `ShellB`, and close controls. +- Preserve current game/controller input behavior. + +## Non-Goals + +- No controller focus navigation in this wave. +- No keyboard navigation beyond existing debug behavior. +- No drag/drop, resize, window move, scroll, hover menus, or double-click behavior. +- No generic retained-mode UI event system. + +## Execution Method + +1. Inspect current input bridge. + - What changes: identify existing pointer position and click signals. + - How: trace host `winit` input into HAL/runtime input signals. + - Files: `crates/host/prometeu-host-desktop-winit/src/input.rs`, HAL input signal definitions, firmware context wiring. + +2. Add or expose a minimal pointer snapshot. + - What changes: make Hub update code able to read current pointer coordinates in 270p logical space and click pressed/released edge. + - How: reuse existing `window_to_fb` mapping and input structures if present; add a small field/method only if needed. + - Files: host input module, HAL input signal structures, firmware context. + +3. Define Hub hit-test rectangles. + - What changes: create explicit rects for `ShellA`, `ShellB`, and close command. + - How: keep rect definitions close to the local Hub UI slice so visual and hit target stay synchronized. + - Files: `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs`; optional local submodule if the file grows too large. + +4. Route click results to Hub actions. + - What changes: clicking `ShellA` or `ShellB` emits the launch action from `PLN-0062`; clicking close emits close intent. + - How: hit test only on click edge; avoid repeated launch while button is held. + - Files: `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs`. + +5. Add tests around pure hit-test logic. + - What changes: test button rect boundaries and click-edge behavior without needing a desktop window. + - How: isolate hit-test/action selection into pure functions where practical. + - Files: Hub module tests or a local Hub UI submodule test. + +## Acceptance Criteria + +- [ ] Pointer coordinates are interpreted in the internal 270p coordinate space. +- [ ] Clicking the `ShellA` button emits the `ShellA` launch action exactly once per click. +- [ ] Clicking the `ShellB` button emits the `ShellB` launch action exactly once per click. +- [ ] Clicking the close command emits close intent for the active Shell app. +- [ ] Holding the mouse button does not repeatedly launch apps. +- [ ] Existing controller/game input paths are not regressed. + +## Tests + +- Unit tests for hit-test rectangles. +- Unit tests for click edge to action mapping. +- Existing host/system tests to ensure input changes compile across crates. +- Manual verification in desktop host: click `ShellA`, close, click `ShellB`, close. + +## Affected Artifacts + +- `crates/host/prometeu-host-desktop-winit/src/input.rs` +- HAL input signal definitions, if pointer data is not already exposed +- Firmware context/input plumbing, if needed +- `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs` diff --git a/discussion/workflow/plans/PLN-0064-retro-hub-home-and-fake-shell-ui.md b/discussion/workflow/plans/PLN-0064-retro-hub-home-and-fake-shell-ui.md new file mode 100644 index 00000000..28da0d40 --- /dev/null +++ b/discussion/workflow/plans/PLN-0064-retro-hub-home-and-fake-shell-ui.md @@ -0,0 +1,100 @@ +--- +id: PLN-0064 +ticket: prometeu-hub-ui-direction +title: Retro Hub Home and Fake Shell UI +status: open +created: 2026-05-15 +ref_decisions: [DEC-0028] +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Briefing + +Implement the visible Hub/Home and fake Shell app surfaces required by `DEC-0028`: a retro/minimalist 270p Hub with two manual buttons, plus green `ShellA` and blue `ShellB` native fake app/window views. + +Source decision: `DEC-0028`. + +## Objective + +Replace the current debug-style window surface with the first Prometeu OS visual identity slice while keeping all UI primitives local and avoiding a reusable toolkit. + +## Dependencies + +- `PLN-0062` should provide the launch/close/lifecycle wiring. +- `PLN-0063` should provide click routing. +- `PLN-0065` may provide pixel font rendering; this plan must still remain executable with current text rendering if font integration is deferred. + +## Scope + +- Full 270p Hub/Home composition. +- Retro/minimalist palette, borders, panels, and two clickable launch buttons. +- Local drawing primitives for panel/frame/button/highlight only when needed. +- `ShellA` fake app view as green. +- `ShellB` fake app view as blue. +- App/window chrome with close affordance. +- Clear visual separation between Hub/Home and Shell app state. + +## Non-Goals + +- No full UI toolkit. +- No generic app catalog. +- No Tabs/List/Status bar/Footer/help bar. +- No controller focus UI. +- No production app plugin model. +- No game cartridge visual changes. + +## Execution Method + +1. Define the 270p layout constants. + - What changes: establish local coordinates for Hub background, title area, two buttons, and optional simple panel/frame. + - How: use fixed 480x270 logical viewport coordinates consistent with the runtime viewport. + - Files: `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs` or local Hub UI submodule. + +2. Add local retro drawing primitives. + - What changes: add small helper functions for panel/frame, button, highlight, and simple text placement. + - How: keep them private/local to the Hub slice; do not expose as a toolkit. + - Files: Hub module or `crates/console/prometeu-system/src/programs/prometeu_hub/` submodules. + +3. Render Hub/Home. + - What changes: draw a consistent retro/minimalist Home surface with exactly two launch buttons. + - How: use low-resolution composition, strong outlines, limited color use, and button labels `ShellA` and `ShellB`. + - Files: Hub render path. + +4. Render native fake Shell app views. + - What changes: draw `ShellA` as a green app/window and `ShellB` as a blue app/window, with a visible close command. + - How: use the task-owned window information and app identity established by `PLN-0062`. + - Files: Hub render path and any local fake-app state/mapping. + +5. Keep visual state separate from lifecycle state. + - What changes: UI code may know the current view/app identity but must not mutate lifecycle directly. + - How: return actions to the boundary defined by `PLN-0062`. + - Files: Hub update/render code. + +6. Add lightweight tests for layout/action coupling. + - What changes: ensure visible button rects match clickable rects from `PLN-0063`. + - How: put button definitions in a shared local data structure used by render and hit testing. + - Files: Hub module tests. + +## Acceptance Criteria + +- [ ] Hub/Home renders full-screen in the 270p viewport. +- [ ] Hub/Home shows exactly two manual launch buttons: `ShellA` and `ShellB`. +- [ ] The visual style is retro/minimalist with strong borders and limited palette. +- [ ] `ShellA` renders as a simple green native fake Shell app/window. +- [ ] `ShellB` renders as a simple blue native fake Shell app/window. +- [ ] Each Shell app view exposes a visible close command. +- [ ] Local primitives are not exported as a general toolkit. +- [ ] No Tabs/List/Status bar/Footer/help bar are added in this wave. + +## Tests + +- Unit tests for shared local layout/button definitions. +- Compile and runtime tests from `PLN-0062` and `PLN-0063`. +- Manual desktop verification of the full flow: Hub -> ShellA -> close -> Hub -> ShellB -> close -> Hub. +- Screenshot/manual visual check at 480x270 internal composition if repository tooling supports it. + +## Affected Artifacts + +- `crates/console/prometeu-system/src/programs/prometeu_hub/prometeu_hub.rs` +- Possible local modules under `crates/console/prometeu-system/src/programs/prometeu_hub/` +- Tests colocated with Hub module diff --git a/discussion/workflow/plans/PLN-0065-pixel-operator-font-integration.md b/discussion/workflow/plans/PLN-0065-pixel-operator-font-integration.md new file mode 100644 index 00000000..81db4bb3 --- /dev/null +++ b/discussion/workflow/plans/PLN-0065-pixel-operator-font-integration.md @@ -0,0 +1,88 @@ +--- +id: PLN-0065 +ticket: prometeu-hub-ui-direction +title: Pixel Operator Font Integration +status: open +created: 2026-05-15 +ref_decisions: [DEC-0028] +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Briefing + +Integrate the already-available Pixel Operator font asset into the first Hub UI slice when the existing rendering path can support it without creating a new public font system. + +Source decision: `DEC-0028`. + +## Objective + +Use pixel-style typography for the Hub/Home and fake Shell app labels while keeping font work scoped to the initial UI slice. + +## Dependencies + +- `DEC-0028` must remain accepted. +- `PLN-0064` can proceed without this plan if font integration exposes unrelated architecture work. +- The asset is expected to exist already under `assets/pixel_operator` or from `assets/pixel_operator.zip`. + +## Scope + +- Locate and verify the extracted Pixel Operator asset. +- Determine the current text rendering path available to Hub/System UI. +- Add a local font binding or asset loading path if one already fits the runtime. +- Use the font for Hub button labels and simple Shell app text. +- Document any reason this must be deferred. + +## Non-Goals + +- No general font manager unless one already exists and only needs registration. +- No text layout engine. +- No multilingual shaping. +- No public asset/font spec change unless implementation requires a durable contract. +- No dependency download. + +## Execution Method + +1. Verify the asset. + - What changes: confirm exact files and format under `assets/pixel_operator`. + - How: inspect asset directory and identify usable font/bitmap files. + - Files: `assets/pixel_operator*`. + +2. Inspect current text rendering. + - What changes: determine whether Hub can draw text through existing HAL/GFX primitives or asset-backed glyph rendering. + - How: search current text/glyph/font rendering APIs and examples. + - Files: `crates/console/prometeu-hal`, `crates/console/prometeu-system`, current asset/glyph code. + +3. Add the narrowest local integration. + - What changes: make Hub text use Pixel Operator if the path is straightforward. + - How: register/load the asset in the same style as existing assets; keep code local to Hub UI if there is no general font contract. + - Files: Hub module and asset-loading modules identified in step 2. + +4. Add fallback behavior. + - What changes: if font rendering is not currently suitable, keep the visual slice working with existing text/primitive rendering and record a follow-up. + - How: do not block `PLN-0064` on broad font architecture. + - Files: Hub module and this plan's execution notes. + +5. Validate typography use. + - What changes: button labels and simple Shell app labels render legibly in 270p. + - How: manual visual verification plus any available render tests. + - Files: Hub render path. + +## Acceptance Criteria + +- [ ] Pixel Operator asset location and format are verified. +- [ ] Hub text rendering uses Pixel Operator when the existing rendering path supports it. +- [ ] If deferred, the reason is recorded and `PLN-0064` remains executable. +- [ ] No broad font/text toolkit is introduced. +- [ ] Text remains legible at 270p. + +## Tests + +- Compile tests for any asset/font binding. +- Unit tests only if new parsing/registration logic is added. +- Manual visual verification of button labels and Shell labels. + +## Affected Artifacts + +- `assets/pixel_operator*` +- `crates/console/prometeu-system/src/programs/prometeu_hub/` +- Existing HAL/GFX/asset modules if they already host font or glyph rendering diff --git a/discussion/workflow/plans/PLN-0066-hub-ui-slice-validation-and-lesson.md b/discussion/workflow/plans/PLN-0066-hub-ui-slice-validation-and-lesson.md new file mode 100644 index 00000000..7e323695 --- /dev/null +++ b/discussion/workflow/plans/PLN-0066-hub-ui-slice-validation-and-lesson.md @@ -0,0 +1,96 @@ +--- +id: PLN-0066 +ticket: prometeu-hub-ui-direction +title: Hub UI Slice Validation and Lesson +status: open +created: 2026-05-15 +ref_decisions: [DEC-0028] +tags: [hub, ui, shell, system-apps, lifecycle, design-system] +--- + +## Briefing + +Validate the completed `DEC-0028` implementation family, collect evidence, and prepare the post-execution lesson required by the repository workflow. + +Source decision: `DEC-0028`. + +## Objective + +Prove that the initial Hub retro Shell UI slice satisfies the accepted decision and leave the discussion workflow ready for housekeeping after implementation. + +## Dependencies + +- `PLN-0062` must be implemented. +- `PLN-0063` must be implemented or explicitly documented as unnecessary because mouse/click was already available. +- `PLN-0064` must be implemented. +- `PLN-0065` must be implemented or explicitly deferred with evidence. + +## Scope + +- Run relevant crate tests. +- Perform manual desktop verification of the end-to-end flow. +- Check that no forbidden scope leaked into implementation. +- Record evidence in plan execution notes or final implementation summary. +- Draft an English lesson after execution is complete. + +## Non-Goals + +- No new UI implementation work except small fixes required to satisfy acceptance criteria. +- No new architecture decisions. +- No lesson before code/spec state is published. +- No housekeeping until plans are done. + +## Execution Method + +1. Run automated tests. + - What changes: execute the crates affected by plans `PLN-0062` through `PLN-0065`. + - How: run targeted cargo tests for firmware/system/host crates. + - Files: test output only; no source changes unless failures expose implementation bugs. + +2. Verify end-to-end desktop behavior. + - What changes: manually exercise Hub -> ShellA -> close -> Hub -> ShellB -> close -> Hub. + - How: run the desktop host or project runner used for Hub boot, click the buttons, and observe lifecycle return. + - Files: none, unless bugs are found. + +3. Check decision compliance. + - What changes: inspect implementation against `DEC-0028` invariants. + - How: verify no toolkit, no catalog, no Tabs/List/Footer, no direct task/process manager mutation from visual components, and task-owned Shell windows. + - Files: implementation files from the prior plans. + +4. Record validation evidence. + - What changes: update the relevant plans or implementation summary with commands run, manual checks, failures, and fixes. + - How: keep evidence concise and tied to acceptance criteria. + - Files: plan artifacts if the workflow records execution notes there. + +5. Prepare post-execution lesson. + - What changes: create an English lesson only after implementation is complete and published. + - How: use `discussion-housekeep` when all plans are done; lesson should explain how to think about Hub visual slices without making lessons normative. + - Files: `discussion/lessons/DSC-0036-prometeu-hub-ui-direction/...`. + +## Acceptance Criteria + +- [ ] Automated tests for affected crates pass or failures are documented as unrelated. +- [ ] Manual flow passes: Hub -> ShellA -> close -> Hub. +- [ ] Manual flow passes: Hub -> ShellB -> close -> Hub. +- [ ] Shell windows are task-owned. +- [ ] App close uses lifecycle close. +- [ ] No complete UI toolkit or catalog was introduced. +- [ ] Pixel font integration outcome is recorded. +- [ ] A post-execution lesson is ready for housekeeping after plans are marked done. + +## Tests + +- `cargo test -p prometeu-system` +- `cargo test -p prometeu-firmware` +- `cargo test -p prometeu-host-desktop-winit` if host/input code changed +- Manual desktop host verification +- `discussion validate` after marking plans and housekeeping artifacts + +## Affected Artifacts + +- Implementation files touched by `PLN-0062` through `PLN-0065` +- `discussion/workflow/plans/PLN-0062-native-shell-launch-and-lifecycle-wiring.md` +- `discussion/workflow/plans/PLN-0063-hub-mouse-input-and-click-routing.md` +- `discussion/workflow/plans/PLN-0064-retro-hub-home-and-fake-shell-ui.md` +- `discussion/workflow/plans/PLN-0065-pixel-operator-font-integration.md` +- Future lesson under `discussion/lessons/DSC-0036-prometeu-hub-ui-direction/`

F)j14a z6z!3X9}Q|h+$Hn<+U{)`UsmlCEqtUic*F?w4T4Am&f(pxPH7<|MU6dQzrNlZL)i-S z9_cU8JNgY~!cM+^sohX&t66w@D6>_o5jnn&9^=pJ?6rPi>}vfGvX5DQqW!ok)?xU` z?^8d(c<`hB_8y>#4Q2;pVU0G!z{%bI+^`$3VV!L%4rV%dHgR6}QlMR%C6G382hhK7 zqOqcKSbY}x-+W)LBL7}c)bIOuq`yGVL4Ohbpr87OFK&YvIm8e8ef)%}k;jNSZO{S! z6o1+jQ8d>Wynqo18|oW;4_-!}iX91Phkgic__Vl2V_RzirD=DVKu+NvbaelYg^%80 zf*&FW96&#i2W(F0hsXd0{l0!8{RR3#{{()B9F0FB6gUpD9II@|YJFhT?D}x!WO2)n zi9X;Tv1K`ETO3#aFqO0Q5W8Zq;BSd)_J?%lerR}YrCI`4(hdd>G#lt=MN#+@?O=)^ zSi>Db6SvyHCA6nW#n+2_0{1@JGZ}EW3LFOd(*C~F`{5t6ftN+&VOP?5D(v^`X2@#R z!g>dRbsO(V6z)g(xCy3<_a%JzM6DIspP=y>?6x+?vruM^2AQQkI?)_PU%Jw1fcH)` zm+oc;>%4*)5#rDzQnB%m_&U2Dm}BOn1oUBeG3pD-r?ofm6n#2p8&+AE(;eZ`TJr<2 zm8)&_B3gx@ZAwZCi`kHS)ry$e%u5`%^Zpe$9?ZcV6!StVp1>d0oWUOo`Xl~O(C?1G zAGT@6j`U;iO8rg!6>eQjphLoXp>B;13;H8E)P576HV2z~ zg0G6-L50ie1|CCRbbUx)HFItxFZ3h3ZZx$!V%uc+GvRk+&j)*H!J5)6?$-Xi*0O%Z%OYu>~2d77Jw$Ny5}@XX`S_vyqBAgT9m zbR|o0DAt8f>q2~ib+(xstF1bFpQ)hUA>ME&67k1aF}7lcU{yz(X-P2+)-fjwou-P&96SA4Hp%SH#NrFPaE&+t$4iA+nL8N z_UTif^jT&bWc{kFC~W_@r;*srBlf>u^@sI8GY_6sM-{Bu7`&iX;;xl_HjQ4U)wHjhf@>n{ z5L{>Pzmn7N5`Vlt`xcCcRV=P*DQ5MK7y&=1H8j8Ky53swBHk~H?#cLSrOc23dt30K zP9v*%J`bO3ASLGK6GR9PWKFJRb(aQO)9;{6|NaN5 zpbW$-@PuctG)8geP7?H*+GqFclKYjvYCM_C=VRLinMYC0#GP8r=#_dix}$IL@711} zP1JMOg8&LOhkG6LLvkK|6Zt^2WSA6esZ&^XqNva_ScDv=<}&&sXEv`;W6)RRnO05k zIxAg9bsao=7OwZ`Ir!5U;9$%|^!NB={MG?WtP83O(u zklB~kN)0q2j@bv|R1}OSi;3|&l5Gf_m^pw3k)pTX8@3Gp;W-gJFKU@^rud(2aC zT5MvsHos5l`S)Fb;N<;$d$1jO))Dix*#pu+26LDypU`Vq1@}zQ`V5!hoviRhi_@fd zaRJ89?BdII<3vX+d_K-RPf=%|O?s8xV(>80UNH*d(>IDS4{AoPj1Udx`47E=XLMNt z>FvD=T2f=w9U-&UBwB{xV|*R&W}(}pAFlp@-IQXoQw6UwuOB+M+qQ$K+iBY|DT&=_ z+pf%xy=2>QNx4gHJ0TTr*0%AKqLm&rNq)3#k97sfkmyHd`LKWy7oGB2?T9_qw# zf7ZDTteCbVGh!QTJ0?}JJ+|%2y4c;e9mmdZ+O`ui)xFHNlQP{Mu_b6 z(zYw*;`oPcyGl03kIM$hN;i&98N_==JlTxjfqJqQJ-cKl`m*?R34R~bDO+WSj`O5Z z)}S?@-w(-3*mZh>t=3q2`?GpWVOYp5H*WsHXxgMkXaeW`!eW2Zg-tFLn-)FR! zBf8M)k&E#=P!Hd2$LB1@`h4y{JA2;#|+D)8Gl_x6b(Nc%IkTHOE`f(z5iz1ugTJK#VJ(|6#~aYhDg*(n7QfwdKKYR$|EZ;cT~e zd4G1GbEt2?TZ1n8A^ocxV+W{Uq7OP7kCtvgiwSIv?7lbr(X@ zSa0aO{StrcJ`MSJI_@%f z(jYTX^_+*D;n}Db8-Y7>@oTOoM8Z5E6j5gZYRHAs2Gm{*1X>CoxCq$&Mqt&OWQDvL z@zsvK@kvQbc^hK(O8k!YYI!@>k{xml@bx;`2yDMW-YJ`; z6TkiZqKwFgh5l z$MA)mJSzVwkI7HuarwP$k^hn>8A2v_kGudpx(V6rz4AWUjoSJr(5Psa>|_w`Gr&IRN=S4HF8Mqby7~PQ|Hvn^YU9K?M!y2I8&XooU`%U-sAE+ z+!^={?qvQNyBLS%U*y~J9eD`9`~8;uP;SNk?MLuS;D_aY{0jID_zmbe&UCrGWJmAz zmXoHm%#fSKdUa9sId*iK$$Mh%(M)td*hJG03hdP-b9u)TL{Vh7*jm+Tnm mqmT<)R?fHQ#d@AU9|bL64%R%31cx7v{(1RDJV*ZziT?#bZS@=g literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperatorHB8.ttf b/assets/pixel-operator/PixelOperatorHB8.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5283cb51b364fbcaef3e34acf509f647c295d38c GIT binary patch literal 19076 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 HH<|ty^k|7o literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperatorHBSC.ttf b/assets/pixel-operator/PixelOperatorHBSC.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b8fa149c00ea526de161dccb02fe21ce5e296176 GIT binary patch literal 17112 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 literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperatorMono-Bold.ttf b/assets/pixel-operator/PixelOperatorMono-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..215d4a29f146cc23cd1869bd50f30dff2df45ce2 GIT binary patch literal 16744 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 O^7~aQc?|!*1OEq~H{whH literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperatorMono.ttf b/assets/pixel-operator/PixelOperatorMono.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1c1edccac2370813c6c4dd8c7609ebfa6ca5da2a GIT binary patch literal 16972 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 JM*nYx{{!TAB+LK+ literal 0 HcmV?d00001 diff --git a/assets/pixel-operator/PixelOperatorMono8-Bold.ttf b/assets/pixel-operator/PixelOperatorMono8-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc5b82b1b012632271a30dacffe0df847c67cb59 GIT binary patch literal 18624 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