From add2507eac96ad6e6124f2a7f634751c780eddb3 Mon Sep 17 00:00:00 2001 From: Jeroen Schweitzer Date: Sun, 19 Apr 2026 15:37:33 +0200 Subject: [PATCH] fix(content): add price_tier to brand layer schema, import, and V-B06 (#828 blocker) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit price_tier was documented in D-189 §5 and present in brands.toml but silently discarded on import — absent from schema, INSERT, and V-B06. - Add price_tier TEXT column to brand_products CREATE TABLE - Add COLUMN_MIGRATIONS entry for ALTER TABLE on existing DBs - Add VALID_PRICE_TIERS constant (mass/premium/luxury/flagship/institutional) - Include price_tier in product_rows tuple and INSERT OR REPLACE - Add price_tier to V-B06 enum checks; skip NULL (nullable column) - Backfill 4 pre-amendment anchor brands (8 entries): Calloway flagship/premium, VGV luxury/premium, thrds luxury/premium, Bífröst flagship/luxury V-B01..V-B06 all pass. Co-Authored-By: Claude Sonnet 4.6 --- server/data/systems.db | Bin 5746688 -> 5746688 bytes tooling/economy-db/import_economics.py | 11 +++++++++-- wiki/economics/corporations/brands.toml | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/server/data/systems.db b/server/data/systems.db index e06ff502d9b123ce5ebcdec02d48834b8f41211d..56ad83082f308ab522b23fd180714269b43e90dd 100644 GIT binary patch delta 21720 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 delta 19849 zcmZ`>349aP*3V>5nl_ox(v}k1QbH*qO+y+=8bTVnQA#%;GsxPiY_c!1D-2)|m8Al` z$QoR50b~)0K7?0Xc&=>X3Mlyb{Cqw@cs>O;_|BbV?p)sceg1w8oZd74d-ikgo#4_- zUn!Tu&$=vjlR}|cq>%rc+S<#*Y!aGZZDw}u>+p<1ou0BexjyL;%wb~DgG?h6oA4^Lqf?qwl``J+UeXHVaQ%Bamu3g!ROc&WEl)F6 zCf4%|6JugC&M|-2#4ev@)-kbrzGU`3mp)RJ@|cn_eW%)#^qO&`!Jrta9j&{hMr$Vf(&!2T`Es2#GR$U<9pr7tR2i`MephLgt1`$5ZP2DO&Y`m#^h!B~#bn^+Z z>6UIen}A!AtPeO0dO_zwUlr;zP{psh;nu{OU^VI8E?D$>Q1&Q8C-m;Gx=943?{B&# zggEw_u8j~Qf7dM_#Ce(+`G@XNvhu?py4hr_bdBDh2U~?aXx&LeI$Hg{AqlnqsT)t& zZ~v(qONje#>(&$E_H7Dv^&Q<5Y2}b!TgH5cbY=Ry4$8sG6vcN*`Xs$+N+QhAk4>yJJpGcE$u<9O{w3}#@UN2T7W?gv zfz46onQ=%}YH=8DFesU>vF}~R^djc*!_7t}XNl6K*vb6VN##~?YQO1qwNCYm{txw| zs=uq}sm^Ias<%`JO?OQ1tH+t1S4GtaRBKGjRg2X-lCGMrnpo8Y)A^+HNq0;em3>u% zlp$qp(izimQ=MsmX})Qysl?PPxl{5k)4eL2%AovNd0F|9@^$5N%2wq=%1O$wGE1rJ z#{86gHTj+71M0z=UfOfIg@*k}N0V12KbYK-T$k)iwwte*KS!qAuyS*1e&7LAL??Gep;4 z*HhO~r_^3+6TF$pA8B6KJf~^ZEY?iW3_<+`MXk$>9Z;`j#x$$iqcDh0 z(5uo7bv45)D^O^e@p`RAWoPO_Lu$u14yl1Z@6kvF!JtZKM7|V-;y;->uqwNfeoFBk zJcinr8;7(1$vX*+UT*ZD&~wJrSl!=*!!9nF zb{CnM$HYI-l@-SDe}PVpuT6i%xJZR}7WMq|5#zs@HRyW8_^i_KHvTg`wr8c$rqr17 z@Ftikc43wA4uh6FVXVwHLB8;qP~ok{8jOs{MV<^PmdeBS^rD(6)61) zBcGPMO<{~{CqMFGT&~b+<3u)Ye6q$Qp#!UpJ(MX7+P^z971ggbvKp&G!F(2Lit0XQ zumgJ>UT0KW)Q_vP6ftAe$g0uHV=}a8|30H7=6cpR!iaJo&B;gm$7HC*U#@)nWh49~ z!H)@klHn%>e$27AU$*SDN*Ri#9Jl<95T$QgUMIwFZ(7<3ar`Yyln@i&w#bFD_#MkR zvSL1A*+Pf|CoE?OvFdM@HwiK1T?#t$J278Mk0{ujKxQY!DlQLgg`);6V=#Psx8S%Q+Uu| zgS9i#p0!vAo9(Q{MTntiEg?c|IcxDs07ZSY`I#8txWU>X{od*KFX&y=yN|P|*y;A= zxD&e|!^e~`H6L3X1Z&a9mU0QJZ*Q$v6sE{%%|hRQObK)6V@p4Yt#^^uA#ORtXiY<7 z&rxi1&sqEg`n7YGUWEAPIZ6V@CluS%Pb@`*?b%N(0coF-04Yu! zQ_En9tvX-p&P^-upofycgquFKbRld*?3tp}xddOteq0OID_-}k}2}lpNeL<-{ z00;@BGz)`(BM)3OcSKKrL229m1ts4dn&|%}6(e)Lv^b@0&>aQ(sLcH^}rC1^kU$P_> zG2>$<3;U|M;eKH@47m3SW8t$!sD;mFp#(n13VHB3N-)FcJuv@jhEISGekj!5CxY;| zrk)Cgl1o!UF;|+8!KY@N`784=Jc{f$Yc*rCRDK3Eui(=S7-zIi6=cxE{kcqZ$HkhM z*)dZQ`=z=2%w>~cb^5Zd@Htr+4WAQ*j_^65PHEnw(4>41eO5CgW-4R9PGKHESL#_0 zGY91~ur6i_YQ%rcLQ5Oiq1s6fwa=kM0mRwS?FKfPSr9Wdvfr6I%@<|>#5^GvKIb-J zaT)V7DS1%U2P!HDmc8Ahb()HuM}Q4#}99blDx`SJj(T&1oIu*#hzyWA@Kzop#TQ-bb2Bhi<3 zmVzbsm0M+fPLxw<>IzvO&s41|9gB0V)Y|d?b>)HzYq7LT|H)dXXn`(%Ye#gp!kQ(m zlstfK16a*F!l}qoNvYrkb&j9B3JN~>I1E2=2Al{E2wl~rz0cdD#q zk^}==w0_YCP5rDkG`ZR;x59PRRyi8queQpa;&!z)C;?QA*1Byt7*F@Jc0%I^TIFDT zY@lp|fg`ovT+G%o4K%$x(3($FFxObA_^Yv!(uo$=SV?mT@miM{^lJmqjL+6k`}|Tv zxvF@Om5d$b!*Jxlrk4ZOOtfhb^~@WCWb?MwTIF$~q?Qt37QOOft^5eOT5BZ}S-(1M zQ1l|ZlFvk^`dhVV>|iRC<_@O9@3p~Jd2+ZpnDSm(omHOR=GIXT+g(QiT&<(TaMxSO zI8argEy)(gm7ui?daB+kk1I#&spR~3Jtcvsfy$sc4U{-X8{}X*yw1N{MI3f;y?-wu z#&7T+l!#dNM*m8Ap55E#KPxSv2=ZSe#G+09PYE&nDZe~XTQ~b(BP(Y%`;QW0;}-vE zLQL68u{pN+Pmq;c+x%Myv3a}y5Fx@l{Le~6q|q8_>=0>8jWni38aqZB(+@XhsGAGZ z6tfiOij+yo?WS){Wl0;2SB*}?gZgc{A9MxUhc&y^x77jF66IFr?@U+4EOg_0Wm&4= z46^=$pv|7?XLOnREIm%>wcGe~bY&a=aF%q5Qr4gKyPP(gEl($MW!6ARTmys7Gu!!A z!c`n#Yh2}kmEgiy)7FH$pa*wQSk3*|8n@qOw*_@N8|;`_?m;tu=enTtjrNxamfz2o zyL~o$UXT&FFxHqRdlq`D$^Ize>R-wR3*3}kfR+74I1@#N*jE#-o<6p`0CuG1y7PHB z3pEY3&&!c?Z0yU{dIEsuN$BYHOr12VWfEGth3|w6!|YEHz#b*6*8{?3dSs)$Gt9n@ zF!b-k2HY;d%1>bVJ!oFozKbvvd0D?3n<~M8)hpxdn+QX=n5`-ByKUK$G$kJN8)rXC z7`z^~q@dhw&n%H;SXaxXp({LPpg?c7Jl6|?ICVO3u09h4X|Lt7(1GFh#|W0)&H8g| zKpH0_a*4*ihq7RgBG#XU{a=7LOV?-mJZRr!E**6nVP8OCa$T%1E8wuj&5|z0Qu_$| zD#CD2AzN1v1b;cOG~oK62kp3@%R#G0+IJGJ?oM#3*KW&nV`<_cSwG6YhA<58#Rgq& zuuTBNfHdHB;YS!4Ge_H>CtN-UTki6~W&sQnm!_p2RR4XnJwkG+JtNYd8ENknY0rwZ zcaF5%BJEuw?b(s`oJf0aq`hmTJ@0UPH}yJan&OPYJS^o2xQ*&(+LiQEQrP%};k?11 zuhC7?zNfjP8KPdQdQbUJ3BFx$gx`PoF!rc}1p z4ra3@QZO^%L3?j;+342(jLn3rO9wV!_W+icF+idku#d9!Tn75+K*lt}HPQ-7SKDoQ zB?$|IqsAW0c#AL;v#ie*0OMB5#tkikbKJ;RG9rYl!NP_dUWW*St3oE+o*EBj#0W!A zGwXHuK^iLhb{@(|MYj%R$YrBCh4q&>K{E(q(NP``a$SJ3ap2VqIn-^*tf!;^u<~U` z<(}j^pe2VhW|197o7kYQB(9k#5|p6+N#OKev5Y;0E0Dz2_=2DwI9)1d!UZTnnXhH6 zBwP(fw%qQw+ic!MdcuuulL>@`(Tq02 z&{@TL-9C^eTSO40`Qd2B3c^sSWc?l|C}qb=Wf^dyt~-{omoOACY|s+~1UvW)7_e=c z|C-TC@~YV$Y3?3r&W|+rh%^^OntMi?9g*f&nDXn1D+Kc+fQ1of5J61cR zbiGzvAXH^#W+UNkUutai{L=MI?5nw@8<~|k3rk};3;o}w#nd_0Kg^M+KN9U1i3TFk z{*h=f5-p2FLy_o!NVGf>t%yV`Bhjizv^o+U7>U+IqJtvQ+DLS8Bw81V)<>cZk!WKi z+7yWniA0C)iVkb;oeT%wG{tO%xg=#v^10+3Q+d)s;{~J3Fhze9uFMOyVa*=(RkcSo zP`Q)&lqpoq#)CvCRp{H3Ey;z@CG8VJ=9w|}CqS43YZJa9GB)y0~Fnx%c&i^=dpep zl=-{_mzWGIV1_!nf}cmQxUOuu2iMeu{+X2?bYlS&otcmD&k!z8E?epG+wEe@NF-M7 zLas9!8sV1^E-r^H4-zbp3pY|FV8IkGWA(~rgF&amo{775qUfx}WB&D(yj(5Hy0D=< z&@m4T3PswG3B~aGBT(jEe3X}aZciI<1>;zl3+u?Pg28C^Dt(>3B!m^YbmY%e~#5 z$p%Vl00wi#t<t7YI~E1{?6XsUil#*jMv%v&c+m-M;+0i`c(cQwUWZ*CEVE77*;z{8NI^nNO>grSaODGaMCK{bB3P{o%C~b z2em(IJ8Pz?qpBZNnaT)rf7jB-l3uq|#c}=Pv=61OpDZ85{Vg2}5uY8+72=U!0I32LR#B0;nf- z8>zU>t6_Z(7n~!+Q9WKReq0dlh*I152MN~jf$UIsC18ms7r?56;i{U;Lnqt#ZG_8N z&DM!Sd!Af+f{4#SFCz-8rHUQu#aQ4}apZ=4I{iCfP29xG2Y|9lHsr-4cY+J6=YEQR zfoxV&!Pews1Ht4jmL3>#*DS!3%w~Q);mRv#%k%L`1SWT>8Xi~xN1Gou^D_un#ef8s zSfC)OAdGSs!;x$A7TQ!H)}4iOaiSRT{czZZ#tq}-Xl@z9R(c`bvqM-UsKP^`JNybgq*Iua zN4Tod5T`f-Lt@<*8|kTEAx@1PC;Pl{6kF%O{a8{DvTVjjaAf<8qvZ08ge=4LBf*8e z_ax74A?ghtfsbqeBStesU;`Zb??5G;IGo}N+`~4wK%_h|n&b6w`yDP9Ro}zOWoYnl ze2N4t=`sQ`gPjK=C6Ay&r6>R2hyH~lAfUb;!O2azo?~mgILoAo8>aWr!;ocdBWd-* ztk;W6T7nC!*EEU}JUoo8bp-$>QONNzJ7qL?)O%M_Jd4}Ioa7Cr%ciWPNybMEXAKH{ zt!|$7gyx#Yr@mjcTX|mDgBgpOFO|%NiE0rZQSOevQ&~`M`*!B!(?Hci*5k9s&qZSV z!9~HD-{ACgvoj@N(E_%_=fqg?D8(Agw83q``!))zZa(XCI{?dI4k*@XH8d`NbmcS%TI3LAWFF09Li!wQj70CjO|K zlP9q79JbC52Ra+v1Bn?A&i-)|ID2SsPOi*_v*AGJ1FQrWmTTVV$yTepPgcb2aBs)Q8WKeB9j1t1C> zo$=hfbsnCsw}zi2Y*|7wZXkdLgEMBsdbMwb(W2|N@B@U66HIJ_H-raFkfyP_8 z>4a^#pvBDuOopcdY%-|aO;3QyQaf1_)H1RKKD7?pqIm{I7KGMH248C2X}97vuyN4vV$l zLy(=%;N;8HF%PqKPQ06V=>-M@6)!yu73<|pPM-gq4@nsahDcm;PQ!!SlbyJQWXF+< zr7DxCq###t8OYU;#l0w{&fythZBEbQ3bQ+9dGd3nUrjxdW*c`Jt{J-Om*`^JKeg$a z5$frx*Wv4RK4zxkIG(s#(}Z3^9?luKcf*mC5TWV!@CIVI3ZW}5;;-4S|A&U_f2 zyZjNBBdME^%a*v|nhy^*642?zQ17q(5uQuXh6y=rtpne4if({%0^VBrXZQ`m(Obxd zxhx1k2@Y)FhrN6k^vLb-V!}2-=)yL+%K-=qia0CPLd#nVE$>4wZ^p$u3B5PMYDMGj zgx8U$e1eUwb%y|49OvS79iGZYtJZ~=5w?4U&TIo_iw`^?C4d*ThTkU~eT1w8kT}c5 zYt54vjJ%4BeNX4DTTv*+M4k_T=Afw*%|LD+$LyAp`ON3K33a zG5Nq`ffW!Xb2o%H5;m8R4liEtZCsp9Je*(N08>oe#_$5dRxfl+pyA^zPGvxAm7QjwYV_LAK^8Tvz0JDjX%7_7qsQ#u<#G!NFgw z%v+~`Z0zRn9Ku#BSl|}P4L6|pbOr4o6Y^%{DHu18Zw_z1dng;PFn3Rxp1jTUP13JP z{f)y7&+1R=vvlR!HJX>yKdbXpla)J|Zy76UZmjB?CiDq3*c{v~Wa?VnUfC=tBC=5^Wf5^UJaP3M8F@=7>DR2e7~v!Q$spoyn4 z7+Rn$2$7_L%gE*3njFFy!q2{w!tIuEJ(=~W7?Ug(WwgP;W8ibn%5bLdal^r>r< zY;M7gLjWQ(ekUZFnTbF^&Hs@Kfo7oyS93svQYShM8sO^d;dhDjZo!2o7XX5p1an}q z3crW$vGGRuA;LCHC}b-gB>*H25)hdH`o5Bxj4iHLQt(35Q{2m?@}ao|#Z zx`^+J*8Loo`%8&X07s2l0HXQ}`wL|0ykEjA2--NI2ixEQYsIH)2ueV^@jdjus+&|* zC=v3ZeS`FQ)UY?^ACRT)TNGNo(47sq@YSSPn;|a1lP%+5+Pi)$yq#?75$p+1inTdj z_4fTrr8_5d!v|OZg1dfk!iHR#{#*Fi-DxsOVJ=RYlDy7zGU;YgxpAi9ZT)S1NHw9|`w50asAjz`*d;z9#LLg= zH>kNQEL7nhOC=aY%brgl!FC=EKSO{@1-P*Bl>iWxV3#o4l4IdV3ERCw1&qWPO}e1~ zYdZc)wU0WXoUQf;AX5_@SgWg-!mkpHA;JK-jdR8^#3LP8=Gdq3+VJ9KN+O>Sf|DPZ z2Lnka-uX>+m_O4_KzzhJMi2FNk=c9k8d^J?)2WLkN1f@qT7GRnEpMwF{ ze@DsOU+}ZlZfu?e8l?MS~G+XC_c?VA}lB0n)2d#TQ{0LEaq%evt&%-YTY7z+rfjsg)C>-Gr zsA}aAM#4=#E_*fdw8nOUoBYxb!vaC$1h}zr;+Gob33owzzw}}F7~v=q?t$|rej{Bj z*Y@Kd-R1J(@FfPAALF48u>%sV{Sw;9){|81I0c>!6(kC=bcs1L8zh>0iYn`M0tbgT zTo~~r0kMi*egmIGKG+|Aiip)q2m>1)YZGiZfSOhV+cO8Kf#W^_u53KO7H_{G8(fmL zUWD;w>_I9>`UykXp`IE*qb^u;&%!NP(<_v<#tK95Fa+Tb7b9X{1=+@|0JNZ;)1uCY z!cP+c142_gFeP3r;Ma%3&k>G6LL=*U-~u2WN1&{oSqSgV|N1IbL0v)vyoATKjXIAk zIvhp>Xsl3=&msUM)khG^`7xYDxLEjk!d5EOv6W6p6}m`vd5w~}LKw_?^Px_}s{q&@ zqT$=u!h6UWBpOy*9I1*%oGnX}UpCz`Whb>5R~tUkU)2xLEz%y=oYQntm#P*jH!xo_ zsS0!>)G0SjC=+JG$*Tl^O9KaOyg#+(Lsj@!KDUNQSS`$AOY-5(I8GOF zg4R!%&enO$A(g31+gt~AZX6{{!{5>YAh8NT5J5{nIuin1+l$*pfcgkiVL*WWG81gr z=)WLm>02eqVE(r~c3`dVvCwGDXg@nm$ZAl0N$(7(vI-iX;7jlmgwsPSC z)@OIb^%FA%ytO?8zH2_(#mUEpd|?v)N(opier^+w4aeKVYYEUOVIo{xdjLqhNsgzS z>v8bT>f=-w=_gFU@dH5ORdW2>0OmJgE}Qoz)f*dy@h}r${Uo#Fqg5w91C_o-O?jol zIJPz)E16)!*4p9s9q#%Ga3c3NsuENPaFOr8 zw#TO@T%}<8|Lt#7rksXMNzo)7P?)n)1}Bd)ZAv3Yt^-T-3KaCtp0Z2y<}K#J_bVrXbk+T6gX}sRSJ2@b{|AxIfIh znz@|A>o}z)rd-P1Ht&jZIlGE@%dU2=XqSbz9KOz}bC5cRm%kEuK8G)ma8Ob%Mfh|1 zo@8YTO>Coylk_vUbNL?R8E01tZ8S}+?n*%)qlq7BA}5amXrzgyc@)3_AUY&28eL_Y zES=6%Jt(KQ8?n3jF496_P?Jd(nyPslS?EtKoU!w^R0%3Tpo)BG=6LFne&mrN6e^b= zDfG(=ULjpdDQ~H;$g?$JYI#A7bk$&&= zYSQECx>4>l-X{INuvq5L?Ma!(Lw?^E-DRHMWT8aVmB{C&7Vff65w&oasxE5bMu9Ap zvrrcHE+i*;ppU2p*}E6DfS-`mb2%iRxshczpG_X4_OQ}hVr>v;I6g<5c>DTf2l+hs>6jLxgs-BB zc_E7JMVdHIvzZ1^0D%G2Gt=pnC{3IJf;dx1lawqjM%T-D`Co?=ms8N=XrhfK{#H(H z`YTO1DyWswG_jT@jsqc!lSIUU*qTg zKT}Xc0gR}jpdX`Gj?_>Fy-Ks$22lX@G_iyx_S3}WLDW8MEoHU`B&&J6#dj5S*Ccrb zPM^@|iK!>bE4}Z^Jm&C2?uII!t8wOL# zze5wh&_sS6#WtKKR?);?XyTtV(YcBmnOcV33CHw@n8c5FoRx+(!^|1`DD zqcrjQ)6|~-pjSFQLp@VV6N_nL?=#dsUq3^knV+Qq%4lNdv%Dis8YqQPQUvztQ-XHF zut#+G1o#M{dyazZ`y93M08MPAiIWu3wu^e+4TNmnp|W)wVO%6zuHQxN@(xYhq``VT zPa)s)JoU`uG;x$>yG9e)FHiuDG$Fje%l}mHReI$+nn-_=knQ9Wf^Y5qFUbvq^`;sP1 z;i%|@CyK@&G=qQ?a4nR{sBF`76+ z6IW=$Hj&c0fhGhXB%z(lI!djsFT&>pDI#3U$jH{$d-sf#Hi;6giYDgK#0!%s0luVH zk{+M{`q9MH2dHOu&?~2Df|)FrFy}IZq(O;zW|ES$aG73;=@L-kuEX~-9a%y&|^M`+>-P1vSV&ooS>(3ZlAWOt{qn5YvMTGGcQERu>& ziRVAMMd~yPu97C^PNQ~xfnNE7CXCZ5wtmy8?3ps1g5E|GC#h$4S*(_}{VMoBCd}af GF#jKymWDb2 diff --git a/tooling/economy-db/import_economics.py b/tooling/economy-db/import_economics.py index 67d4d58a7..4cc2421d2 100755 --- a/tooling/economy-db/import_economics.py +++ b/tooling/economy-db/import_economics.py @@ -72,6 +72,7 @@ CREATE TABLE IF NOT EXISTS brand_products ( shadow_viable INTEGER NOT NULL DEFAULT 0, brand_tier TEXT NOT NULL, halo_brand_id TEXT REFERENCES brand_products(brand_product_id), + price_tier TEXT, updated_at TEXT DEFAULT (datetime('now')) ); @@ -177,6 +178,7 @@ COLUMN_MIGRATIONS = [ ("corporations", "behavioral_archetype", "TEXT"), ("corporations", "supply_chain_role", "TEXT"), ("corporations", "shadow_economy_access", "INTEGER DEFAULT 0"), + ("brand_products", "price_tier", "TEXT"), ] @@ -743,6 +745,7 @@ VALID_VALUE_TRAJECTORIES = {"appreciating", "depreciating", "timeless"} VALID_SCARCITY_CLASSES = {"capped", "constrained", "scalable", "unlimited"} VALID_BRAND_TIERS = {"halo", "volume"} VALID_CURRENCY_DENOMINATIONS = {"tractus", "mark", "mixed", "sol_adjacent"} +VALID_PRICE_TIERS = {"mass", "premium", "luxury", "flagship", "institutional"} def import_brands( @@ -780,6 +783,7 @@ def import_brands( int(p.get("shadow_viable", False)), p["brand_tier"], p.get("halo_brand_id"), + p.get("price_tier"), )) input_rows = [] @@ -797,8 +801,8 @@ def import_brands( value_trajectory, scarcity_class, product_subcategory, base_premium_multiplier, premium_floor, origin_system, terroir_locked, currency_denomination, shadow_viable, - brand_tier, halo_brand_id - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", + brand_tier, halo_brand_id, price_tier + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""", product_rows, ) conn.executemany( @@ -947,12 +951,15 @@ def validate_brands(conn: sqlite3.Connection) -> list[str]: ("scarcity_class", VALID_SCARCITY_CLASSES), ("brand_tier", VALID_BRAND_TIERS), ("currency_denomination", VALID_CURRENCY_DENOMINATIONS), + ("price_tier", VALID_PRICE_TIERS), ] for column, valid_set in enum_checks: bad = conn.execute( f"SELECT brand_product_id, {column} FROM brand_products" ).fetchall() for pid, value in bad: + if value is None: + continue # nullable columns (e.g. price_tier) may be unset if value not in valid_set: errors.append( f"V-B06: brand_product '{pid}' has {column}='{value}' — " diff --git a/wiki/economics/corporations/brands.toml b/wiki/economics/corporations/brands.toml index aff684f10..9361581e8 100644 --- a/wiki/economics/corporations/brands.toml +++ b/wiki/economics/corporations/brands.toml @@ -63,6 +63,7 @@ terroir_locked = true currency_denomination = "tractus" shadow_viable = true brand_tier = "halo" +price_tier = "flagship" [[brand_inputs]] brand_product_id = "calloway-single-malt-halo" @@ -90,6 +91,7 @@ currency_denomination = "tractus" shadow_viable = true brand_tier = "volume" halo_brand_id = "calloway-single-malt-halo" +price_tier = "premium" [[brand_inputs]] brand_product_id = "calloway-reserve-volume" @@ -123,6 +125,7 @@ terroir_locked = true currency_denomination = "tractus" shadow_viable = true brand_tier = "halo" +price_tier = "luxury" [[brand_inputs]] brand_product_id = "vgv-premier-cru-halo" @@ -150,6 +153,7 @@ currency_denomination = "tractus" shadow_viable = false brand_tier = "volume" halo_brand_id = "vgv-premier-cru-halo" +price_tier = "premium" [[brand_inputs]] brand_product_id = "vgv-standard-volume" @@ -183,6 +187,7 @@ terroir_locked = true currency_denomination = "tractus" shadow_viable = false brand_tier = "halo" +price_tier = "luxury" [[brand_inputs]] brand_product_id = "thrds-origin-halo" @@ -210,6 +215,7 @@ currency_denomination = "tractus" shadow_viable = false brand_tier = "volume" halo_brand_id = "thrds-origin-halo" +price_tier = "premium" [[brand_inputs]] brand_product_id = "thrds-standard-volume" @@ -244,6 +250,7 @@ terroir_locked = true currency_denomination = "mark" shadow_viable = true brand_tier = "halo" +price_tier = "flagship" [[brand_inputs]] brand_product_id = "bifrost-grade-a-halo" @@ -271,6 +278,7 @@ currency_denomination = "mixed" shadow_viable = true brand_tier = "volume" halo_brand_id = "bifrost-grade-a-halo" +price_tier = "luxury" [[brand_inputs]] brand_product_id = "bifrost-commercial-volume"