框架

DUCKERRY_Warehouse v4.3 一次性优化提示词 · 债券腿入管线 + 全库同步自检

改动前备份(任何代码改动前执行):

optimization · 资产·机制 · optimization/提示词/系统优化提示词_2026-09-23_v4.3_债券腿入管线与全库自检.md · 11879 B

DUCKERRY_Warehouse v4.3 一次性优化提示词 · 债券腿入管线 + 全库同步自检

性质:只需运行一次的优化交接包。整段可粘贴到新对话,无需补充路径/参数。

本次状态:已于 2026-09-23 在本次会话中执行完毕并通过全部验证(见 §7 证据)。再次运行时请按 §0 的"幂等检查"执行:已完成的项只做验证,不重复改动。

目标仓库:/var/minis/mounts/DUCKERRY_Warehouse(Obsidian Vault,可读写)


0⃣ 幂等检查(先跑,决定本次是"执行"还是"验证")

cd /var/minis/mounts/DUCKERRY_Warehouse
grep -n "def refresh_bond_leg" scripts/fetch.py            # 阶段1 已完成?
ls scripts/doc_sync_check.py                               # 阶段2 已完成?
python3 -c "import sys;sys.path[:0]=['scripts','tests'];import test_pipeline as t;print(sorted(c for c in dir(t) if c.endswith('Tests')))"
python3 scripts/doc_sync_check.py                          # 阶段5 一致性
结果动作
四项齐全且自检全绿只验证:跑 §3 全链路测试 + §6 判据清单,出一份验证报告,不改代码
有缺失项按 §1→§5 顺序补齐缺的部分,其余保持不变

改动前备份(任何代码改动前执行):

cd /var/minis/mounts/DUCKERRY_Warehouse && \
mkdir -p /var/minis/shared/backup && \
tar czf /var/minis/shared/backup/DUCKERRY_Warehouse_pre_v43_$(date +%Y%m%d_%H%M%S).tgz \
  scripts tests optimization "00 驾驶舱(投资MOC).md" 2>/dev/null; echo "备份完成"

1⃣ 阶段一:把债券腿接入主管线(消除"每日手动第 0 步")

要解决的问题:v4.2 把 TLT/AGG 刷新做成了每日发布前的手动附加步骤。用户要求它归入每日复盘流程——即每日发布必须恢复"一条命令跑完"。

实现要求(scripts/fetch.py):

  • 新增模块级函数 refresh_bond_leg(timeout=240, quiet=False):
  • 在面板构建之前调用(债券数据是面板输入,顺序不能错)。
  • 通过 subprocess.run(["sh", str(K.REPO/"scripts"/"refresh_bond_etf.sh")], cwd=..., capture_output=True, text=True, timeout=...) 执行。
  • 绝不致命:任何异常(超时 / 无浏览器会话 / 脚本缺失 / 非零返回码)都必须捕获并继续,把错误追加到 数据/logs/bond_leg_error.log,返回结构化结果 {"ok":bool, ...}。

*理由*:债券腿滞后只是 L0-3 的已文档化降级(退回 10Y 收益率代理),绝不该阻断当日发布。

  • 逃生开关:环境变量 DK_SKIP_BOND=1(返回 {"ok":True,"skipped":True},不得调用子进程)。
  • 新增 CLI 参数 --no-bond(语义同上)。
  • 结果写入 latest.json 的 bond_leg 字段(供后续会话与自检读取)。
  • --no-fetch 诊断模式下仍可运行(但不得因此把 publish_status 变 PASS)。

产出:每日发布 = python3 scripts/fetch.py 一条命令,债券腿自动在管线内刷新。


2⃣ 阶段二:把"排版同步"变成可校验逻辑

要解决的问题:v4.2 的"排版同步"是一张人工清单(靠人记得改驾驶舱、快照、报告)。用户要求"其他文件同步更新逻辑"——即同步必须可机器判定。

新增 scripts/doc_sync_check.py,实现 evaluate(A, moc_text, snapshot_text, runlog_text, panel_rows) -> list[str](纯函数,便于单测注入样本),检查 9 项:

#检查项
1驾驶舱 frontmatter 更新时间 = 本次运行日期
2驾驶舱 AUTO:DATA 区块的目标交易日 = latest.target
3AUTO:DATA 的抓取时间 = latest.generated_at
4驾驶舱头部状态行的「面板 N 行 / M 交易日 / span」= 实际面板
5目标日快照存在、非失败占位、目标交易日 = latest.target
6快照 L0-3 结论与 latest.l0 的 L0-3 status 一致("可评估(含真实债券价格)" vs "收益率代理" 回退必须告警)
7驾驶舱 §十 工具箱中链接的 optimization/ 文件都存在(注意 Obsidian 表格内 | 转义需剥离)
8驾驶舱 §九 版本记录包含最新的 系统架构优化报告_<日期>.md 日期
9run_log.md 末尾条目包含本次 target

在管线中的位置:fetch.py 发布成功后自动调用,仅告警、永不阻断;结果写入 latest.json.doc_sync(写完需回写一次 latest.json,否则该字段为空)。独立用法 python3 scripts/doc_sync_check.py [--strict](--strict 时有 issue 则退出码 1)。


3⃣ 阶段三:全链路测试(必须真跑,不许只看代码)

3.1 静态

cd /var/minis/mounts/DUCKERRY_Warehouse && python3 -m compileall -q scripts tests && echo COMPILE_OK

3.2 单元测试(新增 7 项,套件 15 → 22)

按类分批跑(iSH 上整套 discover 的汇总行常被静默 kill 截断,分批才能拿到确定结论):

cd /var/minis/mounts/DUCKERRY_Warehouse
for c in PipelineSafetyTests PaperEngineTests BondLegTests DocSyncTests; do
  python3 -m unittest tests.test_pipeline.$c > /tmp/$c.log 2>&1
  echo "=== $c rc=$? ==="; grep -E '^(Ran|OK|FAILED)' /tmp/$c.log
done

必须新增的测试:

  • BondLegTests(3):① 浏览器通道不可用(monkeypatch subprocess.run 抛 FileNotFoundError)时 refresh_bond_leg() 不抛异常且 ok=False;② DK_SKIP_BOND=1 时完全不调用子进程;③ update_bond_etf 增量合并不覆盖已入库日期(同日修订值被丢弃、新日期被追加)。
  • DocSyncTests(4):① 完全一致的文档零告警;② 面板行数漂移(MOC 写 81 实际 82)被报出;③ 快照缺失被报出;④ L0-3 从"可评估"回退成"收益率代理"被报出。

3.3 端到端真跑(后台方式,前台必被静默 kill)

cd /var/minis/mounts/DUCKERRY_Warehouse && \
DK_DISABLE_MCAL=1 nohup python3 -u scripts/fetch.py --force > /tmp/fetch_v43.log 2>&1 & echo "PID=$!"

用 delay(不要用 sleep)每 120–150 秒轮询:kill -0 <PID> && echo RUNNING || echo DONE; tail -5 /tmp/fetch_v43.log

必须验证的日志特征:

债券腿: === 抓取 TLT(secid=105.TLT)===      ← 管线内自动执行
债券腿: TLT: 旧 N 天 + 新增 M 天 = ...          ← 幂等/增量
  ✔ 驾驶舱/快照/run_log 与 latest.json 一致      ← 自检通过
=== 完成: target=..., G1=PASS, publish=PASS === ← 唯一完成判据

3.4 失败注入(必做,证明"非阻断")

cd /var/minis/mounts/DUCKERRY_Warehouse && DK_SKIP_BOND=1 python3 scripts/fetch.py --no-fetch 2>&1 | grep -i "债券腿"

断言:能看到「债券腿: 已跳过」,且管线继续执行到分析阶段(不因债券腿而中断)。


4⃣ 阶段四:归入每日复盘流程(口径统一)

文件改什么
scripts/fetch.py债券腿为管线内步骤;帮助文本注明 --no-bond / DK_SKIP_BOND=1
技能 /var/minis/skills/duckerry-daily-review/SKILL.md删除"手动第 0 步"叙述,改为"fetch.py 已内置债券腿刷新";保留独立工具 refresh_bond_etf.sh 作为排障用;版本号递增
optimization/每日发布运行提示词_<today>.md同上:第 0 步从"必做手动步骤"改为"管线内自动,仅在排障时手动执行"
scripts/publish_status.sh输出增加 bond_leg 与 doc_sync 两项(便于轮询时一眼看到)

目标态:新对话只需 一条命令 + 一个完成判据: DK_DISABLE_MCAL=1 nohup python3 -u scripts/fetch.py > /tmp/fetch.log 2>&1 & → 等 === 完成: 行。


5⃣ 阶段五:其他文件同步更新(排版)

文件同步内容
00 驾驶舱(投资MOC).mdfrontmatter 系统版本;头部状态行(面板行数/交易日数/target/债券腿=管线内);§〇 架构图(画出 refresh_bond_etf.sh → fetch.py 支线)与新增表格行(债券腿、排版自检);加固清单追加本版条目;§九 版本记录新增条目;§十 工具箱新增报告/提示词链接;页脚版本行
optimization/系统架构优化报告_<today>.md追加 v4.3 章节(变更、证据、遗留、回滚点)
复盘/<target> 收盘数据快照.md数据有实质变化时 --force 重生成(只重渲染自动快照,绝不动人工收盘复盘)
数据/run_log.md脚本自动追加,不得手改
/var/minis/memory/<today>.md记录本次优化要点、环境实测结论、踩到的坑

跑完执行 python3 scripts/doc_sync_check.py --strict,必须输出"排版同步:全部一致"且退出码 0。


6⃣ 完成判据(全部满足才算本次优化成功)

  • [ ] scripts/fetch.py 内含 refresh_bond_leg,且失败不阻断(失败注入实测通过)
  • [ ] scripts/doc_sync_check.py 存在,9 项检查可用,--strict 返回 0
  • [ ] 单元测试 22/22 通过(BondLegTests 3 + DocSyncTests 4 为新增)
  • [ ] 端到端实跑出现 === 完成: target=..., G1=PASS, publish=PASS ===
  • [ ] 日志中出现 债券腿: 行与 排版同步检查: 全部一致 ✔
  • [ ] latest.json 含 bond_leg.ok=true 与 doc_sync.ok=true
  • [ ] 驾驶舱版本号 = 本版;doc_sync_check 对驾驶舱 0 告警
  • [ ] 技能与交接提示词口径已改为"管线内自动"
  • [ ] 无任何前值填充/补数;人工收盘复盘未被覆盖

禁止:手改 AUTO:DATA 区块;删 数据/paper/;覆盖人工复盘;为过闸门补数;在脚本里 import akshare/efinance/pybondlab(环境装不上,必崩)。

回滚点:见 §0 备份 tgz;另有 数据/bond_tlt.json.bak_20260923、数据/bond_agg.json.bak_20260923、/var/minis/shared/backup/DUCKERRY_Warehouse_pre_arch_20260922_001450(v4.0 前全库)。


7⃣ 本次执行证据(2026-09-23,已跑通)

项结果
债券腿入管线端到端日志出现 债券腿: === 抓取 TLT/AGG === + 旧 79 天 + 新增 0 天(幂等)
非阻断DK_SKIP_BOND=1 → 「债券腿: 已跳过」,管线继续
单元测试PipelineSafetyTests rc=0 | PaperEngineTests 5 OK | BondLegTests 3 OK | DocSyncTests 4 OK(合计 22 项 rc=0)
端到端 runrun_id 20260923T081449+0800,--force,target 2026-09-22,G1/publish/source 全 PASS,面板 82 行 / 78 交易日
管线内自检日志 ✔ 驾驶舱/快照/run_log 与 latest.json 一致 + 排版同步检查: 全部一致 ✔;latest.json.doc_sync = {"ok": true, "issues": []}
自检实效发布过程中真的抓出「MOC 头部仍写 77 交易日,实际 78」→ 修正后归零,证明检查项有效而非摆设
附带修复① update_bond_etf.py 不再用 str(float) 重格式化真实数据(81.80 不被写成 81.8);② L0-3 缺失分支输出统一 %+.2f%%(原输出原始浮点串)
目标日推进会话期间 LBMA 发布 09-22 PM fix → target 自动由 09-21 推进至 09-22,新快照 复盘/2026-09-22 收盘数据快照.md 生成;L0 因 SPX/NDX/VIX 目标日未发布而正确降级(无填充)

版本:v4.3 债券腿入管线 + 排版自检版 | 性质:一次性优化(已完成,复跑即验证)

关联:每日发布交接包 | v4.2/v4.3 变更报告 | 驾驶舱