claude_dev
841ea1536e
fix(live): 三策略定寸现金→总资产口径(卖后买现金窗口A修法,回原JQ语义) [vps]
...
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 23s
CI/CD / nas-verify (push) Successful in 11s
08-25 9:30 事故(前后端session移交):small_cap同轮「全卖19只→马上全买20只」,
台账现金只被runner_live 60s归因轮询更新(唯一cash入口),买入定寸落在两轮之间
→卖出回款不可见→20笔买入全部目标0全天空仓;momentum同型撞运只入账首笔
79k/6≈13.2k/只(44%仓)。B修法(191270c,下单返回即时归因)已做;本A修法=
防御纵深第二层:定寸口径回总资产,归因异常/漏单时定寸也不再依赖未入账现金。
改动:
- all_weather.py 共享helper _total_value:B2 InstancePortfolio.total_value
(=台账equity,实时价缺价回退成本)/jq原生total_value直接读;缺属性回退
现金+Σ持仓市值(同语义)
- momentum_timing_ex/small_cap_ex/value_selection_ex 三处轮动定寸
per_value=cash/N→total/N,守卫cash<=0→total<=0
- momentum 尾部卖出+买入抽独立方法 _rotate_positions(纯移动零逻辑变化,
便于回归直接钉死)
- 原JQ语义per_value=stock_value/len本就是总资产口径,cash口径是移植失真;
all_weather/channel_test的cash读取(递增建仓/现金铺余位语义)按移交指示不动
- 清三文件因此孤儿化的_available_cash import
测试:tests/portfolio/test_sizing_total_value.py 5条——helper 2(直读/回退)
+每策略1条「卖出未入账时定寸不缩水」(fake现金旧值+持仓仍显示旧仓→per_value
=总资产/3=3500而非现金/3≈333;目标3>旧仓2=事故真实形状,防买守卫提前break)。
portfolio+data_platform+api全量811绿。验收=08-26 9:30 momentum补仓满额
(~490k/6);与191270c同车推VPS(NAS恢复后)。
2026-08-25 20:49:01 +08:00
claude_dev
0ede4e967e
chore: 191270c 标签补正说明——[vps]误写在正文末行,enforce-label按subject行匹配故run741红;改动本身无新增(空commit),B修法实体在191270c [nas]
CI/CD / test (push) Successful in 5s
CI/CD / nas-deploy (push) Successful in 15s
CI/CD / nas-verify (push) Successful in 3s
2026-08-25 20:43:28 +08:00
claude_dev
191270c884
fix(trader): 卖后买现金窗口B修法——下单返回即时归因入账,台账cash不再等60s轮询
...
CI/CD / test (push) Failing after 6s
CI/CD / nas-deploy (push) Has been skipped
CI/CD / nas-verify (push) Has been skipped
2026-08-25 事故:small_cap同轮「全卖19只→马上全买20只」在两轮归因轮询间隙
读台账现金,卖出回款不可见→20笔买入全部目标0、全天空仓;momentum同型撞运
只入账首笔79k/6=13.2k缩水44%仓;value无卖后买序列满额(反证)。QMT无责
(0.5s filled/券商现金即时/下单线程同步见filled),gap=runner_live.py归因
poller 60s一轮才调ledger.apply_trade(唯一cash更新入口,DB落库时间戳恰差60s
铁证)。
修法(B,治本现金新鲜度):
- LiveInstanceLedger.on_order_done钩子+notify_order_done(未注入/抛错静默,
绝不阻断下单;漏单由轮询兜底);apply_trade幂等判定整体移入锁内——钩子
(策略线程)与轮询(poller线程)并发同步同一笔成交时恰好一笔入账,防双计
- live_strategy._instance_order_wrappers:所有真实委托(bt_order/透传)返回后
_done()触发即时归因;决策层不下单的路径不触发
- runner_live:engine装配后注入on_order_done=_sync_instance_trades闭包;
60s轮询保留兜底(部分成交后续/异步路径)
测试+8:钩子三态(nop/触发/吞异常)+8线程同trade_id并发恰入账一次(竞态回归)
+wrapper卖出/买入/透传触发+不下单不触发;portfolio 459绿+api 170绿
[vps]
2026-08-25 19:47:13 +08:00
claude_dev
f438c6cd65
perf(factor): metrics热路径numpy/scipy化——rank_corr/quantile_mask/decile的pandas rank改scipy rankdata(axis=1)C实现,宽矩阵压力下分钟级→秒级;接口与数值不变,测试原样全绿+速度护栏 [vps]
2026-08-25 10:29:43 +08:00
claude_dev
a8f9199dab
fix(factor): mount_alpha101 docstring 100→82(实测数)+_quantile_mask 未用形参收敛为top布尔 [vps]
2026-08-25 06:53:05 +08:00
claude_dev
23d7b6e02e
fix(web): 详情页换手率改读metrics顶层+批量页删失实'剔ST'文案(实现不做ST过滤,无point-in-time名称史) [nas]
2026-08-25 06:53:04 +08:00
claude_dev
5fdcd8b5d7
perf(factor): 原生polars快速算子库覆盖vnpy慢rolling_map——ts_corr/ts_rank/ts_decay_linear/ts_quantile/ts_cov/ts_slope族共8算子shift展开或rolling原生,EXPRESSION_FUNCTIONS官方扩展点注册,等价性测试精确对齐原版;ts_argmax/argmin并列场景原生恒等式不成立留原版(25因子另批处理) [vps]
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 37s
CI/CD / nas-verify (push) Successful in 12s
2026-08-25 06:29:31 +08:00
claude_dev
0b3f6bb87c
perf(factor): 逐因子join砍除——pivot全表后pandas切窗口+预热cutoff广播掩码置NaN(NAS实测94.5万行join+pivot 11.4s/因子是全量8h瓶颈;NaN语义与join剔除等价,指标层自动剔缺失) [vps]
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 34s
CI/CD / nas-verify (push) Successful in 5s
2026-08-25 01:43:52 +08:00
claude_dev
c09cdee519
perf(factor): 股票池枚举改递归CTE松散索引扫(573s→70s)+数据查询逐symbol四列全等前缀(补exchange直落日线子树,免扫15m/5m条目)——NAS 2核26G库实测两处慢点根治 [vps]
2026-08-25 01:33:04 +08:00
claude_dev
0d038548ae
perf(factor): 股票池枚举改无过滤DISTINCT覆盖索引扫——带WHERE(interval/datetime/LIKE)版本在26G库退化全表扫NAS实测>5min不归,前缀python侧滤,周期/窗口由数据查询天然过滤(语义不变,15m-only股锁定测试) [vps]
2026-08-25 01:01:48 +08:00
claude_dev
cdaa88fea1
feat(web): 批量评估页——股票池/因子集/时间窗三步提交进任务中心;CI门禁加tests/factor [nas]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 34s
CI/CD / nas-verify (push) Successful in 11s
2026-08-25 00:42:57 +08:00
claude_dev
77e12f4fe0
feat(web): 因子详情页——表达式卡+6格指标+月度/累计IC双系列图+十分组柱状(echarts终端暗色)+排行榜页色值清理走token [nas]
2026-08-25 00:40:26 +08:00
claude_dev
52eb5177ac
feat(web): IC排行榜页——瓦片+筛选chips+全指标表格+IC趋势sparkline+信号灯,终端风1:1 mockup [nas]
2026-08-25 00:37:41 +08:00
claude_dev
fa87135a44
feat(web): 因子工作台接线——eval API 客户端+3路由+投研组菜单/面包屑 [nas]
2026-08-25 00:33:46 +08:00
claude_dev
f0e9860316
feat(api): 因子批量评估四端点(runs/leaderboard/detail/submit)+orchestrator任务接线——leaderboard服务端扁平化排序,worker落factor_eval.db+任务中心摘要 [vps]
2026-08-25 00:31:12 +08:00
claude_dev
dfa4f90ecd
feat(factor): 批量评估CLI——冒烟/全量/列因子,进度打印+Top15汇总表(NAS docker exec 冒烟入口) [vps]
2026-08-25 00:26:45 +08:00
claude_dev
d3226ebe71
fix(factor): 批量评估空因子矩阵守卫——join静默空集记error行不再产全None淘汰假数据 [vps]
2026-08-25 00:25:30 +08:00
claude_dev
3f9a4fc681
feat(factor): 批量评估引擎——进程内逐因子calculate_by_expression(弃spawn池整df pickle),单因子失败不中断,结果增量落盘 [vps]
2026-08-25 00:21:54 +08:00
claude_dev
afe969e307
feat(factor): 评估结果存储 factor_eval.db——runs/results两表,metrics按周期JSON,SANGUO_FACTOR_EVAL_DB可覆盖 [vps]
2026-08-25 00:17:47 +08:00
claude_dev
89a8dd1487
feat(factor): 向量化评估指标——RankIC逐行秩相关/ICIR/t/胜率/多空年化/换手/十分组/月度IC/结论分级 [vps]
2026-08-25 00:12:35 +08:00
claude_dev
d00ad7d81d
fix(factor): WARMUP_BARS 60→120 恢复spec剔新口径(修夹具130根预热而非改口径)+evaluation_filter改datetime对象比较(9M行免逐行strftime) [vps]
2026-08-25 00:09:31 +08:00
claude_dev
cfb604588c
feat(factor): 评估股票池加载器——dbbardata分块直读polars,前缀60/00/30,300天lookback+45天forward缓冲,vwap派生,bar_idx预热 [vps]
2026-08-25 00:07:37 +08:00
claude_dev
51137a8268
feat(factor): 挂载 vnpy Alpha101(82)+Alpha158(158) 全量表达式进注册表——空df实例化零成本提取,导入即注册,幂等 [vps]
2026-08-25 00:01:41 +08:00
claude_dev
ec5a55c5f7
feat(factor): data_adapter 补 vwap 派生列(turnover/volume,零量置null)——Alpha101 表达式 59 处引用 vwap,dbbardata 无此列 [vps]
2026-08-24 23:57:19 +08:00
claude_dev
a62013cb9c
docs(factor): 第一批实施计划——13任务TDD拆解(挂载/股票池/指标/存储/引擎/CLI/API/前端三页/NAS验证),含ST过滤偏差声明与spawn池规避设计 [nas]
2026-08-24 23:52:40 +08:00
claude_dev
c94d1f3d2b
docs(factor): 第一批设计spec+终端风前端mockup——①spec:Alpha101+158全量挂载全A重验(2018-2026,主板+创业板剔ST/新股,RankIC 1/5/10D,退市股保留无幸存者偏差);后端=注册表挂载+vwap派生列+批量评估脚本(因子分批15-20/批)+冒烟先行;用户拍板两条: ⚠️ 最终部署VPS不止NAS(走标准promote链,VPS 42.8G权威库)+行业中性化先不做(IC数据说话后再决策)②mockup v2:第一版亮色Element风被用户打回,重做1:1科幻终端风(tokens.css深空黑/荧光青/琥珀/红涨绿跌/term-grid/信号灯),三页=IC排行榜(统计瓦片+筛选+主表带IC色条sparkline)/因子详情(表达式+月度IC+十分组)/批量评估(股票池3预设卡+因子集勾选),用户确认 ✅ ③mockup与spec互引,调查报告见同目录 [nas]
2026-08-24 23:36:36 +08:00
claude_dev
31596f58f9
fix(shadow): 双轨对账count_match改按票+方向聚合总量——QMT部分成交拆行致27vs5恒False纯计数噪音 [vps]
...
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 1s
08-24实录: momentum一笔3800股被QMT拆19笔fill,对账27vs5恒count_match=False,总量却分毫不差。旧口径按原始行数比(注释自称'差异如实呈现待归因',实则部分成交属成交粒度非分歧)。修=按聚合桶live_volume==shadow_volume判;原始行数保留在live_count/shadow_count供归因。真量差仍判False(新增测试钉死)。trader 254绿。
2026-08-24 23:07:12 +08:00
claude_dev
e2dc473682
fix(shadow): 影子市价单成交基准改实时行情——旧按委托保护价记账恒差1.5%,08-24双轨4/6红根因 [vps]
...
根因(代码级实锤): broker._ref_price 优先用下单传入price,而市价单的price是保护性委托上限(策略侧行情×1.015,BrokerBase契明文'可用作保护价/参考价'非期望成交价)→影子每笔买入虚高~1.5%,卖侧对称低~1.5%。08-24证据三连:momentum/small_cap首次真实成交日25票价差紧聚-150bps(-112~-189);卖侧510500同样-1.54%(排除'晚一根bar随行情'解释);级联=虚价吃掉影子现金6k+→002038买第6只差1678元资金不足拒单(shadow_60日志)。排除用户初判的滑点/费率参数不一致(影子账户slippage=0.0费率正常)。回测/实走无此问题(matcher.py按bar开收价,另一套)。
修: _ref_price(security,price,market)——市价单成交基准=price_getter实时行情,行情不可得退回委托价(告警,可用性优先);限价单沿用传入价(触价语义,旧行为);buy/sell补市价转限价封顶(行情超保护上限按上限成交不追高,卖侧对称)。
+5测试(市价买卖按行情/超上限封顶/无行情退委托价/限价语义不变),trader 254绿+api 171绿。
2026-08-24 23:07:12 +08:00
claude_dev
6c2c217e22
fix(web+api): 组合回测max_pool默认30→0——用户拍板「前端页面肯定要改」(回测口径与实盘对齐,f214e2f只翻了live/paper链漏了回测) [nas]
...
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 42s
CI/CD / nas-verify (push) Successful in 9s
你印象中改过的是6ecdaab#95标的池pool→all(三表单+后端四处),max_pool当时没动。本次三处对齐: PortfolioBacktest表单默认30→0+过时提示(「MVP验证用,默认30」)清理+routes_portfolio Field default=30→0(防API直调口径分裂,#95同款对齐法)。语义同全链:0=不限,策略层>0才截断。build绿+tests/api 165绿。
2026-08-24 20:54:56 +08:00
claude_dev
981b501bdd
docs(data): get_security_info_batch docstring同步双seek终态——删'IN+GROUP BY走索引'旧描述(该假设恰为生产劣化计划根源) [vps]
CI/CD / test (push) Successful in 6s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 3s
2026-08-24 14:16:21 +08:00
claude_dev
aafa5baa67
perf(data): min/max改逐对双seek——INDEXED BY批IN形态VPS实测仍不达标(30只冷8.1s/热0.25s,大池冷态分钟级),ORDER BY ±datetime LIMIT 1三列全等前缀每股恰2次寻位冷热皆毫秒级——上一发( 80fc517)生产探针续测定形态:①原IN+GROUP BY劣化计划101s冷;②钉复合索引后计划翻转(TEMP B-TREE消失)但仍逐股扫全部interval条目(d+15m+5m),30只冷8.1s→momentum池~2000只外推冷态≈9min过不了<60s验收;③行值IN变体在本SQLite对(row-value IN+INDEXED BY)走全索引扫描7min不归(弃);终态=逐对双seek,symbol/exchange/interval三列全等直落d子区间两端,连15m/5m条目都不碰;无日线对不落minmax(下游.get默认(None,None)同旧GROUP BY语义);测试5个重写到seek API(双索引名/回退/EXPLAIN计划签名interval=?直落+无TEMP B-TREE/batch==逐只等价);628绿;待VPS探针终验双seek计时 [vps]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 1s
2026-08-24 14:14:11 +08:00
claude_dev
96a1e6b413
tools(ops): 存量max_pool 30→0迁移脚本(默认dry-run,--apply才动手,幂等)——策略session 08-24移交项#1准备件 [nas]
...
CI/CD / test (push) Successful in 3s
CI/CD / nas-deploy (push) Successful in 19s
CI/CD / nas-verify (push) Successful in 3s
真实盘点(只读): VPS prod=live_accounts全6行30+paper_accounts.strategies 6处JSON30(=影子实例);NAS=paper_accounts 1处JSON30,live_accounts空。
⚠️ 刻意排除backtest_stats.params里的3处30=历史回测运行记录,改写=伪造历史(JSON白名单只放paper_accounts活动配置面)。
⚠️ 执行铁律:只与数据session SQL治本(80fc517已落)+f214e2f同车,部署成功后、引擎重启前跑——池放大×慢SQL=更糟;迁移后重启引擎吃新值。
冒烟三态过:dry-run盘点/apply迁移(30→0两行,显式50保留,JSON只动max_pool键)/二次apply零行幂等+历史表原样。
2026-08-24 13:50:40 +08:00
claude_dev
3ec1375a1b
fix(web): max_pool表单提示去「默认30」——f214e2f默认已翻0(0=不限),提示与新默认矛盾 [nas]
...
两处同型: live/New.vue + paper/New.vue。表单已自带0=不限提示语,无需另加占位(策略session建议的可选润色,实际缺口=过时文案)。
2026-08-24 13:50:40 +08:00
claude_dev
40908b51f8
fix(live): 市值改本地估值委托——开盘不再依赖盘中Capital下载(策略session 08-24移交P0)——实锤:开盘miniQMT Capital表下载常超时(代码注释自曝trading hours常超时)→close×total_capital=NaN→策略sort_values无操作保持代码序,平安银行(≈3800亿)混进small_cap买入清单。修=get_fundamentals_df组装后增Step3.5:_apply_local_market_caps把market_cap/circulating_market_cap优先委托self._unified.get_fundamentals_df(fields=两列,估值parquet EOD,亿元同单位,全池同一时点口径);单股本地缺(NaN/新股)保留xt Capital已算值,unified整体异常静默回退开盘永不挂;date=None传今天(EOD取最新≤今天);_fetch_close本就读xtdata本地缓存不动。+6测试(本地优先/补NaN/空回退/异常回退/NaN不清值/date=None传today);628绿。验收=部署后首个9:30 small_cap买入清单不再0000xx连号不含超大盘 [vps]
CI/CD / test (push) Successful in 6s
CI/CD / nas-deploy (push) Successful in 38s
CI/CD / nas-verify (push) Successful in 10s
2026-08-24 13:49:24 +08:00
claude_dev
80fc517531
fix(data): get_security_info_batch SQL计划劣化治本——INDEXED BY钉死复合索引(运行时探测索引名)——策略session 08-24移交P0:VPS生产EXPLAIN实锤min/max批量SQL被选去单列idx_dbbardata_interval整扫~21M日线行+USE TEMP B-TREE(interval IN列表作废),30只冷跑101s=开盘选股38-51min主根因;复合唯一索引存在但无统计信息计划不选。修=SQL加INDEXED BY钉死(symbol,exchange,interval,datetime);索引名跨环境不同(ensure_schema长名/NAS副本merge_increment建uq_dbbardata)故sqlite_master运行时探测+实例缓存(哨兵区分None),探不到回退裸查询不劣于现状;GROUP BY(symbol,exchange)=索引前缀→TEMP B-TREE消失(测试EXPLAIN断言钉死);+5测试(双索引名/回退/计划签名/hint下batch==逐只等价);628绿。配套:今晚VPS/NAS库ANALYZE灌统计(建议a一并落地) [vps]
2026-08-24 13:49:24 +08:00
claude_dev
7a6e9c8c52
test(api): 修channel_test随启随验过时断言——实盘=单probe_all定时(启动+90s随墙钟),四时点改由无env直测钉死 [nas]
...
策略session 08-24移交项#2: test_facade_injects_run_daily_for_channel_test 在HEAD恒红,非flaky——原断言的9:35/10:45/13:45/14:30四时点是回测/无env路径;实盘(SANGUO_LIVE_STRATEGY置位)自随启随验(channel_test.py:78-84)只注册一个「启动+90s」的probe_all,时:分随墙钟(13:33/13:34/13:35三跑三变之源)。
修=断言随启随验设计:单probe_all+时刻落在[注册前+90s,注册后+90s]取分窗口(纯时刻比较防1900年日期陷阱,容忍跨午夜);新增无env直测(ChannelTestConfig(on_demand=False))钉死四时点路径,原断言价值不丢。
3跑稳定;tests/api 165全绿。
2026-08-24 13:49:21 +08:00
claude_dev
f214e2f0e4
fix(live): max_pool 全链默认 30→0(0=不限)——08-24巡检定罪MVP限流泄漏生产,选股池=代码序前30只失真 [vps]
...
CI/CD / test (push) Failing after 12m2s
CI/CD / nas-deploy (push) Has been skipped
CI/CD / nas-verify (push) Has been skipped
根因(策略session 08-24 午休探针实证):runtime/live_strategy.py SANGUO_LIVE_MAX_POOL
默认30经env注入全部实盘+影子+paper实例,_stock_pool截断成份池为「代码序前30只」:
small_cap「全市场最小市值」实际在000001平安银行等30只固定代码里选(平安银行≈3800亿
出现在小市值买入=market_cap开盘NaN排序失效叠bug);momentum每行业RPS只在代码序前
30里排;value 0/30+零委托史同源。注释自曝「MVP验证用」=限流遗留泄漏生产,上线
首日起全部选股失真。
改动(9处默认位一致30→0;语义0=不限,与策略层max_pool>0才截断一致):
- sanguo_portfolio/live_strategy.py 适配器env默认+docstring
- sanguo_live/runner.py _portfolio_env_for(存量DB显式值不篡改,缺列/0→"0")
- sanguo_trader/shadow/supervisor.py 影子env默认
- sanguo_portfolio/runner_live.py live_env默认
- sanguo_trader/portfolio_paper.py + sanguo_api/routes_paper.py paper默认
- sanguo_api/routes_live.py create setdefault
- frontend live/paper New.vue 表单默认
测试:env mapping三态断言(缺列/0→"0",显式30不篡改)+live_env默认"0"
(RED→GREEN);CI范围642绿。存量实例DB仍存显式30,激活需配套DB迁移,必须与数据
session的get_security_info_batch SQL治本(101s→亚秒)同车部署——池放大×慢SQL=更糟。
2026-08-24 13:34:01 +08:00
claude_dev
d575029788
docs: CLAUDE.md MCP权限注记更新——claude_dev已提权仓库owner(2026-08-22用户操作) [nas]
...
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 33s
CI/CD / nas-verify (push) Successful in 14s
旧注「MCP token 对仓库无 write 权限,dispatch 403,走 curl basic auth」已过时:
排查实证 token scope 本就齐全(write:issue+write:repository),真根因=claude_dev
协作者角色 read(Gitea 对 read 放行评论=有写权限的错觉来源);用户提权 owner 后
MCP issue_write 开/关往返实测通过(#7 开→关还原)。dispatch 预期同治(下次真实
「推vps」自然验证);cancel_run 404=版本无路由与权限无关。口令闸门铁律不变。
2026-08-22 23:02:03 +08:00
claude_dev
136d087b34
test(ci): CI扩跑tests/portfolio+钉死测试归一——issue#35方案B,440组合引擎题进门禁 [nas]
...
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 2s
前置已消失:2197fea时点的13个Mac环境性失败,已被08-14 bullet_trade 0.9.2升齐+08-15补22个lock包
两次依赖治理顺带清零(本次实测440绿/1.74s,此前无人回头验收过);CI runner=本机Mac同venv310,本地绿即CI绿。
改动三件(不只加一行,用户点破冗余):
- 钉死测试迁至独立文件tests/portfolio/test_provider_method_surface.py:单一真相+保留
fail-not-skip牙齿。原位置挂模块级requires_bullet_trade mark,conftest会在bullet_trade
缺失时自动skip=钉死虚标(#35重演形态),必须移出mark覆盖面
- 删tests/data_platform/test_provider_method_parity.py(4aad65a方案A的复制版,
「两处同步改」人工契约随之消亡)
- ci-cd.yml pytest行扩为 tests/data_platform tests/portfolio
验证:组合跑(CI同款命令)=617 passed/2 skipped/6.07s(177+440,副本删除-1,迁移+1);
conftest合并无冲突;钉死测试在新位置实跑通过。
2026-08-22 22:51:57 +08:00
claude_dev
a58d9fd385
fix(ci): vps-deploy/workflow四雷根治(pipefail×3+ssh裸连+收尾非幂等+关issue不查gap)——issue#33基建工作包#1-#4 [nas]
...
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 3s
pipefail+SIGPIPE 三处(本机复现rc=141确定性,run724根因):
- L82端口释放检测被反转(最危险): netstat大输出|grep -q命中即提前退出→上游tr吃SIGPIPE(141)→pipefail判整管道失败→走||分支谎报「已释放」→下一步/run撞10048竞态
- L91 API等待循环同雷=run724死因: 检测恒假→120轮耗尽exit1→收尾三步全跳过
- L98 /docs探活同族(输出仅3字节几乎不触发,顺手修)
修法: grep -q 'x' → grep 'x' >/dev/null(读完整流不提前退出,无SIGPIPE)
workflow内裸ssh全量补 -o ConnectTimeout=20(对齐vps_restart_resident.sh写法):
单次ssh挂死原会让整步无限冻结; vps-deploy.yml 9处+ci-cd.yml 2处(NAS)
收尾三步抽幂等脚本 scripts/ci/vps_finalize.sh(工作包#2):
- run681/715/724三实录: 部署本体成功但收尾被前序步骤失败整段跳过,只能人工拼三段补
- 现在workflow尾步自动调; 被跳过时Mac本机手跑即补: GTOKEN=<token> bash scripts/ci/vps_finalize.sh <部署的sha>
- 常驻重启失败不阻断tag/issue记账(代码已就位,末尾非零退出提醒); tag -f+push -f天然幂等; issue按真实gap开/关
关issue按真实gap(工作包#3,2026-08-21事故):
- 旧代码硬编码VPS_LOG=""无脑关issue——用户dispatch填旧sha(f28f9cf≠be315a0)漏推P0后,gap非空也关→用户误以为推完
- 修=finalize算vps-deployed..origin/master真实gap,非空则issue保持open并列剩余清单
- gap改按subject算(--format='%h %s'|grep,与enforce-label同定义): --grep匹配整个message,commit body里引用的命令文本会误命中(曾误开issue#7); ci-cd.yml check-vps-needed同步改
- vps_pending_check.py: GITHUB_SHA缺失时回退VPS_DEPLOY_SHA(支持Mac手跑); 有上轮部署sha时body加「仍未上VPS」警示
2026-08-22 22:33:24 +08:00
claude_dev
4aad65aad9
test(ci): 方法面钉死测试复制进CI执行范围——issue#35方案A,ff05207「缺任一CI红」从虚标变成立 [nas]
...
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 35s
CI/CD / nas-verify (push) Successful in 14s
钉死测试(test_method_surface_no_gap_left)原在tests/portfolio/test_provider.py,
而ci-cd.yml pytest只跑tests/data_platform→CI从不执行=钉死虚标(issue#35)。
本commit把该测试逐字复制到tests/data_platform/test_provider_method_parity.py
(复制契约:两处同步改),CI 零改动零新依赖,其他测试零影响:
- 牙齿自检:bullet_trade不可用直接FAIL非skip(skip=环境劣化时钉死无声失效,
重蹈#35;单测失败不中断同批其他测试)
- RED实证:给unified源码临时加假公共方法zz_fake_parity_gap→
AssertionError「回测有实盘无:['zz_fake_parity_gap']」→还原复绿
- venv310按CI原样跑全套tests/data_platform:178绿(原177+新增1)
方案B(CI扩跑整个tests/portfolio,需先清13个Mac环境性失败)仍为可选增强,不阻塞
2026-08-22 20:54:32 +08:00
claude_dev
42894fe884
fix(nas): bs_5m --limit冒烟禁推chunk state——2026-08-22 09:17独立容器冒烟(--limit 3)实锤把state从2025-08-20多推到2025-02-18,[2025-02-18,2025-08-20]半年片被3只股'代表'5548只跳过(当日上午巡检发现:state mtime 09:17恰=冒烟时刻,窗口算术反推+代码链路三证合一);根因=limit_reached只盯DAILY_LIMIT配额防线(bs_5m_eod.py:220),--limit预截断列表后循环'正常跑完'lr=False,286行推进守卫畅通;修=chunk state推进闸门加not args.limit;+测试钉死冒烟不落state(Red复现→Green);NAS侧state两步手动补回(今晚23:5x→2025-08-20补跳过片,明晨完工后→2024-08-19跳过重跑);venv310全套177绿 [nas]
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 36s
CI/CD / nas-verify (push) Successful in 5s
2026-08-22 09:43:03 +08:00
claude_dev
329ad40dd7
feat(nas): 5m下载脱离主容器治本——DSM任务原docker exec进主容器跑,任何push→CI重启主容器=杀在跑的5m(08-20两案+08-22增量案三案实锤,系统性);修=独立一次性容器docker run --rm同镜像同tag(与现役容器sanguo_vnpy_v2:lock-aligned实证一致,CI部署自动跟踪版本),挂载与主容器完全一致,主容器重启永不波及;单实例锁/pid活性/state幂等全部沿用;DSM命令改一行:bash /volume1/stock/sanguo_5m/run_5m.sh; ⚠️ 片宽183d维持不缩(45d小片同配额多跑4倍夜晚,容器解耦后已无暴露面问题,撤回此前缩片建议) [nas]
CI/CD / test (push) Successful in 6s
CI/CD / nas-deploy (push) Successful in 28s
CI/CD / nas-verify (push) Successful in 4s
2026-08-22 09:15:41 +08:00
claude_dev
ff05207f48
fix(provider): 实盘provider方法面全兜齐+CI钉死——用户拍板「不论有无消费方,统一堵光同款洞」:补最后两个裸名缺口①get_constituent(=get_index_stocks纯别名,对齐unified spec§6语义)②get_price_ex(转发base get_price xtdata成熟路径零新逻辑,签名/默认值对齐unified,fq默认'raw'而非base裸名'pre'保跨环境同语义);核心=新增方法面钉死测试:unified全部公共方法在SanguoMiniQmt(+MiniQMTProvider基类)逐一存在,缺任一CI直接红——「回测有实盘无」洞从巡检发现升级为结构性防住,未来unified加新公共方法必须同步实盘侧否则测试fail;+4测试(别名等值/转发参数含fq=raw钉/kwargs透传/方法面零缺口) [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 33s
CI/CD / nas-verify (push) Successful in 14s
2026-08-22 08:50:30 +08:00
claude_dev
27ed4b1416
fix(provider): 实盘SanguoMiniQmtProvider补get_limit_status_batch+get_value_metrics——2026-08-21策略session巡检实锤:方法缺失→实盘策略_get_limit_status getattr(...,None)静默返{}→filter_limitup/limitdown/paused全走'无数据保留'分支=实盘涨跌停/停牌过滤完全失效(涨停股照买/停牌股照挂单),回测LocalUnifiedProvider有此方法实盘缺,第5个同款洞。修=①历史日期(<今日,实盘主路径策略传previous_date,昨晚bs-daily已写昨日bar)委托self._unified同回测口径(prev_close×板块幅度+ST5%+volume==0判停牌,None条目语义原样透传);②当日盘中单次批量xtdata.get_full_tick拿lastPrice/lastClose,幅度复用_limit_pct板块感知(主板10/创业科创20/北交30/ST5),线程超时15s(2197fea开盘QMT忙挂死同款教训);③失败一律返'全清白map'(每code {False,False,False})而非{}——filter_paused对map内缺失code是剔除语义,返{}会全剔除(空转事故形态),全清白=只丢过滤不丢选股;tick缺code/价无效不猜停牌(宁错过不误杀)。另+方法面对照加固(策略session建议):diff两provider扫出get_value_metrics(+batch)同款洞(value_selection未入舰队=提前堵,委托unified三表parquet);get_price_ex/get_constituent裸名零消费不堵;+21测试(委托涨停/停牌/无bar/委托失败全清白/今日走tick/创业板20%钉/缺tick全清白非None/挂死超时/value_metrics四态) [vps]
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 46s
CI/CD / nas-verify (push) Successful in 23s
2026-08-22 08:37:56 +08:00
claude_dev
cbf2db8069
fix(nas): sync_parquet.sh加互斥锁防周日双触发撕损——DSM id=6(周日04:00)当年配置即跑本脚本全量但从未实证(无parquet.log,当时标注待用户DSM UI确认命令),08-21又挂了sync_valuation_daily.sh周日钩子(~03:3x)同一脚本,两路若同日都触发=双scp -r并发写同文件撕损parquet;mkdir原子锁+>6h陈旧覆盖(单跑70min远不到)+trap EXIT清理,哪路先到哪路跑,后到skip留痕 [nas]
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 7s
2026-08-21 23:18:06 +08:00
claude_dev
dc7ee632b9
fix(nas): NAS同步链补两个断更域+周日周更全量挂载——2026-08-21晚全域巡检实锤:每日链(dbbardata增量03:00/小表/events四类/valuation+financial_abstract 03:09)全绿,但①valuation_baostock(bs_eod每晚写pe/pb按年parquet)NAS断更自08-16②fundamentals_baostock(08-20新域,fund腿每晚回灌profit/dupont)NAS完全不存在,两域无任何同步器覆盖;③per-stock周更14子域(balance/cashflow/top_holders等,sync_parquet.sh 6.24G全量)从未被调度,仅08-16手动跑过一次,top_holders已漏VPS 08-16 18:18批次。修=扩展sync_valuation_daily.sh(每日实跑载体):循环外加valuation_baostock+fundamentals_baostock两域scp -r(MB级秒级,03:09时VPS写盘已静止,同款3次重试)+周日(date +%u=7)setsid脱离挂sync_parquet.sh周更全量(ak-weekly周六重写后周日兜底);sync_parquet.sh全量清单补fundamentals_baostock源+du对齐;bash -n过 [nas]
CI/CD / test (push) Successful in 7s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 11s
2026-08-21 23:16:03 +08:00
claude_dev
2197feac33
fix(strategy): 实盘选股挂死根治——证券信息批量委托本地库替600次xtdata RPC + 选股阶段耗时日志 [vps]
...
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 46s
CI/CD / nas-verify (push) Successful in 14s
2026-08-21 实锤(live_19/shadow_60 同卡):momentum 9:30:06 buy_sign=True 后
47min 零输出被重启;small_cap 同型(fundamentals 超时120s后沉默)。channel_test
正常(不走走filters重取数)。value_selection/all_weather 月度未到期=零成交正常。
根因(VPS离场时段探针27s跑完全路径反推):filters.filter_st/filter_new 逐只
get_security_info,每只2次xtdata RPC(_detect_instrument_type+get_instrument_detail)
且无超时——momentum 10指数×30只×2过滤=600次RPC,开盘时段QMT忙时47min+不归;
provider无get_security_info_batch→filters._batch_security_info回退逐只(风暴路径)。
修法:
- SanguoMiniQmtProvider.get_security_info_batch:委托内部LocalUnifiedProvider
(2条本地SQL替N×2次RPC,与78d35ba get_closes_panel/get_constituent_ex同款
委托模式);失败/非dict返None→filters自动回退逐只(不崩策略);全部策略
(aw/mom/sc/vs含_ex)经共享filters即时受益,影子/回测同速
- momentum/_ex+small_cap/_ex 选股段加阶段耗时日志(池预取/宽表/过滤3段,
下个9:30若仍有卡点日志直接钉死位置)
- 遗留已报issue:SanguoMiniQmtProvider无get_limit_status_batch→实盘涨跌停/
停牌filter静默失效(涨停股照买),归数据session按本地公式+单次批量tick根治
测试:+5(委托/失败回退None/非dict回退/filters消费批量零逐只RPC×2,__new__
绕过Mac无bullet_trade的构造raise);portfolio 380绿(13失败全=Mac缺bullet_trade
环境性,NAS CI过)
[vps]
2026-08-21 22:58:57 +08:00
claude_dev
1d754426cd
docs: CLAUDE.md reload行适配任务重组——sanguo-bs-eod→sanguo-bs-daily(2026-08-20晚bs合并,18:05串行eod→fund),即刻让采集生效的命令同步换名 [nas]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 32s
CI/CD / nas-verify (push) Successful in 10s
2026-08-20 20:14:52 +08:00
claude_dev
be315a0fd8
fix(live): P0 order_target_value执行层跨实例互卖根治——2026-08-20 14:06实锤#22探针otv(513030,0)(own仅100股)按引擎全账户target把#18的43,500股(~8.3万)一起卖了,当晚15:10恒等式如实报警(unattributed -83,346/-19.09%>0.5%);所有真实策略卖出全是同款写法(aw:191/409·mom:472·sc:392·vs:383),不修则9:30轮换同代码票必互卖——修法=facade层实例相对化(_instance_order_wrappers):有账本时otv换算 目标-持有 增量下显式股数单(买入差额/卖出硬顶own closeable,清仓允许零股尾巴,减仓整手化,可卖0一单不下·绝不卖别家),负order_value同款硬顶,正order_value买入不动;价格取get_current_data实时价,拿不到回退账本加权成本,双失效才透传引擎旧语义;无账本(回测/单测)原样透传行为零改动;+10测试(只卖自己恰好-100/P0原样复现own空再清仓零下单/T+1当日买closeable=0拒/半仓锁定只卖可卖600/加仓差额2400/减仓整手5000/负ov硬顶1000/正ov透传/无账本identity/价格回退avg_cost);portfolio 410绿 [vps]
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 8s
2026-08-20 20:05:33 +08:00