From e1546bd1b14fce28628b11817df78eae57d885c4 Mon Sep 17 00:00:00 2001 From: Richard Date: Sun, 23 Aug 2026 12:25:03 +0200 Subject: [PATCH] Fruehjahrsputz: toter Code, ungenutzte Symbole, Dokumentenstand Alles Entfernte war nachweislich ohne Aufrufer. Build, 198/198 Tests, Smoke-UI und Daemon-Prueflauf sind vor und nach jedem Schritt gruen. Code: - AIModelService: Platzhalter, der immer 0.5 lieferte. Im DI registriert, aber nie irgendwo injiziert. Ordner Core/AI faellt mit weg. - CtApiWrapper + CtMeta: JSON-Modelle fuer einen {data,meta}-Umschlag, den CapitolTrades nicht mehr liefert. Der Scraper deserialisiert seit laengerem direkt List. - IBKRGatewayService: DisconnectAsync, InitBrokerageSessionAsync und SearchStocksBySymbolAsync. Der Dienst selbst bleibt - er versorgt Instrument-Sync, Kurshistorie und den Watchdog-Heartbeat. - Je eine Methode ohne Aufrufer: BudgetService.GetAvailableBudgetAsync, TradeHistoryService.GetRecentTradesAsync, CongressRepository. GetAllTradeIdsAsync und .ResetHistoryImportAsync, IbkrMapping.DefaultPortFor, SecretProtection.IsEncrypted. - CongressRepository bekam damit einen LoggingService injiziert, den es nicht mehr benutzt - Abhaengigkeit samt Konstruktorparameter raus. Ressourcen: - 17 Symbole der WinForms-Oberflaeche entfernt. Das Wildcard-Muster im csproj nahm sie in die Binaerdatei auf, ViewIcons.cs bildet aber nur sieben Schluessel ab. Resources/ enthaelt jetzt genau die sieben. NuGet-Allowlist: - Dapper und HtmlAgilityPack sind seit R3 bzw. R1 aus dem Projekt raus, Microsoft.WindowsDesktop.* seit L5. Muster entfernt. - MySqlConnector und Newtonsoft.Json stehen NUR transitiv in den Projektdateien und wurden zuerst mitentfernt - ein Restore in einen leeren Paket-Ordner scheiterte darauf mit NU1100. Beide wieder aufgenommen, jetzt mit Begruendung, damit der naechste Aufraeumlauf nicht dieselbe Falle tritt. Dokumente an den tatsaechlichen Stand angeglichen: - ARCHITECTURE: R2 fuehrte die Umstellung auf IHostedService als offen, obwohl R4 sie erledigt hat. L6 und die Deploymentcenter-Phase fehlten ganz. - DC-Konzept: Schritte 0-8 standen auf "dieser Durchlauf", sind aber umgesetzt. Jetzt je Schritt der wirkliche Stand - inklusive der beiden Halbfertigen: Update-PRUEFUNG laeuft, das Anwenden hat keinen Aufrufer; die Release-Pipeline steht, ist aber nie gelaufen. P5 ist eingetreten. - Accounting und Supervisor trugen keinen Umsetzungsvermerk, obwohl beide Module gebaut sind. Vermerk nach dem Muster des Linux-Konzepts ergaenzt, mit dem, was jeweils offen bleibt. Co-Authored-By: Claude Opus 5 --- NuGet.config | 9 +-- Resources/accept_button.png | Bin 1863 -> 0 bytes Resources/add.png | Bin 1815 -> 0 bytes Resources/cancel.png | Bin 1713 -> 0 bytes Resources/delete.png | Bin 1886 -> 0 bytes Resources/diskette.png | Bin 1555 -> 0 bytes Resources/emotion_batman.png | Bin 2708 -> 0 bytes Resources/file_start_workflow.png | Bin 2961 -> 0 bytes Resources/money.png | Bin 1168 -> 0 bytes Resources/money_add.png | Bin 1629 -> 0 bytes Resources/money_delete.png | Bin 1631 -> 0 bytes Resources/money_dollar.png | Bin 1721 -> 0 bytes Resources/refresh_all.png | Bin 2481 -> 0 bytes Resources/stop.png | Bin 1173 -> 0 bytes Resources/traffic_lights_green.png | Bin 1673 -> 0 bytes Resources/traffic_lights_red.png | Bin 1643 -> 0 bytes Resources/traffic_lights_yellow.png | Bin 1673 -> 0 bytes Resources/warning.png | Bin 1904 -> 0 bytes docs/ARCHITECTURE.md | 30 +++++++++- .../KONZEPT-Deploymentcenter-Integration.md | 30 ++++++---- docs/konzepte/KONZEPT-Modul-Accounting.md | 10 ++++ docs/konzepte/KONZEPT-Modul-Supervisor.md | 8 +++ src/IBKRTrader.App/IBKRTrader.App.csproj | 5 +- src/IBKRTrader.Core/AI/AIModelService.cs | 24 -------- src/IBKRTrader.Core/Budget/BudgetService.cs | 7 --- .../IBKR/IBKRGatewayService.cs | 55 ------------------ .../Security/SecretProtection.cs | 4 -- .../Trading/Ibkr/IbkrMapping.cs | 4 -- .../Trading/TradeHistoryService.cs | 9 --- src/IBKRTrader.Hosting/AppHostBuilder.cs | 2 - .../Database/CongressRepository.cs | 28 +-------- .../Scraper/CapitolTradesScraper.cs | 14 ----- .../Modules/CongressRepositoryTests.cs | 2 +- 33 files changed, 78 insertions(+), 163 deletions(-) delete mode 100644 Resources/accept_button.png delete mode 100644 Resources/add.png delete mode 100644 Resources/cancel.png delete mode 100644 Resources/delete.png delete mode 100644 Resources/diskette.png delete mode 100644 Resources/emotion_batman.png delete mode 100644 Resources/file_start_workflow.png delete mode 100644 Resources/money.png delete mode 100644 Resources/money_add.png delete mode 100644 Resources/money_delete.png delete mode 100644 Resources/money_dollar.png delete mode 100644 Resources/refresh_all.png delete mode 100644 Resources/stop.png delete mode 100644 Resources/traffic_lights_green.png delete mode 100644 Resources/traffic_lights_red.png delete mode 100644 Resources/traffic_lights_yellow.png delete mode 100644 Resources/warning.png delete mode 100644 src/IBKRTrader.Core/AI/AIModelService.cs diff --git a/NuGet.config b/NuGet.config index 5ced69e..7e000eb 100644 --- a/NuGet.config +++ b/NuGet.config @@ -13,10 +13,12 @@ - + - - @@ -55,7 +57,6 @@ - diff --git a/Resources/accept_button.png b/Resources/accept_button.png deleted file mode 100644 index 7786ac77ea5918f5ba473c6cc95738ba744572a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1863 zcmV-N2e|l&P)b2BH#r0<|*lC2v%Z!(?Jzi$)@oabN|DRcyaVB1Jt^Z!nz32Sj_iyL?N5VR<_LorM zs=-Ofc*c^jKlfge3dF)S$-sw8(|G^ezhZGcdZo3#KlmDUC>6Niv}0e#&pOat>%;b{ zI#^~Jv2+xPRD>joXmSB#;Sgq`QH17_FirF)BRKrkX$+Gd>rMzL55J4QIUIQ5kB`2L z_C4)b)W)G9LbKAaEE9%lz%UFV1EjSS<`!oVnjJ=P_9lWeF-*<@rjCE~y^0q}pRo}F zwyx6%9Nc|R-CMtY4@>YPZU!+CzJ}@f0n9~*kxUxG?Kv$Dn++barMV@NNFZyIWtKrG1JQ4 zY^sV{&qL%PJFX0WiOJa%CT21D=__bjNn)iM+ry_3Jl=V9>tpvmj-)bz{*nJ+bh00c z0?1Nn;9H1T88Vfw7IE|T^$fVYKC4-1eISbgoo;$I3=++cB>Yg+6n1Ufi~1^{ss-m6Gf$xDepK1* zXl>o@Ls^-OA4bmI88{)PsMxyq_MoHr4736gGqJDHShWw;9tnyKt<8j)BcL>Q;>7N4 z+eECVBR7!Nsl=2!04K{2wVp+z=MeU9J%uf0KH(7_qgfh}3!%Eg2QPVf$AdV5OlrYy zbK&XDo7`|Z9hf2lB8fH-Z(8*-mhbr|c5XhF|8{iWWkHMwvA&o#iYiYd+)nbp8&5Mf z6L8Ap5|3Mk%jrfm5fm<4X`!`-<=w3e{@WsQq1ZQ>u~~gdEd+1*RzZL<1vcGO9;_P) zQNJleD_o@i^>ii9}wp63e-IO{ABgYkGc=h%Mc=xO~`OdrBnM zp4BqrF6RgD^d2M7j}X%#p0|KU2z-#h z*>dGJD`zPJ$htIm}7a1NV|bn8ZnHmRS;h;%TL7>p%> z+2}Z2YF&Ok=LEVqctj{)?GoUA0=KPVIf+xL!$NEd%Y?<4jLih}*fe_L^l~OThH|wj zzn1eJU?+vFd?;F)1iu&Hx!rOVqHfY1jsyh(#$;?Jki78;K3-S?!b<@-P$yhvWxc=_ zv0F=#$b+k^Th6*Tw5)rUFc^z58Jh{D7Xp~p5*Q9gEClBIQDg7S*Lx9(;o}&Io)_T! z=7zddgh`sHtc|rP_js;m<8%84~oPcl1e7 z9sFK^uirq-@rXBE442V9Fu^5xFbNzt1IDvTG&(Unzutzt7XsPakAuSb5@pJ$! zTe=7(g#_krJp-)aa&}P#SuVhbdZ}ekU}he3m)^#+yiIWYSGHsv3e$fHpH?5lVGC*3 zA~h1*JZCiC|WIn_X+T^Y0Q59I=X4Z7|CMR=pq8_ zu{1CLLznPb%|RSlP8nrUYNH%-85-Q3C{wnGlOzPp~pyLK0vxRc?% zoJEm~C-Cyh3k(a_c{+~K>;J|ZlRu!JK2K$nPTSDYjKoDk_M_TejoQ73(OtP6kEkv* z-*Va`O?n(7kuiKRZ~;BbVNvIFE)v~ue4|IR!tb^$5jRN%mo-UQK}TI!@(Ge?Hp!N= zz}lT2PD^>j&TUk-i;_x|y`C+v^zAHOdHr920RUAB`g1}vt~mez002ovPDHLkV1kDI Bb?N{B diff --git a/Resources/add.png b/Resources/add.png deleted file mode 100644 index 60a7a2910eeaefb1c1d3ec231d08ec1312667c73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1815 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 diff --git a/Resources/diskette.png b/Resources/diskette.png deleted file mode 100644 index 3a9dcf37ec21415647543eab105dcdc124734cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1555 zcmV+u2JHEXP)?^ z2%;b=w1PtMK_Qq6`eacwRwJ4Q8^y-Is!u)$27D2rLL>CSB6%sb6-%oiXr7c36;X@$ z6a=Lp+WfU?kTm!1%y_;tvp4sKySF42x?%2ac6Yw>oo~)Lb5?op>3SXsew0!;r8ka$ z`B&zt52PIP;%hl?mLgC!|0F7$VaIrTW_EnfAV13FrKkXm&%HCfJ|rDAFRg+97maiYRz4tU*D(sbX) zbJSikRJD$Nd;T_>_`38kKW^u-tmC^SD6z_xy4q6mXD6wBONkQJPBR%9iK$&H8FkN^ z+*5K^f&naG0vk4>>Raj+kQJ+1Pi=`N$Ho9)v?0Fa>y#9`<9MR40eI3{%RKzwc#mVp zIa1ED3W`dM$7*8EH@1!c92|>dX4~{;|-Wcld?-yXlz=I

0ykMq`Y4{8q!E{{~|sxdD4#g0bNzcnK0& z0;sSC!Je{LPrrDO#-16hTPDlSTN)aDi52jIB@VHb)m92v@1kLnLE;h7kz=QD$;R`# zp=tyWl#u(#vCkUb$(KNiPjn`?K}7^AhyfESSE@rqV+~_qQ!ve7M!2yNCCdVXcn2mt zNI+{cF)IRAs+BAYY&0i;^|5$SOSC330mcmN-}?v+l*=OP$jfig=#!60u0!rD%V;0p z+rRfwDkCE(q@?967#@2)WPvOJibO1q$08VP77kol{{00*JLBv#Pin!#;cHWfD}S0|&&Bhoc)TDTvAn548r zS$nk@$dCn0kL^+i6PWsAg&w@M{hIayU;r!SSkOM$C?tSqk_9}mlV`m5{XD%p?XQUd z=|K%btEMJ*i6pSklzAZH=zxRWJ`k-->{9nqNlj`ZWTGVw7ie zu4&3kz%3gJR+0*6=zt0cD7B7&5*x(?_zxQg)fAxE6(yny&IaujgJ6$$y_MD|n8 zSB?i4n$9$I6Vh-C@M>9;JXIt;sm6eOiW>s43yKC1E=VlIMwt1ljfeZXmGV#?6b(eHd z09Kb~r{@lhyuz1P!mcSftWv)2<8c#@ZfY!6`LV)dA)b*GT|7XxZ37h=--8!<{2k9( zPC&j7p%_#xm|Ts9sv%KDGf>vsGnzyR|_*l9HsN^<}J002ovPDHLk FV1gfG(G36q diff --git a/Resources/emotion_batman.png b/Resources/emotion_batman.png deleted file mode 100644 index 17ddd8b58f01a4784268922f3a17ebb3d84a1d69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2708 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 EKQac8@&Et; diff --git a/Resources/file_start_workflow.png b/Resources/file_start_workflow.png deleted file mode 100644 index a83e9691df81daad621928b7d48c2213f582232d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2961 zcmaJ@X*iU7A0Ert2V*(1Ph%&uSO#NfRF23_vc$~D#4Kh;28FaJWZxZY+M^>W`;yKP z6;hF<5Xv$l+lcUvPIcZ7Z|`$m&+}id`@VnM{o%Rf=x_ieAR_<(06?|}G0yB2vitJ! zu)nm($QAY?O}Fu+yO0Cv;r>)Sz!FCez(Z__{>Smocz;|(XeZtT0N{cWTs`TY_J`0| zG7;v#i-9qS6gC?GFfnIP{IS7!IwSypoIo;#E;O`2Aq1Q$)I;AMVNbEf2N4cNQt>X4 z4zAe9V5|`iYHkKGVW8OpL_FOe!XSo_XlRBh^qVf4z2CitLm}TF^k7ryKS_DoJ3_3< zR6IlQH zZ@&LinC2Qm!NZ;LG;$af%N|^y(rzdU+M0^@r<19!WOB%lE;10|EnF6tP(T5=+ z9t0AO98UX&x3@>zl4x{)5*BZZF@>@fU<3jVZE1kgF|xKqpo}c7kw_a|OMQes24!Po zWT1z_7#Ldr;9|(wFe08r|G~xm%SHZ@yK4m^g&i4#rxH%$ar>!cBIH}iXu>aZF|zrk z-ghqUm$?}2|0NgBP6oa^*#8>zk1Mu&cDFxm%Rc-xKAyyOJC$u~SzTE$0Kf;d#aOyB zhRQvn99=(3nujmEH7GHW(gREUmI~=jhT8Z{f}nv(c|*!Wd3rDDI@q1*^1=rWLr7vx z1>H-0c(z>R+Z=sl{w(UJt*0ROz5%`&0%442JS6*^wdR9^W-FC=CwyJzm4i% zU=KsgRDd64w=QkJGAkCjbxRZ5{^-#{ zc4lVNrKqR(YP>m}TSi6l4MB}-L$^hxq&!@_yed0Rj}t(lc0wE;uC9#^qUGj)u?$Kl zxl=9H6C_g$8u*u%mP)Eh!9qM-CC5>7t5RM$Vq)M;e(u`$W$DiwA&pWB;AYF)udTei zWRz7@%96RwHkq_NGBR=N>kM@*t@AT^gd4^_yw$qZiiM^}A1bb%J`7!K@%}rSNy4Pp;3-YH}m2gXi@3NJ|41Iip@|O$T4}tXnz*e${b8bgHOxrF!jw zZ1KceYX;xG4;(Yyg$+DKPoMN=X6IPG#B7uOcC)}X5>bhW_6=L>I) zhRo}ojnv!ICkD!t<7gJmQLLi5tgI|)@j%^`wY4}9cIdc{JPC<9{RHsA(L_B>-S!n& zT0=MSp<{8uY~R)_-=Uo;KA<#IMDEr$DXf8!eRa)@i=KW9DU}Gf}mBqOBma}={`mLRA5dQTu?Iz<~0d|h@OOH;eNd)NU z8yJvA_y$_)IVOEm26#XA6dJWUd?G!wWBF|KZvc$-rSk)=f^SA=^w(@rK%P6%LWbwX zxFzz?La>%q+MB+StOI*S-?84pSYxwV&?@4jCm_#iek&m<>HskBdzbyyc)L8j8Rn%ax0WK0xtW#yl>jUmn!qvij(8n z#%F%rca-rGdIV&QwQ*z+BJF`r9ar0E^M-KDX%J-^=2wcv2(pl}VBX_n^xlI&$YGoS~&O<&A>RY&3^5pJK!ywaYaR7(& zCAmS$_pg~oJ^*-!%;VJD3N(jQHqVJC#15bh1}67%P6P3|0%> zZnkHDYpm0DrS@8r=$OTZW>#d5b46tD(O$E0(RYvJD5LYABH>Wzdm!_|G34R*go<}*t6_B)j!x;yvP#vxq|6CI2Yg@&w2e&PiOa+bE>L|gK@9h+9xNKMI9ESmK7*r z;o)IpQ+;;U`&&A>2M3Roya=L8N*b>Ln^?W#==MUBbemR{@&g;VcxIZT@%eFE2vGTn;J3y`)8^yi+snQ!~b; zFw;+;i~w5sbgZNR`rX~#XD0OWZ%k%NJYkSbO&T_&gMxxY)%+el-3kS8UU#}Hu3OOl zK;B}DE?irvQx|f#(t;NV1R@Z6eDmSxl84uMjhSzhg>TyI^X`w}EWH+>*$|W&HZ_$M z_5z7?BFxOBrlta9b#$u|ZO1-5FX-*>=W)0b%xz=Gv5yBRTyZ4VV32WnbG(0k*w8%L z!sED_YDvV>NL{sC(6T~;3d7kqWZ!i&`LpS@#M_@LZcI<#dR!B%v3ET0^=%EgKTo)Q z#b$s&ca*MNL0rUc?AcBqR@2U|e`1NiIHx4O=f^|D=I z*~eZo2f8(t7k5tO1I596{tQV=afEZxt5(ySK|5NlfGLi7CcWiz`|eM&t&Ibw(&|{; Fe*mCs2hjik diff --git a/Resources/money.png b/Resources/money.png deleted file mode 100644 index c8c5a1171271621b3f25c6cd25d9722e595ed6c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1168 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 b{|Ybwxpr75L7Bz>00000NkvXXu0mjfcV`zN diff --git a/Resources/money_delete.png b/Resources/money_delete.png deleted file mode 100644 index d1a9cd064e20ed5e2a0f438574b51f00fea86172..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1631 zcmV-l2B7(gP)$vLI@}&4pzN<;A#4_v{7%)Sif!M-p3X#ubeTp1dij}8+S{IrppbL zYMZ@x=WBAp0NXC=HQBhF0iJQ1JfC_gmLu=;W??Y|V#tOF00D_Vyg~F>g?1LAro~3_wUjz#&dd$jODz^lL@s ziQ!ikUDBn5;nOt{Y>XZ}09x$&{%i<8$4jV=OTt zFM@`a%P>q*Y0F`buq^Lb!Sx{PU|Y8UFof#?({K?>T5Zs?`a}(4eZ9!e%tFN@<(x;f z+Cf?{qyY)9kaC=PjOV05WHS^FYuP@M%|ykra@e*_x}{D-wq=M^4-g@2ik0EHjmd8i z7)3Q9kBoC|kcL~ce6$0T812}9lZ|)Ea;D#e3>*%nIYcM`i;zf|Bhh>w{h#fE)!F76$)AYuf@LV%vK7XTchUFuE{Ivd)DTd-g^f@k4Q4u# zgi11dLXszji=kIZIe!<=e+-ve&Y`in7K(O~)i!|QmI0J(-i*P6pCH+Kg@a8V$aIDJ zbd0cBPd?^6k5-Gn*x9s&jPETSeH`YQ%;%DP6Xx# z14s`b`pSM}J)VOqPdAj57BH={s(-nyOmF2pi0i*<&kX^%@#gcp*V8kSazVM9<~uoe+7a|diP^z_ zzm)KrSaj$Z(gp{qU!~qL;)-^sEytk(WK(JyRJ8inE{C!#V5B#7x|({86N`BqaRKn% zEbjIH(o{^Ty4c{&xshyAPU)#b`A-VC6_c`~E7prX%dUf_=KpVrn$F(s1)ZYrM<310oRS>qpFXLuP=k;|2OB;4gf#d@L;z|V zn$R5UKeXk-m7OFT9SZ<_AUFqp@2*>tl~H`7FE%ZW4x~^x3>gRz>3rJt-90@xcd;2w z-F?;TYAOIs4yfKU=fFXT8zHU?ZkGQxeyp&Jgro@iJf5Y+q dd;XUI0|1|8ZbvaROuqmC002ovPDHLkV1f!D6(#@x diff --git a/Resources/money_dollar.png b/Resources/money_dollar.png deleted file mode 100644 index bab8f07963bab5540954d423c5eeb50be938748d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1721 zcmV;q21fabP)*9Fo3)Q7*d`hPg76`pp5~7Mu=dI7=BcuCPEA(qJlgWh&47^2%uP^AW&!kMIzKf zp+HGnpxw4x`e56#?RIB&#&c()}HkS zpkEf~X7F!pTdRL15>re^i6I(rR41c>;=GeL%NFqa5H@eLR1|u=tVY1p6TTQt&O9 zvOz>hhy}K=VE80I>Z_Xa>9%AT059-y3fGEu*#i?(t`Sp(BujYE;Fi98`{=?h3b^S@ z$32@k(mu}?J76kXdVK%Ilgt=Kqab$OuEn*}Cr(CXT`73-dBDsHo*p<3mu?imSzUSV z(3bq=o~AaYM9>KrP7+GuA-PA=prJMr1>|Y8cpJ&|yml3M2}eY8VfpMexOD5>^w6!= z3SYbTtmIWc&&vEckCrgvnMwRQ2-UC!GIlSm9g-YJgyTEWvsqF7hz%cvF@vUoC)eDm zEXIxULR3DuPina>d*99dKnKugD(($Hbo$0Q+fqi_SH{~TDebC{fnX9JISdY45*!i9 zXl`}mx1xL$-@6LM$F178Ave2gChRW&=Fh=zZeM)PF)$)BE;gJPuV^pn*rKS4#tAkD ziB=>;4n<1b7}PdabmBCaxDXu7`v#2V?uz zN=seRt&%DtwEShsu#ymARbC-lXKm%uW=|8|+OZ5V5wS=eJr!k* z7s=oMaGF(1Nmf`%t}_aN+-I5-WebDTU4p8nGDHMBkQ_eD%RUqu%NMzPFOx8vs!-3HGR{0cfrhp%TH|ZPg@ITHFVl!?ZOHE!Qe$sW4Wp)AfLZgD>H&126_Y*fdoV#<*i;H z3XAR|Kc^sF4`Z*9Vie&>jvhCA<%ExHF=11pV+J55DhzQnGa!CS%bj7z2TcCR<3okB z9!E?0TOv15BKup;DS^w5>7MgVlUC|GYWYg_8fwU P00000NkvXXu0mjfC|NO8 diff --git a/Resources/refresh_all.png b/Resources/refresh_all.png deleted file mode 100644 index 0f4d26174d379a29111a9e6dc01919fd8c5aa06b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2481 zcmaJ@c|25mA0GRbW#VEG$7rZzX3j8}VPY7&ku_SpjG4m>vo&)vwu&q-k!+>#YNHa$ z(rqDSyWUD4brsqyEjL!hpw_@ULLBQ4q3)qS! z{}dJnCki24AS4#-5HY2Li#A&dB_z9wAOAw{rzSH)|Krg+QXZ+SuC@iS|@? z+hs0Iz}&%u`0z59^*7h<*fnTJ`z$ zNE>8fhP?8+s{03hRI5ej={`Qae95D$^9wN_c>5=fjdFI+#*AF;EB{(PeJ%PBrz|qB z21=eMzhqQ$^d~IxOpCHnSq%GT0-lIY=i&^cKx1 z(~yAQ@88dUTv4&BczD$+({RA~eO?ujNUXtBS38KCnqJ)9N?Dm|9AIyzwZc3J6%eBE z%PGq-(dEbynR;1--p#~lPGX|nJUDo$@ZbmKec=ol{8`WUTboX2_D*&#yx~5s)jHw2 z);+e_+FJYbo(Z}38RFzW*iPCZxcj^exY}r{F$hlGi;k!n~g6&y@+pBQ&CY#$aj8&wXCfk+Oiu#S$r0lEHf8F zYdEHSF?)Neh`m=`W9#}T?)HY-01DN>P%k}Rt-B6oofY&jLK{%*MqJdjM&=_2wZ9T5 z^@Y}%c|FG`h7#{b?9}oo{k#d~5WRk{WU?qOu%l=SK)D!buU6)OnVB)PlVy=qOv|MI zWx9c$bM0A^j$>*{?_5V#`hKo>GA*keRD8;F(lQHok}D^3$HnD~pJrdScd*B?p!ulr zh}yT}0rPtoKb_umX*%faZ_L@PHHX65h3HY5M~q<$tckM4=RF?738~@0?BI$%WxbvO z_O{l|`!JY|4A=#&+qXF%R5>x$P%C`tRESg@$ouz$o}Ks0N;6|}^%ujS&Vd`s8FneA zPrbh$Rb$cQ4^wlMpS=vyi{$sS9)3Xv6AxVfqh*dvy8Xuk&6yQ_#L}qOt>;WRl(g%5 zD_}RoSPUR zPtM%h%C_rZ)Dfz+yqN)`RzTEpI=+ftX?;4bswn;ormnJ8SCP1(^=W(ObaA^;`$0i! zapp;`o5r91&l=yxOK5EOP51s8RW9KVpl<@C1#g_V!hY zrdGo70J)9V7PDha^^wE~jPu6l)+ufF3KjxxiNg53ed^i2su!8GIM$0uiJMld*$LzZ zLetb|oiO<4B#bhmFVWvz5g%1OaT%>$oSjx(GQIcxZNHIq^|9d9(Tm|W=M*o!#WgU0 zce-Pf#SfoWuiSv}-Tx?@Zt?KlV)6bnXQ(KoW=l;_eW)<0E$4=8w;?(#ZL+$+K}W%J z8!n5&@<^Id<=)zCA*q)bD$k{vq)Mp#sn<3d7sfbnCl_ySh#a&-+qLF>>ZHiHGo#3B{Mq~(zB)zaN3 zQB(cE19n`T!@3W*>v}m=+7}{Ot2qn9BVSyyFP$ak&_~uH23`RH`u@FBUh;0nH{h_A fMWs(0Q)Lj~>Yg#b#uUubPn4INAMLD5+V9 diff --git a/Resources/stop.png b/Resources/stop.png deleted file mode 100644 index 807117fc6468f1df68ed60f79796070ba5f740a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1173 zcmV;G1Zw+Asa3nA^ae@K=c%PZvJI{XDfNdbWLD%@rgE?pJJ@?KX2GxiAk53NH0vC+}9~fiS zto_^mu;=MXF!rkd!DK6b)hjLTss{dhZ#35Sq9XAp95i-z)c;5PG*2G4KVRL zL!)`Fq1Ehx)ZA?2U6aQK{+@2HM1oZYkHk6#Z-o2@+93Vy5H7Qd|DmkyniUpcMV>%E zsV>O&or6>&0m-p{;sbw`C&8+L2Rb8={szIhE*Gv$+akcYkVI3*PeS_5TUdJhuq+8y z&h6o^hC=>m7v#Rb4uEb3mwPSlTNsR+lEm_{K1d;nm8tPfNvvPdJ@Rohw*ShtP+cSn z+Rd+b1inUsqZk!P9_&R=Bq8-|IzI5{R0#=I0)D(J)_Un`C=l)de(O6BvP*t?s^iqGzt@?1ct@TRW&f-9qB%c4c?Ki%F0s=KZaZU0H_QtA*G7_r_aD)*cj0 zL+z1|zCIU5-x~8Uqf}-Ir1XmPrYN!at zNu1VWjjJFn6~)r%EGbAF$D?G?j0h)@<)gicpk$(3k241hN>qL zP7?slSa%q)yarU1iPIjynm`(W^&t=%hJaxRnA0J^Peb3t19+S&7y{`5aE^eA>kBiz znFll}K;|$3hGFK0QJMwxVCtj+6}WW2lNwND6T?cffKo%t$r@nQD~DK}iS<#uoL3xw@J9dI+OHR0l{9IJx%Ur!Rn1rVCgsge8C$ zy>p`H*Fbw`(2FD@Di$RoA$Aj7z@sP6A)8wTo%6)W`xB?})iZe+Q#&yN1$VlrLJmADO4hJfVf_a2`qsC~Ovv-KqCmRq}xLxRMzf;L+T9JaV1 nk?_dob$dfYOIN#|zY|~pH1*!5o)KJT00000NkvXXu0mjf(-|po diff --git a/Resources/traffic_lights_green.png b/Resources/traffic_lights_green.png deleted file mode 100644 index bd53d899900552b375c11511c23fae226150da69..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1673 zcmV;426p+0P)}2tKGmAxgm_g<@Kz#6(jQGrig? zvB}^~IeX^&!=jSTb?mIGnuCBtaox9P}+=`3@lF4My-u@^)`0yi?m6c_EQBHpK zrB6&!&bscLz&3Cvd-gsnMg}z5>5pg6U}YtZpSru@mH@`b$KdyRQBzls%F1eGluD)0 zd+8Fo&!0zga|@Em6x!O_R3Ojn-3L=LqiHVudiAnegC^M&=catqri$LNv5^jy5tV8e z3<<{T_2G780i_#D(cIdqoI1Pk`FtpAe+(nxFd~s#D1T(LvY{;lrY;A4=dPI>K;pAc zKRLSp`GY4mmXvhBuD6jf)b1k-5j^$uQ*e7cs@|&y^|o%^itB@esHmt?HvBd@F~Ndk zITq_Z`@`v@Tw{%0P5^O{DN*d2pP%oI$K%S0X=YTzRc)!jMyaVscI@-}*9gCHu4+rA z(zR?{pbz?@Px`jkC>Q{{^_Ix^g$vzXu~_sMHcrMcRSg@0jVj%KiY&TD7?cQgsB771 zpbz?@Puq9;UIB1qvO%2hKCS|gX3}I=b+t9{2Lg95?ug7$hq}r}Z0Tdw;+eZ}j{L(3 zB0wjsw_D)19E}OQLb!4BmW^8n)YhM>%1r{-A*E}m&Q}U^g%-b808S8!6ATgE?G_X) zAsik?Fc_4&2Ne7`yaLN)BCh5lqC;K7AtdopXz@Y;cwatzB&l(GvI8~|JDMcq7RQT= zOE`D#9HytIvPfXF)z;Rbp&=;2c#uw~l?}(?Bd^X91^oB*sgu6d98f5L!1nDsdZeK` z>G;Z(%L>Q3+oIl~p})Z3f{h^sP1U(l@5sV}%>9YScRZmMbAsEsbC>#^OeTAPlYwFa zFy4Fjonr@IeCgwoKuL#1L?%44`|0Uvm4*8HhC7^ZpCM(XrI?)j7gLjyl8qWQN87={ zYly{Ty{EtX_85KVE|w1kiVMV`Yi4Ff!H~{$-HjOuAQTEIxcOE=(fL2;sH5wiEdSF7 zedXhTLIDt`3xv+ao(snGe93U3>Wg9itEDALV*RT zppXm~!m1N=&9HS8bj|Ep@nA4iB@k9~3A@!xr^f|)JaRRxy*se+cvM%Em*d9#g0iuB z;J#sqe3u8Nb47O5+|-20scFSR&i%#OsEPWzT1-eII%O+ntQ!EKXTXACbUBK-xj99* z>9k2`WshUGTT^q?p)PHl8`J#;poqxYp~dO4afJfzEE-MVkL#B(Havz*%F3+n)e&k5 zp{XSZkH;$|GL#LIKq9iT@jr=ZV4z=dJxPat2Kok2))K{m_vLC+VVOtgOV00000NkvXXu0mjfrRXrd diff --git a/Resources/traffic_lights_red.png b/Resources/traffic_lights_red.png deleted file mode 100644 index fd00be29e74da07a198a59c068659d27d4ea1406..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1643 zcmV-x29)`UP)BTxuwlx{R?E2K)4 z@=(V~<2X+2W^ug5p5c6FW?aX$6Vqm*BTwd@?VfwS@7}8zhC%kDC<+xl+P>G`ILiZX z5$j=G#Ni-CRrC7rVdQdT=(_n1pBOWYANw!-a)?#3#g6T`N>Ku?!|%M8ww)lr!omXe zeSDPe-1&zb2+DFdaF4Fuyg{MJjM({`n`qC@=joa5&60@DvUTgT^u@_9slL8G?+bF~ z`|sRrlCk4zMTynudX9GQd4Y{|ndz_n7if7oOTP^akfLey@5DI0!iraF>&eyBB1Rb= zKRP%_C;5GAXBTDD8QQXC3*|VGU3>OQWfa9h*REcY7%<6~xVYpSHh4#Z!9b5xgcESE z=$wqx?WUReIeL{VaEgOlb(9|$e>>fP4A9Oz3VmWI(dIo*&o?C9zuipR-FAZTiZ;2XxE16|Wb zA^3nV__TayS4#j-E}z8j1IHzS9A=}?rj{1Us0_ixk}QLfPKn?h-!KLp=)wlJ@KF#v zR~)QV0)VT=3Nru#*r@ z&{3}SqF;@8$5>&zdH>S;O~dCXWWGxP%Z(_ zwrx9x+-`R-y7=2T<*(}XPqjWbmOWSumC&6?J`#YH- z@t#hnhltL2DoH^9{IgGw?LYA5SJj^C9+QX+a&oY#sVS*KTid3GoR4&vq#9~#X>#&D zg(fG-=WCTQ*xtHzlM>0q$hn_?ItJgB^nh>y8}x<4VS%Ax^+1>t= zj!A}Ao*mG5D(?l}h6b96#>B?rf&UFdDs^~3IhT1>-AuKUp(#OveSR?~YEYZsM-$wL z_Oey-teF6yr;`c8rT7v>A`$X)mxJpWTB3snR9O#W(19*&VEZ@;2oaexG&!9oE-1jv zmXayDJv>bJgJX<;v$6=-&Igf>jt+7&wTMV5aVV{0*(^j<<>>(l_4f8sczT+~ z0s+Q#h#DK4A6aAA&dx@twbf5u-QCp6yW-H$5H~Mx$*ClW=p$CU$Ff*>D6Nc$P%6zy zV`BmGaR8fuiUniPfv#aC^<+eJ@sHyUtJQHn^msf}Q@08c@fdWVE6&*#KAwz-ta7RB z%GYK= zmq+&Mx{==(Mz3GXpLiZpwj+Q4vnd?5t8{ExA}V}9N*yeXmG{dEIL}%TT&(nVT&hB# p&#H>Ms&I!kuVKm6uIK*=FaRa+Pc+6LW_$nu002ovPDHLkV1g6w4DJ8` diff --git a/Resources/traffic_lights_yellow.png b/Resources/traffic_lights_yellow.png deleted file mode 100644 index 54034fc0d3e5ac50258bfbdeff5c3871dd75095d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1673 zcmV;426p+0P)#hqb8~YT zc;j_kz4{kqS%yr3uSLf2$HfbX$8QU}mKGnjZh0JC!F5n65mi;u-TeqYKKKdh>+AEr zSPp&rjf+gOR$O~gVyk#1+qUl@BMlO*^w(oYp(r{077D>m2~12x;dVOF>TgF=Q;RUl zX0r&NJc-cYAcDazWHMQ-U%y@?^2GKY=(IDEWW(7rr$h`k$!~G-mNztb!_jD@SL}$` zY8y04#_4q7PI3lywRH%tTPK`at8lqosPBFhk+Cr(le1X;P@}M6TTYmDd9d%|n8gV! ze)+}cdv`v&>$BRLnqHXat*M$=eR3v=&5vz{-Qf`DT{u{8!-fsGG&%~e*C%ZF+l|Rd zK5#6gQsHAiAKA+>me>^~kS3WT#eqa35l*Mm!ilb{qTqbZUewZ=I%vf%w|j~3H=gq~ zHwj(C#s>DmzSt-GHe-}cfU9+uWMXJ2G>}T&{hbR()pT)&YXTi&yWK1lbct|MB&@@_ zhK&UF!M@n1={r{`0Ul~TiNVl*kpLBwM62?*wZiT3EDvr8&9M&a3LCOz9|ghHWjIIa zVI|>VCw$&^g5Sd36v3+#x2I=K+*+VE{`s032(DL!t|ls9DBLO+yix*I5`q&n64`F2 z3ZKWnW7iN^6M)lQLvYLFQIK6si8)kdT?g zrOP2iC#ImN#?l?Kgw75>f}LyNAcUxDPT271-}6eGQNVxS9X{kL7qr~yYlh21^+Z9nMGBrV zgn#olo?{)!v|(HJVZv~x)UCK83=I@$q98jvJ1Ec%=yZyjzVzyrBuY|K3>}89p1&*Z z4~F6hh}C3bw?KOvlzAr{Tt~W0buF26z}u}t$v8=;9Sh00urYa{A`ES)V(?02SrR)q zlG{mjoPnIp!Io8p@NfPm=17Ni3;T>pW5opcVxd!ponV+r&Ee#@6UWt;AUPW#b1)MA zeO%j(FwL#~j2F;yC6iHJAWx(B!fWU6eY*xcd*z6wR~)`SKnx7vWAT_Y0u2VEWQ z)HfJcHQVqeFcBHMagRiF{`@(?_1q6|-CewJ7CA*ldsDsW3yq#o#cb?4E+=kc+qNF+ zpp^Xmuo4kTC7RMYk}g3+Zci_hP+wmkV(~b}BN4*&6t!Z_%g&f>r>AeBwbhTc!5~^& zS};633>#m`i)kjJ*GTOe$$Vi`S{)JbR@ogGACI7o0+hRsd5(2hS2vToKO#DDe80_X z)tOv8blgG*)kSGRm5cd6TZ33#1=%mms^VGYy1lS>;J+Jcm zRE#d10G@v8NkLBHtf&JTk4_*;!MQ!NY#u}cdNz|8895#9;RmRN-}C3rmVB64?>~#e z*|tK(mL;OX!K6g@E1IgWmnCqXHX%4)?d!PI4l#YYtFEeo80Ir9UFmuLp8x{@X(K}f THVBz900000NkvXXu0mjfH^vzq diff --git a/Resources/warning.png b/Resources/warning.png deleted file mode 100644 index 311e72652b2e264dc48791d7719a8f8309f5f345..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1904 zcmaJ?Yfuws6piRmhKlkM5vwkXVo{UL1_ERuJd)*+noz(f4@C*d0uhp3vl|kksKKZx zh(eWusE7`zsH<&?z#87-|V)? zh%gi$KCVIvAhqv;VazgCv?moymuqK6q&NG!DkPo{J-4aNvo;7J%DQpr-VXiTQa zT+@pAGZ+&=r8Jg`m532Ju42i|7?xf|&};_7KTuD|-Ffah{*CVum3ZrCzUX`vU5j`J#r;E^Y^ELzm?;unf zANL~U4`Op54u?r2m}I7!lIfXh(rruu#YnkE zNl;2$4VV>WNw}8cgS69sQcw{eWYy&RGSLNt^fCg1S!{DkV?c@I|Dh_?2Q*1VV;}wg zr!XnaBrqr%BXO-pP9I#dn>iGL2sN0D!ZlJHPamsdWGYVKWGYSo!X;c548$na3S39N z!%HNHNKH~QwHyw~TXgrBrytsuUVLbLOig#YhHmQ};^Y?kw)Be7V5$D@xfn^fG|DmHX-6r%t59Gw zYVC0}WNwtvwl4Re#8HZNn4Cr;3ygeQ}=bcyW*X!S9ai-Zu`bPk8K}Jo~0splj8FRc#%J zM|XdP_VW$#Atp7<%fZqP?0)g*t>QbCLX-O_A!s|D2|%5{z@6@H&BefQ;u%fg_3oL) zmJC_r_6ct2;*5gZ)Mju;!i?CQw~Ht2J+~Ta!7sPkbSJdIU`F9>Jy&HHdbfA$kZnW# zjw46ziGk1SzPG)6(LZ^z1C!;}|FG^9>U_R;4-j~+^xKgs54-*P+JD%!JE5o|@0EIV zt_z#8f4S2rUepuXxw+p_`OL|6U2E0CoPg7bE@Dvm?(``d3&L z?0(Y{u`95-r2fW}>=|Cuq8sj9nLzow=a-00&R@=Uef3Q0mn*F&IkwWln(HO(rQ-Yn zCs+HHokez8Yb%$&-bGHe0!Aj^p85tQ#FvuuPlBfJZXeCHyr`Wi8(gtr^_H0UM^@SX zsg)^JNt$%Rl%|U$wdM9rH#m%8UyTJ4G@Y2)dPKvMe)zS zeVH9i#RtPVaS2 zxr7}KGW3yO7ixcFg|Oxo&acmVSmK)_{;WH%^tXnhzK)<&lQ;KR-ll|%3s)?^HGpcKuuP@xm?deA{Fbn>}u#_Zsi$w1M z7iXt!&zt?q_;Y$y2YU0BHSRjUVlte!v^uJ$B;3}_;R>v^%Z@DYn;v0b*&AP z@}|Q-C9JHOQucUo&VFBA6R$Te6WCDfbhd1xBUmK7v@y%TdKSl1>^GnVSAQ?~#tn$N zv@pl{u`$Q~*xfbLc+Ktmgq^MP9l)|d+~S~ZEZNUkKa+|HA6`>sdHLMsr|G4mLlZHn zNoxxlhD2R4u9^O`dLN;`e6i=+*4#=|Ee@XaVw=UEmVr2CZs diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 8cabb12..bc2daf2 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -97,7 +97,7 @@ src/IBKRTrader.Hosting (classlib, net10.0) – AppHostBuilder + RunStartu - [x] `ShellUiHost` + `LauncherForm` (View-Buttons + gemeinsames Fenster-Menü); Core-Views (Workers/Logs/Settings) als eigene Fenster - [x] CongressTrading auf neuen `IModule`-Vertrag; Modul-Worker als `IWorker` registriert - [x] `--smoke-ui` Headless-Test (alle Views + Launcher konstruieren) → grün -- [ ] **Offen (R4/R5):** Worker von `WorkerEngine`/`IWorker` auf `IHostedService` umstellen (aktuell noch WorkerEngine) +- [x] Worker von `WorkerEngine`/`IWorker` auf `IHostedService` umgestellt — **in R4 erledigt**, die Zeile stand hier bis zum 2026-08-23 faelschlich noch offen ### R3 – Persistenz auf EF Core **Festgelegt:** EF-Migrationen **extern** (wie PolytraderSharp) – Schema per `dotnet ef database update`, @@ -163,6 +163,34 @@ Anzeigegerät mehr und ist damit erstmals Teil der CI. **Offen:** IB Gateway kopflos betreiben (IBC + Xvfb) – eigene Baustelle, unabhängig vom Code; LiveCharts2 kommt mit den neuen Modulen (Avalonia deshalb auf der 11er-Linie gepinnt). +### L6 – Namensgebung bereinigt ✅ (2026-08-07) +- [x] `IBKRTrader.App.Avalonia` → **`IBKRTrader.App`**. Das Suffix gab es nur, solange daneben eine + WinForms-`IBKRTrader.App` stand; seit L5 ist die weg. Assembly, Wurzel-Namensraum und die + `avares://`-Ressourcen-URI sind mitgezogen, Git erkennt alles als Umbenennung. +- [x] Die `global::Avalonia`-Qualifizierungen entfallen – sie waren nur nötig, weil der Namensraum + `IBKRTrader.App.Avalonia` das gleichnamige Paket verdeckte. +- [x] **Inhaltlich falsch gewordene Aussagen berichtigt** – das waren die eigentlichen Überbleibsel, + nicht die Kommentare: `.agents/rules/grundregeln.md` schrieb weiterhin „C# .NET 10 WinForms", + RichTextBox-Logging, `LauncherForm` und `PropertyGrid` vor und hätte die Portierung Stück für + Stück rückgängig gemacht. Dazu Core-Kommentare (`LogEntry`, `IWorker`, `ModuleView`) und Doku. + +### DC – Deploymentcenter-Integration ✅ (2026-08-23) +Konzept und Begründung: [konzepte/KONZEPT-Deploymentcenter-Integration.md](konzepte/KONZEPT-Deploymentcenter-Integration.md). +Schritte 0–8 der dortigen Reihenfolge sind umgesetzt; der Stand je Schritt steht in §9 dieses Konzepts. + +- [x] Lizenz (Sperrbetrieb statt Abbruch), Watchdog-Heartbeat, Fehler-Stream inkl. globaler + Ausnahmebehandler, Update-Prüfung mit `ReleaseCredentials`, `setup.json` + Release-Pipeline. + Einbauort ist `IBKRTrader.Hosting/Deploymentcenter/` – den Host teilen sich Shell und Daemon. +- [x] Vier Projekt-Befunde vorab bereinigt: Zugangsdaten aus `AppSettings` (P1), `AppPaths`-Rückfall + unter Windows (P2), globale Handler (P3), Version zentral in `Directory.Build.props` (P4). +- [ ] **Offen (P5):** Die Gitea-CI checkt das Schwester-Repo `Deploymentcenter` nicht aus. Solange + das SDK als Cross-Repo-`ProjectReference` hängt, ist der CI-Lauf rot. Behebt sich mit + Schritt 10 (SDK als NuGet-Paket in der Gitea-Registry). +- [ ] **Offen (Schritt 9):** Bugtracker-Baustein – setzt voraus, dass das Projekt `ibkrtrader` im + DC-WebUI angelegt ist und ein Token mit `bugtracker:report` vorliegt (serverseitige Handarbeit). +- [ ] **Offen:** Das Anwenden eines gefundenen Updates ist nicht verdrahtet. `DcUpdateService.LaunchAgent` + ist fertig und dokumentiert, es fehlt der Aufrufer, der danach geordnet herunterfährt. + --- ## Kurskorrektur abgeschlossen (R1–R7) diff --git a/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md b/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md index df45607..6d361d6 100644 --- a/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md +++ b/docs/konzepte/KONZEPT-Deploymentcenter-Integration.md @@ -523,6 +523,9 @@ Packager, der genau das abfängt — kein Fehlschlag, sondern die Absicherung, d ## 8. Befunde und offene Punkte +> **Status 2026-08-23:** P1–P4 sind umgesetzt (Einzelheiten in §9). **P5 ist eingetreten**, +> P6 entscheidet sich erst beim ersten Release. Der ursprüngliche Vermerk von 2026-08-14: +> > **Status 2026-08-14:** Alle sieben ursprünglich an den Deploymentcenter-Entwickler > gemeldeten Befunde (D1–D7) sind mit den Versionen 2.5.0/2.5.1 behoben — bestätigt über > `GET /api/updateservice/v1/changelog?since=2.4`. Der Abschnitt bleibt als Nachweis @@ -567,6 +570,13 @@ ersten Release ab — zu Recht. nur IBKRTrader aus. Eine `ProjectReference` nach `..\..\..\..\Deploymentcenter\…` macht den Build auf beiden Matrix-Zielen rot. Siehe die Entscheidung in §2.2. +> **Seit 2026-08-23 eingetreten, nicht mehr nur vorhergesagt.** Die +> `ProjectReference` ist mit der Integration auf `main` gelandet, die CI ist +> damit rot. Das war die bewusst in Kauf genommene Folge der Interimslösung aus +> §2.2 — lokal baut die Projektmappe, sobald das Schwester-Repo daneben liegt. +> Auflösung ist Schritt 10: SDK als NuGet-Paket in die Gitea-Registry, dann +> `PackageReference` statt Cross-Repo-Pfad. + **P6 · Konfiguration liegt im Installationsverzeichnis.** Unter Windows schreibt `AppPaths` neben die Binärdatei. Das ist mit `preservePatterns` beherrschbar (§7.3), muss aber beim ersten Release stimmen — ein Update, das `settings.json` @@ -627,16 +637,16 @@ nicht durchgängig beziffert). ✅ **Behoben (2.5.1, Doku)** — Changelog nennt | Schritt | Inhalt | Abhängig von | Stand | |---|---|---|---| -| 0 | **P1** Zugangsdaten wechseln, Vorgaben auf Platzhalter | — | ⬜ dieser Durchlauf | -| 1 | **P2** `AppPaths`-Rückfall plattformabhängig, **P4** `Directory.Build.props` | — | ⬜ dieser Durchlauf | -| 2 | SDK-Bezug Stufe 1: Cross-Repo-`ProjectReference` (§2.2) | — | ⬜ dieser Durchlauf | -| 3 | `DcConfig`, `DeploymentcenterSettings`, `DcApiClient`, `BuildInfo` | 1, 2 | ⬜ dieser Durchlauf | -| 4 | **P3** globale Handler + Fehler-Stream | 3 | ⬜ dieser Durchlauf | -| 5 | Watchdog-Heartbeat inkl. `stopped` | 3 | ⬜ dieser Durchlauf | -| 6 | Lizenz mit Sperrbetrieb statt Abbruch (§5.2), `EnsureLicensedAsync` | 3 | ⬜ dieser Durchlauf | -| 7 | Update-Prüfung **mit** `ReleaseCredentials`, `exitCurrentApp:false` bei offenem Zustand | 6 (braucht den Schlüssel) | ⬜ dieser Durchlauf | -| 8 | `setup.json`, `preserve`/`exclude`, Release-Pipeline (Vorlage per `curl` von `/docs/release-template/`) | 1–7 | ⬜ dieser Durchlauf | -| 9 | Bugtracker-Baustein nach `AGENTS.md` / `.agents/rules` | Projekt-Slug angelegt | ⬜ separat (Projekt `ibkrtrader` muss im WebUI erst angelegt werden) | +| 0 | **P1** Zugangsdaten wechseln, Vorgaben auf Platzhalter | — | ✅ Vorgaben sind Platzhalter. **Die Rotation des geleakten Passworts steht weiterhin aus** (Nutzer-Aktion) | +| 1 | **P2** `AppPaths`-Rückfall plattformabhängig, **P4** `Directory.Build.props` | — | ✅ 2026-08-23 | +| 2 | SDK-Bezug Stufe 1: Cross-Repo-`ProjectReference` (§2.2) | — | ✅ 2026-08-23, inkl. Prüf-Target mit lesbarer Fehlermeldung | +| 3 | `DcConfig`, `DeploymentcenterSettings`, `DcApiClient`, `BuildInfo` | 1, 2 | ✅ 2026-08-23 | +| 4 | **P3** globale Handler + Fehler-Stream | 3 | ✅ 2026-08-23 (`DcCrashHandlers`, `DcErrorSink`, `DcErrorReporter`) | +| 5 | Watchdog-Heartbeat inkl. `stopped` | 3 | ✅ 2026-08-23 (`DcHeartbeatWorker`) | +| 6 | Lizenz mit Sperrbetrieb statt Abbruch (§5.2), `EnsureLicensedAsync` | 3 | ✅ 2026-08-23 (`LicenseGuard`) | +| 7 | Update-Prüfung **mit** `ReleaseCredentials`, `exitCurrentApp:false` bei offenem Zustand | 6 (braucht den Schlüssel) | 🔶 Die **Prüfung** läuft beim Start. Das **Anwenden** ist es nicht: `LaunchAgent` ist fertig, aber kein Aufrufer fährt danach geordnet herunter | +| 8 | `setup.json`, `preserve`/`exclude`, Release-Pipeline (Vorlage per `curl` von `/docs/release-template/`) | 1–7 | ✅ 2026-08-23 (`setup.json`, `scripts/release.*`). **Noch nie ausgeführt** – das erste Release steht aus | +| 9 | Bugtracker-Baustein nach `AGENTS.md` / `.agents/rules` | Projekt-Slug angelegt | ⬜ offen — Projekt `ibkrtrader` muss im WebUI erst angelegt werden | | 10 | **Folgeschritt, nicht Teil dieses Durchlaufs:** `Deploymentcenter.Client` als NuGet-Paket in die Gitea-Registry pushen, `` durch `PackageReference` ersetzen, Gitea-CI (**P5**) auf den Paketbezug umstellen | 2 | ⬜ offen — siehe §2.2 | Schritt 7 und 8 hängen zusammen: **der erste ausgelieferte Build muss die diff --git a/docs/konzepte/KONZEPT-Modul-Accounting.md b/docs/konzepte/KONZEPT-Modul-Accounting.md index 148644e..fb81b70 100644 --- a/docs/konzepte/KONZEPT-Modul-Accounting.md +++ b/docs/konzepte/KONZEPT-Modul-Accounting.md @@ -1,5 +1,15 @@ # Konzept: Modul „Accounting" (Buchhaltung/Reporting aller Konten) +> **UMGESETZT (Modulgerüst).** Das Modul steht: `acc_`-Schema mit Migration `InitialAccounting`, +> `AccountingIngestService` (append-only, idempotent über `IdempotencyKey`), `AccountingClassifier`, +> `AccountingEngine`, `FxConverter`, `AccountingReportService` sowie CSV- und PDF-Export. Die +> Ingest-Quellen liegen hinter Interfaces mit **Offline-Null-Stubs** — das Modul läuft vollständig +> und bucht dabei korrekt nichts. +> +> **Weiterhin offen ist genau die Zielland-Arbeit aus §6** — vor allem der Live-Flex-Abruf, ohne den +> keine echten Buchungen entstehen, und die Steuerschicht, deren Jurisdiktion nicht festgelegt ist. +> Das Modul ist damit lauffähig, aber noch nicht in Betrieb. + > Stand: 2026-07-30 > Ziel: Vollständige, **von unserer Trading-DB unabhängige**, buchhalterisch korrekte Erfassung ALLER > Kontobewegungen der IBKR-Konten. Periodische (meist monatliche), vor einer Steuerbehörde diff --git a/docs/konzepte/KONZEPT-Modul-Supervisor.md b/docs/konzepte/KONZEPT-Modul-Supervisor.md index 907f0e4..ad6fbfc 100644 --- a/docs/konzepte/KONZEPT-Modul-Supervisor.md +++ b/docs/konzepte/KONZEPT-Modul-Supervisor.md @@ -1,5 +1,13 @@ # Konzept: Modul „Supervisor" (KI-gestützte Handels-Analyse & Forensik) +> **UMGESETZT (S-0 bis S-4).** Datenfundament im Core (`core_decision_journal`, `core_order_events`, +> durchgereichte `SignalId`, JSONL-Log-Sink), `DossierService`/`DossierBuilder`, der +> OpenRouter-Agent mit read-only Tool-Registry und Profilen, `sup_reports`, `CounterfactualJob`, +> `DailyReportService` und der MCP-Server (`McpLightServer`, `McpJsonRpc`). +> +> **Weiterhin offen** sind die beiden Punkte am Ende dieses Dokuments: die Counterfactual-Kursauflösung +> (Interface + Stub vorhanden) und der externe Versand des Tagesberichts. + > Stand: 2026-07-30 > Ziel: ALLES, was IBKRTrader getan (und bewusst NICHT getan) hat, detailliert analysierbar machen — > Entscheidungen, Orders, Trades und Logs — und die Analyse durch ein KI-Modell (OpenRouter) durchführen diff --git a/src/IBKRTrader.App/IBKRTrader.App.csproj b/src/IBKRTrader.App/IBKRTrader.App.csproj index 420f03d..eec3ed7 100644 --- a/src/IBKRTrader.App/IBKRTrader.App.csproj +++ b/src/IBKRTrader.App/IBKRTrader.App.csproj @@ -44,7 +44,10 @@ - + diff --git a/src/IBKRTrader.Core/AI/AIModelService.cs b/src/IBKRTrader.Core/AI/AIModelService.cs deleted file mode 100644 index 7d91c4b..0000000 --- a/src/IBKRTrader.Core/AI/AIModelService.cs +++ /dev/null @@ -1,24 +0,0 @@ -using IBKRTrader.Core.Logging; - -namespace IBKRTrader.Core.AI; - -///

-/// Platzhalter für KI-Modell-Integration. -/// Wird in einer späteren Phase mit echten ML-Modellen ersetzt. -/// -public class AIModelService -{ - private readonly LoggingService _logger; - - public AIModelService(LoggingService logger) - { - _logger = logger; - } - - /// Platzhalter: Gibt immer 0.5 zurück (keine echte Vorhersage). - public Task PredictAsync(string symbol, object features) - { - _logger.Warn("AI", $"AIModelService ist ein Platzhalter – keine echte Vorhersage für {symbol}."); - return Task.FromResult(0.5); - } -} diff --git a/src/IBKRTrader.Core/Budget/BudgetService.cs b/src/IBKRTrader.Core/Budget/BudgetService.cs index 81938ad..8cfc12f 100644 --- a/src/IBKRTrader.Core/Budget/BudgetService.cs +++ b/src/IBKRTrader.Core/Budget/BudgetService.cs @@ -19,13 +19,6 @@ public class BudgetService _logger = logger; } - public async Task GetAvailableBudgetAsync(string module) - { - await using var db = await _dbf.CreateDbContextAsync(); - var b = await db.Budgets.FindAsync(module); - return b is null ? 0m : b.TotalBudget - b.UsedBudget; - } - public async Task ReserveBudgetAsync(string module, decimal amount) { await using var db = await _dbf.CreateDbContextAsync(); diff --git a/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs b/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs index 3c4bcb4..fe64450 100644 --- a/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs +++ b/src/IBKRTrader.Core/IBKR/IBKRGatewayService.cs @@ -119,26 +119,6 @@ public class IBKRGatewayService } } - /// - /// Initialisiert die Brokerage-Session über den Gateway. - /// - public async Task InitBrokerageSessionAsync(CancellationToken ct = default) - { - try - { - await RateLimitAsync(ct); - var body = new StringContent("{\"publish\":true,\"compete\":true}", - System.Text.Encoding.UTF8, "application/json"); - var response = await _http.PostAsync("iserver/auth/ssodh/init", body, ct); - return response.IsSuccessStatusCode; - } - catch (Exception ex) - { - _logger.Warn("IBKR", $"Brokerage-Session-Init fehlgeschlagen: {ex.Message}"); - return false; - } - } - // ─── Contract Search ───────────────────────────────────────────────────── /// @@ -198,33 +178,6 @@ public class IBKRGatewayService } } - /// - /// Sucht Aktien-Contracts nach Symbolen. - /// GET /trsrv/stocks?symbols=AAPL,MSFT - /// - public async Task>?> SearchStocksBySymbolAsync( - string symbols, CancellationToken ct = default) - { - try - { - await RateLimitAsync(ct); - var response = await _http.GetAsync($"trsrv/stocks?symbols={Uri.EscapeDataString(symbols)}", ct); - - if (!response.IsSuccessStatusCode) - { - _logger.Warn("IBKR", $"Stock-Suche fehlgeschlagen: HTTP {(int)response.StatusCode}"); - return null; - } - - return await response.Content.ReadFromJsonAsync>>(JsonOpts, ct); - } - catch (Exception ex) - { - _logger.Error("IBKR", $"Stock-Suche fehlgeschlagen: {ex.Message}", ex); - return null; - } - } - // ─── Historical Market Data ────────────────────────────────────────────── /// @@ -263,12 +216,4 @@ public class IBKRGatewayService return null; } } - - // ─── Disconnect ────────────────────────────────────────────────────────── - - public Task DisconnectAsync() - { - IsConnected = false; - return Task.CompletedTask; - } } diff --git a/src/IBKRTrader.Core/Security/SecretProtection.cs b/src/IBKRTrader.Core/Security/SecretProtection.cs index 714f996..3ae44cf 100644 --- a/src/IBKRTrader.Core/Security/SecretProtection.cs +++ b/src/IBKRTrader.Core/Security/SecretProtection.cs @@ -92,10 +92,6 @@ public static class SecretProtection return Encoding.UTF8.GetString(pt); } - /// True, wenn der Wert bereits im verschlüsselten Format vorliegt. - public static bool IsEncrypted(string? value) => - !string.IsNullOrEmpty(value) && value!.StartsWith(Prefix, StringComparison.Ordinal); - private static byte[] DeriveKey(string raw) { // 32-Byte-Key als Base64? diff --git a/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs b/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs index 6b7817e..62bd4ae 100644 --- a/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs +++ b/src/IBKRTrader.Core/Trading/Ibkr/IbkrMapping.cs @@ -33,10 +33,6 @@ internal static class IbkrMapping return null; } - /// Der zum Handelsmodus passende Gateway-Port. - public static int DefaultPortFor(TradingMode mode) => - mode == TradingMode.Live ? GatewayLivePort : GatewayPaperPort; - /// US-Aktie über die SMART-Route – der einzige Instrumententyp, den die Module handeln. public static Contract Stock(string symbol) => new() { diff --git a/src/IBKRTrader.Core/Trading/TradeHistoryService.cs b/src/IBKRTrader.Core/Trading/TradeHistoryService.cs index 7fd1047..2af16a5 100644 --- a/src/IBKRTrader.Core/Trading/TradeHistoryService.cs +++ b/src/IBKRTrader.Core/Trading/TradeHistoryService.cs @@ -42,13 +42,4 @@ public class TradeHistoryService _logger.Info(module, $"Trade gespeichert: {action} {quantity}x {symbol} @ {price:F2}"); } - - public async Task> GetRecentTradesAsync(int limit = 100) - { - await using var db = await _dbf.CreateDbContextAsync(); - return await db.TradeHistory - .OrderByDescending(t => t.TradedAt) - .Take(limit) - .ToListAsync(); - } } diff --git a/src/IBKRTrader.Hosting/AppHostBuilder.cs b/src/IBKRTrader.Hosting/AppHostBuilder.cs index cb5bfe6..1bffe65 100644 --- a/src/IBKRTrader.Hosting/AppHostBuilder.cs +++ b/src/IBKRTrader.Hosting/AppHostBuilder.cs @@ -1,4 +1,3 @@ -using IBKRTrader.Core.AI; using IBKRTrader.Core.Budget; using IBKRTrader.Core.Configuration; using IBKRTrader.Core.DependencyInjection; @@ -166,7 +165,6 @@ public static class AppHostBuilder services.AddSingleton(); services.AddSingleton(); - services.AddSingleton(); // Datenfundament für Analyse/Forensik (Supervisor): Entscheidungsjournal + Order-Events. services.AddSingleton(); diff --git a/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs b/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs index 24adcfb..0d17f6e 100644 --- a/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs +++ b/src/IBKRTrader.Modules.CongressTrading/Database/CongressRepository.cs @@ -1,4 +1,3 @@ -using IBKRTrader.Core.Logging; using IBKRTrader.Core.Settings; using IBKRTrader.Modules.CongressTrading.Models; using IBKRTrader.Modules.CongressTrading.Persistence.Ef; @@ -14,16 +13,13 @@ public class CongressRepository { private readonly IDbContextFactory _dbf; private readonly CoreSettingsService _settings; - private readonly LoggingService _logger; public CongressRepository( IDbContextFactory dbf, - CoreSettingsService settings, - LoggingService logger) + CoreSettingsService settings) { _dbf = dbf; _settings = settings; - _logger = logger; } // ─── CongressMember ─────────────────────────────────────────────────────── @@ -71,13 +67,6 @@ public class CongressRepository return await db.Trades.AnyAsync(t => t.TradeId == tradeId); } - public async Task> GetAllTradeIdsAsync() - { - await using var db = await _dbf.CreateDbContextAsync(); - var ids = await db.Trades.Select(t => t.TradeId).ToListAsync(); - return ids.ToHashSet(); - } - /// Fügt einen Trade ein, sofern die TradeId noch nicht existiert. public async Task InsertTradeAsync(CongressTrade trade, bool detailsFetched = true) { @@ -133,19 +122,4 @@ public class CongressRepository public Task GetSettingAsync(string key) => _settings.GetAsync(key); public Task SetSettingAsync(string key, string v) => _settings.SetAsync(key, v); public Task DeleteSettingAsync(string key) => _settings.DeleteAsync(key); - - // ─── Reset ──────────────────────────────────────────────────────────────── - - /// Löscht alle CT-Fortschritts-Flags und alle CT-Daten aus der DB. - public async Task ResetHistoryImportAsync() - { - await DeleteSettingAsync("ct.history_import_done"); - await DeleteSettingAsync("ct.history_import_page"); - await DeleteSettingAsync("ct.history_import_total"); - - await using var db = await _dbf.CreateDbContextAsync(); - await db.Trades.ExecuteDeleteAsync(); - await db.Members.ExecuteDeleteAsync(); - _logger.Warn("CT", "History-Import-Reset durchgeführt – alle CT-Daten gelöscht."); - } } diff --git a/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs b/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs index 6b02b79..03fc5a9 100644 --- a/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs +++ b/src/IBKRTrader.Modules.CongressTrading/Scraper/CapitolTradesScraper.cs @@ -9,20 +9,6 @@ namespace IBKRTrader.Modules.CongressTrading.Scraper; // ─── JSON-Modelle (exakte Feldnamen aus dem RSC-Stream) ────────────────────── -internal class CtApiWrapper -{ - [JsonPropertyName("data")] public List? Data { get; set; } - [JsonPropertyName("meta")] public CtMeta? Meta { get; set; } -} - -internal class CtMeta -{ - [JsonPropertyName("totalPages")] public int TotalPages { get; set; } - [JsonPropertyName("pageSize")] public int PageSize { get; set; } - [JsonPropertyName("totalCount")] public int TotalCount { get; set; } - [JsonPropertyName("page")] public int Page { get; set; } -} - internal class CtTrade { [JsonPropertyName("_txId")] public long TxId { get; set; } diff --git a/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs b/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs index 65c276c..f78536a 100644 --- a/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs +++ b/tests/IBKRTrader.Tests/Modules/CongressRepositoryTests.cs @@ -26,7 +26,7 @@ public class CongressRepositoryTests .UseInMemoryDatabase(Guid.NewGuid().ToString()).Options; var settings = new CoreSettingsService(new Factory(coreOpts)); - return new CongressRepository(new Factory(ctOpts), settings, new LoggingService()); + return new CongressRepository(new Factory(ctOpts), settings); } [Fact]