Commit Graph

318 Commits

Author SHA1 Message Date
claude_dev 67d1c1ef2f ci(vps-gate): commit必打[vps]/[nas]标签+vps-deployed tag+待推issue [nas]
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Failing after 4s
- ci-cd: enforce-label(本次push无标签→fail,merge豁免) + check-vps-needed(nas-verify绿后对比vps-deployed tag,有[vps]未部署→开issue)
- vps-deploy: 成功打vps-deployed tag + 关issue(gap清空)
- scripts/ci/vps_pending_check.py: issue开/关/更新(CI复用)
- docs: vps-impact-map触及面表 + vps-deploy-pending判定记录
- CLAUDE.md: 部署流程段补标签约定
2026-08-02 23:25:40 +08:00
claude_dev b66a6c5958 fix(ashare_engine): load_data 直查 dbbardata 绕 vnpy peewee(治 CTA 死算)
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 4m11s
根因:vnpy 父类 load_data 走 get_database().load_bar_data()(peewee ORM),
get_database init 时 create_indexes 对 26G dbbardata 库 → spawn 建 26G
索引 CPU 死算 1:27+ / web 并发 database is locked(2026-08-02 根因,
vnpy_db 指向 v2 大库 2cb2ab0 后触发)。load_data 读 0 bars → 回测空/卡。

修复:load_data 统一直查 dbbardata(原仅 5m/15m 走 _load_intraday_data,
扩展到日线 d),绕 vnpy peewee get_database。sqlite3 busy_timeout=30s
防并发锁。d → BarData(interval=Interval.DAILY)。

验证:日线 600519 2024H1 load_data 0.1s bars=116(was database locked
5.2s/0 bars) interval=DAILY;run_backtesting 5.6s(was 死算 1:27+);
000001 compute_metrics 完成 daily_df=(116,25) benchmark=116(5图metrics恢复)。
2026-08-02 21:48:33 +08:00
claude_dev c263aa14ab chore(cta_engine): 加 load_data bar数+run_backtesting logging(确诊卡点)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 27s
CI/CD / nas-verify (push) Successful in 3s
cta_6f7e8036 日线卡 run_backtesting(CPU85%,read_index_daily 前即卡),日线111bar该秒级→疑似 load_data 读多了(vnpy_db 2cb2ab0修复后读真实dbbardata,区间过滤/interval疑失效)。加 load_data history bars 数 + run_backtesting 完成 logging,重跑看 bar 数确诊。
2026-08-02 21:21:42 +08:00
claude_dev 3d934f5fa6 chore(cta_engine): 加阶段 logging(治 spawn 子进程黑盒,定位卡死)
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 30s
CI/CD / nas-verify (push) Successful in 7s
CTA 回测走 ProcessPool spawn 子进程,cta_engine 没配 basicConfig → 回测日志不进 docker logs(卡死看不到卡哪行,反复诊断障碍)。加模块级 basicConfig + read_index_daily/compute_metrics 阶段 logging + daily_df shape。下次卡死 docker logs 可见卡段(同 portfolio_worker)。诊断 cta_8aab3823 日线卡(rolling 已修非根因)。
2026-08-02 21:14:40 +08:00
claude_dev 2ff8ecaf52 perf(metrics): rolling alpha/beta 向量化(O(n²)→O(n),治分钟级卡死)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 5s
compute_metrics rolling alpha/beta 原 for 循环每点 iloc[:i+1].cov/var = O(n²)。日线 111 天没事,分钟级 daily_df(万行)卡死(cta_c287f4b5 卡 5min CPU88%)。改 pandas expanding 向量化(cov/var/mean O(n)),数值与原循环一致(beta/alpha diff<1e-15,NaN 位置匹配)。pytest 6 绿。触发:b2c41c7 降级让 compute_metrics 首次在 benchmark 有数据时真跑(此前 benchmark 空被 skip),暴露 rolling O(n²) 性能 bug。
2026-08-02 20:54:50 +08:00
claude_dev b2c41c73b8 fix(backtest): CTA metrics benchmark 缺失降级(不阻塞整组指标图)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 42s
CI/CD / nas-verify (push) Successful in 5s
benchmark 数据缺失时原实现 if 跳过整段 compute_metrics → {task_id}_metrics.json 不写 → 策略净值/回撤/波动图也空(不只基准图)。改为:benchmark 空时传空 Series + log WARN,compute_metrics 内部 reindex→fillna(0) 容空(基准类指标 NaN→None,策略指标正常),metrics.json 照写。效果:策略图照常出,只基准/Alpha/Beta 图空(前端 benchmark-curve/risk-series 已容错)。加测试 test_run_cta_backtest_benchmark_missing_degrades(mock read_index_daily 返空 → 验 compute_metrics 仍 called + metrics.json 仍写 + 策略指标有值)。6 测试全绿(Mac pytest)。
2026-08-02 20:37:50 +08:00
claude_dev 2cb2ab0dd8 fix(config): vnpy_db 改 NAS v2 dbbardata 库(治 CTA 结果页 5图空白)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
根因:vnpy_db 指向旧路径 /volume1/stock/sanguo_vnpy/data/quant_trading.db
(v1 残留,库不存在)→ read_index_daily 连空库报错 → cta_engine try catch
(line 307)静默跳过 compute_metrics → metrics.json 不写 → CTA 结果页
5图全空(基准/Alpha/Beta/回撤/波动)。个股回测走 parquet 不受影响,故只
5图空,日志无 traceback(静默跳过非崩溃)。

修复:vnpy_db → /volume1/stock/sanguo_vnpy_v2/data_backup/quant_trading.db
(NAS v2 dbbardata 库,000300 SSE 4025行实证)。yaml 本就是 NAS 路径基准
(daily_dir 等 /volume1/stock/...),VPS 走 SANGUO_DATA_ROOT env 覆盖、
Mac 走 fixture,三环境互不影响。

端到端验证:NAS 容器 load_config(find_config_path()) → vnpy_db v2 →
read_index_daily('sh000300',2024-01-02,2024-06-28) 返回 117行(was 0)。
2026-08-02 20:22:44 +08:00
claude_dev 4c5270cf7a fix(frontend): EquityCurve 去 v-if + watch flush:post(治净值图永不init)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 2s
EquityCurve 用 v-if/v-else(空数据占位/否则chart-box),但数据异步到达时 v-else 切换 + watch 默认 pre flush → el.value 尚未绑定 → echarts.init 跳过 → 净值图 hasEchartsInstance=false 永不画。改为总渲染 chart-box(同 BenchmarkCurve 模式) + watch flush:post 保证 DOM patch 后 render。vue-tsc RC=0。
2026-08-02 20:01:55 +08:00
claude_dev c049e0e97d fix(frontend): MetricCards fmt 兜底字符串值(治结果页整页渲染崩溃)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
后端 statistics 字段可返字符串(如 sharpe_ratio="0",vnpy原始统计),原 fmt 直接 value.toFixed 在字符串上抛 TypeError。stack trace 证实:Result.vue onMounted 赋值 relativeMetrics 后 MetricCards fmt 崩溃,中断 Vue re-render → echarts setOption 从未执行 → 指标卡+所有图表全空(cta_3919916e 零成交复现,canvas:0)。Number() 统一转换兜底。vue-tsc RC=0。
2026-08-02 19:51:51 +08:00
claude_dev 857d43c6c2 fix(frontend): CTA结果页补净值曲线图(零成交也出图)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
Result.vue 拉了 equity-curve 数据却未画净值曲线;且 benchmark-curve/risk-series 依赖 *_metrics.json,CTA 引擎当前未生成该文件,致收益概述图全空。新增 EquityCurve.vue 走 equity-curve 接口(独立于 metrics.json,数据源 BacktestResult.equity_curve),零成交时画 N 天平线(初始资金不变),满足'有结果就有图'。vue-tsc RC=0。
2026-08-02 19:10:55 +08:00
claude_dev 9588a77a01 feat(portfolio): 回测可观测性 L1+L2+L3(治排查黑盒)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 4s
L1 worker logging: portfolio_worker 模块级 basicConfig(spawn子进程logger进docker logs)
  + subprocess stderr=None 继承(runner_backtest日志实时进docker logs,原capture_output吞了)
  + 失败处理适配(stderr未捕获,改提示查docker logs)
L2 task状态区分: 加 GET /portfolio/task/{id}/status(返state+error)
  + get_result 区分 failed(422+error)/running·pending(404 not ready)/done(原全404分不清)
L3 _wait_future日志: runner.py except 加 logger.error(原只task.fail静默,治非timeout异常排查)
前端无需改(轮询通用/task/{id}已处理failed)
2026-08-02 13:42:06 +08:00
claude_dev 6d23f7b5ec fix(portfolio): worker _TIMEOUT 3600→10800(3h)+timeout非静默日志
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 6s
全市场(max_pool=0)全周期(726天)回测每策略 60-100min,原 3600s(1h)不够→
subprocess.run kill→_wait_future 静默 task.fail→404。改 10800(3h)覆盖。
加 try/except TimeoutExpired 显式 logger.error(task_id+argv)+raise RuntimeError,
timeout 不再静默(治基建反馈排查困难)
2026-08-02 07:14:00 +08:00
claude_dev e22c8ee939 feat(portfolio): max_pool 字段透传(model+handler+前端,解除30硬编码)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
model 加 max_pool 字段(默认30,0=全市场不限);handler 用 req.max_pool 替换硬编码30;
前端加选股池上限 input + onSubmit 透传。下游 submit_portfolio→spec→argv--max-pool
链路异步化时已存在,本次只补入口。全周期验收可传 max_pool=0 对比 docker exec 旁证
2026-08-01 23:20:40 +08:00
claude_dev 7a14d7da82 feat(portfolio): strategy 字段全链透传(API→orchestrator→worker→runner_backtest + 前端选择器)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 20s
CI/CD / nas-verify (push) Successful in 3s
后端: PortfolioBacktestRequest.strategy → submit_portfolio(strategy=) → spec →
portfolio_worker _build_argv --strategy(NAS local + Mac SSH 两分支)
前端: PortfolioBacktestReq.strategy? + 策略下拉(4选项) + 副标题动态 + onSubmit 透传
runner_backtest CLI 已支持 --strategy(choices 4 策略),本提交不动
2026-08-01 23:01:26 +08:00
claude_dev 5c5bd9d7bb fix(docker): PYTHONPATH ENV 移 COPY 后(缓存命中 TA-Lib,避 sourceforge wget 卡)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 20s
CI/CD / nas-verify (push) Successful in 2s
PYTHONPATH ENV 原在 Step2 前置,致其后所有层 cache miss,TA-Lib 步骤重编译触发
wget sourceforge 国内卡死(build_v3 卡 29min load0.04)。移到 COPY 代码后:Step1-19
(apt/TA-Lib/pip)与旧 build 相同→缓存命中跳过 wget,只 ENV+COPY 重跑(秒级)。
功能等价(PYTHONPATH 在镜像 env,spawn 子进程继承),仅层缓存优化。

build_v4 实证:Step5 TA-Lib Using cache(跳 wget)+镜像 ENV PYTHONPATH 固化
(docker exec 探针可见 /app:/app/vnpy_v4.4.0,修复前空)。
2026-08-01 22:49:21 +08:00
claude_dev 0f6cdbedc9 fix(entrypoint): uvicorn --log-level 转小写(治 exit2 crash loop,第3根因)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 2s
新版 entrypoint(uvicorn 工厂)拼 --log-level ${VNPY_LOG_LEVEL:-info},但 VNPY_LOG_LEVEL
已 export INFO 大写,默认值不生效→传 INFO→uvicorn case-sensitive 拒绝→exit2 crash。
改 ${VNPY_LOG_LEVEL,,} 转小写(bash4+,shebang /bin/bash 支持)。

新版 entrypoint uvicorn 工厂首次在 NAS 跑,连暴露 3 个 crash 根因(已全修):
  6d786fb: PYTHONPATH(spawn import 治 BrokenProcessPool)
  c210197: +x 执行位(tini exit126) + SKIP_REDIS_CHECK(Redis 超时)
  本commit: --log-level 小写(uvicorn exit2)
旧版 python run_web.py 硬编码 log_level='info' 无后两个问题。
2026-08-01 21:59:39 +08:00
claude_dev c210197778 fix(entrypoint): +x 执行位 + SKIP_REDIS_CHECK 默认1(治 run535 NAS crash loop)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Failing after 34s
CI/CD / nas-verify (push) Has been skipped
run535 部署后容器 crash loop(exit126),两个独立根因:
1. Permission denied: entrypoint.sh git mv 后 644 无执行位,rsync 推 NAS 也是 644,
   bind mount 覆盖镜像层 chmod +x 无效,tini exec 失败。→ entrypoint.sh git 100755。
2. Redis 连接超时:新版 entrypoint 检查 SKIP_REDIS_CHECK!=1 才查 Redis(旧版 if false
   硬跳过),NAS 无 Redis 卡检查 crash。→ 默认 SKIP_REDIS_CHECK=1(复现旧版跳过)。

附:文档(nas-deploy-plan 方案①已实施 + ops/README 根治标记)。
2026-08-01 21:43:29 +08:00
claude_dev 6d786fbf41 fix(orchestrator): spawn 子进程 PYTHONPATH + entrypoint 回根治孤儿
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Failing after 33s
CI/CD / nas-verify (push) Has been skipped
ProcessPoolExecutor(spawn)子进程不继承主进程 sys.path(insert 是内存修改),
import sanguo_orchestrator 失败->BrokenProcessPool->API 回测静默失败,POST 秒回
task_id 但轮询永远 404。spawn 继承 env 不继承 sys.path,故:
1. Dockerfile ENV PYTHONPATH=/app:/app/vnpy_v4.4.0(镜像层,bind mount 覆盖不了)
2. entrypoint.sh 回仓库根(git mv 自 docker/):promote --exclude /docker 致旧版
   entrypoint 在 NAS 成 git 外孤儿(340行,被 bind mount 覆盖镜像层);回根后全量
   rsync 自动推可复现(对齐 docs/deployment/nas-deploy-plan.md 预设修复)+export 兜底
3. 三 Dockerfile COPY 路径同步

反馈: 策略 session(根因诊断+探针验证)
2026-08-01 21:33:20 +08:00
claude_dev ca0ec016f9 ci(nas-verify): 加 /health gate 防存活探针回归
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
/health 是 Docker HEALTHCHECK 依赖端点,后端漏实现致容器恒unhealthy
(a17f291 已补端点)。nas-verify 加 gate:/health 非200→CI 红灯,防漏部署/被改坏。
public 端点无需 token,$BASE 已是 http://192.168.2.154:8000。

反馈: 前后端 session
2026-08-01 21:07:34 +08:00
claude_dev 1989a54ee5 fix(deps): requirements-lock 补 bullet-trade/jqdatasdk 治重装丢包
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
VPS lock 缺这俩包(实为手动 pip install 在 c:\python310),重装 Python 环境会丢
——与 NAS docker 重建丢包同源坑。版本与 docker 侧/VPS 实装对齐(0.9.2/1.9.8)。

polars[rtcompat] 不入 lock:NAS Celeron 无 AVX2 专属,VPS AMD64 有 AVX2 用普通 polars。
2026-08-01 21:05:27 +08:00
claude_dev a17f291850 fix(api): 加 /health 存活探针端点(治Docker HEALTHCHECK恒unhealthy,/health原404)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
2026-08-01 21:01:35 +08:00
claude_dev f9b7c103c0 docs: §10 可复现构建更新(单阶段Dockerfile+polars[rtcompat]+已验证换装)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 3s
2026-08-01 20:39:58 +08:00
claude_dev 7bed73aa4c fix(docker): polars[rtcompat]==1.42.1(治 NAS AVX2 SIGILL 根因)
深查:pre-init-rebuild 有 polars-runtime-compat 兜底层才跑得通;
plain polars==1.42.1 新镜像缺 rtcompat → import 即 SIGILL exit132;
vnpy_ctastrategy 的132是transitively import polars 同根因。
改 polars[rtcompat]==1.42.1 拉 polars-runtime-compat
2026-08-01 20:09:03 +08:00
claude_dev e0808859da fix(docker): polars 钉 1.42.1(NAS 无 AVX2,>=1.43 SIGILL 崩溃 exit132)
构建验证抓到:>=1.26.0 拉到 1.43.2 在 NAS(Celeron 无AVX2)import 即崩;
pre-init-rebuild 的 1.42.1 实证可跑,钉死。>= 松约束版本漂移教训
2026-08-01 19:49:06 +08:00
claude_dev 0332aef3d4 fix(docker): 加 .dockerignore 瘦身构建上下文(1.9G→~50MB)+Dockerfile apt清华镜像
NAS容器bind-mount提供代码/data,镜像只需Python+依赖层;
排除data_cache/frontend/venv/logs/.git等;治上下文发送慢+输出不可监控
2026-08-01 19:20:12 +08:00
claude_dev 53daf9b57b fix(docker): Dockerfile apt 换清华 debian 镜像(原 deb.debian.org 国内不稳) 2026-08-01 19:16:10 +08:00
claude_dev 608574b49b fix(docker): Dockerfile pip install 对齐清华源(与 Dockerfile.test+运行时env一致)
原用默认 pypi.org,国内构建拉 torch 等大包极慢易超时;对齐项目标准清华源
2026-08-01 19:07:52 +08:00
claude_dev e64b5906da fix(portfolio-backtest): 净值曲线 echarts 空白 - watch漏触发手动兜底
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 3s
根因(浏览器实证): onSubmit 异步轮询 done 后 result/equityCurve 同帧赋值,
v-if result 块(含 chart-box div)此帧才挂载, watch(equityCurve, flush:post)
在该时序下漏触发 renderEquity → echarts 从未 init(chart-box 无 _echarts_instance_)。
手动 echarts.init+setOption 实证容器/echarts/数据全正常(37点),纯 watch 触发遗漏。

修复: equityCurve 赋值后 await nextTick()(等 chart-box 挂载)+ 手动 renderEquity()兜底。
watch 保留(双保险, ensureChart 幂等)。
2026-08-01 16:56:26 +08:00
claude_dev 4986e5c3c4 feat(portfolio): 组合回测异步化(接入 orchestrator task 框架)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 3s
routes_portfolio 同步 subprocess.run(timeout=600) >10min 回测被 504 杀。
改异步复用现有 sanguo_orchestrator:submit_portfolio 仿 submit_factor,
子进程执行搬至 portfolio_worker.py(三机自适应保留,timeout 600→3600),
复用 _wait_future/_on_done 持久化。前端 onSubmit 改 POST 拿 task_id
→ 轮询 /task/{id} → done 取 /portfolio/task/{id}/result。

- runner.py: + submit_portfolio + _portfolio_worker(lazy import)
- portfolio_worker.py(新): 三机自适应 argv + 子进程 + stdout JSON → BacktestResult
- routes_portfolio.py: POST async 返 task_id + GET /portfolio/task/{id}/result
- 前端: postPortfolioBacktest 返 task_id + 轮询 status + 取 result(去 600s timeout)

不动策略逻辑/runner_backtest 核心/现有 task 接口。
2026-08-01 13:52:46 +08:00
claude_dev 2ca2facce3 fix(docker): requirements-docker 补组合/CTA 运行时依赖(治重建丢包后患)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 25s
CI/CD / nas-verify (push) Successful in 4s
容器是 docker commit 快照链(pre-init-rebuild 比 with-sqlite 多64包),
手动装的 bullet-trade/jqdatasdk/vnpy_ctastrategy/vnpy_sqlite 只活容器层,
从 base 重建会全丢。补进 requirements-docker.txt 钉到容器实证版(均PyPI可装):
- bullet-trade==0.9.2(组合框架,import bullet_trade)
- jqdatasdk==1.9.8(bullet_trade import 链必需)
- vnpy_ctastrategy==1.4.1(CTA引擎)
- vnpy_sqlite==1.1.3(vnpy sqlite驱动)
不补 pyecharts(0import残留)/jupyter栈(bloat)
docs §10 记可复现重建步骤;干净重建待 env 空闲验证
2026-08-01 12:23:53 +08:00
claude_dev 4fccfad4ca fix(nas): 固化容器 --init 铁律(防后台回测被清复发)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 21s
CI/CD / nas-verify (push) Successful in 2s
- docker-compose.yml vnpy 服务加 init:true(供未来 compose 部署)
- three-env-code-promote.md 新增 §9:NAS 容器必须 --init 创建,
  手动重建命令+image(pre-init-rebuild勿用with-sqlite)+复发风险(手动rm+run)
根因:无init时docker exec nohup后台进程会话结束后被清(02 day0 4min被清)
ci-cd只restart不重建,--init保留;唯一丢--init路径=手动rm+run
2026-08-01 08:49:32 +08:00
claude_dev 3b3e42985e fix(datareader): read_index_daily 切 dbbardata(治 benchmark 读陈旧 vnpy DbBarData)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 3s
cta_engine benchmark 经 read_index_daily 读 vnpy DbBarData(方案A前陈旧源)。
切 dbbardata(指数点位已由 sina_index_eod 灌 exchange=SSE)。

- 数据源:vnpy get_database.load_bar_data → sqlite3 直连 dbbardata
- 消除覆写 vnpy SETTINGS 副作用(cta_engine.py:73/199)
- 回归坑1(000300读空):CODES 已加 000300 → dbbardata 有数据(本轮修复)
- 回归坑2(sz000905):默认 benchmark sh000300 不触发;中证指数用 sh 前缀
- 复用 provider 模式:substr(datetime,1,10) 比日期规避混合格式
- 测试:mock vnpy → 真实 tmp sqlite 库测 SQL 路径(2测重写)
- 验证:Mac 4+5 passed + VPS 真实库 sh000300 7月23行 close4588.197
2026-08-01 08:41:57 +08:00
claude_dev 6b3d86920b fix(idx-eod): 000300 沪深300 加入 CODES,补 7-16→7-31 数据
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 26s
CI/CD / nas-verify (push) Successful in 5s
根因:000300 不在 sina_index_eod.py CODES(15个中证指数码),无每日更新
机制,停在历史灌入的 7-16。其他14码由 idx-eod 每日更新到 7-31。

修复:CODES 加 000300(sina 主源良好,无股票码碰撞)。实证 ssh VPS 跑
--codes 000300 补22行(7-17~7-31新增11行),dbbardata 000300 SSE
max=7-31 rows=4025(was 7-16/4014)。明天 idx-eod 18:30 起每日自动更新。
2026-08-01 08:00:36 +08:00
claude_dev 3813d22e2b fix(nas_sync): sync_parquet.sh 加保活+retry(防6.24G跨公网broken pipe)
CI/CD / test (push) Successful in 8s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 4s
scp -r 6.24G/70min跨公网,加ServerAliveInterval=30保活+3次retry兜底broken pipe。
2026-08-01 07:37:31 +08:00
claude_dev 4876727289 fix(nas_sync): sync_valuation_daily 改scp-r(单tar跨公网broken pipe)
CI/CD / test (push) Successful in 11s
CI/CD / nas-deploy (push) Successful in 23s
CI/CD / nas-verify (push) Successful in 3s
单tar 1.1GB scp跨公网broken pipe(连接断retry难救);改scp-r多文件独立传
(sync_parquet.sh验证6.24G鲁棒)。实测valuation+financial_abstract DONE,
8-1同步5535x2文件。踩坑:nohup &在tee命令里干扰stdin致部署空,分步tee。
2026-08-01 02:04:19 +08:00
claude_dev 86bec48b14 feat(nas_sync): valuation+financial_abstract 每日同步脚本
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 4s
ak-eod每日--force全量重写valuation/financial_abstract(估值随股价每日变);
bsdtar--newer慢盘stat不可行(11070文件>60s),改python tarfile全打包(实测9.5s/1.1GB)->scp->解包。
拆分:每日高频per-stock(valuation)+per-date(dragon_tiger等)+每周低频per-stock(northbound等)。
2026-07-31 23:03:50 +08:00
claude_dev ae6dde7778 fix(frontend): 组合回测副标题文案修正(本地执行,非VPS)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 24s
CI/CD / nas-verify (push) Successful in 4s
CI/CD 测试改动:验证 nas-deploy 前端 build+rsync 链路对前端改动跑得通
2026-07-31 22:54:49 +08:00
claude_dev 9013ecc141 docs(claude): 加部署职责边界(业务session只push,推VPS是运维+人决策)
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 29s
CI/CD / nas-verify (push) Successful in 4s
明确:开发/数据/策略 session 改完代码 git push 即完成(NAS 自动验证),不要自己推 VPS;VPS prod 必须 nas-verify 绿后由人触发 vps-deploy(运维 agent + 人协作)。让所有 session 按当前分层方案执行。
2026-07-31 22:44:41 +08:00
claude_dev e5e9632460 docs: session-environment-guide 更新为分层CI/CD流程(NAS自动+VPS dispatch+agent PAT)
CI/CD / test (push) Successful in 12s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 4s
Step2 改 promote --target nas(CI自动为主,手动应急);§8 改已建成分层(双workflow隔离+两种approve+PAT osxkeychain sanguo-gitea-ci)。原写同时推NAS+VPS/审批gate过时。
2026-07-31 22:02:50 +08:00
claude_dev 7f550d2eb2 feat(nas_sync): parquet per-date 每日增量同步脚本
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 30s
CI/CD / nas-verify (push) Successful in 6s
VPS机械盘扫parquet小文件mtime慢(11070文件>60s),bsdtar--newer不可行;
per-date类(ak-events:dragon_tiger/block_trade/margin_sse/restricted)按文件名
日期精确拉(7天窗口容错),绕开慢盘。实测pulled=20/skipped=8。
per-stock类仍走sync_parquet.sh周度全量。
2026-07-31 22:02:29 +08:00
claude_dev 74c280d636 docs(claude): 部署流程改分层(NAS自动验证+VPS dispatch两种approve)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Successful in 3s
CI/CD 已改分层: ci-cd.yml push→NAS 自动部署+验证(nas-verify 秒级 gate); vps-deploy.yml workflow_dispatch 触发推 VPS(人工 UI 点 / agent basic auth dispatch API)。promote.sh 加 --target nas|vps|all。CLAUDE.md 部署段同步。
2026-07-31 15:25:10 +08:00
claude_dev 83e5c73a8f fix(ci): nas-verify login 字段名 token(非 access_token,实测响应 {token:...})
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 20s
CI/CD / nas-verify (push) Successful in 3s
2026-07-31 15:18:53 +08:00
claude_dev 6731fc35bf fix(ci): nas-deploy rsync 前cd..回根(build合并在cd frontend step里,rsync frontend/dist/需在workspace根)
CI/CD / test (push) Successful in 10s
CI/CD / nas-deploy (push) Successful in 22s
CI/CD / nas-verify (push) Failing after 1s
2026-07-31 15:16:32 +08:00
claude_dev 5d54e22f72 feat(ci): CI/CD分层(NAS自动验证+VPS dispatch)
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Failing after 12s
CI/CD / nas-verify (push) Has been skipped
promote.sh 加 --target nas|vps|all(拆 NAS/VPS,默认 all 兼容)。ci-cd.yml 重构: push→test→nas-deploy(推NAS后端+前端dist+restart容器)→nas-verify(login+strategy/list+dbbardata 秒级 gate),不再自动推 VPS。vps-deploy.yml 新建: workflow_dispatch+sha input,checkout 指定 commit→promote --target vps→verify,严格版本一致(VPS=NAS验证过的 commit)。两种 approve: 人工 Gitea UI Run workflow / agent MCP dispatch_workflow。原因: Gitea 不支持 environment approval gate,此前 promote.sh 同时推 NAS+VPS 无隔离,push 即上 prod。
2026-07-31 15:14:05 +08:00
claude_dev 67bc87f69d fix(ci): 纳入frontend/tsconfig*.json(vue-tsc build 需要)
CI/CD / test (push) Successful in 9s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / nas-frontend (push) Successful in 13s
CI/CD / vps (push) Successful in 18s
根.gitignore *.json 同样忽略了 tsconfig.json/tsconfig.app.json/tsconfig.node.json → CI checkout 缺 → vue-tsc -b 报 TS5083 Cannot read tsconfig.json。加 !tsconfig*.json 例外。
2026-07-31 14:03:14 +08:00
claude_dev 3cf1bf9646 fix(ci): 纳入frontend/package-lock.json(CI npm ci 需要)
CI/CD / test (push) Successful in 8s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / nas-frontend (push) Failing after 9s
CI/CD / vps (push) Has been skipped
根.gitignore 的 *.json 忽略所有 json 但只 !package.json 例外,漏了 package-lock.json → lockfile 没进 git → CI checkout 无 lockfile → npm ci 失败(nas-frontend job)。加 !package-lock.json 例外。
2026-07-31 13:38:23 +08:00
claude_dev 6e7179eb24 feat(ci): CI加前端build+部署NAS闭环(nas-frontend job)
CI/CD / test (push) Successful in 9s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / nas-frontend (push) Failing after 3s
CI/CD / vps (push) Has been skipped
新增 nas-frontend job(checkout→npm ci→npm run build→rsync dist 到 NAS homes/admin/frontend/dist),与 nas-smoke 并行;vps job 改 needs[nas-smoke,nas-frontend]。打通.vue 改动→push→CI 自动 build→NAS web 自动生效闭环(此前前端 dist 被 gitignore+promote.sh 无 frontend+workflow 无 build,CI 对前端完全断)。复用 Mac runner node v26/npm,HOME=/Users/chufeng 复用 ~/.npm cache。VPS 无 web 不部署前端。容器 bind mount homes/admin->/app,放挂载源即生效,无需改 Dockerfile。
2026-07-31 13:35:19 +08:00
claude_dev 286c0bd069 fix(portfolio-backtest): 净值曲线watch加flush:'post'
CI/CD / test (push) Successful in 8s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 22s
watch(equityCurve) 默认 flush:'pre' 在 DOM 更新前触发,
equityEl div(在 v-if=result 内)尚未挂载→echarts.init 拿不到 DOM→空图。
flush:'post' 让 watch 在 DOM 更新后触发,曲线正常渲染。
2026-07-31 13:21:16 +08:00
claude_dev 4317d97fb0 fix(docker): Dockerfile.test补bullet-trade==0.9.2(组合回测依赖)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 1s
CI/CD / vps (push) Successful in 22s
NAS容器跑sanguo_portfolio.runner_backtest依赖bullet_trade,此前容器内临时pip install装在writable layer(重建即丢);补进Dockerfile永久,镜像重建功能不失效。
2026-07-31 08:36:04 +08:00
claude_dev b2aab85105 feat(nas_sync): 小表全量同步管线(constituent_unified+bs_adjust_factor)
CI/CD / test (push) Successful in 10s
CI/CD / nas-smoke (push) Successful in 2s
CI/CD / vps (push) Successful in 18s
新增 export_table.py/merge_table.py/sync_tables.sh: VPS stdin喂python全量dump → scp → NAS全量替换(DROP+CREATE+INSERT,幂等可重跑)。sync_dbbardata.sh 每日increment末尾连带跑 sync_tables,保持NAS副本成份股/复权因子不陈旧。修复NAS组合回测选股恒空(NAS副本缺constituent_unified表,phase3只导dbbardata)。
2026-07-31 08:18:36 +08:00