DUCKERRY_Warehouse v4.3 一次性优化提示词 · 债券腿入管线 + 全库同步自检
改动前备份(任何代码改动前执行):
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 |
| 3 | AUTO: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 日期 |
| 9 | run_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_OK3.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):① 浏览器通道不可用(monkeypatchsubprocess.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).md | frontmatter 系统版本;头部状态行(面板行数/交易日数/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 通过(
BondLegTests3 +DocSyncTests4 为新增) - [ ] 端到端实跑出现
=== 完成: 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) |
| 端到端 run | run_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 变更报告 | 驾驶舱