From eb5dcc5a809ce4998df7c66501c690761768aa5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=BD=AE?= Date: Mon, 15 Jun 2026 13:36:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8A=95=E9=99=8D=E5=B0=BA?= =?UTF-8?q?=E5=AF=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store-replenishment-forecast.zip | Bin 0 -> 19897 bytes .../AGENT_PROMPT.md | 55 ++++++ .../store-replenishment-forecast/SKILL.md | 174 ++++++++++++++++++ .../sample_store_data.xlsx | Bin 0 -> 13442 bytes skills/linggan/bot-self-modifier/SKILL.md | 6 +- 5 files changed, 232 insertions(+), 3 deletions(-) create mode 100644 skills/developing/store-replenishment-forecast.zip create mode 100644 skills/developing/store-replenishment-forecast/AGENT_PROMPT.md create mode 100644 skills/developing/store-replenishment-forecast/SKILL.md create mode 100644 skills/developing/store-replenishment-forecast/sample_store_data.xlsx diff --git a/skills/developing/store-replenishment-forecast.zip b/skills/developing/store-replenishment-forecast.zip new file mode 100644 index 0000000000000000000000000000000000000000..b3a3bd23d13e6571181b6d439ed7ac9692787d75 GIT binary patch literal 19897 zcmagFW2~q_)2_L&mu=g&ZQHhO+qSuvZQHhO+s5qo&CHy0CX;-fR9C0dsrvCe>ARAy zOI`~24>G`iMz`v$_J0@u_k;t058&i%=V(IXXku?|Vr$`KZewEWOk?_Q%gDgVnNCF+ z1^`Udg3eOxpZ&+XxI+N|{&@xj0Qhf6`TvFn2LS&+LI*Mf05JVep`8qD{-xCWZ+bmr z17`zTcWWp2|2JXy|9?UsFA())omE zp)h=W5+I-jGx*uppW4%3SZyXJp4a9ZuWB8uYo14LNyj*Nh`qf%`TY&%ktgEMU2(F3 z8c_o}?6t`y+_EF{+r1&%tG&JxQ>#bQD;Q5UFwh6hut+H*OLi6B6|021suc#-)BMoW zmVmS{uy8}yn;YPxc54IYXc!7aF>5`WcJ@yOJ^ph#k+3kw0jC~MRiM;wLaVX5$MSOA z=cA1oUvMD(ySOSg)m!OC2~GAml5WRu>awY|#+qRo^~dB6>j)qiv&|p@W*|LT{0xk9 zT0xg|c@`_Hv7Zg(a^T_+^>aO$x_Pd57w}F)QU9R9?>rfR4X(`XR)eR*bQL%-(eS_P zwN++43&hc-rXV8eV^gf3C#=uh2>kiaNVim=LC!Ov$?Xy2_0|e}{nMsmZ&&_EiGYPG z&RF%UDXaY%e+S6_b_QVT(}6&jCb9eq+t%Z5sj^%g%998}I1^$}VQ>=`(#UXrNyG3I z1=ntit1#`Ku5(0UquA%Vd`SjmU-=rCwi`z7kbCEVKcRQ=4oRwXTe7{K2j*A@%`UpT z7X%c{oqC5!ZbvC$IdXbyAISa5HF=YKy1MGUERSZ}g5tP4_p7cktyC!G>BU2s88!O# zNpVlz2%B}UmBk-k9f^wff9L@D20!2JPO3-~hzo)SOS?ygg~bc)Sg-5#vof`Mxr1%H z%>%~KDFyKb${Vb3V2fhXa;C4<6T<09DxNgdvD^y)a)GZ=O^)fb(9X9DL#CUtM?C2t zWurMC2&d*!gNG=;w)?sv+g+FL0SP0;?!=gGq!Sc~xuUYl%$Bp)bBsq-`92e-if1cZ ztq;E3f5jadz0`P!<4 z2}uui`5h{H0{a!X{ZoXR(bz>Hs4Oc@&@W9B9<{1*E8u!GH{fNf)zBP6#P$=qKMoEC zImBWjuj+OpmlgY!7I*nTJt}iLgGzY_DOIS9QaaPE_PVfZnlExrDXY;*D<={bKsB;W zzZr)t|3h%)8r$i!d5z--|tNuCv7JX?h;sQg5f<6NbW=ZvvIz;dR6eY&Q^;LTTLAoS99hP zBb2)VvCjpmsNVH}$;A~#rN4*G)y2Q51mBXsB3`kAhxM6>axM<1$-DT#tCZYOm`8J7 zRh%Ug?@gG%)3@<}lGdvWnuMeW&BDY!EExer@XLTtLH4GG(}wK^v)fsZZeh4yyA~~C$d$cC?qRVJw+X~j)gUF*CK6T7J|7>OSuV`Rvo-gY*jFu? z@{@b#h6LrkZPNS21>(KlH3|uvDR`DThpTs`mLHvFI{12UoH)x-0F1feTkDlW`w% zXwpsCx~agEB9pycW$C*@T=nTvN_pB%KDicBx9_@5&Y9+3Sh!^?Br}sZD%wIz zAGdauQ()1_!^Ysyyj`rF<3^q>ypHFYE%nJm#%@w2#yzyXNIy)7P&Fi@Z>97TEYdJv zX7LgpqCdS9{){BapTam$AK8JxkM%tS|DKX+#0Yg;-lprB?E{Qy^Bf}u z*O@kLyhcZKlnpjWaV<-5GnDUnn964+m5uiLAf)J+Y3tK|e^&~Bj!Y3B3Bk!%<>Q9| z6$8(g+2HOO?vLN1U?dzx+L_HL`t&RW0ZIW-4SKO|@pwELg^WpweTp;)Z2uzS^- zgvK;#-=LFSp#uXQLhaZCCrfCu6sYJkfv8K%Li`3-QKEKSxK8PnQnx73MM9S$ z!bCEUax3L#0@-t1nQg>lH%<8ps2LT&Fp>TgF;J~H>VtP)ot^!CJo`!M4Xp}fI&{Y1 z3+}it^M%^KQSWAxR_MBmCY&H8Q*DNh}TmeC;qs;L?}b$H7~I%vUbx`J6!d@KW{oB7fd$S<6uZ6w*!3rED z)w^vS0@lRMhQiQ+V!Vb|4;i_YMls%o!vOnvY**^C3y+0!vHql)EP_tZ{nZYxz%E z8a>yyt7uoPx@>5JBdrJsF)Cpy1z}WS>OIqLVk2q0D{LylFsi+Nr4^iR&3&L08$vf9 zwmrs%Pp`P;JDyECI;gvz_ba-q)jJTMKkP-i({o$A3|c(?Te#ahwmLr*6Ghxyy;eP* zyG>19#Cc!Vn}SK0RxO8}a-nDaXCVhFarL!x+uJj_b+{%5qsOxsoy*6^h0Ddq-vjki zFHKatleHpeXtW&KdbeFQ1EbJ<*7cJ+I@LVd#n|DmLdGItA-0IHuL;J6qHp zmWAL2vbBWSxYzI6p~6_UffJslsAl!G71VWd)W}I5w>`nSKTXfB5BDcbTiinNw#L%rNqoDi_Bbe>#x$Z37cJsy|#h5>`T%a-FnO1 z?5$AGE$*(G$`|TJaVI`jw_L@nk5@(W?E5RzuKZSYRV4#6JH{*p;5^f8o2y!5s|`Yq zHfe1Z{dw4D@%*EH9yq_lkWMYHQkV`%Z$jKi4NFeHT?`Bh6A)lNk&WXk5i3(_N{(7is1D~#Q z1o-Uuc8_R4d9gt>qD_zm$}M!KiW3QQtV+v;L-`sI6L6&61itroI3G#g+sb7Te1_+m z4l~JmA&U#CFv))!Y~W+st$L*@;&WH_z+t6(!QZ}TUey}Y|?6k(emks%Ps5nrP@?ZoUs>yL9-Fe+@o zR;E06NByx!E?4jOEIBFyLTi?}d5GkGqxC7a1Ji%va!Ux$UPCgRdZ6y z(7Hf6S^b)CXd0`SvnUj$s+kL7P2#Sl4^?}xe+}_*c!7gc*(S`ABBZ7;1KBf~e%X)A_WRNJ`8zOPc5SwW8G$Xc#>IU~$#XEgoevr;?N@tC3+U6)og5?NN^>f}?fs{7Ca;?K$*1tp_ zUxC-4xeqG__#07I{+$isQd|>tj(7w6+I8bRQ1hczG0`2s1M(82~6OkKxRU1)sSzsoM=*-N4$i9Hg7BXT@? zL!Y($w_X68f3DTSOT$jr1#Z6qUx*89sUM8hE4`R|3TD`vv^S@i%OE9}aJFduq5=Up zuo8n_5{aVeDur@M>+@&~FZhMf@WkV#ugZ_(@ux>kl&?X9f~VufXly7$|gv!N%u3~ zbg5oYUAQP5S@`17#^F*;CWk3RmJ_g#X{JI@<=q?{ggrh$$&s@_scVI@{#s{(g_Ons zZ-RhBknwa^yQO#4yMQU_qlvy%AyU|zO1^La=ptZ=XCHP02g0-$hXAtF<)S9oaXerY zGjWoDI;}kh^3}Bj1vN#R!e(XWq;kl{VVgKx?zu|DQfKW?Y3f$1o0#evk9K)LSq5xM z>0yihKx7r7Q`v3s=`_!B;lKfxnPgU8BL}C%rUZ1Ka)9xSkrcB&uizx%xEw}nSTIvY z{)laU`AIr#W~N2a$|M5!z`vhKB&>?@Jfd?n5=($uM$j(SV6nN#!?oiHAV+GjiElxG zMz9%{Wa1q;=R*+%0uY^bo4SYyv>TUfL~8=AyEjE-*o$XPW}|7mf4ya=`0t45n^rX7 zW3J{43;`S|U*)El-*ldWz#@ipi3kAwDdDjZUj+<3Ug_DdoIc3NJh&RK-yXVqB6#O= z&Y*hXFGB&Z`u5F3HWOiFS1S-e%v`IvmuEa&46tciUsT<_Yhpj?DRRrZz;LCA$dIo6 zt~^2(ps%JboAm<%x&G=~kAia7Vo_uB>9P*>l816XfKm&NkpsR95u~)~4@ujuz`u)m zWroBFR?hn20qL;NmU+)W!=XJOA_3z3_|M*Y>c>tsU3urZiY;4 zVg)XJuFjHe8J~X-Yl&mDy*bezZ|jpzBSevga}^5(eCQNtTSJIG$$qtMbQQ6h1G)S2 zDk&F4jc;eEACa+_G(w|1t?D^a`!8cGGmtV-r~aMqN3z_4DW*w}*n;S$%)<2BkY-;f zFbIWcXn_phgm*>}%sK9MDlMoENl{0E-%I0`7{hph<$iLC^&tCj{=UAEYdO9_{N51IwGg>(mMpzjg zTJ2nj)!}##oGdEiVrcN}-0jE}+_)b^YY~aj$2Zu^bP@KUFgC#h8QOc#@}=lf7s)sq z0QMQt&hP;yZ!ingjkzE`=y1s=iEASzg>sG-u_xjmKuR2uVV%Z+dt?rKqf-0T%6|K< z@4gz9wSsX(b1S540S>cDEP^HaUbNTOg-P*M0g>FeQnBDye*(BfMg&ci0IP`EiE;t6 zzbIR?DDqfc2;}p=cp5Id(P*B*rz|KHs;K{{o#e}dkI7lE$2#6N0Z{01asFCUBHcj@ z^xQsWVHChH;cvWWpGdLE&TC>`NY zQc@OmVD$GW`ao%O7MZb-M37%(f@%Sb>OB!=xB>)awHmoUFPlQGQM%K39D@&NcS@gq zzw&W?##wtqCvuj#Kb8h2w$!B3r@UEN>^+((W12)gJzb09k=Ng~5y7lLGmrH!iKJ_V zB~}Lg1a=UWSAt1y&=Un1mam z5zM#Gc#gs!X5`WUXd0tIUdZT73L~8tg0n z&{eA>6jo|uNd9_y2R~qO1Tb4COyLtqn1hP|phWAE5gk`S=c%~%Ks2ki4vMn~K2@w` zvyC+3KZ!5cQwkVjr3I7b#Z2g0EVR48Pb2E(Z%SY$6#3BZMTBX?(tV1~$UEJR@QUjJ zY2ZvBJK|hnIxDwt`KB3X75Tv65juVgMx_Yd0XL|rzfetl06$E$*BTK5MfpJ-`(An* zn&YLtJCD@9aoVoyzeDqUh(n6JR|4_Lrk9W{NS5+Ft0Y0TJu>qFfUJV@Dad`9j6FKV_DD5(m zfAnR4cIrS()k$c!XO-dJanElW@@D7t)M}{AFyg>a6Tw&}35st!JW?&DjDaQ!atsQu50axx7@QImYuK1ecjR72%UsoZr0v3m z3-PYu05-Z`f(bM+zemg9#Ak0RuLI9#X|zL_Sh}{6lcM)94kV8DcZJn!&V1>k7EGzk z{W&V5RY!g7SLl-}=CkFMFsARo0A{g^lZ6aeRpv|CdkGpe!?hzi8;5-{;Ni*T+q#tZ zZf~-cl64NQtpgNby+6PnU1^ogn2adE5`O`|vU&D!qQdhtfLPQC*|l0t_Nh)jVlUk? zJ>O=k*u;W1z;;{0VWg^AJYsV-2^ns?Z~YV$Xpf9#H6XPdVQV9q_o|@2c(R;={`wGe zigf*z4JR_-&Y{d2kZM>wq#-`=S}eOQ7`$V-_-yX$@g*E5TX1li;lr=5}X6X z;Nt$=Y^@)TPf%4?1$Ln_$G=6uF`O|2fMyN>Ql-o*(j@8$b~2ENP7?>PM7gzRopk3n zZ}?M}em~ZJHh4zT8K%rCZQYe!$F!)GGCZNo$2hZ28Qt6ac%KaGJ(6%GPD?jcs;WRc zRk~9d`t?^`)#Qr@>D^IfS{KlmRZ}NrI)E65#xUREgcc`wrGID*Yy5AAra?<4G$^J? z;=B+5Y+GY2P~_Dg?q%ybC0VLjABeb0dd7k(#`UFj%UAPby;67KubP1|dM9D;CTbx0 z;=1TgnFVCakfG+&&~fg;azGk{?pB2w`i9~ssU|{@8=1wfsFx^mS1(BsRp3UL0;0j#di>HrwT@1D)<2{WcF%jKod{B!5d@Zi14+)e<q8H<5&kQ>4^qBqz06y;Ptc?u7K7w$>_Z1?9B2XsH7VuE4bJqVH_ltzu0#e(7+>) zzDe9`Tjb4Fa$wUHujUz43{f*1sIf0iH>Y_;gh)h>>B-oiJ;?URy z(q_TM7D)rI!LsmHJK&6FhI`B;XKboIae$Y)ae;&YVe>O@TJ=EOVb}dYE4xpnqXNVS zVVYlcU*U3k>ZyviERT;B*$&Ng!~_pe(xeDoAKy^8&1q*zImP7 z&FtnVqxAOf=IgCMA?+zjL#-viwc{<(N9Bgm)kiR*05`J_H%cA!Qj!HB98(7Eck8#& zvLN4-R|fPtJCcfCRV0sMQ6APUFX_N#0>z(SJuL=>S#~9souy0kqfH1~XxZ?@a}2W$ zwV-Ef#(v;qD8%|RFUxI}itZ|h9IR=RrZOW!d!m^d5~;Otp@jNFSzw0nXK$AUDJ23$ zJzgI7Li|n<-%--fQ&)SE`=Bi9d)+Ck(pp`cpLLS}y=8y!=oY zh-DKzqonAA{M&pC%22h$mHqft1`dPyC$P^ET_~ZY(OpG)V1J0bH0PU{H^*9yY8Ou;JTJsA60AGUEY**94c{~ALK@sm()@5*0)z-TK$pIpsGuL z=3t)BQ2uh41$2e&4_o!}SlK={hUZelov zUJR%vej9ai^uxy-Ecd|1#dN&`+Xqbvd+Zbcy=oFakHOmWCL-(k+~>y^WNA_HyZ}w# z9*g({hEPxeyrfv~|5s~^cz3TJW7=$sS9Ql%u1ikgKa5O+vi|iXVN5?Yi~^@f9*>i; z2K66;`|Cl*ks{v#tlhH`{Ed)Q7&+gV$P{kuvOD`O6t!C-=V}a0sd&yC=I* z*6wt;1iaR-Z-6%Zncx2^pe4UV5iEP-#`(IfIPFxr){8Yi3#<9l!2M|Qs()Ky z4NY7^cd)#3Ljj%nD(l7K)F$J%=+rSiBP-+JY70jZ+1B!OyxSUg-~9vKVf`SDz|_+< z$=i9sAwZD3@uY*=`Of8)DDD=%%jb0_MSRCVlc16FAm4yQQ~d|R7ba#FL! zwXyD&qK@aDR>i?+<>@E`rY3u*b=YF@ELZsWCbZXifk*YiFe2@7cFi!8*J{Fb8WN*jK>>lV z$nAx9&wSCaQ@1K1cd^imeD8HRR5+NR;XPd`97L(KV8Jna37{dM>ql`9F zQ`NoT&BmNK5f+X{k@L4Ka!0a49um=D%N-lD_1lLuC=U&9I)ZZ|g@I$4E7pU9m9^_^ zvFKefNuvW94G;p?@ELG7n8GPnmzO;+Xwnc*xlaTVEBY8l7Tw$bmighAM^so@% zxP)uwbbuG&j|4@hCG|#%?}{Zvs|XG{<{@X@zyMm;lSWM_mo>7A_7EE`5e4PXWRhIm zf~#OF1k3y?}CCSCT&TF3AYB3+ct7vm1qV)MbHms)M*3MKE-eDyCg{ zTrSc`S|dSmRhTLzHqLNogCBT>33a2aG*qta-9j-kK5l`F7J%cZ@PiHh_Te&dK()N( zBzkCY=Rrl~T30s!gHZU$&(pxytTF_f9%os?tCO?SMo>E*qY5*{Lg;rnc^PXuuGrV! z0+CuA%iXgSCSAtMyfzYOA1=!@IAxTBOX)mArgr z6|J#%;wLRY5}%>+v$0S!`!xj|y&~(dUR~?*5_&)Cn|ayEt2V!}foZ6i0T? z&iu5GXsl}%oD#D&hYLd5C$0F1{@xDGbZ!ZWnZIjz+;W)8Mx9 z?OySwOn_uff(O`pRhZjl^vSbCp~m<_T-Q#}^`4M#C>dkm%x$GyL;k|sU_mFUG6RL5a-Onl&7T{0f0# zo12~N78F`sZ{bwrrw(~zdce2ydZ^He+)PW3illuOg917KL+JJdRskZK*Nr`8ty$li z1Q_khY;>1XaL6H+vdTE#4MFp>@97JjB)?RHc&m}Q#o@fKy^^;s7Mv8OW`NG40UNES z`FtSXDyYV@bMOhh6fzbyi7@zF0B&E~S51=voIe;*P@BsZw?Qx((_?zbejVE|^^kVi zZlCbitxmYh84QLJjJ(%& zIkPn3^a`_JaY3}H=k$1~#~)XT!3eA)`K+ffH1>C4ihqdVM>;sp6!-(+c2z$WYPIHC zuw7NB0@JnPQsklV29e6rvcUzXRZV?Zi*nU2XT2~B)(ipWhKmOz!w0i)7cnUrCK4~m z*f}RB1cYVTAPc5@bkTjf?}?v78v|Hd)0A^D--$`FR~UgtamnYCHLP+*zm70%qcEau z0#dnI&C1*#51i(&U3nJ@Ry_w96sRBf0;Vtv2~EF)a-j$~;Y;2$v51KCtcD9$Rj>)0 ziVXB}39PyBk7Lrjl^F<}H(&?2nTVE5&p<(KWrS~2n?IztXHC;N&a(wv?kpq}p4_Q> ziBxBY@cX4DZQaqn+(_Xo@GC~x8f~XmZvs2DqK4J8B4pq824{LfXUV-hKKiEBGxw$x zM>C^|d`N6*o@nps_w%GU@+?-OuLmUTnvZ?2Z>O=1@jWJZ>tM3WjY zVQ;r(*&mX^yx`+)ofW;`W33rnVm;wPPg8^oLWR{SGTi#@jNp@7b!u z9o;(hARF{Zk3_J_)g9?;{=E5u*{zhUw?C{r3p_`>rcPpp^rQWO70x}F-W3A097M_Z zn%AbHBYX1^&hc1fIVk;iL#yq26E*EwG*DozWOAOZmpC00=cZ=ZHoj9T>+5JTr+G8i zs#54mkv4zA91b!7KbT>nMiVIdz^^JIZU|F1Lyybsup*@;TuJm5g$KeRBJ~ zVbD^BpT5)647DyjX`knA;bFS`qIl*NvRm8^PAA_!S7@Oow|&@H6a;gNz~z^m2K58T zh|c6|)a%4%1AbI{NqghCV%*l~K4HW)$Ke@h-g@JU1J~StUb#7}@^=M$J0Euy^97MP z2yyf=T)HJ5g@stvgBrcZJaH}3Esmie9Ae=52!2tJ_`LQQzEcUsZ{Diz>HN`&WVTaX~bh{@8+dGqkGyo@V|gui#TNGyOT6M*6k#H)_% zRekG5EiB#%nE=!V2FPg05={77UlXjsEgZp~G^d_gwo>OjY$CQ55}K^XYV_(icV>Ja zKT>uLh1Xhg(3Cm*Z(&9Z64&Op*U6}9CoXI>T94161~&O&(_d{`YUDR+;|Wg5z&NU^=~flw!wOXT}2O7gKT6rc5z zOJ!u=W#7k-56H~7eRZ2b1wgdpWnv|E>%n}UPV@Q_?+VEKZO6R@`PkS`N{4b+s)4!0 znXz-TO|tpvF}w45mC$97v89>bT2M><5&Ncrj$O3whk|~J$xpC{Q}g(gjuKm6!vPb8 zRO{wQKv9WhQ?@H*Z8F8suXAjr>%^wS?Q8iG7jEp)MiY0AcLMX+bGlo>0Oc=2FR>Ma zaZwwwr+9_aHzl}uhoTt_L?|WQBy_`UGHZotC?uHJD6XqMh(Xiwo&Kqv@u;cFRv$M{ z2M;Yfm#i|>_lvZTrQ06(2wdY)@_+n1FApF)NBV_IN(u9_suo?$tOdBA^wS*CP^m$u z?()qfrrF|tc=YkJw!cx=P%y0f#&AKe3><%E4L*4kJ`X_ZfY|McE55q-0x^v3_m{^} z1?QXD)uk<2mGU^W_qi{XAx>d&I{xTxnTwwAxV($c6gGXWAZ*G0M2DBQd?zFV#{02z)O*Da2&U%E8sByqtT{ zJ#D=TD)q9Lm$8`lYi+yJR87NW6;VULvt?aHX>IkgGkx8WpWg1DlK6d{euFTAtYd*- zrCxJsIe@+isRih_n0ZGi6b&F28~#x3sg`G(HJ`W@nxQg4c5_D%e2#Nh&9-W&Hjtu!yR2bAo0?! z`(nlsGK??G+6xn*4>>ykJh+}}!EGiG50m!iR|A^a3he z7eN-gI6J8CwUsgSqc-A8FH0|!w>XLE3H7@L`um8h&SeRgG3NL&g3x02z|)uLhjlFL zST(d`-mOLt?YVEKZaqvsVCnVp4$Vi$Zml6q4B!1}H*fx}*AH)R|0j)%^~d!0+kJ@d zD);x=Afor&kB{#T?i=ds_k+2A7szjy?*k8zk8|nQm+gF)($8=FF-{V0+V6Mb)GnnL z&iA)0oA>>8w69m?XNUiLk%VmacSH7D=DSn&@-qH%xux<2O05cifMx zz;Dd+>bJM)sdZ*|@)HjSB=*;(o@$(cU>7TY@Fz@PW(H(S?;B5E3Jkm*={^FG9suA! zoWcJh5M=&0xWNYo0D$^`A`k?`L}Zoq3Q?8@_KB4j!Wa?^{fA;mkAT}Yg8sZjBWINR96w3 z=y5QEal2C2`*nH@vze^yZD~20f^s_XaSppuGhW^PY`W>0KfipPPe0Y3@BoFSpAXc=VLEb4y%rV^3*LUD)h8j*5;OW(mkH| zu(bLdP0PZfW7Ff_{M!GlzRe{nim|&t%c^Z{>1}BFdH!xRLuK*wR9LvquGl72aq|sF z7y26$6C*#CgH!(f^J#v=AfL>kc7F9qEcEf%s`(FM0n%A@L zZCZZ8e{AyyA>Bf|?4+Dm%00}hX;Uc%mE@p8PuN>o1|OgH;8bsbW^^IEq7o+?#v=*X z9}QNizIH*!KcJP_p~(h}gDh&Fp0`LnM-fkp$PVKfNBnQdPPXy8K4u6E@aL*)UlF*%F z+$pC%(w;qa*0_d7Eu-8>v_K5C!#D+_Qi@(g5!dWcrIJaX9(w-v!*Rq-<^@#uVJs55 zZl}?#oA-Gljv7U;$wL8f!BKm5@!_G05r+x2>e5v7MIGYIeXT*`_*uCw1pJe*n!~wm z3YUiqbLnCrPG~W;w%Emr^_NM8CK$zhku5v9uQix;ip6BV_aUIJ0ZjV79}z~4SphPn za9q&A{df}%EL0Rk<*uJR^EdqSBe=G*PbA8lzdjE8J7yF)rS6f3x4W0Fahyc9_k~<; zxgdk-uBg8rHd>oFlzQ?Npt@xn3}Qty~W;}IVk$$BsZYcJsBn#hM`_%X)?%pYQe(UW8lbEDvcj~7rk&0Bg9%&Y+Gm^7;S4<{RTy=5| zv`q5*UoiCPlAK^1s_{7X602u2WL&U`hsGyMMgs}SIrK;{xqWpLuZzck+MKbuvctveB z3nrPOBGUSz$wE^?e1w3j?-#F`!D8ICiY%1f!@B(|Fr#xLRy@?Ss@1*Lo-4Cc36?#A zu}jjLy`($%=><7@ihtSFuN6)CFj*{5)l|Qo%KqvQgb$0odlunYJ7(0DHry>#1iloy- zj_B}-T&?p-O!&22xc7m|?O;bzq7%_UTrSMV{WBEY@6KGbukJnXGj-8ld@lx3=ilbL7B1s~lyRM0rYe@vu?(~mROm&*7lJmE5mNQ_h zl(rutnZ?b#cB&U|1|!gL_qBx_JmL|H$BLPE*)_@l5I-vw(N)VGPg<2O#t{Xg#ukZT z*ZNcji>-s-|^YiD3DpHjU9Uh?O6pp2m!5SH_)Q z%#BkuBZMb2sCNe6t;6eyppYT*80QYEl6QOau~Yn+G_Qj+6$}@W-riPtk6KNw=kmC( zpQ}K~der?129$VATz^RkscMq=Cnrbll!Fh-m+sDQLGvT5+l%yF^)IjT26E5vs|X+U z3Q@jsXhIk;0D%99?f;Tt z+W$?4?I{5ONd6}oR+5sCmi~YAm;Imia{jab`2P=USgfh#gr(-_J6g-GQX@H@EFrHZ zMY{M0A7V+V!2r$A*}58n=yi`g8?nYj{(7RJD=f}6Jk!5`cA?5H|vozVWHWhyH&6?ifL`Wd}VvMA&WBb zZ8oN8&h4>w>lx>ESemP~DDSG{9mbFp&t+HkAjj1~W7N`?;!s%+0^#ae&hK?L-+$FN zlGLU91SM*K+b(B-(#JU;tJ(EBq_YPQquYlND^&TW5m=k!8Hep#aTKmg6}r{daxjY4 zC?hMb<*AjVS4>K#zv$Y!7&bb0rrcEh?3p&?WR$LDEiGlcp}{(L zQD?Gb-&2wcCVM%48UnR8fNZ1YE!NgYt5Neia{p_!e%mjc@7#rs6-l-;?wZ%|ShZa; z$Dq|sb(u~O?%7#Hfh)}X;?8C&@u*2?XRvLv9FI- z2ffm@09$r>&7$Kg=&8dC;8MCy_&V0>U{<)Jj5GoM@0-PWf9pSW$}Q=^#llte%J)V_ z|9eL5!NG=o9*7abD{Hhwj3eSo@-hl326|=_b!6}J!=+46;%?6g5845{h_WLp+=UhK zMS=v$W?$Bnn+=)ST`VM9p>_Pt!?MyX_pMpQ$|-wgk`qFEZ^+F+Jyo&SL~&=WRyf#P z>)s6U@_buugx$(8KR-`iQ|C@={bBk>u{31J&)@3F+93cmtfhr_r#M-H^YqLob-=2v zlbWCIF{)#5FX1Mid@_ZZg4Rjx2ooB#zyVT zf^pn5Cag2*?16OXSCWhCbUso=&9T&!>z#)ouR)srs7M7bfF8IF0%p5kpdzlnlb-O0 z9pZ4dsn@aUKcbg(0J3uC0A{&pw{ZvIU{{|>77t_tVI268suz-j3uk}sSk!)sW5H1s7daV^UfK#amSn& z0M&0-ho?WDDc*9q%Xt);WFO@?gq2erK-P<*DOFtzwpDduy;eTO$Fz&ce_ypD zB(nSp@MJ~}5L$xT5ePXd7j>yH9A##Q4Dn1++73c+cswO;uUnnSk#s9vm=HOqDN4@S zAG?l(;OVByguBd0mhedu(+`l43$(JkskYxvQ3*2sNO*X(dec4n*&E}zOq(AIn)gaj zc>dRGB{mW^()%eM1LKQ=@f(Z(c2mm-B=qHVTNu_ocVK_CId&%oH2W|(H@0edHNUDS zHUb_Of-^qkno5E_-4kl$WLaW=OfF|~MwSQMP$+9A#SMxgAdLGUUdZXS44)P?sf zmCYU^W+3Klqw7z2Q0Yl{f)WR)Q=z9IkhGgZ4O@I!&DaoRy_;hv;k$dM3|4n8@qh=1 zfT)-S63edz;mkNEk8YB>HT=DJOMNxK2G5c65vjJdG9Q{-qHF2{518ld`wC*=J~;_Tu(+6aS({e6It}21-~@hW*135 z2Z9*{TE_u$871Lz?c@9tDwqqVCJ%OGhZgxUZtZ0x<_)4A3QbGQ9?!o!x_AuS+HlD` zgHLw;)-Y4@hvL4+c&)Ces;;JozX6mM{&&$~Vy~D88MUJxB0iY$zIJB^47npKY~~)@ zKNi10p4e-;7sw_)+5hj;KbYE$r1A3=QP?0!4A^F&hKXW3{36YXx9%jLs7!hEr7n4D zUAj3-B(l($cMR=-K10GheQCM+4u8kT?SPrUE=lNZN37OJ40YzVV zSi9NomJd)nG@0y+Wu-%c?t~ybX>WYDlXL&~6XD7$r7KV;BR=(uLYEZ(DA9lQ9bSeL zbVz>L^OT_Ppr41j6P0>bwA}z8rsCmy29r^urc_K4TJtkwc;J|}p^TJ6rfM{Q{H4+) zXFU=5syVl;vULg<`u<6L0Umc?BvFLoZcW?xHVBdskxs}cr(B1fN~e(~g(nC{2lVIpAAX0vcNDEycNbfxY(tD8> z;L6-_#+Q5lTh6}hzUfx?i3QZ}nXI5yUiJw(Dkdw)(%y)Hx!!PwjOPb1navC5OY|F?h{xGgnrOQ{?hf0L< zWjVeqWAa!8EffUsT)c~m)01yuGqafx4JHy3Kp#V-jvH~r=!-pAeCkR5cy2)H`*eCG ztn)|vXAyFDW7;f4If-R~t1U`!4|G7n35!bnfL2tR>lr|>-aD(P;hQ{JVd}J^!eD8P zDFuP`d4>D|F(Ry{&dIBduVTwzx_CozwH)rBLr7V>hl-omTc~f@4i{%nC0K$h z#Y$*1KT4cD@*nt1JISAm5hWlhAEHd=fwv8e{NQbXv=}y@XTTE=addOET zn^8u_m)B+S0!P2*`1Mtx+;q!|rV830@`GdMY>;-MueL&wPMegTzWCKnO_?XJ)EzjD zw>D1>$8(}W2+j@T>z1#<`8q*{_e!o=i?h)Xj!xWYy%+nM<(FH8)w<@@RAS7B-DnxDqu6QRdbH~Sts5nPJqWO}~tweP}nUjVqRj?-64yfbY1ZES3~!c&0j) z?Rp3Mv1mpy#_jaI-GW{^tY=V*2TbBVBvyZT-KB!rh}IIbAl2rwK2JRFqTAv zBZVn7+lhIMO>CB3F)JKz(0WY}-hGgDkMTWsH&@3{@;4Z`Z&DA@>^L7`77)|Ect!|* znrRc3R=rAu@mH+${+OskVbj-D-B<2LcK|(Ethnn>q}IB3ir~O+8$bsUvpcKPwbcXBIeRHLi78h@ja0%m8RU;%Y7Uaz^ z_baeNgO7Z1>1yn9@_O~;*(Y_(A9dGs>*so^mzv15JZwNCIZ~;#spVG>J>(Y*UutV< zsH6}Y&mpp#J8Sew+li;AM(qzTDMlnu%YO08I)`*!FMaFatlvKODqRwUmo%`x2BeArt8!pMEOEn7LNDQ>1kN{wMx4a%H!BcOs{!Xm>j zzu2?C7=aRd#q?C29K367XBCd>-jXU^V!CZp!U|`YA>3Jw8d@7v zfjdY7w{}q-icO-3D&C9|-gg1ekpc2>4@`Q1)x9HjbK5Z?1vcIVXMm_c2-hRu8isjq zZjC;USRfJbXvzb`oEb@3D_TY+d#Vz-OU3>p{VhsObl}KfFlv2Qt2(<9CN2%OuvtOP zB-8?v-9MfTwu!QB^M=Qyrlc&aEIG_t-}O_!5wnSzHNkX8AEIzx9~>>WneH)-jTg>u zr6HyZ*b>)u!a~LPJ3cL!QZVxB+E>H!ve3J!qEYwTmnMr7p3hnh+DFuVw&S%4??lE^ z&@v=mO_tzvgp!K%=Y(*EMfO+;zo1B8uH9^0Dz0bo-(u}2p-P!|H+U-}yKJ@$6WrDG zICn>7N=g*7_K{-&8aQ3K+l-VXn5OS#@Fqs>Ps&gsSi)iR^CaE#m`_$5ZXju1eflRK zvg@F(=?7&xp{gh=?%pIXUiYtj8z)P(@l_bC!nWIxP<^i4^v5IH9{X|u+?{QJuYAFi z`NvE~L8gOzA|W+Rat>H5eyF_BW4z%Fe4^$?ZV}w@{51yvWPbDed`+8}zr5G^cW0|; zCx~vi`=fBmtb&N26V<6jD{!|KvFk+2Rgg0mR?hGH5Nd&MJXF@fvio)(pP#uv@J9-{Mj@QQL}#6(Hk zbTw}I1Y@WHr}U03y>zRU$7a6Ej(0gb0pA5yfBDAs^u3ByZ4foq1P0hw)NAmyc)vYu zI3Qi+>DCtFbtfdVISMM7uoz9qCsnKUq_0SPK;|MiW(=2x{QH;IvG3jxFVjgd$+&x?M{vrR!Iopl4+F-vgU32b&75Uv!$hkI^;6>d zIuC%FLQ;j=N~Cgo3|bh$lZpGv2i(odJalm0s8eb(M1|?|M_F;%j#ayjKfaBKEW`mJ z6Ys5r3zKiw=ftKWDdgQV(XnFlw6tHXsY!|)i3b}B`!i(6Mb{J+S@VMWJ0Qp8Z=+Hc zq5}@9Y>6yW8%0=mx6SRxt(t5MEs(vC+d33FYD6Z7Dhb^b4@%^J&1|F@^n;~dZAIEF z>^-(8=@#U;DUru2vAVlab|;O`lb+vRPE&aeuS|L@91)5s{d%r389FNK)JJ;vKnt8U zt9>%S#zV)!0t`3`<~TZR8wo|*%kJNBk=u2oa_k&nO~NS)gHLht{=~|l8TGIX7yMHu zNccGGT_i}rfhHQE-kJMIGEI{jd`^C$vRPKnUEZYu04}sNUCm3E>45(_%jS}z`OVeS2?HeOhJzmXj{^~(zUx3&J4 tM&F;z7i#989k@_4eh|9-|EJoft|k%j#kHVcYwQvLfYZD<{R1}IE0+KO literal 0 HcmV?d00001 diff --git a/skills/developing/store-replenishment-forecast/AGENT_PROMPT.md b/skills/developing/store-replenishment-forecast/AGENT_PROMPT.md new file mode 100644 index 0000000..7d4cf60 --- /dev/null +++ b/skills/developing/store-replenishment-forecast/AGENT_PROMPT.md @@ -0,0 +1,55 @@ +# 门店采购预测智能体 · 系统提示词(System Prompt) + +> 把下面整段作为 agent 的 system prompt。它定义角色、纪律与流程;具体的预测方法、 +> 公式、风险判定与输出模板,由 `store-replenishment-forecast` skill 在运行时提供。 + +--- + +你是「门店采购预测助手」,一个面向**生鲜/食品短保门店**的采购(补货)预测智能体。 +你的任务:基于用户上传的 Excel 数据,预测未来覆盖周期内每个商品(SKU)的需求, +给出**可执行的建议采购量**,做到既不缺货、又不积压过期。 + +## 你的角色边界 + +- 你是**初算辅助**,不替代采购员/店长的最终决策。给建议,不拍板。 +- 你只基于**用户上传的 Excel 数据**(销量、库存、商品主数据)做预测,不凭空编造销量或库存。 +- 你输出**采购建议清单 + 预测解释 + 风险提醒**,供人工复核后下单。 + +## 三条铁律(必须遵守) + +1. **基于真实数据预测,不臆造。** + - 历史销量、库存、商品主数据都从用户上传的 Excel 读取;读之前先核对表头与样例行, + 确认哪列是日期、SKU、销量、库存、保质期、箱规、提前期,不要按列位置硬猜。 + - 按技能给出的方法与公式逐个 SKU 计算,计算口径前后一致、可复现。 + +2. **生鲜底线:保质期是硬约束,宁可小单勤补,不可一次压货过期。** + - 任何让库存覆盖天数超过保质期的采购都必须被卡住(按短保上限封顶)。 + - 出现过期风险时必须**显著提醒**,并解释为什么不建议多订。 + +3. **诚实对待数据缺口。** + - 没有销量历史就**不要硬造预测**,直接说明缺哪类数据、请用户补充。 + - 缺失字段(保质期、提前期、箱规等)用默认参数兜底时,必须在「预测解释」里**如实声明假设**, + 不要假装数据齐全。 + +## 工作流程 + +1. **理解请求**:明确是哪家门店、要覆盖未来多少天、是否有即将到来的促销/节假日。 + 完全没有任何销量数据时,先请用户上传或补充数据。 +2. **读数据**:打开 Excel,核对销量表/库存表/商品主数据表的列含义。 +3. **逐 SKU 计算**:按技能的方法(加权日均 → 安全库存 → 目标库存 → 减库存 → 短保封顶 → 取整) + 算出每个 SKU 的建议采购量与诊断指标。 +4. **成稿**:写「采购建议清单 + 预测解释 + 风险提醒」三段式报告。建议量算出后直接给出, + 不在报告里临时改数。 + +## 输出风格 + +- 用清单/表格呈现建议采购量,关键字段:SKU、商品、建议采购、当前库存、可售天数、日均需求、备注。 +- 解释要落到具体口径(加权日均、安全库存、覆盖期、保质期封顶),不要泛泛而谈。 +- 风险分级提醒:🔴 缺货、🟠 过期/积压、🟡 数据不足/波动大。 +- 措辞用「建议/预计/需关注」,但建议量必须具体、可执行、可复现。 + +## 何时使用 store-replenishment-forecast 技能 + +当用户提出门店采购预测、补货预测、要货建议、订货量计算、防缺货防积压、生鲜订货, +或上传了含日期+销量+库存+保质期的门店 Excel 要算该订多少货时——**立即使用该技能**, +按技能内的预测方法、公式、风险判定与输出模板执行。 diff --git a/skills/developing/store-replenishment-forecast/SKILL.md b/skills/developing/store-replenishment-forecast/SKILL.md new file mode 100644 index 0000000..c50545c --- /dev/null +++ b/skills/developing/store-replenishment-forecast/SKILL.md @@ -0,0 +1,174 @@ +--- +name: store-replenishment-forecast +description: 面向生鲜/食品短保门店的采购(补货)预测助手。基于用户上传的 Excel(历史销量、当前库存、商品主数据),预测未来覆盖周期的需求,算出每个商品(SKU)的「建议采购量」,并强约束保质期/货架期以控制过期损耗,最终输出「采购建议清单 + 预测解释 + 风险提醒」。当收到门店采购预测、补货预测、要货建议、订货量计算、replenishment/purchase forecast、防缺货防积压、生鲜订货等请求,或拿到含日期+销量+库存+保质期的门店 Excel 数据需要算该订多少货时,使用本技能。 +category: Data & Retrieval +--- + +# 门店采购预测助手(Store Replenishment Forecast)· 生鲜短保版 + +## Overview + +本技能为**生鲜/食品短保门店**做采购(补货)预测:读用户上传的 Excel 数据 → +预测未来覆盖周期内每个 SKU 的需求 → 算出**建议采购量** → 强约束保质期避免积压过期 → +输出「采购建议清单 + 预测解释 + 风险提醒」。 + +数据**直接来自用户上传的 Excel 文件**(销量表、库存表、商品主数据表,可能在同一文件不同 sheet)。 +你读取这些表格,按本技能给出的**方法与公式**逐个 SKU 计算,给出可执行的建议采购量。 + +生鲜底线:**宁可小单勤补,不可一次压货过期**。任何让库存覆盖天数超过保质期的采购都要被卡住。 + +定位说明:你是**初算辅助**,给建议不拍板;建议量供采购员/店长人工复核后下单。 + +## When to use + +满足任一即用本技能: + +- 中文:门店采购预测、补货预测、要货建议、订货量/进货量计算、该订多少货、防缺货防积压、 + 生鲜订货、安全库存/再订货点测算。 +- 英文:replenishment forecast, purchase/demand forecast, reorder quantity, safety stock, + order-up-to level, store ordering suggestion。 +- 拿到门店 Excel(含**日期 + 销量**的历史,以及**当前库存**,最好再有**保质期/箱规/提前期**), + 要求算「下一批该采购多少」。 + +## 需要从 Excel 里读到的数据(最少 → 理想) + +| 数据 | 最少需要 | 用途 | 缺失时 | +|---|---|---|---| +| 历史销量 | 日期 + SKU + 销量 | 估日均需求、波动、趋势、星期效应 | **硬缺**,没有就无法预测,须向用户索取 | +| 当前库存 | SKU + 现有库存(+ 在途) | 算净需求(要补多少) | 缺则假设为 0 并在解释里声明 | +| 商品主数据 | 保质期、箱规、起订量、提前期 | 短保约束、取整、提前期 | 用下文默认值兜底,并在解释里声明 | +| 促销/节假日 | 即将到来的促销倍数 | 需求上调 | 不传则按 1.0(无促销) | + +> 生鲜场景里**保质期/货架期至关重要**,尽量从商品主数据读到;读不到就保守假设一个短值 +> (如 3–5 天)并明确告知用户这是假设。 + +读 Excel 时注意:列名可能是中文/英文/带单位,先核对每张表的表头与样例行,确认哪列是日期、 +哪列是 SKU、哪列是销量/库存/保质期,再开始计算;不要凭列的位置硬猜。 + +## 默认参数(商品主数据缺失时兜底) + +| 参数 | 默认值 | 含义 | +|---|---|---| +| 服务水平 service_level | 0.95 | 目标不缺货概率;越高安全库存越大。短保品别盲目调高,会积压过期 | +| 提前期 lead_time | 2 天 | 下单到到货天数 | +| 采购周期 review_period | 3 天 | 两次订货的间隔;**覆盖期 = 提前期 + 采购周期** | +| 均值窗口 | 最近 28 天 | 用最近多少天算日均(数据不足则用全部可用天数) | +| 新鲜系数 freshness_ratio | 0.7 | 短保关键:订货后总库存覆盖天数不超过「保质期 × 此系数」 | + +服务水平 → 安全系数 Z(用于安全库存): + +| 服务水平 | 0.90 | 0.95 | 0.975 | 0.99 | +|---|---|---|---|---| +| Z | 1.28 | 1.65 | 1.96 | 2.33 | + +## 预测方法(逐个 SKU,按序计算) + +> 数据准备:把该 SKU 最近 28 天(不足则全部)的**逐日销量**取出,按日期排好。 +> 缺的日期若代表「当天有售但无销量」按 0 计;若代表「未开业/缺货停售」则尽量剔除,避免压低均值。 + +**第 1 步 · 基线日均需求 `base_daily`** — 用**加权移动平均**,越近的天权重越大。 +简化做法:把窗口内第 1 天到第 n 天赋权重 1..n, +`base_daily = Σ(当天销量 × 当天权重) / Σ权重`。 +(数据很少时直接用普通平均即可。) + +**第 2 步 · 需求波动 `σ`** — 算窗口内日销量的标准差。 +变异系数 `CV = σ / 平均日销量`,用于判断需求稳不稳定。 + +**第 3 步 · 趋势修正 `trend`**(可选,样本≥8天时用)— 比较「近半段平均」与「远半段平均」: +`trend = 近半段均值 / 远半段均值`,**限制在 0.7 ~ 1.3 之间**,避免被异常值放大。 + +**第 4 步 · 星期效应**(可选,有日期时用)— 若周末/特定星期明显更高, +算各星期几的「该星期平均 / 总体平均」作为系数,预测覆盖期时按落在的星期加权。 +拿不准就跳过这一步。 + +**第 5 步 · 覆盖期需求** — `覆盖期 = 提前期 + 采购周期`; +`覆盖期需求 = base_daily × 覆盖期 × trend × 促销倍数`(用了星期效应则按逐日加权求和)。 + +**第 6 步 · 安全库存** — `safety_stock = Z(服务水平) × σ × √(提前期 + 采购周期)`。 + +**第 7 步 · 目标库存(订货上限)** — `order_up_to = 覆盖期需求 + safety_stock`。 + +**第 8 步 · 建议采购(原始)** — `= order_up_to − 现有库存 − 在途`;**负数归零**。 + +**第 9 步 · 短保上限(生鲜硬约束)** — 若有保质期: +`短保上限 = 保质期 × base_daily × 新鲜系数 − 现有库存 − 在途`(负数归零)。 +把建议采购量**压到不超过短保上限**;若被压低,记为「受保质期限制」。 + +**第 10 步 · 取整与起订量** — 按**箱规向上取整**(如箱规 6,则 45→48), +再不低于起订量 MOQ(建议量为 0 时保持 0)。得到最终**建议采购量**。 + +**第 11 步 · 诊断指标**(用于解释与风险): +- 再订货点 `ROP = base_daily × 提前期 + safety_stock`。 +- 当前可售天数 `= (现有库存 + 在途) / base_daily`。 +- 订货后可售天数 `= (现有库存 + 在途 + 建议采购) / base_daily`。 + +## 风险标记(据诊断指标判定) + +| 标记 | 判定条件 | 在「风险提醒」里怎么说 | +|---|---|---| +| 无销量 | 窗口内无销量/无数据 | 无法预测,建议人工确认是否新品/停售 | +| 数据不足 | 有效历史 < 7 天 | 样本太少,预测置信度低,建议积累更多数据 | +| 波动大 | CV > 0.5 | 需求大起大落(受促销/天气影响),建议小单勤补 | +| 缺货风险 | 现有库存 + 在途 < ROP | 🔴 应尽快补货 | +| 过期风险 | 订货后可售天数 > 保质期 | 🟠 应减量或暂缓 | +| 积压风险 | (非短保品)订货后可售天数 > 2 × 覆盖期 | 🟠 建议减量 | + +## 输出格式(Output Format) + +输出**采购建议清单 + 预测解释 + 风险提醒**三段式中文报告: + +``` +## 采购建议清单(截至 {预测起算日},覆盖未来 {覆盖期} 天) + +| SKU | 商品 | 建议采购 | 当前库存 | 可售天数 | 日均需求 | 备注 | +|-----|------|---------:|---------:|--------:|--------:|------| +| M001 | 鲜牛奶950ml | 48 | 8 | 0.5天 | 16.8 | 缺货,按箱(6)补 | +| B002 | 吐司面包 | 0 | 30 | 4.6天 | 6.5 | 已超保质期可售量,暂缓 | +... + +## 预测解释 +- 用了哪些数据(最近 N 天销量、库存、保质期等)、用了什么口径(加权日均/安全库存/服务水平)。 +- 关键 SKU 的算法依据:日均 × 覆盖期 + 安全库存 − 现有库存,再按箱规取整、按保质期封顶。 +- 做了哪些假设(缺失字段用了什么默认值、保质期是否为假设值)。 + +## 风险提醒 +- 🔴 缺货:列出缺货风险的 SKU,建议尽快补。 +- 🟠 过期/积压:列出过期/积压风险的 SKU,建议减量或暂缓。 +- 🟡 数据:列出数据不足/波动大/无销量的 SKU,提示置信度。 +``` + +要求: +- 建议采购量按上述方法算出后**直接给出,前后一致、可复现**,不要在报告里临时改数。 +- 解释要落到具体口径(日均、安全库存、覆盖期、保质期封顶),不要泛泛而谈。 +- 短保品如出现过期风险,必须显著提醒,并解释为什么不建议多订。 +- 缺失数据/用了默认值,必须在「预测解释」里如实声明假设。 + +## Workflow(按序执行一次) + +1. **读数据**:打开用户上传的 Excel,核对销量表/库存表/商品主数据表的表头与样例行, + 确认日期、SKU、销量、库存、保质期、箱规、提前期等列。 +2. **逐 SKU 计算**:按「预测方法」第 1–11 步,算出每个 SKU 的建议采购量与诊断指标。 +3. **判风险**:按「风险标记」判定每个 SKU 的缺货/过期/积压/数据风险。 +4. **成稿**:写「采购建议清单 + 预测解释 + 风险提醒」三段式报告。 + +## Examples + +### 示例:三类典型 SKU + +- **鲜牛奶**(日均≈16.8,库存仅 8≈0.5天,保质期5天,箱规6): + 库存 < 再订货点 → 缺货风险;覆盖期需求+安全库存−库存≈45,按箱取整为 48, + 订货后覆盖 3.3 天 < 保质期 5 天,安全。→ 列入「🔴 缺货」,建议采购 48。 +- **吐司**(日均≈6.5,库存 30≈4.6天,保质期3天,曾有异常高峰): + 现有库存可售 4.6 天 > 保质期 3 天 → 过期风险 + 波动大;短保上限算出为 0 → 建议采购 0。 + → 列入「🟠 过期」,解释「现有库存已超过保质期内能卖完的量,本期不建议进货」。 +- **可乐**(日均≈20.5,库存 200≈9.7天,无保质期): + 库存远高于覆盖期且无保质期 → 无风险,建议采购 0。→ 说明库存充足、暂不需补。 + +## Guidelines + +- **生鲜底线**:保质期是硬约束,过期风险必须显著提醒,宁可小单勤补。 +- 没有销量历史就**不要硬造预测**,直接说明缺数据并请用户补充。 +- 缺失字段用默认参数兜底,但要在「预测解释」里**如实声明假设**,不要假装数据齐全。 +- 读 Excel 先核对表头列含义,不要按列位置硬猜;列名中英文/带单位都可能出现。 +- 结果要**可复现**:同样的数据与参数给同样的建议,便于回归与人工复核。 +- 这是**辅助初算**,不替代采购/店长的最终判断;措辞用「建议/预计/需关注」,但建议量要具体可执行。 diff --git a/skills/developing/store-replenishment-forecast/sample_store_data.xlsx b/skills/developing/store-replenishment-forecast/sample_store_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e5b6790bb27c7f099327238dea909e8340f1873b GIT binary patch literal 13442 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 **头像规格:宽高固定 300x300。** 若需用 AI 生成头像,请在生成时直接指定 300x300,不要事后缩放。使用 agnes-image 时加 `--size 300x300`: +> **头像规格:宽高 304x304。** 图片模型生成尺寸必须为 16 的倍数,304 = 19 × 16,满足要求。请在生成时直接指定 304x304,不要事后缩放。使用 agnes-image 时加 `--size 304x304`: > > ```bash -> # 1. 生成 300x300 头像并保存到本地 +> # 1. 生成 304x304 头像并保存到本地 > python /scripts/generate_image.py \ -> --prompt "可爱的卡通机器人头像,正面,居中" --size 300x300 --save /tmp/avatar.png +> --prompt "可爱的卡通机器人头像,正面,居中" --size 304x304 --save /tmp/avatar.png > > # 2. 上传并设置为头像 > scripts/bot_modifier.py --action set_avatar_file --file /tmp/avatar.png