From 247abbbf122d43c7b85f7bf8ab49b6cd673f2173 Mon Sep 17 00:00:00 2001 From: vitya Date: Thu, 27 Aug 2026 22:37:47 +0300 Subject: [PATCH] =?UTF-8?q?feat(mappa-vitya-project-discipline):=20rename?= =?UTF-8?q?=20project-discipline=20=E2=86=92=20mappa-vitya-project-discipl?= =?UTF-8?q?ine,=20Rule=201=20=E2=86=92=20mappa-canon,=20+4=20mappa=20rules?= =?UTF-8?q?;=20project-bootstrap:=20drop=20legacy=20trigger=20[v1.0.0]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist/mappa-vitya-project-discipline.skill | Bin 0 -> 7003 bytes dist/project-bootstrap.skill | Bin 17001 -> 17083 bytes dist/project-discipline.skill | Bin 5112 -> 0 bytes .../mappa-vitya-project-discipline/README.md | 59 ++++ .../mappa-vitya-project-discipline/SKILL.md | 264 ++++++++++++++++++ skills/project-bootstrap/README.md | 7 +- skills/project-bootstrap/SKILL.md | 18 +- .../assets/AGENTS.md.template | 1 - skills/project-discipline/README.md | 29 -- skills/project-discipline/SKILL.md | 133 --------- 10 files changed, 330 insertions(+), 181 deletions(-) create mode 100644 dist/mappa-vitya-project-discipline.skill delete mode 100644 dist/project-discipline.skill create mode 100644 skills/mappa-vitya-project-discipline/README.md create mode 100644 skills/mappa-vitya-project-discipline/SKILL.md delete mode 100644 skills/project-discipline/README.md delete mode 100644 skills/project-discipline/SKILL.md diff --git a/dist/mappa-vitya-project-discipline.skill b/dist/mappa-vitya-project-discipline.skill new file mode 100644 index 0000000000000000000000000000000000000000..ff959136b0a1aa0ddbb9f5d263e8b7d3adc59468 GIT binary patch literal 7003 zcma)>Ra6vkwC({(>5^uK9$LD)8IbNyi2;Tl5CrK^x?6@ukZzDh8ip4uZ;Ysy4DNOsIoh71P8 z;UC~=j`E$C9}9Q&ba1XdW>+!i133*!nVt z5lg}_s_v%9NBxCVQ{5pSpu^YvQ+?e2sz2AhmenPT0Mq{rv1GTBbh%qo#o@eRoiuZE z)9&*Ibu+-`=|=eJ>d`2t(V^w`ZuVj*z?6b&uk1ozC^ zjfz0+t28Afr(M^TVbcn>H3xvHAeFk7xH#T>T8H~-nM^s?MXtWOBI-)oDJ6)@-F~7# z&pMeDSH=JQN(yI#YBnE9G5#&{8~3L9bHk(EJ@xXV@6*qR@;&6<+8#~NU*9Jt8lFu{ zndo2Ddxc9fTPxG!Mr8Ee=6?y`BIB8m`HOQ)5H{!1FrSrxO}bN8{A8PK?dQGlJ{9&c zv6C)1Wttf>nMSqYV#{Cg)5Q$1OLsn)Rmn4zyXebmhOcx}x@W|=`a`<0%5Cvzw~a9E z?8PXC1N++XG2m1x_zol(#1^664JB<2r{@QKI4esQH`K?|3k33sr6@MWI7f|c`7Jv) zx?G!nqKd}T)x-jLkE-MnZ+qRmj$sJJ>3JmR1rmkmr=p%NYqLidqFs)~u>!`mFU;i_ z^|US}>IxLLE&XA)?iI0gd#ZE!+MA9e(W(O$oP3mXgLKD|}8`1zr%bIME#M zH(a+0PsUOGhHGcs8quD?*K(zJ)&w3)Mm!bWxgKWZGl(Z63xM77mWyT9)A>a)6$BaL zUw@2^Wsu~a*q6Gz42q4Dxx`V2#WiQHylm8C|5}AfniJDr=hcR5@EZMxZi*mltVg3y z>RKj4tC&-mH3|T;_Y`f@!K`xC11tblaEp*KjWt_VL?0*ljDi z{XqWy_y;87XaGam@V45F$a}o&mQcp49i*fGfs-spJT=*jn=_d=5aU@Txw8+Rg0G+D zKR+F*05|=FL3a4bxj5!DuDy6mfdT%pfWLHQXWU;*b=oW zUN;+Ca`G0gZtLb(UszkTO&yJ{CM-)?3#hLJ;*B;Re~J*jS`p1=F4HG3v0SmOjT0Z5 zPFUhcWKX^>Oht@5kByOiovQr}ne?=?*Jm6qy& zc|F|y-u?ZQ=&0}3^5Om zmHF0l|1qlOFYF2zFR1z9X|f!4!&_|>2MF$Y;KmGYe+Wv{sQ15e?fM(uaj#L+)4%oA z<1gL7xwZH4Q8ge{0~FAyTZj2|_xuU|mf|2>X@Wk;U*DfBW9=n6>Z4LwP zT4T90G5U*)B$s) zwUpPn3#pnan=jFnk9(S0sb*&6ekIURYJ~GiX8kU$)8Y2dp5+(Jt4yb*bSK{OsGz`W z&6prX-+ra|+Bld(lf`mWSdx%v%)`M(U359(IU&EO2{(;lke7CF6Q?vptjF%J+rR1E z-;OQ?oUeIvjMvMH3rQ4b!Qo5O$=iH+OuZ1%{6RVm2HCF0`rh+uMjIwlRIU<5!*Q2tx%Fdnszuj~zb+DJC&@mS~RfLJSC(Q41s#VjGEp z5>>M6a&ns3>FY9TcYplxA$Iz962S1ZD2%~qCm%|=3X{^qLJR8; zKZth=>0!U^$1bX#;!mxba*|!e|97+R@9wZ!>8`_Pi;BDH7+aLXGlrBcO!dD~l*;Z? znjOvIR;MYdk~9HOQsZza@U$^)Q7wb|-*_s68BIiXfrXx7|c@T{~zWs_iZuQYwdWKIh{Kll5U zsGx`jj5~@v&qb#Mo2j?4(~^zHW>edKw76m=7hLJ45?`+n?L?1i&WD9Ll?fRG4OJuG zjY1yI7M8XuMZRI~26sF>?$70hoN&HxisB5sE9dRR6V|dZ#@AvQvtgVUMU%9PZ5Vh9 z00a5Qivw`ADJjnI7qA?P7(+n@vKaFB;??JGUiKnkG1#nm9<+*50df0MI|3=3LLu2Qb6|C8CpL&U~@o81h@yCX87YB zxypH5CnkcT(9v8*e94(pUj^GBgc%uNX0s_9yo`d&UeM}!=$B}+Ksb9IC@0(LO#*qs z0=m_FB-NWQbbRy~s$E}rSN4LkmHLfv!zG<=lw>XKG;Kt)&q-9!sZS0fKX1|F*J)*W z*~C?Due#Tx)C>!sXn1RI+K!;?eC?yF+Yd|Qje*)$7?-8G#4sA84KVX69D&EgKIH>5 zuse!4$~bz}V4YszSeaR8EABcyHA-YD1d}&z!jelP&$@gee&@h)gvSh^q$+lH4VECj5~z;TRk!>J6}<ILX1EW38%m?2s4#Y0o~BX`Da^6#ju)Fuwg{qefWBz}&aIF8Rx#JR3Z<$dxR)VJ&z z$Ve!`62yxXtAUCcQ#w_E6bOL@-nEv$r9BRLX7w*sZm_TueKt>meX4yM6=>;D_;gFM z2yMnHD4`}7$__W4YLa68I{2q337+dIbPUs;GO|>nz~mfD7MyA;|4o(%y~OQK|EklAWA3^{7T_l<(bbd z-)%@`NSD3E-`HMYo4n14b4_GL4c;$~Nd%?JM-~A<*tXa0w5~k8+NkIwgWHzGz!hPF z)*H$u38u|7+T?_-MiY!9v_y>g#NOEb8Sis7XB=XcdxWNV#W7e828SOe1TXtph~%fyo3yu=BNcajGPLap;l>Z_gCjXnst#9s95f1em1GYKgA z(Wp(}ItnVOa{QSRo49XN=TK5f)$h?rda1Br{az7%-yVPiPHQR}N%6RCA3#d8st07T-vqhTYJ^%a_;etY zj#G8TXzmB`qw|>cn7c$#>Pv#!p-u_CTRbGO`#OWs?7JX0G!6xmDm>%mWzcCF3^TN% zgrbB`iM396&ktuwcSgVGsyVl*AFN$xA9n7?6Sw*^X#pR$jqBc~L(A!&VUW{25ZuXDQ8 zt>sAV+ip@}!F909%feycFyv=2A3 zL^HV==K%^rULk}yiv#mSJL2bLK;>AKAD%>aD@}G#1uYWh6Q&oc=JQH&$6*Loq0t~H zZPUDvT&_digHa2nJnS1YBO*b@atxQ6!h|wmkx8OirTQn#L+MbFmqd~Qgvycm!q>Jm z%~2iGsr+-OSj7O~cY0+p>I16cMWS&%-D#9qN;trGSxpsha3CDzAi85)HW5+Z|5$Lmit==&8 zRKY2mrsF6*x>V5}L)|;&7&6^^>T{>y_^e#qlump96H$7Wpi`VfI+NkRJB~#!=?ax=M$nl`#Sc9;$xa%MW+x{ES&=Pr%hl^&GWE zdNxlFI`&w$r%CD|r*cpIM2Nn54TnO%tY6-*$4I;60t`rsIzIp`GOqi*(bJ~PMw%wx zfc;}Qy8|v$hA%djPrUab?X$}zSq^ZX@atF;4W+nANs%mO#rMOnp)@K#GFP27Ag=kUlKkBCTzq8Mp zh`Kav(2#Oz-W(pMUEAZZrBX7pXs7Qc>oF6S+jv>ZZcA8cmaapJ_FFYFQUki*knOWm zhh>i`wI>4?drDNdv1v4bYV1zOO6OThA1AruX9gBR$g)V<<{w_9 zk)|$GmTSol3J!IszMF0re)T~Ulp$N|%93j7-esx9eT!Klq|yHn6qU6xKsH#TY^Gcf2*_%WN{ zp@Ky|IPD3Ga5J#_WC(CB-^#<+HrRUV8Yr%nFrtmflZIL~{mN}hoD^#ahNrFDwwiEk zG~6akPw_sWzDO2HLB7@P9zU4d?8v4Lig!H1JS0jl>7zB4snMLB-|h2z=UXHWVCgwX zQ%mVlXH>|N6YM9IKgBC<*k@9aXBD&N<7KMyz}m>T*Mgl}+=9clM03f2Zavs!P*lAWbpJ1PJ2!ohO$@z6SZ6E)Aq zWnby|nmeciuT2YEzTuX>rr|5~ulIxWrPOg;sVjjTQsAR1n#;kb8HHSdzV)JsKXmfJ$kf!PTJmLT*jw381Gi#rs#|tBDQderqro=(h z{*Iu}ajPBGo5i+4rEU6;n+r=ms&6oMC}3kM>M;1-)}PyI-kYxH9y;l}4-#ijo#L_k z^U;`puzsNTH3uHIWp)@wn*?CYSz;~OP+o?>p2IjJ?O&X(x1U^dBX16JAsm-cW(iaJ z-af)bqw}4)P#)~}HB+b32wgfg3JYSO_;7|9xwVLwp{AXt~vRhp7iGz7)V*_3I3XNo65i?hUf4SnEM18@_j^2`z+F%Ht zf}TkXC7OZupaLX<9foZFsP&zf2OqSV3q)f(pIt@}aY8RVTwM@1oR4irW zTq~fBocA4D)XW=1+8P;JI$yIMnV$4{ph0w}lC`8Q&G@zs zoU_wCnKDmaf`tTAHn3~91ukFayJvqAs7lIak&iF;jZL~DfMIGb`Z0<5b^J*=LguL$ z-r`_>AN4GIHJL7vDd*H-0a)Yt<9^$$d6qI75#f17fcu*plo{>BFCN-s&@+-6zLekX zfx7Tx=;49QU;&wH*=3!RwZHE3SOR&A==r7rTf^W#n|mAet)RbGk>P#G6z`kDE9v5# z2Bol#Q{BF6KK`8!5_klt_3vuB7VaCtt9QRD88Ggu9fG`qU46xzCgloL1iFM7w9ni` zW{FU2QZ~kmxi5lz<7r-X!8f_WekRuX`~?_(kx! zcw{!U_{P;7f6_`=GvYbzxZhUNKI@N36xvq2QvNu}un8ez5*4alMkup!F2gv>@$8UK?{Tj;iX@KB_&ZIDX^CQ_I}e zEnBO&LDddnYV~g0!P9GN3<{b_FW6s+W>Y!vk>9EhFOi2wW`3;)h2Z4jd+o&?680LuL;98C*DU=Bd`?oC;N^L1e>DZWW=3@SusySD?>YS=`vv<|1 zwbyeV3fdh8imfaM4uJsz0s;e4)_`xoE%vH;0t*6Co`lT|B&$RV`{l87#RqG=E@NWu zAG8)k96LmiL~g?nJv@_0U#*SN_ZSTUDSk# zJN9&HbSYB|Qw-+N9K-bS62fbkq;6)(7P5G{viqCX@0|{}0lrG~7Mf>mQ9bWC!7 za*T&LKU`4@b5(ao%mN;(hKyiILuaqQbW|N9GFiHiLr0Z0P4XG_0poN~Z<-!-QT&Lj z1mBMWX!EIqGfL&GjiP=wuZCG2Y?>FBW-{&`j*}~-zv z=Z2gPrD9Rhho|>gLb4mWtl5t&{5gK{6JziE@E zF0O+?U`toaA(BgWIRTQPnoa_}pqm~0m(zpmdY{~Hn#9T|ZOTCKZNWQ*5LcWd}Ji{Ub^-I zbdna(6EYAoS?%4`Kk7Vt3RYCt9kCf$jI)+rt%i3NkHFT4R@cQEHa{lUG zeW@na9Ov2Fc)wgl&bc9UI4iPnr}+`@3>+>D0>QioxgrwVVJM3ih_Y7=shn0r{#DZOZWeD-5+5BE|byAY*& zWs2MB)%DE|{ks`yvO@dh9^HuBitlKNpM8e&itfPc3sKR}zln)&ec)*{@1f|@!H#pu z=F%^#ZybR2YIEWsdv>a~PUM~g{N#+GURt{}*q70sO;Jlp{7TL_pKZKO(Q_OA#l&X3 zm#ebC#MpA6rZYl1(~*VRf^<{Gum~@w7Ps;|$s~TWz@j^W9D6jVEMq)JcN@e?b$HV3 zpO%J92*)AkhWZx}nfq;v^_VxbNf~}P)QTXWzn9EVLZh$$`!U?1s==5YYh@ zw*0$epG!ZTRU@`n6O2a?Zw=n8bBzNS*!LE|6zgJyE}Q8wE`#Q)$1jkeh=+L?Qi&+B zM9(F}4&d@lA+A7|x!hSBkRdw|)v(Uvv%_Ujt+o2YOiqF$lp57pqqk{-d=+OAuWLPa z1;VRtW)s6sMKl<#ofCQr%!{^54n4OK0ky~H-1gQ;A{ocaEUhJ6u~6gGHCEL%l_kA`l9|Qd? z;=DP#;B;CH1k2M##FlbIF-S$k24$H{f9M>bEmj|I7Lcm4CS|w;5?->&y|1E0SW?h8 z2=>|vEQAe0KHtb{u-{%$(S28=4N8fB#3TPM&_TG3uOP9WnO3e=j)0hs?s+4_KqoIn z3_;fU5FvGw({m#Fa)?m6O-+8I!WU5`N$O0-1m&Jl&IWn6e#E~bbPSB2zu@UPU;co? zOS#2*&ZSsF4B4#%B9`VY=y+$yP)q!ykv*JR$mrb0C?M*-%I}PDHWjdO9=E`PpQu59 zF8gyyAZTt;ZZRjpbvmHoLuSx#)d&U>xHHwemy6~Se1PpxL|PIs!FSCwq7Qy z(=}Ni7%aO)#s+U&aJd@W9b*M^CS&%fOm>q*7ssBS=II{{ zXxh~u)8Ben4b-D}Ev+^}R=*lKr4ut~au{3A!E03n4x?+*S%cYvCl@Mo2~Hk~wdtMY zNAEJJQ5A$NuZe3-KS8djbg-|DJ*U>(#DjO`GL4{FDLoA(#H-r}DrDTX-2B4Emtq(? zaZe+>2dOBI!9s;=*LhAkzta2H+p|U8*$F~kgDk7Jd^vLcQhLDPJWf8o&hq>ThBIx; zLunWVEC+pBt#iTst$mvJJlK6g&k7@WTHT`sfA64d(gFSA!zp&Ly##NARK}*z?c3o8 zse*CbWA06h1Dk7SR_x`YwMuAueznH3KJG*43HHl1G>WgMe{q^wNXx7RHR@BMb#xb| z7=?8J2e)A}ktxJ??-^OSzWvyPUbG$Rg=Z@ZC?Bu`J52iXs^jl`dY{LP%ht^y3R*a9 z5M(w3Ua0q%VI^)>>$G{nbL^Q^O~QON@Vc`wO7B}7izupU-~BJ?@!(hWnj?_y2%n&r zp5wn6AiviUNL=!#9WZdI_vdtRYz;SC)3VIMw2haAHi*eUlzKqOKdx}|D#UL~eajIC z%H<$0D=D|XZC01A{9QuUXvE-T#;2GXqq9fbB(@qII2_w z{)9x4Dv-14iYi$s`C4jGsFmGp(VxacWK!_0qIaCdSLgEb?&Mulr-v7iz9`PVYf|9T zdO(jIiQ*0*E042p&?L#X!b6c)g;xIq`l%+W!^*18UdzqE3u`^U)I$Smcen!eSCNKz z9ZM~ShUOhr_ff&g=+`sa{quN13vNVq#+QpGu6La$;Qe0m(~D8SU3sdx5Zl|CBV&s1 z=H}*Z{ya-{6Ho0Vc(fnX*5=jjh~GFS2qAt$|Bno;`cDQ{&T0<sdj)cXP&2;0RRRFdmIR3|Pt- z^fuE*16T0w{lP}YMkc_1x0~87iKeF{1Qgz+iGwe|i{EcIr7#nml0^=pOr88M8ltp) z$@DadEU9La?2IiPL6!{wbMOuib25;DFmt(At@kvWXJ4vA1xy`2-^ zjnmeiaYfjd8RPS^j{ z9p@<%h+bm2&g?DO9?Kk6WXmcrX=)8q$U2=Ft;XK%7{Q&T*o~I_uuP}4!95k==*t{e ziSj?XVF%D8XnURx^mc-+yZ-ShN#Z`3E3Yrpnk6aC3SYsFQPe zb`I@>HaiFyKA z(!ns&^O(B!7)1TM+OS#<`DIjGRSGOfTkQ=u6|EI`>S{NJkAZs{Zv5a4Q$u^W&4y#_ z4?S-uJ3zLK1_R0n9vCLa@nXU~UGWYR!b5-ZVT_m=i`=8LwBwHu5*(xme3eE*c{p^% zqQL6u!yRX=W8r<4kr$NN*~*76m!2&p?=j$$78Q|$RaqD@^oPqLo990trKK8+2-HaX zQ45}VYMxbdc;KZrZz7ig&a~i>v;KCN8)jaGOrA&C)j~VoWQ?dfn@nw{e3|C2r+6>x zq%bmpw6!TS-2mhX?NL#{DHJ!sWPBP{uw7`LPT*E?lmLw3aRa!SaC@k=f^nWOB}D+a zjP|1&5AYb)1lbJW;skJaMoDSz1JRjd{PrTkuCi#Uv&0RDNOH)i&wO%lofAkxFXkcY zUqa)d=~hg|7e#WUdgCztF>Gk_Sd0#mFCCWbnZ)GK4NBtdT#&)VG8KZUv!B8ueP9W$ zEZtf+V_O30KcmVYq#5>U_Hu={(g6!aXEKM$2O{k5*6TfPJBcw>$C9KdbV6GqfvOs3 zrwG)*`NrNiHiFC)Qel({#9K+M+0UfFDiWI(+STcIZF8=zbz3GoVD8nG`wWcOEhrC_ zOi(o$NRT+2-MGBglDdObpJIXym?%ZH3tb&FSLxoXv^0@g(D&IN=~E|~R0&DGS@UnS z0`tm>b)E`eipk{OjyI3()||c(=ls^$+bhH;_;_@QB3$qsoaGc#z)f^E8htWCqo!8rSh;nu1rAp&P5>hZpN{-&h-y#Rmr_Z235 zgxo+WLC>FftWkyRDm2Yg zjrrtCEzOKr>RHN%*-;+dtP=`Ma^+PiKoEElG-n2#1J!79j3Xg28vyB**MGhg(5-$o zKLCiTSuEA|{7K108Z%XGyEjrN=m)IuyFb;5wT#sV>_~K_8}nwxdC~O;fE2}E zP^sy~V8TQ8>_?z?H45DWmXMvg5&Z(61YM_AC+c#V%Y2`ReY-;MFz?s&eywA(AD%@#wh9tlP44BfT%94f7T_66vc=REte zgJ#dHKTD}qzd9<#=~3auG2Z>4fjvIKYJ=;;Rx@GrP~C5N)~o+imeUnqtwC8xj8E_f z=*akA7p%MKa}Z;A7+Fpox6g4|ep?ssnfN{I3z-_zJU0rAp2KBxIoKM12YZd2?UH`q zvie%(;K-nwfKA(_kLOGhN({mril4_{4coNaYlw9(4NSPMHh~SNrIc4Z=42FUBlK&y z<#Z4{foZp8<-y@w8@DF^;J{=!=`6Vnh^raxGF)6x`&ya*$?4l{K=|mpE1<`Zuyqm8 zD5zl*5mr+OllKvUxuIY$SxMQ z3L7*s&7SKm7E`9k#6~ zwQ6zn#RZ8+#}81aROlF|D)c?Xl-zo{+%%Sq*Bu zhx2PEZnOabmp-XjNd9l4UH;F{Gh(EEj`Dn=C)3wY&mlD{zUPVnkS`l~d6#Hv0~MAB zJSH-47;$Lu=Jc-hcE3&bwN#iDtPVJ+%;*z)UN?;I61#k4pwUJ4_16YhM!mw!}A61ni)bt|u~hbK?{eSUX; zuGg6LyFc%n9f%^XN}sOcxS3n|L=XdmYBuG~!51m=lnO&Gb-VT)%!|x&)rjp$vu+0- z+l8-7tiGaj$y$%SHgaFL+CjjD_wr6RO`aN?pRZuac9m$GYiploodmg3^f2h)bZXIz z+@a9o?{HEQFmQQx;4d?r`duFAj2Tg^ziKbHeb6p&MS$?*)VkEhrTG^S?RCJP`^zU~ zSux-ckBHfDi1Em5s1QZU9tIa^c?vcr1?Wr)0COIl9$}X9?$xP+?vyXG3pIT6RcJni z2#Xr%th*`FTn7Cy&@#Hyd&DgCCi-)PyRg5xx!)g6jSnWnC;I>z--$QKEl^O=kMQR4 z_`UeIcwXz#uXwZpVxw0+#7g=v&(U9ScM)I!n*;EoSjqiD#MuA(CEZuJIpWyO`H|lJ z?Q37_gXCknktVwl+TW26Kl47a>qfsdpsF`%5m5aC9$C#`pkiKgSwV?qjZzS? zaex6D63)_U61*&17QFOOUxNKf&h4l8#`VkJ@eXUi{V=t~82lWoxm@q_Bly4G=kA|N zo`!t9eBSpnlNn=oa?JLkDGk{XM6ezb+Wm5^kUxA4_Y2;Ep(uN1`|B!?`;JHuWi89` zf(@)m%vJ0!ioyx4c+o~e2uC#iZO-rH=|B)1S6+eAzQU`oTQ%?j0^{6zq<)a19?w^a z`4wvMv`F)U24uV&wwKc!V~BtFMII4M6OBA%#uw5IkcWwBX2OrQNaf&FjCj#-;2VLO;6QLR z|4XM^>K+fq9`|!X!G5{%!AMIo$sL6Q0VjqHyptfsE`i^YHqu+k0R_=Y9g1harF{KW z7y*Ax1Q39wB3bg~56NP=tHNomhEi_XgJHLN2%^?$GWw4>ddcG-NLqO8)rlp}xhc=93L%eA>Dz<_&CtTQA}1$)0$M4fW-td6ytty_kTu*aGbh*#C} zM&o)Lse7yD5)g|2^Ux)9jos80 zZcYc=E%nBZ{fR7+pATic91ymiw{ZV(u*Cyz081pSB@LZu2;^!mam%SoH7h_Y8Ml@C zGf_3?e)qUyfj>bG#_u_|#0SKv$)E7Q;}vCOI7UH0mGqJqq26sM0$_3+LcBv_io48V zBNB?}4G7dw$=kUdDZO!$Wbz<6c;?202j0*T;PDDq_FJV*z}V z#a#X*5>Mzzkmsh_)O3T@a?n@srVElcQ6iC;dIrrE~UqXk)mG3N@=;y+7r#9Ugh z(d5W!6aB~$_ETN3z5>&P|JBbas!uVUYq^k4mf_4K)pv-E3JJ#BFg@GGt(XxgrXp!I z#n69p!Z2|`Ugj_T!`ks(3xYk6rG&c0eL!w2O5GNtdk1AOO<=b(b~e_p*JT4RZ_Gn>*;#xhi!fx`QI)TZBw z1U?0_E6ICZya5ZX9(sP&&5WUrf+rn*@}t>^Z*7{@xay)L#HStS)=4CO5FBYYD^vVt zYk>Lc@nF^)Pzm_)z3~fr-An z0*9?W)<6mhmaC`t{Ldwl!eCjGAqpOb%%0!hKU$Q)=%C>`lA6}ywX{^@yr|SHd;^@<&4n?BdT_L=*W0P*|Xg3pxGxHSK0SSeAIxad}g>A z*r(^$pD;bAnwXnMg3@q?%FU{p!FQ}H-8?r^FW1xH2q?~h_<%U5e~SsX^g(kW!$Joj ztibVWGeRhlVUq%9l)y^WzEnW@e#bF}w$R3^WhWXq^SxG6x5=u-1Vyh(KBh!PZb?HF zH8{H*h5F2qPJJ&-gz;IH_7Dy?+XU1+Y2^mjUd!HNb13NqK+_b7T8AT?)Af&jY9u8_ zq6+~H_`|75I{Nw(6iuSkk%DwUZ{o0C7LZ9K%L4tEU^1-?6RI~m;phif_T$bB)Yyu6 z9F=bi_aw7i(<{O@NbH3@iJ~s(#st*q#1UK?#ee3PF6(2aHLW+jfxUN2G2L$ldGcfO zdqG(qOBHrZ`hCErC}GhaI#=YLSW(iBvcOAnIOs(YKS_w1W>L8 z$$-R_znHpBU^_5K6wca1nmC{d+c^{VEb5t8ruP5$kFBoSUAz z#F<~kye_0(wK)xAhv-Bse3hO0iz)53yJ}>8lYgf=E!J)_eVzZ>2XyYmC?(~g#Z&!a zCEVm{<$2wXF#-g0l@dnr7n}kU2XJ}Er(UG@nJNB9F|V|^>)b;g&ZL86(Y?PAx}xw* znJ6~|)A=TAbcPR9b=qMIod3wNl|Z2$K3=Il1nh>$-9Ry4j?;S>@|?2Xm^{49Vu$S} z!vm2a=AVzdnX#*;?G5%j*d_%SZp&0rb6XJzuZjMcZZRL}l9AiZ&uv>sQB}Dlr0#zb7lyXW&OK{Vk zAjdF;%VPx-c~l!iZXbLliPC$qxH zd*)~XE{Sc8kQ?*ACuI!R{B$^@J+ zv_qM>G3m2uMCty%)7cp~-j|qrN+0ue1-l;2?R*s1DV=g*Z)z4!P&@B;K``iTHL2{f zVzM9rflz@}!PV)F#SDg_?I;UQN~7*o=(y9=`@@2v*1dMAcCLl|qq3Hof(jORfehD*rmN@--MoKR99It!+}b z4UYeagw4nE9i%1N+7m_Dqh}}Z#33OLx+zn^1L3FlX7aA}BS{Ah2%}=K?_Q7SV@Krp zphjcdSYwPf299kr<#g?_&`kfgEO^Rs1t3X#^we?%M~v6mX%9k_P{EQ+^{o9F5jTY@w4D_3LI zNq9oD7|k~qGwgu$pirfgjoeIw_B3r5Zfk8%!e%LAgn4^x_^Omu`$(A=?RvGt*|bI! z49b$6x0fGAC~Aam@c()V#-rBYvvoa!qv7uM@9K&bAB)2AFmr8O)pBSuoE^J)#Q5Hl zGHb6lFmWkUc`3Y*3j@Xj{3#|TUhITzWd#F)C_E?UKm&3iXxoKUM5edx&k5@S_;m-l zsKgLT5#>Q%}U_BK>4BhC_F)ZCUz` zF&V|<^Va`N@JX#)CNcirG%;d-v6yn?JmMz= zd_kL#EH=!I$W#I?YM~r|5sNp=b8cw5v?1%Y_1%)Yt|uF*LO_PlJnqI-O3+~kGm%{z z)U}(b2Sd|)joT7fw=E2}i=bj3z%O(ljC&7F$C!25H)lDwA=X*3XDdA-5&uI!4rFBB z0an1WMc?maR(=_ub<2Pr&+6+N{ev2fS=H>i6<_# z0J{{*aS;1iMmQ{}eR~ZC)2~K6rCz~=zDVB2Zf7u;t)rDpe$J6|e7R*jFPViZTf6LK zN3f^r>87vnB#M3uHxydwM(lcqnFgWM21d9Yvpj<0+j6MrFL;a;=D#Z|f3d!ba~Sc^ zNR;f^piTlf$pjSlYR2e}``W(1l(KH4tDZK^b8_5|B3W}|M_wGcPEcC3-q+GTSEt|6 zSL;JRpsw}V^=HpdQ_DSYQJByRxxqEOre7kaDWQ~s9L<+jJw1tu(6fdL^Z1%_z~emY z@Yt-`8q?Wt_YW>?j~u#F2c|%_!Z%-mbBAssY1EU&Y5)USmp@a9a(%N78yfNC1L zMWB;Xd`OE=Cu7ICIJmtB&%;1lfhWpnIE*5moO{{WSfkhL{)Q2=9tVyE-*t&y@w-h+ z{KhU_a^*^>?1Dyn%Zfeoz&~q759r5FWG${w94JRozoP5VX-ybTct+~zKx8px7@1FS zWMRu(e1ZgeODcw-8sEdVOMemdVxDS@$7*$Qv+lHYQ$ZH#0rpx8D*(1nKs|vrms!|y zT!wqltt~T9OG@~L$2L`r_A;d=U{!&$JUD2gM%3n0#=_Z~wKyoX4{K7J+ zl->ZIOkGw?hFb~dk8({duyThui&hgUH*R>*BR$qMNS4{F7zOM4zia?ELkh@*y5vYl z(g~+FLX$C#&)}i=jVz3iZaDOhOO59wX(JkZs+XwMa`z{JOk&%2`atOhHYS=n69|jc z>F~AhnoLccg>&G6Ic^NhNI_8=B%bQ13w3dxvb)gTP$vGR37(BM&`F4~nBP$KkGwuR z1-lEP9pA&*yN|GS{{e5#Y%+RQuEk)CeGRrZZMq3F_G+iGwtLfL>d2k~D-ZU0GgJA# zZdZ4i%c|Bb=1Gi3>|=w**72&1_Zic$$LCgGoOGLhVbgh&Py6y{1;@2UUDyVKwzXc4 z#joZOT(n=0`5AwUfJ<(uX|PT`kxkvKe>an9+Ikl#1SP1)YelA8Yk)sftJO?g%E#!S zq&S|&sIUhanWkb|ix$=%#ghOohhqg6;jx)8ot8dtisVi9Tcm?*{zz3O@^x?+d#LjP z4sGV+#8@Y^&M%y! z_v?6W#vNWXAOpoRlEG$GGJZzMp{(C4X>nbMtd8-m;UhY%`_g*RO_HT=idQV@I|_~j zszVa=6CtDXP#-l?B}vr&Hg~ZMRRQRD!J;cS4ARf6-t%pyEMVC3(eKw6p=4ZRKxNhg z6BL9WSbgkVJ$Cgqf%L>z|3u2XKHrwb`AoWM&EP^lsoiW^4n6B;;BfR=*Hz;K-h z`1G9TBaRmwF#cDxBW3^weUmi|OxK&}c@8uoat&*H`$*O-sEhhQc#`1JGMgZU%@>k(SaS` zo8)IM2aD(LyU5+<_^prNr5cZt(b%2rRbT+%^dRRG74(72Z0_(X?OnrPdu68SLf|~x zY(W#84w8b!oUbyPQnN4uKtKU-6;svS^+xIDmtv=OT~%j6GMFxaY65Xf&e@tzPv26W zQMXOIv5d5xTjVSQA>Nj0+Z2YURA&tmLR@-k*~H}BX_0rs&pEr>U?d2S5A%x@Fs2XW zIz?~Ehq1DHD=*X9#==9%#UQYO5+dF=`v>V1oy4r+3|N?$b)8Lz=Aj-CHf)QLN1~B6 z)ICrs@=@>^Y%NJd(J7r@xzh%TlS}Ci2K!~|rcqRBLlv3$beI8uj*fy-uesM@*N5DS z^>cQ9J_;**a_ge^Ph3oShp8hez0d%Xvs9MK*)GlCdeARP2TIwm1 zE+fYU^88|F!RM&wS2uM|7i(RP|1Xqby$A(2pHETs9G~d4j-<|1DG2JDF8SKhykRynwxK`|@GydvzLv-luwGyrA?$z|GHve4vqyid4W!G}cT>LgUfxeh!CK7; zF>hBEGbL@rURJF9v`U6WK(u}dKu0XcmPGeUEjRySwhm2}i<9{LkDV6qkKNW$`m{rq zB!g^=9(0P`ll+P$^YLj7mcXGyi7LBVb!@zf##J(?1{MFtg$UD|7}`u-6dIOR6tW>< zi|lxFnM6y_=(=jx^tryiv_W_k<5a%27oNGB&1ej*ci^?gMhb(Ww$a{F`3SZwW3n-Y z`4Fli?Q%iQ5e#pwe$X0l#-s^Xn@hqHlFIdnpoxSyrWX`)!|>B}c!886N-OzVz4YLG zAf|k&6-2AOtKMi6(7mrXgcccmA-3p93Gbc-H#g~zi~P3sr^(MjA*Fp?U;k{haTe0S zh}EI>hM_bP(UK||J!umlFpGvY-*z@=TF9)nzOeJEy}uPc^zRYfq2x9MYjXTA0@*G|9)~n>p z{WtJ!f6So&%N6`sv>(rWa(#uYbEw7ibdx2+QD6oaN2Q9d6{bL*4op6bf4g6N z-j`rg{A{%P&9!jTBV)N~ zrHC%e8hrM4v#1x}TmVdFZ65DKLtuy-yBSGxW&OJR~}qieL(fE(xXJ~Y@)pH`I* z0ZgNrSU=!+4OGQw`Ui(!@t zD538I^U(~dEOa6=-ijb0i^{r77LrNDtxh;sHqM7EBjB?|8u{cMR$SFB&^|LExNU-EPZ zs=FHLjh&PvN=3Xa1iQvq4-w>6Z~*;+urj!dA4E< zq~+;f7rEx9l>uIiI{m(2m|tWMD2X3_5IrNl`}v4?!D&sNPL&%hL07er5j96f9P9Rc z^@Z(TocRvH@apn>98@KJ90u1?Zz;$3_Ikyn`u0)o)htGIT=!m?=46TTd~lsKWt(@| zJ2dLwhdjjj=jIqx=Y18!Yp#NKebGz;^rE@i4#$~@ZpnU=0FsM1zy76sr3taKMv=Ou zXQ~S*m)71vwsff-7Lw&jS~Ehnzr7!b4}zQwTj%Sdb^hkJKb{_j=9vW6vgIGM-4>mu z!+pb1J9X2H%RrgS(pt_(ahJ@;_5>s)yjv5?-a#XP-C>t^TY6m&#o=Q+8ubJK)#xCj zE2|TjwmV$)Wa;ir4;Wxu6Ei~jg~0nd)~g9X>dEm*rbCQPx?Kz3&epyW4Mkyhyhz{e z5CX@0kCz(1WRF^UhZ>vxS#nlF$(LmV>Ah`W5Ljk1-kcK7QytRroql^gw_dI>aSMAC zfzQ!JyM2U$T!xzaKed?(R)BZ|i|hj4n-#~?-6^UCJ~N~U$v9mJ!g^J{TH|2!u8fbg z>heMwA~nlXy@|iWy>Ajm;%v1$g&gYRfTb?xz4C|vP{D`Y5A5enp2_O>H&0j6T#c5k z%$whXh*|1N>hPu2W3@s;pFQ;4BgeNr+rG~p6SFX_G&8n%JlzEW3GpX3*Ftz}TM7_d zF%>a8us|Q9?{CO-x(!gmYOw6#pGBBf`0>=7gMKwv4u$#xoAPGbW$u<0V8oT|&`&=) zi=TX(GV|d1fDk7m)maOap9RucWc^g*eagJF+IDqvQeFt=FH)v$DwS!`4ZQ#Fl6r>fIg6~rlSnc93W zc%M+gHE9TnXhg?DIO#R81%RITu6RNfi4kC;YOpwKw+|u z28M}_1*g0bF7cV&N;Y86Nq18k2y_SB0H@F&m6+Rt`FcZFJ_;uY(<5J1tDc#!Wv7Gz zD7+dwt|t6&rlqFQQEhajwgn8Ye?lPt`glr^6n{*tgC5QPsBi^Vf+rVIR5jR-WT>i% zwsAQ>aS-vK3A}Um?G&d9BqA9lf=#YSDEn0kdAllP4pGlZ(XHYWp}{DM00()bh##|I zrQ*P_jPn)0(JF}lc#Hel#LmpA=RrHdeM;IlR{~ambXnIH=!6wCSOy{dz9=oNyU@sG zuFv7=lb2u7m1-I)*Hp0T={l0QuhsyQ? z_5-RkleIkmJGS4^nsF3EOO*)%l(B8hxEaJ}WGU59r!E{tP2*2=W zsC5XDp*}$CY**9L#p=GV+iCx}q7_?3Qm4o`IQR8jjafGCBc&kqhic_%V9vduChrRJb(ng+F|DWh+aQvs;f7iUOrAs9OA zDSAIEU+LDQ?QYT;{~ob+$Be6R*lypR8V(qTP7u72UXPLmvR0VrT>A4#ym)bXigXG{ zRvVb=Xz~j%?L6EXI)ypX;br#Sngr41;&qHDbb5q&oCQ?-H3J>Jwklm8Q9g_3Td|uR zGM3%Krd$H1y^E@DdqJMB%J<=PYv<~msP>tfa9t-o@`ks()g>JnM+_UPHj`PIhssG4 za^Y6N%`zl_k^M1Vj!tKL*I zjq>2J&msh-yB$nF3si|Jbg(YdxZ@YVViG-g!%eW z<3^)_9*yBh`h)@rtuAk=b}#fUr7@bNDXK?m^qYceCX8sG@U23CeW{u6B7E($u(lt8 z>wktBZMs+M=5%q*4DW45EjNl~4BUU|h7eBk{hHPWhAVC2+L{T*j1_Q^&L7zh0120# zG@YX98X~#Z*807u;_y3@9U3zV^b*oO{)hg++*!)=%eo!CTD##2rs?Be{^kJCiHkUf z9$9Z2d_-*<3}b_8jpi9%u{+fCS#!@D4(4lk@ho9yTDe1~jhD?>=%<*jYN3D~6Iz6& zy4|mWe>aw1YuC&FR=i@`>06e(k}4cJZtmHr-3^*Mb>0I15y_DO%tBbwcR76_!7mm-olF119nj9RI3EN}Ic5be{4Le>At^h0r z`Q5FqhHROh^IlI%7(*)!s>e)3dz-&u*nOX*(1=)oVQ*}- zQ+c*%>NEAEWPcJCNqwa%@l62V#a9JPy!Yw$Z`PtfJXy7-&c7o_hV{E{TXc_9HD{@PT;_M z|0$GJx4S29b5IfEX1z;SBi*Oe7voHDN*&NyIdR+H^x|MvRh(2#2s8W__rX@QtasFe zsIZ?W0M0K=jTDYjLrgg>f}B?%Lu@Q|nEo~Q^s=+OsFlW(JY{`G%k!02E;}PSfy1~- zgMAKnW&$;iAR3c_fmGaQkTCVLYw!9Un)cdfy^K7+m~C%k_(cP2+1sjaS~Nq8&}FB*6&aGCd+ z9h=+LwIZ3Cn%pgkz|-KKGf3)0m(se$Z~VQ5R!k-x-O9;mpn;sciLcM(E1VTG!ED5; zL*sZZ-B`0s|BWFX34Rt#pOInZdr`I60?4H7`c{saZ6^6K#5+Cxz`HySA>hIh^y&?d zQxt=St^HXFm5TiPcz*(1P=&9BsjJ2Dn7c5J!>wMly{%ME0>vKi#Ok&1cHK>uodr7y z!1Y_+HNI~7Z7$C__uAyx5DY+5`D4+Q)fIDbG)=sC(Ac>z>|{N2q6)&WsVzMx3z?e-?H%QEv!bKsB^7;>}21rTi#R zq-=t;e_ASg5e3m3(a?arT1sy^ZW1W{E>jO*T62-LRfZ%BtX3IlaE1l^f<;ppxs&CG z$`+&_m4MUAMawp-nr`5&4A_xjoa*2RucJ)L$dWc`GC$Zwbco5)*m_*8FRJ$JeXipE zIc|*gTx2JtXpA;U3-AYP4M||<1yfmKU@KBM$s>pSqxFA>KXkJ95dUDBUjp8sxo`GcyJE@!V5IB{ISv>4wZ{-{N# zC~|pK8P~c)&-p;e6_7}5wc!-PqNXxCrMX!L`dsQ$D&m|pE8$R*qKXX^)PU~*Y5y%+ z#4_6wVCEwFY&%Bu>^j!|4f|j$fh8o@Gl zi~fr$4=mM~-`G`-<&2h z?XvKBkVK8$PiEQ&w6!sH%9L9NXf;)Jzbx>3Q0IJ}ND|XcNlhGs@3o|+y>E6U!Y$L` zVgQ<1FUS5;OuW(($#^qN5^fL`AOIK&j4qpS2>1wi3g3$-X)~2@_Gs+#qShil8ts07 z>vQ4!Wp6iUZ`}Od*Egq^xCHGzP@mEI-=^*YtbgZPN}@F3z&UR#t3lcb$RfK_KMl3& z3YmK`rLu=#u@y-^kr`BfSz1vVTTw2}AaWC7JFWHdwx&Ji=kp4V_D@9&skWLtw8gM{ z(l~F`5*x@77jW7lR#V8dtktz*D1!22$CN4g}Cq= zG9uOU$Dp4AYW22$onDL)H~>KboVv|LdN!#FmF{Gpd!Aq~eDhK^lz*I0Xufvfm5%nw z2d&p7XhOGEf`u;RUlE`o1cx6$cSoRLRqTo3X+UWhrmAL(SdS@A^G=qx#`9pNdobOF zoLMY0wIm{6gg6~Sn8c}k@NSX4)i;h$tD9iOB!H`CoOd>bL*^ delta 15978 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�O}EiyE=*DcCu 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 diff --git a/dist/project-discipline.skill b/dist/project-discipline.skill deleted file mode 100644 index 5f102e22809821276ab810865584525c35c1cdfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5112 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 diff --git a/skills/mappa-vitya-project-discipline/README.md b/skills/mappa-vitya-project-discipline/README.md new file mode 100644 index 0000000..12a938a --- /dev/null +++ b/skills/mappa-vitya-project-discipline/README.md @@ -0,0 +1,59 @@ +# mappa-vitya-project-discipline + +Vitya-flavored cross-project discipline policy skill for a mappa knowledge zone. +Codifies the five work rules (project-canon via mappa, master-only, semver, +push) PLUS four mappa-canon rules (rg-only search, live-verify after reload, +knowledge-first, durable-knowledge-to-wiki). + +## When it triggers + +- **Session start** — when `AGENTS.md` contains the line + `follow mappa-vitya project discipline` (inserted by `mappa-bootstrap`, which + selects the project's methodology flavor). +- **In-chat** — when the user says "use project discipline", "соблюди + дисциплину", "проектные правила", "follow project discipline", or close + variants. + +## The rules + +1. **Project canon is a mappa wiki entity, not files.** Read the project's + `AGENTS` entity (`wiki_get(project,'AGENTS')`), NOT `.wiki/CLAUDE.md` / + `.tasks/` (file channel closed). Before any wiki work — run `mappa-knowledge` + first. +2. **Master-only.** All work on `master` (or `main`). No feature branches + without explicit user approval. +3. **Semver discipline.** Bump `version:` in `SKILL.md` / `package.json` / + `pyproject.toml` on every edit per MAJOR / MINOR / PATCH; record in commit + message; rebuild `dist/` artifacts after. +4. **Push freely by default.** No confirmation needed for push; a local push + gate (`push gate: ask` in AGENTS entity, or explicit operator word) + overrides per project. Force / delete / non-ff push always asks. +5. **Transit-zone / brainstorm workspaces (mappa channel).** Brainstorm + artifacts go to a mappa brainstorm entity, not `.brainstorm/*.md`. Only + promote to a wiki concept when the user explicitly directs. + +## Mappa-canon rules + +- **Rule G — rg-only search.** Never walk node_modules/dist/build with + `grep -r`/`find`/`ag`/`ack`. Use `rg` (gitignore-aware); never `rg --no-ignore`. +- **Rule K — knowledge-first.** Run `mappa-knowledge` before any wiki work. +- **Rule L — live-verify after reload.** Infra changes verified in a live + interactive session, not headless. +- **Rule D — durable knowledge to mappa wiki.** Never `memory/` / local files; + go to a mappa wiki entity. + +## Prerequisites + +- `mappa` MCP server available (`mcp__mappa__*`) to read the canon. +- `mappa-knowledge` skill installed. +- Methodology flavor selected by `mappa-bootstrap` (the source of the + `follow mappa-vitya project discipline` trigger line). + +## Related + +- `mappa-bootstrap` — picks the methodology flavor per project and inserts the + trigger line. +- `project-bootstrap` — writes the project scaffold (removed the legacy + `follow project discipline` trigger; the generic skill was replaced by the + per-flavor `mappa-vitya-project-discipline`). +- `mappa-vitya-brainstorming` — the brainstorm METHODOLOGY for a mappa zone. diff --git a/skills/mappa-vitya-project-discipline/SKILL.md b/skills/mappa-vitya-project-discipline/SKILL.md new file mode 100644 index 0000000..35b403f --- /dev/null +++ b/skills/mappa-vitya-project-discipline/SKILL.md @@ -0,0 +1,264 @@ +--- +name: mappa-vitya-project-discipline +author: ours +version: 1.0.0 +description: > + The vitya-flavored cross-project discipline for a mappa knowledge zone — + codifies the work rules (project-canon via mappa, master-only, semver, push) + PLUS the four mappa-canon rules (rg-only search, live-verify after reload, + knowledge-first, durable-knowledge-to-wiki). The mappa METHODOLOGY for a + project is selected by mappa-bootstrap, not hardcoded here. Use when the user + says "follow project discipline", "соблюди дисциплину", "проектные правила", + "что у меня по правилам?", "use project discipline", or when AGENTS.md + contains "follow mappa-vitya project discipline". NOT for: the method SELECTION + itself (→ mappa-bootstrap), a project's own AGENTS.md content (→ project-bootstrap). +--- + +# mappa-vitya-project-discipline + +**This is the vitya-flavored cross-project *discipline* skill.** It tells you +the work rules to apply in a project on a mappa-based setup. It is a +policy document — the agent reads it and behaves; it takes no actions and has +no external side-effects. + +Run the discipline **anywhere**, in **any project**, by **any agent**. The +methodology flavor is chosen per-project by `mappa-bootstrap` (this is the +`mappa-vitya-*` flavor). The skill itself does NOT select or swap methodology — +that is `mappa-bootstrap`'s job. + +**Boundary with `mappa-bootstrap`:** this skill defines WHAT the discipline is +for the vitya flavor. `mappa-bootstrap` decides WHETHER/WHICH methodology a +project uses (by detecting methodology traces in AGENTS.md and installing / +delivering the matching skills). The trigger that activates this skill — +`follow mappa-vitya project discipline` — is inserted by `mappa-bootstrap`, not +baked into a project by hand as canon rules here. + +## When to use + +- AGENTS.md contains `follow mappa-vitya project discipline` — apply the rules + for the rest of the session. +- User says "use project discipline", "соблюди дисциплину", "проектные + правила", "что у меня по правилам?", "follow project discipline", or asks + about/applying the rules. + +**NOT for:** the methodology selection (→ `mappa-bootstrap`), writing a +project's own AGENTS.md content (→ `project-bootstrap`), or the mappa +brainstorm/promotion method (→ `mappa-vitya-brainstorming`). + +## The rules + +### Rule 1 — Project canon is a mappa wiki entity, not files + +Before applying default behavior, read the project's canon from **mappa**, not +from files. On a mappa-based setup the file channel (`.wiki/CLAUDE.md`, +`.tasks/`, `.brainstorm/`) is **closed** — the canonical contract lives as +mappa entities. + +Read order: + +1. The project's mappa **wiki entity `AGENTS`** — `wiki_get(project, 'AGENTS')` + (or for the boss-zone, `wiki_get('.workshop','AGENTS')`). This is the + project's canonical contract. +2. The mappa **handoff** entity (session-start contract) and **inbox** letters. +3. The workspace/zone contract via `.workshop` AGENTS entity where relevant. + +Any path, format, or workflow explicitly stated in the project's AGENTS entity +**overrides this skill's default.** No file-based `.wiki/CLAUDE.md` / +`.tasks/` lookups — those are legacy/stubs («не читать, не править»). + +**Mandatory precursor:** before ANY wiki work — run `mappa-knowledge` first. It +loads the project's AGENTS entity and the read/ingest contract. Never write a +wiki concept without running it first (this is also mappa-canon rule **K**). + +Concrete consequences: + +- **Specs / design decisions** → a mappa **wiki concept** (`wiki_create`). +- **Tasks / implementation plans** → mappa **task entities** (`task_create`). +- **Brainstorm buffers** → mappa **brainstorm entities** (`brainstorm_create`), + not `.brainstorm/*.md` files. +- If no convention is stated — fall back to the skill default. + +### Rule 2 — Master-only + +All work happens on the repo's main integration branch — usually `master`, but +if a project uses `main`, treat `main` as equivalent. + +- No `git checkout -b feature/foo` for solo work. +- Sync with remote: `git pull --ff-only` or `git pull --rebase`. **No merge + commits** for solo work. +- If a task genuinely requires isolation (large experiment, risky refactor with + rollback potential, multi-day work with intermediate WIP commits) — **ask** + the user: "this needs its own branch, ok?" — and wait for explicit approval. + Without approval, work continues on master. +- If the agent finds itself on a non-main branch or in detached HEAD — report + it and ask whether to return to master before working. + +### Rule 3 — Versioning discipline + +When editing any artifact with a semver field, **bump the version before +committing** per: + +- **MAJOR** (`X+1.0.0`) — breaks the contract. Renames, removed triggers, layout + changes, removed public functions, breaking API change. +- **MINOR** (`X.Y+1.0`) — adds capability without breaking. New trigger, new + optional step, new public function. +- **PATCH** (`X.Y.Z+1`) — wording / clarity / typo fixes with no behavior change. + +The bump is recorded in the commit message: `feat(): … [vX.Y.Z]` or +whatever convention the project uses (see Rule 1). + +**Applies to:** `skills//SKILL.md` (`version:` in frontmatter), +`package.json`, `pyproject.toml`, `Cargo.toml`, and any other semver field. + +**If the artifact is packaged** as `dist/.skill` — **rebuild** the package +in the same or the next commit. Forgotten dist artifacts are a common cause of +deploying stale binaries. + +**First edit of an unversioned artifact** that COULD have a semver field — **add** +`version: 0.1.0` before committing; do not bump anything. + +### Rule 4 — Push freely, gate only where a local gate exists + +**Default: push freely.** An ordinary fast-forward `git push` to the configured +upstream needs no per-push confirmation. No ask-before-push mode by default. + +**Push gate** (replaces the free-push default for a specific project). A push +gate makes every push require confirmation — it is set up ONE of two ways: + +- **On the record** — the project's AGENTS.md / AGENTS entity declares a push + gate (e.g. `push gate: ask`); it applies persistently for that project. +- **Explicitly, by the operator, in the session** — the operator says "push + gate" / "спрашивай перед пушем"; it applies for the rest of that session OR + until explicitly lifted. + +Either way, when a gate is active, EVERY push to that project asks first. + +**Always ask:** `git push --force` / `--force-with-lease`; branch deletion; +push to a remote/branch other than the current tracked upstream; push to the +main branch that would require non-fast-forward. + +**What counts as "push":** only `git push` family commands. Local commits, +`git stash push`, etc. are not push. + +### Rule 5 — Transit-zone / brainstorm workspaces (mappa channel) + +Some workspaces are **transit zones** — discussion areas where brainstorm +artifacts are NOT auto-promoted to project wikis. On a mappa setup the default +destination is the mappa brainstorm entity, not a file. + +**Default destination for brainstorm artifacts:** +- **In-progress brainstorm outputs** → a mappa **brainstorm entity** + (status=buffer). `.brainstorm/*.md` files are legacy; the file channel is + closed. +- **Mature, cross-cutting outputs** → mappa **wiki concept** (via + `wiki_create`) — **only** when the user explicitly directs this. + +**Agent must NOT auto-promote** brainstorm artifacts to wikis by analogy with +Rule 1. The convergence-moment (move from buffer to permanent wiki) is a user +decision, not an automatic action. + +**When in doubt:** ask the user "this goes to a mappa brainstorm entity, or +should I promote it to a wiki concept?" rather than assuming. + +## Mappa-canon rules + +These four rules are the mappa-canon discipline for any mappa-based zone. They +apply in addition to the five above. + +### Rule G — rg-only search (never walk node_modules/dist/build) + +⛔ Never walk `node_modules/`, `dist/`, `build/`, `.nuxt/`, or any parent tree +containing them with non-gitignore-aware search tools. + +- Use **`rg`** (gitignore-aware). NEVER `rg --no-ignore` / `-u` — those bypass + the ignore protection and walk node_modules again. +- Also no `grep -r` / `-R` / `--recursive`, `ag`, `ack`, `find … -exec grep`. +- `grep --include` filters result file names, NOT directory traversal — it still + walks every node_modules entry. `| grep -v node_modules` filters after the + walk, doesn't save you. + +Rationale: measured 3701s (grep walk of a projects tree) vs 0s (rg) — +2026-08-26 incident, task:1233. + +### Rule K — knowledge-first (mappa-knowledge before any wiki) + +Before ANY work with a project's wiki — run the `mappa-knowledge` skill FIRST, +not after the first step. It loads the project's AGENTS entity and the +read/ingest contract. Never write a wiki concept, ingest, or query without +running it first. (Violation noted twice in one session — fixed by rule, not +excuses.) + +### Rule L — live-verify after reload + +Infrastructure changes (MCP wiring, adapters, configs, bridges) must be +verified in a **live interactive session after reload**, not just by headless +checks. "Fixed, verified headless" is NOT enough — precedent: the +`mappa-http-adapter` (2026-08-25) passed headless but failed real use. + +After an infra change, minimally: reload the configuration + make a real +tool call in a live session. + +### Rule D — durable knowledge → mappa wiki, never memory/local files + +Durable knowledge (domain, ops, methodology) goes to a **mappa wiki entity**, +NOT to local per-project memory (`~/.claude/.../memory/`) or repo files. Memory +is not queryable by peer sessions, not graph-linked, and is lost. If you catch +yourself writing durable knowledge to `memory/` or a local file — stop, redirect +to a mappa wiki entity (domain → target project's wiki; workshop-meta → +`.workshop` wiki entity). User: "все важное писать в вики" (2026-06-18). + +## Quick reference + +| Decision | Answer | +|---|---| +| Where is the project canon | mappa wiki entity `AGENTS` — NOT `.wiki/CLAUDE.md` / `.tasks/`. | +| Before any wiki work | Run `mappa-knowledge` first (Rule K). | +| Where do specs/design go | mappa wiki concept (`wiki_create`). | +| Where do tasks go | mappa task entities (`task_create`). | +| Where do brainstorm buffers live | mappa brainstorm entity — NOT `.brainstorm/*.md`. | +| Search a codebase | `rg` only — never `grep -r`/`find` over node_modules/dist (Rule G). | +| Infra change verification | Live session after reload, not headless (Rule L). | +| Durable knowledge | mappa wiki, never `memory/` / local files (Rule D). | +| Method flavor / selection | `mappa-bootstrap` selects; this skill only defines the vitya rules. | + +## Common rationalizations (excuse → reality) + +| Excuse | Reality | +|---|---| +| "Let me just grep -r to be safe" | Use `rg`; `grep -r` walks every node_modules (Rule G). | +| "I'll check CLAUDE.md for conventions" | File channel is closed; read the mappa `AGENTS` entity (Rule 1). | +| "Fixed and typecheck passed — done" | Infra changes need live-verify after reload, not headless (Rule L). | +| "I'll jot this in my project memory" | Durable knowledge goes to a mappa wiki, never `memory/` (Rule D). | +| "I'll write the spec to a repo file" | Spec goes to a mappa wiki concept; run `mappa-knowledge` first (Rule K). | +| "The method is baked into this repo" | Method flavor is per-project, chosen by `mappa-bootstrap`. | + +## Red flags (all = STOP and re-orient) + +- You are searching with `grep -r` / `find` over a tree that can contain + node_modules/dist/build. +- You are reading `.wiki/CLAUDE.md` / `.tasks/` as the project canon on a + mappa-based setup. +- You are about to write durable knowledge to `memory/` or a local file. +- You are about to write a spec to a repo file rather than a mappa wiki concept. +- You changed an infra/MCP component and only "verified headless". +- You are doing wiki work without running `mappa-knowledge` first. +- You assume this project must use the vitya methodology — let `mappa-bootstrap` + make that selection. + +## Out of scope + +- Does NOT select or swap the methodology flavor (→ `mappa-bootstrap`). +- Does NOT write a project's AGENTS.md content (→ `project-bootstrap`). +- Does NOT run the brainstorm/promotion method (→ `mappa-vitya-brainstorming`). +- Does NOT install skills (→ `mappa-bootstrap` / `update-skills`). + +## Cross-agent applicability + +Behavior discipline with a mappa-media dependency. The mappa tool names are +concrete (this zone runs on mappa); the RULES (read the durable canonical +contract, master-only, semver, push-gate, rg-only search, live-verify, durable +knowledge to the wiki) transfer to any mappa-based zone. On a non-mappa setup, +substitute the corresponding knowledge channels. + +`mappa-knowledge` is a mandatory precursor before any wiki work (Rule K): it +loads the project's AGENTS entity and the read/ingest contract. diff --git a/skills/project-bootstrap/README.md b/skills/project-bootstrap/README.md index d5e0bb9..2af7078 100644 --- a/skills/project-bootstrap/README.md +++ b/skills/project-bootstrap/README.md @@ -53,7 +53,7 @@ Karpathy / `.tasks/` (см. using-wiki/using-tasks, legacy-раздел). 3. **Steps 1–5.** Create or skip each piece in order — git, README, вики/таски (mappa, см. using-wiki/using-tasks), `AGENTS.md` + `CLAUDE.md` pointer. 4. **Step 5.5.** Write `bootstrap-manifest.md` recording the versions of - `project-bootstrap`, `project-discipline`, `setup-interns`, and + `project-bootstrap`, `setup-interns`, and `using-interns` used. 5. **Step 5.6.** Skill dependencies check. Walk the canonical trigger list in `AGENTS.md`, look each up in an embedded `trigger → fulfiller` map, @@ -102,8 +102,9 @@ target with `CLAUDE_SKILLS_DIR=/path bash scripts/install.sh …`. - [`using-wiki`](../using-wiki/) — runtime policy for the mappa wiki (v2). - [`using-tasks`](../using-tasks/) — runtime policy for the mappa task board (v2). -- [`project-discipline`](../project-discipline/) — cross-project rules - activated by the `follow project discipline` trigger. +- [`mappa-vitya-project-discipline`](../mappa-vitya-project-discipline/) + — vitya-flavored cross-project discipline (activated per-project by + `mappa-bootstrap`, which selects the methodology flavor). - [`setup-interns`](../setup-interns/), [`using-interns`](../using-interns/) — pair behind the `delegate to interns when allowed` trigger; cheap-LLM delegation under a per-session permission grant. diff --git a/skills/project-bootstrap/SKILL.md b/skills/project-bootstrap/SKILL.md index 01da295..ccf314e 100644 --- a/skills/project-bootstrap/SKILL.md +++ b/skills/project-bootstrap/SKILL.md @@ -1,7 +1,7 @@ --- name: project-bootstrap author: ours -version: 3.1.0 +version: 3.2.0 description: > Initializes or upgrades a project in the current folder: git, .gitignore, README.md, .wiki/ using Karpathy's method, .tasks/ for task tracking, AGENTS.md (canon) with @@ -391,7 +391,6 @@ use project wiki use task management system check across all projects pull remote before work -follow project discipline follow tdd-criteria delegate to interns when allowed recommend, don't menu @@ -413,15 +412,6 @@ upstream — never auto-merges, stashes, or pushes. Install the skill on the hos if `pulling-before-work` is not in `~/.claude/skills/`; otherwise the trigger is silently dead like any other absent skill. -The `follow project discipline` line activates the `project-discipline` skill, -which codifies four cross-project rules: (1) project AGENTS.md / CLAUDE.md / -.wiki/CLAUDE.md / .tasks/ override defaults from any other skill; (2) all work on master/main, -no feature branches without explicit user approval; (3) version bump on every -edit of versioned artifacts per semver, recorded in commit; (4) commit freely, -push only after explicit per-session approval. Install the skill on the host -if `project-discipline` is not in `~/.claude/skills/`; otherwise the trigger is -silently dead like any other absent skill. - The `follow tdd-criteria` line activates the `tdd-criteria` skill, which enforces test-driven development by default with four bright-line carve-outs (visual CSS, spike exploration, oneshot scripts, pure wrappers) and four anti-loophole rules @@ -435,8 +425,8 @@ which lets Claude offload predictable bulk I/O and summarization tasks (reading 3+ files, distilling long transcripts) to cheap intern LLMs via the local `interns` MCP server (`mcp__interns__bulk_text_read`, `mcp__interns__transcript_distill`, etc.) — saves Anthropic quota at ~125× the -per-call cost reduction on bulk reads. Per-session permission grant mirrors -`project-discipline` Rule 4: ask-mode default, conversational grant / revoke, +per-call cost reduction on bulk reads. Per-session permission grant mirrors the +`mappa-vitya-project-discipline` Rule 4: ask-mode default, conversational grant / revoke, always-ask paths for `.env` / secrets / keys / SSH credentials even with an active grant, session-end reset. The skill is a no-op until the `interns` MCP server is registered — install via `setup-interns` on a fresh machine if @@ -479,7 +469,6 @@ Skills used to initialize this project's `.wiki/` and `.tasks/` layout, with the | Skill | Version | Role | |---|---|---| | `project-bootstrap` | | orchestrator | -| `project-discipline` | | cross-project policy | | `setup-interns` | | interns MCP server install (one-time, per machine) | | `using-interns` | | interns runtime policy + per-session permission grant | | `mappa-*` (методика, модуль 5.7) | | mappa-циклы: session-orient / task-work / knowledge / messaging / delegation / brainstorm-promote / closing-ritual | @@ -519,7 +508,6 @@ Mismatch between template and map → silent gaps in the recommendation. | `check across all projects` | mappa (`mcp__mappa__*`) | MCP | `mcpServers.mappa` in `~/.claude.json` | — | | `pull remote before work` | `pulling-before-work` | skill | `~/.claude/skills/pulling-before-work/SKILL.md` | `bash scripts/install.sh pulling-before-work` | | `session handoff: read on start, write on end` | `session-handoff` | skill | `~/.claude/skills/session-handoff/SKILL.md` | `bash scripts/install.sh session-handoff` | -| `follow project discipline` | `project-discipline` | skill | `~/.claude/skills/project-discipline/SKILL.md` | `bash scripts/install.sh project-discipline` | | `follow tdd-criteria` | `tdd-criteria` | skill | `~/.claude/skills/tdd-criteria/SKILL.md` | `bash scripts/install.sh tdd-criteria` | | `delegate to interns when allowed` | `using-interns` | skill | `~/.claude/skills/using-interns/SKILL.md` | `bash scripts/install.sh using-interns` | | `recommend, don't menu` | `recommend-dont-menu` | skill | `~/.claude/skills/recommend-dont-menu/SKILL.md` | `bash scripts/install.sh recommend-dont-menu` | diff --git a/skills/project-bootstrap/assets/AGENTS.md.template b/skills/project-bootstrap/assets/AGENTS.md.template index ae78067..4c3b6df 100644 --- a/skills/project-bootstrap/assets/AGENTS.md.template +++ b/skills/project-bootstrap/assets/AGENTS.md.template @@ -21,7 +21,6 @@ use task management system check across all projects pull remote before work session handoff: read on start, write on end -follow project discipline follow tdd-criteria delegate to interns when allowed recommend, don't menu diff --git a/skills/project-discipline/README.md b/skills/project-discipline/README.md deleted file mode 100644 index 1087aed..0000000 --- a/skills/project-discipline/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# project-discipline - -Policy skill that codifies four cross-project discipline rules so the same -guarantees that hold in a tightly-maintained repo apply everywhere. - -## When it triggers - -- **Session start** — when `AGENTS.md` contains the line `follow project discipline` (added by `project-bootstrap` v2.0.0+). -- **In-chat** — when the user says "use project discipline", "соблюди дисциплину", "проектные правила", or close variants. - -## The four rules - -1. **Project conventions over skill defaults.** `AGENTS.md` / `.wiki/CLAUDE.md` / `.tasks/` override any other skill's defaults. Specs go to `.wiki/concepts/`, tasks to `.tasks/`. -2. **Master-only.** All work on `master` (or `main`). No feature branches without explicit user approval. -3. **Semver discipline.** Bump `version:` in `SKILL.md` / `package.json` / `pyproject.toml` on every edit per MAJOR / MINOR / PATCH; record in commit message; rebuild `dist/` artifacts after. -4. **Push freely by default.** No confirmation needed for push; a local push-gate skill (e.g. books — auto-deploy) overrides per project. Force / delete / non-ff push always asks. - -## Prerequisites - -None. The skill is a textual policy document; it takes no actions and has no -external dependencies. Activate it by adding `follow project discipline` to -`AGENTS.md` (or use `project-bootstrap` v2.0.0+ which adds it automatically). - -## Related - -- `project-bootstrap` (v2.0.0+) — adds the trigger line to new and existing projects' `AGENTS.md`. -- `pulling-before-work` — companion skill activated by the canonical template; pulls origin once at session start (`git pull --ff-only`). -- `using-tasks` / `using-wiki` — the format conventions Rule 1 routes work into. -- `.wiki/concepts/project-discipline-design.md` (in `skills`) — full design rationale. diff --git a/skills/project-discipline/SKILL.md b/skills/project-discipline/SKILL.md deleted file mode 100644 index 59e84ea..0000000 --- a/skills/project-discipline/SKILL.md +++ /dev/null @@ -1,133 +0,0 @@ ---- -name: project-discipline -author: ours -version: 0.2.2 -description: > - Codifies five cross-project discipline rules: (1) project AGENTS.md / - .wiki/CLAUDE.md / .tasks/ override defaults from other skills (specs → - .wiki/concepts/, tasks → .tasks/); (2) master-only, no feature branches - without approval; (3) semver bump on every edit of versioned artifacts - (SKILL.md, package.json, pyproject.toml), recorded in commit; - (4) push freely by default — no confirmation needed; - a local push-gate skill (e.g. books — auto-deploy) - overrides per project; force/delete/non-ff always ask; - (5) transit/brainstorm workspaces — artifacts to .brainstorm/ or global wiki - only via explicit user direction. Activated by "follow project discipline" - trigger in AGENTS.md (added by project-bootstrap v2.0.0+). ---- - -# project-discipline - -> Four cross-project rules. Read at session start. Apply before any other skill's defaults touch paths, branches, versions, or remote pushes. - -## When this runs - -**At session start** — when `AGENTS.md` contains the line `follow project discipline`. The skill is a policy document; the agent reads it and applies the four rules to all subsequent work in the session. - -**On explicit reference** — when the user says "use project discipline", "соблюди дисциплину", "проектные правила", "что у меня по правилам?", or close variants asking about/applying the rules. - -The skill itself takes no actions and has no external side-effects. It instructs the agent how to behave. - -## Rule 1 — Project conventions override skill defaults - -Before applying defaults from any other skill (frontend-design, mcp-builder, etc.), read in this order: - -1. `AGENTS.md` in the project root. -2. `.wiki/CLAUDE.md` (if it exists). -3. `.tasks/STATUS.md` (if it exists). - -Any path, format, or workflow explicitly stated in those files **overrides the skill default**. (CLAUDE.md, where present, is a legacy pointer — read it, then follow the canon in AGENTS.md.) - -Concrete consequences: - -- **Specs / design documents** go to `.wiki/concepts/-design.md`. -- **Task tracking / implementation plans** go to `.tasks/.md` plus a board entry in `.tasks/STATUS.md` (the `using-tasks` format). -- **Frontmatter, naming conventions, log format** — as described in the project's `.wiki/CLAUDE.md`. - -If no convention is stated explicitly — fall back to the skill default. - -## Rule 2 — Master-only - -All work happens on the repo's main integration branch — usually `master`, but if a project uses `main`, treat `main` as equivalent. - -- No `git checkout -b feature/foo` for solo work. -- Sync with remote: `git pull --ff-only` or `git pull --rebase`. **No merge commits** for solo work. -- If a task genuinely requires isolation (large experiment, risky refactor with rollback potential, multi-day work with intermediate WIP commits) — **ask** the user: "this needs its own branch, ok?" — and wait for explicit approval. Without approval, work continues on master. - -If the agent finds itself on a non-main branch (after a manual `git checkout`) or in detached HEAD — report it and ask whether to return to master before working. - -## Rule 3 — Versioning discipline - -When editing any artifact with a semver field, **bump the version before committing** per: - -- **MAJOR** (`X+1.0.0`) — breaks the contract. Renames, removed triggers, layout changes, removed public functions, breaking API change. -- **MINOR** (`X.Y+1.0`) — adds capability without breaking. New trigger, new optional step, new public function. -- **PATCH** (`X.Y.Z+1`) — wording / clarity / typo fixes with no behavior change. - -The bump is recorded in the commit message: `feat(): … [vX.Y.Z]` or whatever convention the project uses (see Rule 1). - -**Applies to:** `skills//SKILL.md` (`version:` in frontmatter), `package.json` (`"version":`), `pyproject.toml` (`version =`), `Cargo.toml` (`version =`), and any other semver field in any other manifest. - -**If the artifact is packaged** as `dist/.skill`, `dist/*.tgz`, etc. — **rebuild** the package in the same or the next commit. Forgotten dist artifacts are a common cause of deploying stale binaries. - -**First edit of an unversioned artifact** that COULD have a semver field (a new skill without `version:`, a new `package.json` without `"version":`) — **add** `version: 0.1.0` (or its equivalent) before committing; do not bump anything. - -**Does not apply to:** artifacts with no semver field and no potential for one (wiki concept pages, README.md, shell scripts without a public interface). - -## Rule 4 — Push freely, gate only where a local gate exists - -**Default: push freely.** An ordinary fast-forward `git push` to the configured -upstream needs no per-push confirmation. No ask-before-push mode by default. - -**Push gate** (replaces the free-push default for a specific project). A push -gate makes every push require confirmation — it is set up ONE of two ways: - -- **On the record** — the project's `AGENTS.md` declares a push gate (e.g. - `push gate: ask`); it applies persistently for that project. This overrides -the free-push default for as long as that line is in `AGENTS.md`. -- **Explicitly, by the operator, in the session** — the operator says "push - gate" / "спрашивай перед пушем"; it applies for the rest of that session - OR until the operator explicitly lifts it ("сними пуш-гейт" / "push freely"). - -Either way, when a gate is active, EVERY push to that project asks first. -This rule's free-push default does not apply while a gate is active. - -**Always ask:** - -- `git push --force` / `--force-with-lease` (history rewrite); -- `git push origin --delete ` (branch deletion); -- push to a remote/branch other than the current tracked upstream (`git push other-remote ...`, `git push origin other-branch`); -- push to the main branch that would require non-fast-forward (i.e. would need force). - -Anything else is an ordinary fast-forward push and proceeds without a gate. - -**What counts as "push":** only `git push` family commands. Local commits, `git stash push`, etc. are not push. - -## Rule 5 — Transit-zone / brainstorm workspaces - -Some workspaces are **transit zones** — discussion areas with no `.tasks/`, where brainstorm artifacts are explicitly NOT auto-promoted to project wikis. - -**Default destination for brainstorm artifacts:** -- **In-progress brainstorm outputs** → `.brainstorm/.md` (or whatever the workspace's README/AGENTS.md declares) -- **Mature, cross-cutting outputs** → `~/projects/.wiki/concepts/-design.md` via `mcp__projects-meta__knowledge_ingest` — **only** when user explicitly directs this - -**Agent must NOT auto-promote** brainstorm artifacts to global wikis by analogy with Rule 1. Convergence-moment (move from workspace to permanent wiki) is a user decision, not an automatic action. - -**Example:** `~/projects/.meeting-room/` is a transit zone. Its AGENTS.md explicitly states "no `.tasks/`, transit zone, artifacts go to `.brainstorm/` or global wiki via user command." Rule 1's "project conventions override" applies, but the override is explicit in the workspace contract — auto-promotion by analogy would violate that contract. - -**When in doubt:** ask the user "this goes to `.brainstorm/`, or should I promote to shared wiki?" rather than assuming. - -## Out of scope - -The skill **does not**: - -- modify `AGENTS.md` (that's `project-bootstrap`'s job); -- enforce rules via git hooks / pre-commit / CI (this is agent discipline, not tooling); -- manage `settings.json` permissions (that's `update-config`); -- check the existence of `.wiki/` / `.tasks/` on disk (мета в mappa, решение 14/15: вики/таски — сущности сервиса через `using-wiki` / `using-tasks`; файловый layout — легаси); if a project has neither, Rule 1 simply finds no overrides and falls back to skill defaults. - -## Why this exists - -In a tightly-disciplined repo (`skills`) the four rules already hold by accident — the agent reads `.wiki/CLAUDE.md`, knows specs go to `.wiki/concepts/`, knows to bump `version:`, knows not to push without confirmation. In **other** projects of the same user, that discipline does not transfer: the agent falls back to vendor-default paths (`docs/specs/`, `docs/plans/`), branches on a whim, forgets `version:` bumps, and pushes without asking. This skill makes the discipline explicit and portable. - -Full design rationale (why one skill instead of four, why a skill instead of inline `AGENTS.md` lines, scope of each rule, push-permission mechanism choice) lives in `.wiki/concepts/project-discipline-design.md` (in this repo; in other projects bootstrapped from this repo, the design lives in `skills`).