From cd1497d740b1b6e2d7be231b005831cea02525d6 Mon Sep 17 00:00:00 2001 From: sergio Date: Tue, 4 Aug 2026 00:32:50 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=8F=94=20cosmic:=20EL=20ESCRITORIO=20ENTE?= =?UTF-8?q?RO=20DIBUJADO=20=E2=80=94=20panel,=20dock=20y=20applets=20en=20?= =?UTF-8?q?QEMU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 26/26 recetas selladas, escritorio-cosmic 62/62. La captura (895 colores) muestra el panel superior con Workspaces/Applications, reloj y los applets de a11y, audio, red, batería y encendido; el dock inferior con lanzador, workspaces y biblioteca; y el fondo en el color exacto que configura cosmic-start. 48 procesos cosmic estables a los 30s. Y CORRIGE UN DIAGNÓSTICO MÍO. Cuando el panel selló y no dibujó, lo atribuí a que le faltaban los applets. Hacían falta —sin ellos el panel está vacío— pero no eran la causa de la pantalla lisa: -device virtio-gpu-pci no reemplaza la VGA por defecto de QEMU, la SUMA. Dos cards, dos outputs, cosmic-bg pinta en los dos y el panel se ancla en uno; el screendump capturaba el otro. Log impecable, pantalla lisa. Con -vga none sale entero. Un síntoma puede tener dos causas suficientes: arreglar la primera no prueba nada. También: PATH como primera línea de cosmic-start. El getty da un PATH sin /usr/bin y en la imagen mkdir sólo vive ahí, así que los cuatro mkdir -p fallaban en silencio — gratis hoy porque los directorios venían horneados, fatal el día que cambie la imagen. Co-Authored-By: Claude Opus 5 (1M context) --- .../cosmic-panel-applets-qemu-2026-08-04.png | Bin 0 -> 19004 bytes docs/runbooks/cosmic-desktop.md | 95 ++++++++++++++---- scripts/cosmic/cosmic-start-qemu.sh | 8 +- scripts/cosmic/hydrate-cosmic.sh | 0 scripts/cosmic/qemu-desktop-image.sh | 0 5 files changed, 84 insertions(+), 19 deletions(-) create mode 100644 docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png mode change 100644 => 100755 scripts/cosmic/cosmic-start-qemu.sh mode change 100644 => 100755 scripts/cosmic/hydrate-cosmic.sh mode change 100644 => 100755 scripts/cosmic/qemu-desktop-image.sh diff --git a/docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png b/docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png new file mode 100644 index 0000000000000000000000000000000000000000..45d75e4dede12a3ff55ce0009be0f351de0089e9 GIT binary patch literal 19004 zcmeIac~p~E^fnqwRjM+y7O5goDo6zx93V1Vs8T>cWfGZXk}*htFb9>P)e05_lu;^( z%rgNJ2tpN^5o8Qu5JG@34+$Y8xjX%S>-+A#Yu*3vAB{_cdEcCK-m~}f>}T(D4u9M* zH4r>}@-PB{5H$Sl*INk00r-*sM}e>4ZENp#3B3L2^4l#F1S0GV0udd9K z1vN#L%Ze(OEL1LOT)3>Es;;1-qM@R)6JP84|M-G0%GJ|7^#A({G2?=x@P(iMcMpM{ zzHaD1XJ7yS_jlAa&a3{fPO#L|I0V8_+3?q2EJDUt$l;lmZn?W$kF}T1PCs1n`-%VW zABDUg|Lm1lc+bJ;YNC7S;;B*#jlz^`!Of{bCFtgzE*0Z0^N=d^x$~&!(~3m-pMNf# zRaO2y;O45p&niccwoTF)?e1#f?uZ7#jG0iPW3zuxbBRr#B~QV7$#)~be?@bDG8t76D^c6JbChDXJ@B-_lx`c8|_l) z?(=lK~DAsHzPws!~b)G^QXVBp1$^H$j*@U zA?U-c^LY?$I4gX$;r%2S4>9`JfOO2jz`)ff$0eX~RaI3si;<%dwA93y#E&?Hi-wbU zBaAnU7fF)&M!Muq?NW6P+sDMjgc!wsW17|I^zNZHW1@OA;}G1Zd988%QND3n)G9hB zLnFuw?#YI(pz*BxA5OfV)Z_KYH_)TwQ03ZD*)GZIzSy_DLc%P4E5l zi-QH$*4DV|?Mq8bE8V$STF)4h;mW$tXywFa_hZ2ye-F@%^7iuDRKDZp<_4Crof5UP zw{OyJSIt8PwWq6ko9Zy<+NH1&YfX%7Bx>?ogHwMIX>-YDWrc<6)6x8!xCkz5iu)-s z%3?X~u2|6SOuR04f6LO+QqwDzwSt?96?3Q;G$YI=Xx3q65x!(0Ze1o4CK8_2Pg9D} zE*T!dz)wZa{bg{*EPKCQms7b;T{|FVw?0DT?10yDX^z}7Rm{uFONqF@DZ$Y|XpVucU^f* z-vkNGU`_NrIpMr;#wzomq;}Z$BVnETPX?>czNG~3*Abc&R}Yt!luRrLuND;*m6Efv zC%YpJlOi}fuUs4(9UUd)7 zKGP#RbUxwE%vPT+cH_MmYNh(1;K|PgW;rW%-?aES#ba%I)t4*Ugmm}USFr2%+a+-B zJ?X~EP1`ZYOn0HPh}oyeVA`-^jEc`_#S^8*g~tkImlyMrn>U`K>>@Vax5Wv1(<*{mAMnhjpYU=UHkolJ$z3HmOs*avc9&Z5`^n}}-kP$4GfmJ53 zA0AP>|ePCE<{RvfyGy^NA|67?MVJ3WuDzH&d;_d zqUy%Lvhah{MfYy2Qu!t(-n!)W##mpJ8l(50;__w<;0Ql*qeSHPC(Ois1D)t_`tn%0 zBaxbe)rq-bWu*p|2a_+4dE_*$)R8v19}=|bqdDAtYWpd4H@~pf`lw5yD(l>c9lFOC zN4B!Essl%v3>-8u)7tna&oJ4K$fifq$K+!Chb*llDGH8E20W2r@)?uN%Nv?gOjC}* zu4h4(8ldctV{$s1A5W**1sF!f#!Cc`a`*eV*RwQsfIPae2A8Rs=rh+}r~v$VuEl@w z=*OvDp3?ynMlIyVUrRXE&_=Y#(g@Pv?9KwNB8P1}Ql3Ab^DBA#_64v;g>%~~eyzFC zykIhvn)T?Aa4+!&50MLhKLI!rwYR!2BFTZ~j8$?*=@vXz6PLq6cf~620{+ohxjW70 zhK7calOZkzrdhm!IJd@>+2j4ZWP6&u;ERI|)NIx?I4661kjP#^vFIy!v;#8Qs_GM} z3#JWK`C?w-gRAor#wMaE5|UV)tjIaCW}&LK0EykEABTXr;DQ zf{IcTrM5T&smM!WHDF01b3TLGlYs-P#Y=|Wd;eJU(Luq((#ya@VB;4^l!JhCZ>IWM zGs~~sp((wTSyJ7be);|vUCu_Lxv6^oI(@9#L)oS(Z#|0!90S&z9kO;*q>Ft$>Y$i- zXsr8B0|+5M)9HSAz+q!!qljKm&`uU+(#FOnbi^K0`~LL}w7D~d!Ecs%xl%FVuE$A$ zH{9~@z!5KR?<1%jT`UKF1`5Y5DF=rcOJ2JB&+msMLtcSNlmYlH5BNvQ?8CWi##(is zPJ>hvaCw$GdOk_kSWm#(?*98<4oPfNl(9^}NCa#C@P^JmYYo@W7XNzi5Ww_|X_>Z}zHSKY&xppmSQFMp)j2aoZht5nGJ1L>GmGM>AcMvPd0cgPIrl-FrtLH1$k zqvC4Itw)pzUmh#yY`yH$V$LNK_bJL@0RUz|MU|J7>_fx*J*X)3?)nU`@r6&X;rnO|FCv4N@StU;xl-e!77j!6b!VqJ zMlo~aCHHE}BUdiwFuS>IA{WWP{7vb)5V^PQUEUN7d;k{v;r!iy;-#W)*C+Kv3?*nR zz2$)u2CGGRZk~G1CP~vbT#n#}D0MZTN<~s27HjQJKO%1DD`y3ddlI?qwE~k2dYcrd zg3{K!Q;Gt3-XE{={MY|7J6zrSvdPOCXn|aNd@xY(Z9>R>0cVgfz-Hp=0j_=7+QiM2 z^1#J`{4w#){QP{6%=;f)61C~;ZNfPK|5ywF@lPpT4me}yQ~&_e>mJw37v@* z3*g2iT>kR=#6};Cl?u)cR-pFf5P{KwA$T0fEG;Z5+T+D>^nCZeW50}{5~v24wJq_f z-D|6eIM7j>o153qR09yx)6+p{Q6!newkU0wRzX3*iyplM9$|jN26qKKUNlTB}n-LEekD(=GB5mG9<@^pkfwB{P5HM8=5V$P;6WQcrBEH##r^7?hf8dVt;?ezim7c? z`EsZXa^#|MqSod|c#23+ ztiV={>+g8d#onIGyAg;UT&H0DO1p*p4mgsqgvKQXe||~HGT>W6H!5OPQ@#I1M;W47eZAC;cofDN*jAQ}=m+4LC&`;^MnUhp3YslQ2tn znh)tZwM28bu$;bQPX`tQfk-`iGecn{6VNq};*U_b$8R1KmYl$2)+RJHgh8!<@)?9U zm-@&kX%3p~$$5nj+4!=*cIgSYQbT~-Oand^q!Vb~JDk>Ji4X`w3tfKl-%$+4@2fMwln7v&7Q-a_ij8lfx@R#T-Ir=-u-q znP?sjX)*svZlC}n?E^num5!0i4*6oByY~t7$#K1Um~?#sV5ZSOOM zWCS2h7gUxMt0&l7YQNAda%qaQGF3*{?A#CkC(R*ju}xSv0)n%$17R1~m-){h$BtmL zN{fmhq`YpX*OpVF2DMje26aHUiZ-X5(u0V3D1a{l)T_>V3;%nL7i5O3jCI8t$QJLS z)`W(E_YO%#RAAO7A&c|Pdw~0ORhfA$5#39!x8xok$UPr&?di!KNJ=;hE(x5y5n?tT zHBo;b^b*gnOL3EX5SG?KC1r!M;L#RngDzg^9LP8JfL!_0RWUX&{l~0C9RS1L-d?Lq z8K@8B#kM)n@?21IJhaA&`FwP*PL?xk-X1Xa=*y1WTP&dZEsvBta`-?&rE6mR)H2wg z3v_lMHWD~{H0hW?jVx?85Xw}*L%dD3yF}PRt~mKmVV&J+V1TCm%`WAJxujM)$rK>K z6BllvBJ5rRm(K9Q9QN`4!Gc?bY{nFJb)um`7#~DSQ$K9OP137M4Yt0#OOsRWnEuRG@erkSS<%(1qcY6l(}U)&9ntx@YwSKqm6$WK$|T zXxIiOC?e_}R*a{=d}B1>RGV^7aT&{NM$3xG6(fiZ|cm5YHIINME7^!yK3N_dMk zac>A>J8z&s6JC%A93e_YZe>h$n>cW@)*`4NCOb`3h6l!Ly`g&sd?bhYVe7#m$=ePN z&4p=hGp(^e0*6ldUy)CdKR4scDyp5N9qcz!+wu)%Zc>hjDQPh#(8fkajhHp)J`Fr+ zqI$T@-uBk53lQ8uj+`}rvkyq}Q&VmOo(l+GmVh-9^ zl4mcHFOD*A!%L5Os>Hjj;S3`Z|M%ZN;SBb8X-%tG^D|8~2og(#t=W;7P3MiS8<)0U>pVO!K5qhL zdc>ukKp^<8==3xlODCFImOTJ4J3A~qO;>T&TNQi=MVD+SBsJX7nEmtOhXe^*NTERS zmI_UGDdBy#7d{!MDe>CjMN&{=``v9|F)9f~BtvC}R)*&}T9zgz3W#abEE~q$o*=Qs zcS^6Gl4|P!`8bs1TtLAVfc{Ofc3@VbtH9makb|{@%R-ysj_4j$VeReyWZ;?tUAAZE z^Ro@cBJm<05~Xy(V<5!sLtXEMR_G?o<1xJ-kbV>34^ogdK+&n(7N^8b#DWOmrN+F7 z0iuNrlhnYRg8VV8O%MsGj;NU~d)tw-nKp4A1-g&`xici&mAt062hE6J3C#4!;&OFg zGmPg5%BCr72Yi035ZkBC;Mq57sj$ElA|)V$;(q%ZX|Rswk>ls;0h&BX2)b!7hZA@) zhXNru3dH1E{cHkc%X^KqG6e+%(&w%!pRuZ`{dpvj*@NQs%yV0RSzDH+_t1#os}vs& zX;T<-QAix!pz4Mr2a}+GG_^f7HFXlwQ=XXN#cZf}T+9>!2rr1V@@DIikj7gqmlKOjkkV}i1(kq}BX@x4#Z^35gGW;f zEAuf1eJ2H)VWx%DDg95Z<3j+z=SxsLyahV5`$*H-hO9YAw?-VXk*o5KytlF_9DSd@ zLrqh1AcTxoI0K~=S}Z~MxdXE<2bvIa)EE)d%QG>&L<0DfM*yIWgE{xgLCp$DX!tbq zlTsf)e$1O;u(o|;pl3CnS1*CQ)RtF2tHga9eZ$^9vP%({8Mai&wC#nbhg`>}LmZ2o z@NcWXKg;1Th+^R)SH6d;jy8~vNGoJUAO1X%Z2WLS&o2~mBGN@vzmoSte=cv(_V)H? zk_*eq{Pf#SK^h(<>_5p1I3K0s=MG)~&9Xuu3_=w~Z6~1xa`N#nS98&6fjwD-m!u86 z;33t#BpI6ur*~Jy?6>!5<4crV_Ayp_SikAk1pRPr&g+pq>#c%b| z2}?!A^78Ugo5?xLbA6;RHK`VB`=BA7V7QAqjmR}GFy%o92dN|^u<9`tpm2Fv2a!cy z<9X&?)X6L8*VmqQ+AG!OgS_^BJ#vGbWnpENaN^<{5S^uthCk~*lVUFzkU~H1fnG*I zVK!CJ&em2FVjrXum7^|-37-j}Tc)5Yq2^5KT~<_3um!e$e%5@Cu|@>IQ0GYt;0CLE zP4TA!e&ba`B>IQOzg9uKzW@%aP*#5zbRdX=u2e-l=(r)}iY}nIMySxn2}z_+U8O_n zFbR^4`A1MN3SvA@Wr8&xH%V){{|F^(a<6uak3|tkNAUD6*9%O0ykU|Zmc0W-hK{+8 zWGFaC?cZ-$9twX`>^Wrs>cu zKv^IyIbXzxw;KZT5eNUhcL%OhN)3}B$EG|*PX3mE3*`GAcnf#ob>h5|OmP$+tRg%y zLWX&VhBBdCv<*7uoPFbVRhN=+!5~zNfwA9D-r-f{uZd6bpVGTG)y(ssB$>i%?G`fK7Z7BW;8f)>p@&(H1A_w@6A`n-;HzG-dxmDue0^&}Vb_=}y`U`^p|6GT8 zMIdg9{CDBMDY^3ff6nk9KK?gz{O1h+Im3U>@E<4sCk_6S2LDNe{}l3nNdu%)|B0gi zMA3hu=>MlMFnZF&cjbJEO?qjT_yzCk;`vySq#-F8+R~FI6GZ==TPqp`otp6?0}`yf z@gUQng>T0(%Jge|SAUF_J}IbB-R0r#O_eR4@32Swom67~SBd?%dLPR&Gw`yOce0m8 zxwEYd-S;J=9S`OEfuWJk{+c{)#~NaiSS88%Qd&OzHX(Qmv?sU3~~H}+CqY|E03G5 zUh)36r6RnOcjH26yas>Eaiig~+qm_H&q>xsVG=2;_wQ9A58V^}>W5&Y;R+!Lon0{^ zhN%0csw|33=qPkUrC3R16fK)C_wWT*B$cspES7x{!OyzKyZNW_+E)HMUZQjhIkI`l)(1Wx2D#jctZBxwNb{@O~2E zbm%uPs%rNS1<*#jk(ILN3l6oy-Ln$;_2~JpRcb;z;s;N<@4t_*M)aRd3fl3WYF1$S z-{D>6gUi0W%ad5bs4X7?-w?-;8fmEz7isB_D|AGRdR|glJ_t8ic09IO5<>*Pf$JC@ zl^V~lei(nFYCO_&lZdFOhQ7s4S{)Bpi1w9<&K2w|@qMxL%%&XSL^U2BLUxC}g|>Z8 z^Bwi=Yh)%T*D5@25=DpD#|0Q20U9s(HV4iQ%y_T2Niv$NrZb^&kX^7q`R9S0F;xfWmqQ!%@_}1a!Qri(WeGzv|=hL5zNyoZn{n-mjvlq&& zB&_EjSr25f3glVKHP-y2(zn=VEKjJ%p{SmLpG`^~39@j@o~w+b!fvy5M5 zzUf;0@Sf6lJu{qDs=2i2Q|gx%@%l@DZXqmn8c`gE1dl9kKlYI8!Lx@&TAf*+xyuB% za0}PL#T!Y77XyDbj1QE5o~N%NVKr1h4D?P!&Zqb?58IN?%AMjCzK%;xNm+^M8|v>@ z*@iJiKeAB0`wb@ovd79q#a#Skw^fqefyb%t#!H{3*tt($S?^ z*X3R%ogw&A#os&=wm8jIHzbJaBVFhdsCGKPBcqDe9s<69M{(v>`tWf-Zq zukQR({HCdrZHAIvp^Ja^n|}37_q%X5wNJTBR|~&B*^1v{_=U6_FZa5tAT^t{N=7m+ zxa$irV?_dvEW&Q;MU{nDmMCJSV_)3$fe;Mm+Xi3L_-BF!^zx}9(Ync3dIGE!e4i;x zQLUh)#D^Hk@Lb_necDz3XIK4&Cpl&qO_k?0q?Z|oeT2a!uYu)p&hu26k+)AP(*>oQ z7JoO<8(p7C2-y=FVRogZ3F}0>_V|&iJK^v0`faxp%`&QN}6t3)~KlG~RF z5_a%Tn{kp)QjFaz_iE`Zztj@x40~?u$GHB{MjEopDO6t=wQ-nl^k7HhUiZI@VYw{G zSN9wdr}k5|8f#{_CsI`Jx6K3MYX5kBmmcpOr9OgV7WhyHG4-4JLf)8<&JDi5$r>gZ zNqnmIekVzGH_V)BnJ}QO+1I>@`h}csF>4e+&X&JTjbjs^O3ia}Sk<%wv)%PE!_t~3 znv91ifzMB6y;mvZ3KmkL^-U_yJr?1Uv0TN2u?S3pzI%rPDPU&GZsO9@p^3`!p3`+3 z&K*J#dkLv9`*Y|^F{A|D&EK{0k;~OqCH5>vtnr?eRd;DA&DQ2yz1M0dd)2J*vzOJZ7D)b~kwF8C@`#9d;O{CGjS*6XnotuxBi zVp{l+u{b@yo=>V{&f_MGv8GTj9QF zWx^r6+cQi@sykbD;q{VycGq2Unk!@c$Y`UjLyD*k5A}SdqXZjYE>@DNk(T08F7^GbG^?7%qgViO_~SIzd!X=6I-G19BG%)f;y`1KkA^}tUlM08y?J^ zf5v|(XoWDNHPfGdEK;`P&6}c5Iq#2ae0~u( z5c|jBUUHq>nFe;axZ=?9kxP4CJ32YE5j^H9%YUN3HKn__R9rWFa&0mMvt=fHz}%xY zRmStXzex>MCR3L6?Ymq23>$8tdEtJZO{vU9T2`L_Brv*8GlPj)PkGUEz(%Lv=NPg(L^H4(&z$A6)s|f?9dpArNAhCfmQ|_0SRjLq?NP>3Gt$Ju z(Lg+Z77PCTr9R1W>#=s2(-Q%w(IMGd66d1oH_mKkqj*MzJR|xdy>#zgzgdjPQkv{m z_Q!Lf=Skb?^|>Y1ZOy00cTU{6&nV2{%%ICnLQtG}YuackTsHjOPb-xi;xu| zR~P3NSG-5^a9*+a^!HNdJn1vp+Tq`azvhkFJI!k1zASC2Ej>Rsl5v-Kw5467rJ}gY zkF;(5G^wYTN#IIm1?;eXF_~{VG~#9zFF5kGS9jB1tgJFS;Odl_^)mPU=Gv*?X_8dw zi)KPFI_+1l6|@nWRf7wcwZ#joV=eQBCF})WzFc#4Z{DgDwk7;M*C8sZ=^uL)>9I;U zBpJ57F8zo`8)@F{ERMyH?~iEf$Dg|6Fu9s*gwf<^qb7VOIBD;p|o_&dsW)JPU_;QT+!dhZb{YRvyC-v7^QT{Ndm;<_DGzKz1LN0hv198g5NnhnfNSsq zxM)C^8Q~KrwOxaFzWiKFe{Rj@He2b$0Ign9G%~>PwZ-dv?|EHKMlO-C zZJjc5=h#cTzPkNt*z+2rvi7o(a`9rMhSfez?%=$2if`rkaHQ&HyaTFFuCv^grW;f& zIZF;t>^AGOSIcvZRQu+C1Ob!M7jd^ID@}O}AATmre=pkDbd>dk+!-#X7>IHVa^Lx= zEXeT_$n`3xBRT6WxsNnGlAm5)9MoRh9qMmx!rem#c!#q~J<;=ipTf1#^S$sN--dH_ z|D$WhvymkavOa*~9rB$Ojn)^C28T#qt4&Q-OB}_?$EZ*%H zJv35G3kJu0g7@r;6ZfMizjGovv>nW5u~%?@{!pn}vH$Aea!c2br9QWDvchG)w{gzj zmGnQZj*zJ4E(uY_md~6C78>iX)M9n8m#F7TF9(#Hj}VuETcyRT7F&^*l2!6XHZXDG zal$mKvGZATa*Ey?Cp3f3se65tM2mf{9r(S@E|NX&j)Sc#?KAoZ<3$|8D7Eed^xBAZ zB_4XLo$P$Q?XDDm*HWR`)f?tPHttK2G7+A-l=Y^z~Ucj45&EWJC5^X7V=n==|-_^&-XU5n0~iso9w-H))D&J zt(O@bjk%GryF-k=^c>BN`r3kbMfcKr+%p1E@)CN%?BkTwV)|_{y?c%W=QA!{TiX*+ zx;O2!Fqw-H$aT5e=#OGtYila9W(|vfN)^{|UC-8ToYG!>FcA-^pk|@1LPJ9ZoVk2# z6qCHRm8i9rSv}sb{ur1T|JCfc`s{e`>AL7FeMFm|pYNsR=zsTYOAkRM-%~ zr@bgiM34OC`o{zFXHM4V<;f&>#E7IeWfy8Fk=a=zG>0hFIj{4`Vt;`h6k$LGm*OF+ zR4<9@`I2w2+@Lu4lu$GGdLrFQt%TK=HaV^mGqF7)O{|%rbXsG;QL|#6k=PkV@y{+f z%;FZKrhVQ$7&RQNICi<_-t_*F)T!{MPgyO7#W}T2iuC1A+6-GCfm{M1Vok>~HjUwf z|FhWld|6%o!t8i9?;)-s+E$e{x3YYm7)CR6^E6^^XeygG8)(E-_*t$dT`L6Jltt+a zC`{T~i+0jcZ!^|MW3qHpTWK3nls|}44IT`;y!kNIm}iGgP6xM{&~)u?;M|?b=@aoi zZ|dat{n_Vip3*+{5mLN*Y?_l~T$ASGwaXpv5t`Po&k4RKy{PN)s#~-fE3Ei5K^A2p zBPv`yBO@bMF=Ma~lRS$<&w8O@#AEjD2bOPt^}}830i_s0O{?UdOa8O7wrq_nQm3W< zHr#CelApVny)u#Wh`#W-u;g3`YSv;l(4o*mph-bvyKJHVc87Sd<49Q-0Z*tKlb$kh zc<{z>LgVz29-#+*4HG`{WrBhen^zY4=l*({XqKOGb+hbdi*obk_&)^&bGmlsj#x(h zp*SJ+OW$|Trla9!)61)a`te7V=x4+sMM=BQ=bMO#BReu%_{XiKUU-E$t+6CD;zcy* zhRQjA6)qn$(tI;qI_}EvQT1~F^L5dtLFpLYwnM70jOTtev!nh1%iUZ$V&xT^vop=c zxyCYxtjP{`SYkMXjXp?cv07!(v?UZaoW3W~YBJIw{fBK(wBg5^Q3|Q#fo<>ACY>;3 z@Q>Tqs1(z~^IP)!*!wAIIPc)DFT$x>o80Wt)SssSGRdyUEh2cPc3KN2~nNKSbbJ1 zu{9r;9`eiyB!3CAFDChJ|I}jmTa{s5Zmu-0HKECfgfZ^R(qzCkn4gD_3@nEc3Q+0~%{>g7FAx8`+%{ZMq?6SX=ks0F*az;W zHGgjz@#H!|*jQg6h-P)>zzDtPjET~AhDnw2(tNx~0Lsh9>ILy_lt&a(ZFa#-(#F9d zYFjRGV!`<_cu%kHt5I7op1{LDw)e6lZEc+#^<3tQBik6RHPg%@$)iKjQZK956&}&a z)M`q3Vj*p7F+qZU&Zg<|pwA|?bYVGq$@g;SI!#xqGc*M2>!h_8OX<=v1ynNDi}>Woq4DJ_3m#PMAM`?YJ7m)` z9ft~C46Dta=Lj_hTh4cQq{i5{O-8aJX1&wqQg!c7^I;}xXUfN}ibdRqQ#*PBzN-LI zdAj?_wEMLk_xVcOdEqQy9!DF9ead3$%{IRi?1IB_;lK%W@<61S4}+6j+-Q{+`zAcP zdhB}Jc$^Ggr@BaIsJSbecf^IaZRzJu<4R`_pQtpS*?BdlKVJ80vZX4!!czHBO_5F{ zxn8oo=d2@`Rzb&+4~n);6%-|Me$Wxg^bJ4t0V3Z=+L4%G40SMu zy?vuSwYyFSdG=`Che)E~yG=$mmQ9~ASPrtli?oJgZIk7Vlj3$fxb7ET`n$&4|$$nd;YzI^*9thj`LJ>zQ*$Lc)Uc#$jue{54SaDAE-(Z8r3dksn_4_OZr93YWe)Dn&#%_H*efw zcOvgZ1)TQfq1f;6!kaYjarzF*C+lgu6>in-Spa=4c=Xk(zWGyYOedGQ*=o2Jc}bC5 zF|evl64rWEV$ipPp_Wmf8>yaSI#CpqU6-sVQlY!eI|g*e45L^mN100x?M}^>DOodeqmx6$|14g_||_)$JRJ+(h5-IQRK&!f65mgDQ{gOMvQ z)sJyl`BHHr!@U zt%j^*pUuUlK6svQrDJ+Ma&l_cp80BJATwkP)$mc$hI;Xj9jK0{^ezYYr@Iu7xE?w4 zSMMcz9qR9m&it4Zn^%0}N^(#Ta2AHaFD67*b$R%;9Ycl*`TMD7$cRrOjPv!9COGtE z-RoEsS1BcHGNQqe{8*$F4(q7HIf_;VN!S^$6yv|>+$S_i>k(;HZr*kln8~Kf2lvt{ zoUMu;&L)j;iPLQ>%&$#MRs4earavS1KU0hGVK=3V>g{PEW`YHOiJk7&S z_r#%)%eSa~Fov0ooB6}A+R1yoMZAfYMX8l)-b@shB4EvFT9-`RU@Nv(c9=r?hK z6kt{44rPwMg3-@^^~G9W_3Dv6W9Y(~@5CAMd!YZ4gcI~z+AxC|CIy2`LQj*^n0ty{ zeWsAKXH({(-+v2B7o*8J2}XuT^F^T^joYjDdIcwmfh7=Bdt*4 z?m)ce%I$@D10B?U(QhOiXJQ>0G>7)4-<=)F-}p#mp={)_S#k22h_>NXcz`{y?qvVZcm=Ru~@icj>zq^%+TRO{B&&lY) zSk`CO)JGaWTzJ~x=Gat9YMQ!zD`Xb@awgMF)_lsd^h8Qk^<)QO+ir0t=Uir<*K5Q5 z;dq73w0_?JMe>e|FUR@b^)K^jR$lil^HQ)mcDmFitCLQ@rCI@o54|ootAmDWGqEXnwW1wX=vJ3>%p0_2nqW+Fk& zG*ZP|3@nW}jJNJkg+i2krj$?&^CLvQitI@<3C z3OJLy7xVdxkQTm4F>k6h%fs@|#H{a4Y+es`6X@}XQnJgwRI2ZtNMna?xp${GIdUU0 zlM3qIbk^29uka6Xk6sTeO`=BQD>YBQuFC-*&&wOR31!0MA>+FBjWL_GlJLcbfi~R} z0pSObpIRVcBx37VV?FA;e&IbKq z)v%$^2Pt*`Bi0&-1;kiqICJ=S$de zvnNf0Emr?7S?zXNY0GLmag#W#`2B`*6SF@QwXEwnPpwbRHxmVIYcY&&v4lISJLJt_ zO}@*L{2IcO_v^V#cPY&|-6DU=K^kv~P00 zwfczlS!x2OlX7^`V%38B%rbzX~d5|xv@^ZAOxx3CfiFn;xb&x!go4RfoA28?>x z2@e1wT~a|Tf4w9YES%3<1q_GV`pfkD;xO&9FZb@Ejv$u(Zpl*I`1|h9U0jyrX=y#y zs@tPpjIRu0wDOij*mFS*M|P{<>pU7qC_9F%XBcY8c%&cfdka@Fn(-9^|0pS2--w~D zSikz?^0iZ63F1?dip&Z$8IDM7Kvfw0uABpi@gj?O$$ZQ9H}b6S!}X&jxzwTzhTI%6jfK(lAQ;YB_`s>GoOhj6fX!MPr8!rEmos zeAQ?MKjPnfY|-yf>h=%c8I6mE+eQ!n6z$Bg94G^imu*Tg(#cG<(Yc6^aIZuPAcC(h zD)AdN9`#Q-{rdx6;t5lfZ!atWYsXSO-DT-%pL@~oWDq~4$)7c|q#I(ElP6vNT`z{U zSXeLq^fT@GYUsU2YOXY#p7pHSd$c?*3TwC`dR4)(ZFzj7PxHrvI.toml --store store` — no hay -nada que diagnosticar primero. +**La cola está COMPLETA: 26 recetas, `escritorio-cosmic` 62/62.** **El mínimo viable de una sesión son cuatro**: `cosmic-comp` + `cosmic-settings-daemon` + -`cosmic-notifications` + `cosmic-panel` (los tres `.expect` de la tabla de arriba). Tres están -sellados; falta notifications. - -Y `cosmic-applets` es aparte pero no opcional para VER algo: sin sus veinte symlinks el panel arranca, -dice «Done spawning applets» y no dibuja. +`cosmic-notifications` + `cosmic-panel` (los tres `.expect` de la tabla de arriba). **El orden no es el de la lista de arranque.** `cosmic-bg` va antes que el panel a propósito: habla Wayland con `smithay-client-toolkit` y **no toca libcosmic ni iced**, mientras que panel, launcher, @@ -312,6 +308,40 @@ cerró hoy en GNOME. con una fuente `Color`, que cosmic-bg soporta de fábrica — y va en el lanzador, no en el artefacto, porque es política de la imagen de prueba y no algo que el paquete prometa. +10. **`build.rs` contento ≠ linker contento: `cosmic-applets` necesita la libdbus COMPARTIDA.** + Los applets de red, bluetooth y status-area hablan D-Bus por `libdbus-sys` (FFI a la C, no zbus + como el resto de la suite). Declarar `dbus` a secas alcanza para que su `build.rs` pase —le basta + el `.pc`, que el paquete del daemon trae— y el fallo aparece **una hora después, en el enlace + final del multiplexor**: `unable to find dynamic system library 'dbus-1'`. El corpus sólo + empaqueta `libdbus-1.a`; el `.so` vive en `dbus-shared`. Son dos preguntas distintas y las + contestan dos herramientas distintas: pkg-config dice si la dep *existe*, el linker si hay algo + que *enlazar*. Era la única receta de la cola que pedía la estática. + +11. **`cosmic-workspaces` necesita `mesa`, y la dep sale de lo que el programa MUESTRA.** La vista de + espacios de trabajo dibuja miniaturas vivas de las ventanas; el compositor se las pasa como + DMA-BUF por `zcosmic-toplevel-info` y el cliente importa el fd con GBM ⇒ `-lgbm`. Es el único + cliente de la suite que toca el pipeline gráfico además del compositor, así que el juego fijo de + cuatro (`libxkbcommon`, `pkgconf`, `libudev-zero`, `libinput`) no alcanza. Corolario del gotcha + de siempre: la dep no se deduce de la familia del paquete, se lee de lo que hace. + +12. **DOS GPUs en QEMU = el panel dibuja en la pantalla que no mirás.** `-device virtio-gpu-pci` no + reemplaza a la VGA por defecto de QEMU: la SUMA. El invitado ve `card0` y `card1`, cosmic-comp + crea dos outputs (`Virtual-1` y `Unknown-1`), `cosmic-bg` pinta el fondo en ambos y el panel se + ancla en uno solo. El `screendump` captura el otro ⇒ **fondo perfecto, panel invisible, y ni un + solo error en el log**. Con `-vga none` el escritorio aparece entero a la primera. + **Y esto corrige un diagnóstico anterior de este mismo runbook**: cuando el panel selló y no + dibujó, lo atribuí a que le faltaban los applets. Los applets hacían falta —sin ellos el panel + está vacío— pero **no eran la causa de la pantalla lisa**; la causa era la segunda GPU, que ya + estaba ahí. Un síntoma puede tener dos causas suficientes y arreglar la primera no prueba nada: + la prueba es la pantalla, no el razonamiento. + +13. **`mkdir: not found` en `cosmic-start`, y la sesión arrancaba igual.** El getty entrega un PATH + sin `/usr/bin`, y en la imagen fundida `mkdir` sólo vive ahí (`/usr/bin/mkdir → coreutils`; la + base metal no tendió el symlink `/bin/mkdir → busybox` que sí tienen chmod, mount, sed y tee). + Los cuatro `mkdir -p` de la preparación fallaban y **no se notaba**, porque los directorios + venían horneados en la imagen. Es la forma más traicionera de bug: gratis hoy, fatal el día que + alguien cambie cómo se arma la imagen. Fix: exportar `PATH` como primera línea del script. + ## Cómo se construye ```sh @@ -320,13 +350,42 @@ cd ~/hammer ./target/release/hammer build recipes/incoming-cosmic/.toml --store store ``` +## 🏔 EL ESCRITORIO ENTERO, DIBUJADO (2026-08-04) + +`docs/evidencia/cosmic-panel-applets-qemu-2026-08-04.png` — 1280×800, **895 colores distintos**: + +- **panel superior** (banda `(27,27,27)`, 32 px): botones *Workspaces* y *Applications* a la + izquierda, reloj al centro, y a la derecha los applets de accesibilidad, audio, red, batería y + encendido; +- **dock inferior** centrado y redondeado, con lanzador, workspaces, biblioteca de aplicaciones y + las entradas `.desktop` del rootfs; +- fondo `(33,74,135)` = exactamente el `Color(Single((0.13,0.29,0.53)))` que escribe `cosmic-start`. + +48 procesos `cosmic-*` estables a los 30 s, sobre el kernel de hammer con arje-zero como PID1. +Se reproduce así (headless y automatizable; **el `-vga none` no es opcional**, ver gotcha 12): + +```sh +COSMIC_MODE=session bash scripts/cosmic/qemu-desktop-image.sh +qemu-system-x86_64 -machine q35,accel=kvm -cpu host -smp 4 -m 4096 \ + -drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2/x64/OVMF_CODE.4m.fd \ + -drive if=pflash,format=raw,file=/tmp/OVMF_VARS.fd \ + -drive file=work/hammer-cosmic-qemu.img,format=raw,if=virtio \ + -vga none -device virtio-gpu-pci,xres=1280,yres=800 \ + -display none -serial file:/tmp/cosmic.serial -qmp unix:/tmp/qmp.sock,server,nowait +# y después, por QMP: {"execute":"screendump","arguments":{"filename":"/tmp/shot.ppm"}} +``` + +El veredicto es **contar colores distintos del PPM**, no leer el log: con dos GPUs el log salía +impecable y la pantalla estaba lisa. + ## Lo que falta, en orden -1. Cerrar `cosmic-comp`. Es el gate: sin compositor no hay escritorio que probar. -2. El primer cliente de iced (`cosmic-panel`), que es la pregunta abierta de verdad — libcosmic con - `winit`/`wgpu` puede pedir más de lo que pide cosmic-bg. -3. `cosmic-settings-daemon`, `cosmic-launcher`, `cosmic-app-library`, `cosmic-notifications`, - `cosmic-osd`, `cosmic-workspaces-epoch`, `cosmic-idle`. -4. Imagen QEMU con `bash` + `dbus-run-session` + `hicolor-icon-theme`, y **validar CON PANTALLA** - (`DISP=gtk` + `screendump`, contar colores distintos) — regla heredada de KDE y GNOME. -5. `xdg-desktop-portal-cosmic` y `cosmic-greeter`, que son de la etapa siguiente. +1. **Entrada real**: el escritorio está dibujado pero nadie probó un click ni una tecla. `virtio-tablet` + + `virtio-keyboard` y verificar que el launcher abre (es lo que separa «pinta» de «se usa»). +2. `xdg-desktop-portal-cosmic` — sin él no hay captura de pantalla, ni file-chooser, ni compartir. +3. `cosmic-settings` (el panel de control) y `cosmic-files`: la suite tiene aplicaciones y el + catálogo todavía no. +4. `cosmic-greeter` (hoy `cosmic-session` lo lanza y falla con ENOENT, sin consecuencias) y + `cosmic-osd` con teclas de brillo/volumen reales. +5. Metal: la imagen de QEMU y la de metal comparten todo menos el driver; el viaje físico es el + mismo que el de `metal-dual-desktop-en-curso`. diff --git a/scripts/cosmic/cosmic-start-qemu.sh b/scripts/cosmic/cosmic-start-qemu.sh old mode 100644 new mode 100755 index 04d13e88..def6091f --- a/scripts/cosmic/cosmic-start-qemu.sh +++ b/scripts/cosmic/cosmic-start-qemu.sh @@ -7,6 +7,12 @@ # corre ANTES, prepara el entorno, y después le pasa la posta. Cuanto menos dependa, más temprano # puede reportar. set -u +# PATH ARRIBA DE TODO, y no es cosmético. El getty entrega un PATH que NO trae /usr/bin, y en esta +# imagen `mkdir` sólo existe ahí (`/usr/bin/mkdir → coreutils`; la base metal no tendió el symlink +# `/bin/mkdir → busybox` que sí tienen chmod, mount, sed y tee). Resultado: los cuatro `mkdir -p` de +# la preparación fallaban con «mkdir: not found» y la sesión arrancaba IGUAL, porque los directorios +# venían horneados en la imagen. Un fallo que no se cobra nada hasta que alguien cambia la imagen. +export PATH=/usr/bin:/bin:/usr/sbin:/sbin say() { echo "== cosmic-qemu :: $*" | tee -a /dev/console /dev/ttyS0 2>/dev/null; } dump() { echo "---- $1 ----" > /dev/ttyS0 2>/dev/null; cat "$1" > /dev/ttyS0 2>/dev/null; } alive() { s=$(sed -n 's/^State:[[:space:]]*//p' /proc/$1/status 2>/dev/null); case "$s" in ""|Z*) return 1;; *) return 0;; esac; } @@ -40,7 +46,7 @@ else [ -w "$XDG_RUNTIME_DIR" ] && say " ✓ ahora sí" || say " ✗ sigue sin andar" fi mkdir -p /root/.config /root/.cache /var/lib/dbus /run/dbus /tmp && chmod 1777 /tmp -export HOME=/root SHELL=/bin/bash PATH=/usr/bin:/bin:/usr/sbin:/sbin +export HOME=/root SHELL=/bin/bash # PATH ya salió arriba, antes del primer mkdir say "kernel $(uname -r) · drm: $(ls /dev/dri 2>/dev/null | tr '\n' ' ')" diff --git a/scripts/cosmic/hydrate-cosmic.sh b/scripts/cosmic/hydrate-cosmic.sh old mode 100644 new mode 100755 diff --git a/scripts/cosmic/qemu-desktop-image.sh b/scripts/cosmic/qemu-desktop-image.sh old mode 100644 new mode 100755