框架

duckerry-daily-review · reference.md(v1.8.0)

**Apple 风格不只靠 CSS,更靠写作逻辑。

框架 · 资产·规范 · 框架/技能/reference.md · 30606 B

duckerry-daily-review · reference.md(v1.8.0)

正文(9 步 SOP / 熔断 / 红线)见 [duckerry-daily-review SKILL.md](duckerry-daily-review%20SKILL.md)。本文件承载口径细节、模板骨架、历史变更、清单,供需要时定点查阅。

§1 数据口径细则

1.1 二级源刷新与回退守卫(v5.2 / v5.2.1)

  • 优先级:VIX fred > cboe_csv > cboe_delayed > 反推;美股指数 FRED 权威 > 东财二级。
  • 红线:只补当日缺失值,不得覆盖权威源已有值;反推值标 [待验证];东财单家集中度保留 [待验证] 遗留。
  • 回退守卫口径(强制):判断「目标日是否在二级源序列内」,禁止用"序列末项 == 目标日"(T+0 延迟报价已含次日盘中点位 → 会让回退整段失效 → L0-2 假性「无法评估」→ L0 汇总假性降级)。前值取"目标日之前"最近点;来源标签按实际源显示;权威源覆盖同日值后应关闭该日反推 [待验证]。
  • 逃生:--no-aux / DK_SKIP_AUX=1。

1.2 债券腿(TLT/AGG)未复权真实收盘(v5.2 / v5.2.1)

  • 一律用未复权真实收盘(禁 fqt=1 复权价);源优先级 纳斯达克官网 historical > 东财 fqt=0;交叉验证写 数据/bond_xcheck.json;单日两源差异标 [待验证]。
  • 会话完成判定:日线日期 D 仅在 now_utc ≥ D 21:00Z(美股 16:00 ET 保守化)才算最终收盘;东财盘中返回的当日日线是未完成中间价,必须拒绝并入并记 数据/bond_*.json.provisional_dropped(含 rule)。日志 ⚠ 盘中未完成、未并入: [...] 属正常保护。被污染历史行下轮自愈剪除并重取真值。
  • 失败永不阻断发布(只记 数据/logs/bond_leg_error.log,L0-3 按规则降级)。逃生 DK_SKIP_BOND=1 / --no-bond。
  • 排障手动:sh scripts/refresh_bond_etf.sh 或 python3 scripts/update_bond_etf.py --from-aux(--rebuild 全量重建)。
  • ⚠ 不要把 akshare/efinance/pybondlab/yieldcurve 当依赖 import(环境无 pip 网络)。

1.3 L0 / L1 / L2 判定

  • L0 三项逐条填写:L0-1 金/美同日同跌、L0-2 VIX 跳升、L0-3 股债金三杀;期望 L0-3 = 可评估(含真实债券价格),仅当 AGG/TLT 确实缺失才回退 10Y 收益率代理并明确标"非债券回报"。
  • L1 按 5 日强度优先规则计算(chg5 / 同向天数 / 20 日对齐);相关性只是机械统计,不被自动写成 A/B/C 结论。
  • A/B/C 必须分别写进入条件、维持条件、反证条件;证据不足允许写 不可判定,不强行选状态;Agent"观望/等待/谨慎"无区间记 未覆盖。
  • gate=PASS 需 missing_core 与 stale_core 均为空、核心指标(黄金 PM、10Y 名义、10Y TIPS、SPX/NDX)有目标日真实值。

1.4 驱动 / 口径隔离

  • 10Y 利率变化写 pp;黄金/DXY/VIX/SPX/NDX 变化写 %;实际利率只写 10Y TIPS;盈亏平衡通胀另列 10Y名义 − 10Y TIPS。
  • 回测口径 ≠ 纸面(模拟盘/A1)口径 ≠ 生产管线口径,三者不得互相引用(详见 §6.4)。

§2 收盘复盘模板(十段 + §6.3 A1 骨架)

§2.0 Apple HIG 排版规范(v1.9.0 新增 · 全库生效)

Apple 风格不只靠 CSS,更靠写作逻辑。 两条硬规则:

  1. 禁止 emoji。需要"元素点缀"时,用 scripts/apple_style.py 的几何线性图标

(SF Symbols 风格:icon(name, color) / heading(title, icon, color)), 8 枚:chart receipt sliders shield pulse layers gauge clock。 配 .obsidian/snippets/apple-hig.css 的 .hig-ic* 类,全库自动着色(跟随深浅色)。 排版细则与可交互演示见 框架/Apple HIG 排版与交互规范。

  1. 章节标题 = 图标 + 中文序号 + 标题,如

## {icon('sliders','blue')}一、收盘数据;不写 emoji、不写花哨前缀。 生成器里用 apple_style.section(title, icon, color)(Markdown) 或 apple_style.heading(...)(HTML 看板,语法由调用方决定)。

  1. 字体阶梯 / 表格 hairline / 卡片圆角由 apple-hig.css 统一提供;正文不要内联

字体、颜色、边框等一次性样式——那是设计系统该管的事。

  1. 数字统一 tabular-nums(由片段处理);写数值时用半角 -、单位带空格(如 +0.45%)。
---
tags: [复盘, 收盘, 自动生成]
数据可信度: verified/single_source/partial
目标交易日: YYYY-MM-DD
生成时间: ISO-8601
生成方式: 半自动化:真实数据脚本 + Agent结构化复盘
---

# YYYY-MM-DD 收盘复盘 · 真实数据版
> 数据可信度:……。本页事实以数据快照和原始清单为准;结论可信度不得高于最弱关键输入。
> 口径:[[框架/数据口径定义]];机械结果不自动等于 A/B/C 模式结论。

## 一、今日收盘数据
## 二、事前预测与可证伪验证
## 三、L1 动量(5日真实收盘序列)
## 四、L0 应急扫描(逐项实测值、阈值、状态)
## 五、L2 A/B/C 证据与不可判定状态
## 六、L3/L4 执行纪律与价格证伪
## 七、关键事件与事实/推断分离
## 八、错误归因与反事实检查
## 九、明日可证伪观察清单
## 十、规则改进、验收标准与未完成事项

§六 子结构(v1.7.5 固化,v1.9.0 微调):### 6.1 模拟盘(影子组合,数据/paper/) → ### 6.2 纪律自检(既有,不动作)→ ### 6.3 A1 并行组合记录(末位)。

v1.9.0:§6.1 只需写「模拟盘完整账户视图见 模拟盘看板」+ 一句话状态(净值 / 持仓 / 当日信号),不必重抄整张看板——看板由 scripts/paper_dashboard.py 自动生成到仓库根 模拟盘看板.md(Step 4 刷新)。

§6.3 A1 骨架(免责句不可省):

### 6.3 A1 并行组合记录(只算权重、不下单)
- 记录状态:ok / **未记录(skipped:已跳过)** / **未记录(error:<原因>)**
- bar:YYYY-MM-DD|权重:黄金 xx.x% / 纳指 xx.x%|虚拟净值 nav x.xxxx|上次调仓:YYYY-MM-DD
- 台账:`数据/portfolio_ledger.jsonl`(追加式);规则:逆波动率(60 周)· 周数据 · 季调仓 · 5% 偏离带 · 6bps
- **声明**:A1 **只验流程与纪律、不是收益证据**;纸面结果**不得据此更换核心底仓**(那是用 ~60 个观测否决 41 年样本)。
  升级到 A2 的里程碑 = **经历过一次组合 ≥15% 回撤且没动手**。未连接券商、无真实资金动作。

写作要求:今日数据/变化/L0/L1/相关性优先复用 latest.json 与快照的机械结果,不另算一套口径;验证率带分子/分母/截止日期,样本小不夸大;每事实尽量附路径/字段/evidence_id;"明日展望"只写可观察事件、阈值与证伪条件,不写具体买卖指令。

§3 盘前简报(OPEN_DAY)结构

  • Step 0:先跑收集器(§1 同)读出 daily_collect.log 最新 ✔/⚠,判断数据截止日与滞后。
  • 先确认是否周末/美国假日/英国(LBMA)假日(以面板与 dkpanel.py 交易日逻辑为准)。
  • 非交易日:不生成收盘复盘;可生成 复盘/YYYY-MM-DD 非交易日备忘.md,不得写收盘价/涨跌/连续交易日结论。
  • 开盘日:跑 fetch.py,只用已实际发布的最近有效收盘;G1 通过则 review_write.py YYYY-MM-DD 盘前简报 --src <草稿>,含数据截止日/滞后/近 5 日真实序列/L0 预检查/L1/未决事件/明确预测区间与证伪条件。
  • 命名规则:YYYY-MM-DD 盘前简报.md 的日期 = 它覆盖的开盘交易日(数据截止 = 最近已收盘日)。
  • 不得把"今天开盘"写成已发生事实;未发生事件标 [待观察]。

§4 模拟盘 / 影子组合

建议在真实资金决策前启用,但必须明确它验证的是"决策流程与执行纪律",不是直接证明市场预测有效。默认不连接券商、不发订单、不产生真实资金动作。

落盘(数据/paper/):paper_signals.jsonl(事前模拟信号)、paper_orders.jsonl(假设成交:价格/时间/滑点/费用)、paper_positions.json、paper_equity.csv(每日净值/收益/回撤/风险状态)、paper_report.md。每条信号必含 paper_id/prediction_id/created_at/model_version/资产/方向/目标仓位上限/入场条件/退出条件/硬证伪条件/假设滑点/手续费/数据状态/是否实际触发;信号必须事前追加,禁事后补单。 每日:按 L0→L1→L2→L3 生成"允许/禁止/等待";满足预定触发条件才记成交;盯市算净值/回撤/波动/盈亏比/连亏/换手/基准差;分离"预测正确""模拟盈利""风险动作正确"三结果;数据缺失/L0 断路/可信度不足时不得假装成交;每周与机械 L1 基线/被动持有/空仓基准比较。 升级条件须预先写死(示例:≥60 有效交易日、完整事前日志、无 P0 闸门违规、样本外不劣于机械基线、回撤与连亏未超上限);上述阈值标 [待验证],未达成前不得接入真实账户。

4.1 v5.2 空头腿 / 减仓腿(事前写死,[待验证])

触发动作
L0 断路close 全平
持多且 L1 转 downreduce 50%(受 min_hold 约束)
持空且 L1 转 upclose_short
空头开仓门槛L1=down 且 L0=正常 且 data_quality=verified 且 regime=Trending-Down 且 无多头敞口
空头风控名义 ≤0.10×净值(v5.3 卫星降权);逆势 3% 止损 / 顺势 6% 止盈;min_hold 3 日

空头名义计入现金作保证金;盯市用净份额;_open_entry 按净额推导;当日已成交 → 幂等 hold。真实账户 2026-09-24 已执行 reduce 50%(仅验证流程纪律;不接券商、不发真实订单)。

4.2 v5.3 卫星降权(2026-09-27 拍板 · 立即生效)

项原值新值依据
方向性仓位上限POSITION_LIMIT=1.0SATELLITE_CAP=0.20卫星(黄金方向择时)无 alpha;事件否决负 EV 保险
空头名义上限SHORT_SIZE_CAP=0.50.10同比例 ÷5
仓位口径min(上限,置信度)上限×置信度保留置信度动态调仓

风险限额变更,不改变信号逻辑/方向/止损止盈/min_hold。依据 optimization/报告/决策备忘_核心底仓是否改为金加纳指_2026-09-27。⚠ 降权后净值绝对波动约为原来的 1/5;夏普类指标不受影响,但"能否扛住回撤"的检验意义改变,记录须注明。

4.3 模拟盘看板(v1.9.0 起 · scripts/paper_dashboard.py)

把 数据/paper/(equity/orders/signals/positions)渲染成面向人的「真实账户视图」,产出仓库根 模拟盘看板.md(纯 Markdown、去 emoji、排版优先)+ 模拟盘看板.html。驾驶舱 §系统概览「模拟盘」行 + §〇·五「顶层文档」有直达链接(md 内再链 HTML)。只读、非阻断;不改任何判定口径。

项实现
排版基底sindresorhus/github-markdown-css(MIT,★8.9k,深/浅两版),vendor 到 scripts/assets/github-markdown-dark.css / -light.css
设计层Apple HIG:SF Pro 字体阶梯、深浅两套系统语义色、hairline 分隔、圆角分组卡片、tabular-nums
动画motiondivision/motion v14(MIT,★33.8k,原 Framer Motion / Motion One),UMD 内嵌 HTML,暴露 window.Motion.animate
入场动画纯 CSS linear() 逼近的阻尼弹簧缓动 + stagger(--i),animation-fill-mode: backwards;prefers-reduced-motion 全降级静态
JS 兜底折线 2s、入场 4s(WebView 后台标签会被冻结在第 0 帧)
点缀几何线性内联 SVG 图标(24 网格 / 1.7 笔画 / currentColor),禁止 emoji —— emoji ≠ 图标,用户明确排斥
共用层scripts/apple_style.py(v1.9.1):fetch.py 快照与本看板共用一份 icon()/heading()/section()/frontmatter(),禁止各写一套图标(规范见 §2.0)

⚠ 三个已踩过的坑(改代码前必读):

  1. 改 CSS 变量名必须同步改所有引用处,含 SVG 属性值里的 stroke="var(--x)" —— 曾因改名导致折线整条不可见。
  2. 动画失败必须保证终态可见,不能只靠 try/catch(WebKit 上 animate(strokeDashoffset) 静默不生效,不抛错)→ 改数值动画 + onUpdate 手写样式 + setTimeout 兜底。
  3. 入场动画绝不能让元素的"无动画状态"是不可见的 —— fill-mode: both 在合成暂停时会永久停在 opacity:0,必须用 backwards(自然状态=可见)。

§5 A1 · 并行组合记录(只算权重、不下单)

  • 脚本 scripts/portfolio.py(只读 数据/gold_pm.json + 数据/fred_NASDAQ100.csv)。
  • 规则(拍板 b):逆波动率(60 周 bar)· 周数据(W-FRI)· 季调仓 · 5% 偏离带 · 6bps 单边成本。
  • fetch.py 发布成功后自动调用(v1.7.4 接线):run_portfolio() 在 paper 块之后、发布状态计算之前;失败永不阻断发布(同时捕获 Exception 与 SystemExit),逃生 --no-portfolio / DK_SKIP_PORTFOLIO=1;结果写 latest.json.portfolio,不参与 gate / publish_status。
  • 手工:python3 scripts/portfolio.py --asof <YYYY-MM-DD>(幂等);首次 --bootstrap。
  • ⚠ 幂等判据是 bar 日期,不是 asof:同一周内 fetch 每天跑,bar 未变只记一次;数据 bar 早于已记录 bar → 拒绝推进。
  • 落盘:数据/portfolio_state.json + 数据/portfolio_ledger.jsonl。
  • 硬约束:绝不写 数据/paper/、不产 order/signal、不 import paper_engine。
  • ⚠ A1 只验流程纪律,不验统计;升级 A2 里程碑 = 经一次组合 ≥15% 回撤且没动手。

§6 绩效数字引用口径(强制)

  • 年化收益:一律以 bar 数 / ppy 为准(日 252 / 周 52 / 月 12)。回测/engine_multi/ 现用日历跨度口径(差 ~0.36%,尚未统一)→ 引用它必须注明"日历跨度口径"。
  • 索提诺比率:必须注明定义——我方 = x[x<0].std()(负收益子样本标准差);quantstats = 负收益 RMS ÷ 总观测数。方向一致但数值系统性不同(qs 更高),跨实现不得直接比大小。
  • 卡玛比率:只引用 回测/perf_audit/ v1.1 及之后产物(含 periods=ppy 修复)。v1.0 旧 CSV 卡玛列不可引用(calmar(r) 漏传 periods → 周频 +82%、月频 +97.9%)。
  • 口径隔离:回测 ≠ 纸面(模拟盘/A1)≠ 生产管线,三者不得互相引用;跨层引用必须显式标"跨层,不可比"。
  • 波动率/最大回撤(定义相同)差异 >1e-9 才算真分歧;夏普容差 0.5%;索提诺容差 5%(定义不同);卡玛/年化不作一致性判据。

§7 外部资源红线(强制)

/var/minis/mounts/量化策略/ 挂载 9 个外部量化仓库(第三方源码,仅设计参考)。登记见 数据库说明 §〇·五·二。越层即违规:

层范围允许禁止
✔ 可调用研究层(回测/ 下脚本或一次性独立脚本)PYTHONPATH 挂 sys.path 后 import(如 quantstats)在生产链用
📖 只读生产链 scripts/—任何 量化策略/ 下包的 import / 硬编码路径依赖
⛔ 禁装pysystemtrade只读源码任何形式安装(钉死 pandas==2.1.3,现役 2.2.3 → 降级 pandas、打断 fetch 生产管线)
  • 唯一会造成实际损害的红线是 pysystemtrade 禁装;其余(vectorbt/cvxportfolio/PyPortfolioOpt/Riskfolio-Lib/bt)是装不上(缺 numba/cvxpy/Cython),不构成风险但也不要用。
  • 研究层用外部库产出的结论,入库前必须自写独立脚本复核(同一序列喂两侧),并按 §6 标注口径。

§8 成本刺客清单(一律禁止)

禁止行为替代做法
重复读同一配置/口径文件每任务最多 1 次;grep -n 定位后 file_read offset/lines 只取相关 40 行
每轮重解析大 JSON(latest/panel/raw_manifest)用 state_digest.py --step 输出或 daily_summary.py(≤40 行);需要单字段用 python 取后立刻进 state
大模型"思考"可计算内容全部来自 fetch.py/state_digest.py/daily_summary.py/既有脚本输出
逐项串行跑自检合并为一次 selfcheck.py
全量 discover 跑测试 / 逐项跑tests_gate.py(门控 + 整类跑)
反复"自我验证/复述计划"只输出证据行;不写计划散文、不重述需求
把日志/JSON 原样贴进上下文只保留末行完成判据 + ≤5 行关键日志
一次回复超长汇报最终回复 ≤1200 字

模型路由细则:[Cheap](跑脚本/收集器/轮询/落盘/摘要/格式/字段搬运/路径校验);[Std](结构化复盘正文/按模板填充/review_write 落盘验收);[Exp](§五/§八 市场逻辑推演、跨源冲突仲裁、G1 连续 2 次失败的根因排查;单次≤2 段)。

§9 状态外置与熔断细则

python3 scripts/state_digest.py --step N --mode MODE --cost <usd>   # 覆盖写 state/current.md(≤500 字)+ 更新 budget.json
python3 scripts/state_digest.py --guard     # rc=0 继续 / rc=3 立即终止
python3 scripts/state_digest.py --reset --mode MODE   # 仅确认「假熔断」后清当前桶
  • 计数与成本按 <YYYY-MM-DD>|<--mode> 分桶;跨日或换 mode = 新任务(从 0 起算)。
  • --guard 输出含 bucket/cost_wired/cost_this_task;未传 --cost 时 cost_est 恒 0.0(预算防线不生效)。
  • 熔断触发(max_loops:15 / max_budget:0.5(须传 --cost)/ 连续 3 轮无实质文件变更)→ ①立刻停止不重试;②写 state + 回报 BUDGET BREAK: <原因>/已完成/未完成/可复用路径;③保留有效产物,不为"凑完整"再跑网络步骤;④明确告知用户重启条件,不承诺后台继续。
  • state_digest 覆盖写前自动留 current.md.bak;日志证据只取最后一条 === DUCKERRY … === 之后的段落(消除跨 run 自相矛盾)。

§10 预测系统 schema 与降级策略

新预测追加写 数据/predictions/predictions.jsonl(只追加,不覆盖):至少含 {"prediction_id":"pred_YYYYMMDD_HHMMSS_xxxx","created_at":ISO,"forecast_date":"YYYY-MM-DD","asset":"gold_pm","source":"agent","model_version":"agent-v1","direction":"up/down/neutral","expected_return_min":null,"expected_return_max":null,"confidence":null,"trigger_condition":"…","falsification_condition":"…","data_status":"verified/single_source/partial","status":"open"}。 验证时追加 actual_return/validated_at/validation_result/error_type。无方向或数字区间的预测必须记 uncovered,不进命中率分母。 降级状态:①机械基线模式(L1 5日动量/波动率/L0 风险);②不可判定模式(只出方向区间/触发/证伪,不声称 A/B/C);③探索模式(≤2 候选假设,不扩大风险);④验证模式(≥预设样本数、固定窗口,不中途挑有利样本);⑤升级或淘汰(滚动样本外优于机械基线且未违风险闸门才入待验证规则,否则归档为失败假设)。 每次复盘必写:当前模式/模式证据/未识别部分/候选假设/下一次证伪条件。

10.1 建批链路与事前守卫(v1.9.3 接线 · 2026-10-06)

背景:scripts/predict_regime_conditional.py 此前未接入管线、自身也无任何守卫 ⇒

2026-10-01 起 LBMA 主源 403 断了锚点链后静默停批 4 个交易日(10-01/02/05,无人察觉)。

根因与修复见 复盘/2026-10/2026-10-02 收盘复盘 §2.3 / §8.5。

  • 自动建批:fetch.py 发布成功后调用该脚本(非阻断,失败只打印、不阻断发布)。

调用点必须在 doc_sync 对 数据/latest.json 的最后一次整文件回写之后 —— 该脚本 re-read latest.json 并只覆盖 predictions 键,放前面会被内存副本整段抹掉。

  • 四条硬守卫(predict_regime_conditional.py::precheck,纯函数、可单测):
守卫触发含义
duplicate_fd台账已有同一 forecast_date(含验证记录)幂等:一日多跑不会写重复批次
retrospectiveforecast_date < 今天禁止给已结束的交易日补预测(禁事后追认)
too_late_for_today当日 且 本地时间 ≥ --cutoff-hour(默认 21,早于 LBMA PM 定盘发布 ≈22:00 北京)结果将出/已出时不得建批
stale_anchor锚日距今 > --max-anchor-lag-days(默认 10 自然日)数据管道长期停摆保护

命中即只写 latest.json.predictions(含原因)、绝不写台账;--dry-run 连 latest 都不写。

  • 可见性:selfcheck.py 只读项 predict_freshness(判据 = panel 交易日数 − 最近批次 forecast_date;

不参与 all_ok)+ daily_summary.py 同名列(与 selfcheck 共用同一实现)。

  • 判读义务:出现 STALE / lag_sessions > 0 时必须在复盘 §十 记 [P1],并写明是

「锚点未推进」还是「被守卫拦下」(原因见 数据/latest.json → predictions.skipped)。 锚点缺失期间不得事后补建(红线:事前落盘)。

  • 回归测试:tests/test_pipeline.py::PredictGuardTests(含「健康锚点必须真的建批」的正向用例 ——

防守卫退化成"永远跳过",那与"静默断批"不可区分),已纳入 scripts/tests_gate.py 的 HEAVY 组。

§11 历史变更(v1.5.0 → v1.9.3)

  • v1.9.3:SOP 补「建批」环节(零口径变更)。① §10 新增 10.1 建批链路与事前守卫:建批已由 fetch.py 发布后自动触发(非阻断),四条硬守卫 duplicate_fd / retrospective / too_late_for_today / stale_anchor,selfcheck.predict_freshness 只读可见性;② SKILL Step 5 摘要行增列「批次新鲜度」,STALE → 复盘 §十 记 [P1]。修复背景与实测见 复盘/2026-10/2026-10-02 收盘复盘 §8.5(该脚本此前未接入管线,锚点断链后静默停批 4 个交易日)。
  • v1.9.2:纯结构瘦身,零口径变更、零检查项删除。变更史移入本节;看板实现细节(§4.3)移出 Step 4 正文;长句压缩与重复合并(正文 15788→12274 字节)。全部命令、时间预算、完成判据、红线总表、G1 处理、总原则 8 条逐字未动(用脚本比对确认:命令集 0 丢失、数字口径 0 丢失、三大块逐字一致)。
  • v1.9.1:Apple 风格全库落地 + 共享设计层(不改判定口径)。① .obsidian/snippets/apple-hig.css 全库生效(SF 字体阶梯、HIG 语义色深浅两套、hairline 表格零竖线、圆角卡片、.hig-ic* 图标着色),与 ios-dark-glass 分工不重叠(后者只管 .ios-tag/.status-* 胶囊),两者同时启用;② 新增 scripts/apple_style.py:ICONS 8 枚几何图标 + icon()/heading()/section()/frontmatter(),fetch.py(快照)与 paper_dashboard.py(看板)共用一份;③ render_snapshot() 输出 frontmatter + 图标 H1 + G1/L0/L1 状态条 + 8 个图标化章节标题,正文数据行完全不动(保 doc_sync);④ 新增 §2.0 Apple HIG 排版规范 + 框架/Apple HIG 排版与交互规范 可交互演示。
  • ⭐ 接缝设计:heading() 只返回「图标+标题」不含语法前缀 —— Markdown 用 section()(## ),HTML 由调用方自己拼 <h2> + 入场序号。(踩过:section() 直接塞进 HTML → 页面出现字面量 ##,所有 <h2> 消失。)
  • ⚠ 三个已修 bug:状态条丢 f 前缀导致输出 {generated} 字面量;frontmatter 引号规则过宽把 2026-10-01 加引号 → doc_sync 的 目标交易日 正则抓不到(改为 not re.match(r"^[\w][\w .\-/+]*$", val),日期等简单值必须裸写);_h2 参数顺序错位。
  • ⭐ UI 三条经验:① 一次性入场动画本质看不见(文档 99% 时间静止),物理感必须绑在交互(hover/active/scroll)不是绑在"打开";② 某些预览环境会冻结 CSS 合成动画 → fill-mode:backwards + JS 兜底;③ 滚动浮现整块包在 @supports (animation-timeline: view()) 里,不支持则整块不解析、元素保持可见,绝无白屏风险。
  • v1.9.0:模拟盘可视化(不改任何判定口径)。新增 scripts/paper_dashboard.py(只读/非阻断)→ 仓库根双产物 模拟盘看板.md + .html;Step 4 扩展为「A1 组合记录 + 模拟盘看板」每步刷新;fetch.py 发布后自动调用(永不阻断);驾驶舱新增 模拟盘看板 直达。技术栈与三个已踩的坑见 §4.3。
  • v1.8.0:4 个基础设施脚本(preflight/selfcheck/daily_summary/tests_gate);SOP 线性化 9 步 + 时间预算;幂等快路径;SKILL 拆两文件。不改判定口径。
  • v1.7.5:Step 2.7 A1 组合记录;复盘 §6.3 A1 小节 + 免责句;测试项数改实测口径;新增「绩效数字引用口径」「外部资源红线」;doc_sync 11→13 项(第 12 项驾驶舱技能行版本/md5、第 13 项 数据库说明.md 目录计数)。
  • v1.7.4:A1 接线(fetch 发布后调 portfolio.py,失败不阻断);advance() 幂等判据改 bar;倒退 bar 守卫。
  • v1.7.3:v5.3 卫星降权(SATELLITE_CAP=0.20、空头 0.10、仓位口径 上限×置信度);A1 并行组合记录。
  • v1.7.2:熔断分桶复位;max_budget 真接线;预测台账锁非阻塞 + 逃生;arch_check 10→11 项(state/current.md 可解析性);state_digest 留 bak + 证据切片。
  • v1.7.1:二级源回退守卫修正;债券腿盘中伪收盘拦截 + provisional_dropped 自愈;doc_sync 9→11 项;state_digest 按字段边界截断。
  • v1.7.0:状态外置(state/current.md 每 ≤3 步覆盖写 + 剪枝);步骤级模型路由;脚本绝对优先;YAML 硬熔断;成本刺客清单;发布与自检合并为一次批量调用。
  • v1.6.0:§0.5 二级源刷新(东财美股指数 / CBOE 延迟报价);债券腿未复权真实收盘。
  • v1.5.0:复盘写入路径硬规则(review_write.py 唯一入口 + moc_index --verify);arch_check 10 项;fetch 发布后自动登记索引。

§12 iSH 环境纪律(最容易翻车)

纪律说明
单进程 <2 分钟iSH 上单个 Python 进程 ~2 分钟被静默 kill:rc=0、无 traceback、nohup 也挡不住。长任务拆成多个 <2 分钟短进程串行跑
测试整类跑逐项跑是反模式(每项重付 setUpClass);tests_gate.py 已按类跑
不并发不并发重进程;等待用 shell_execute 的 delay,不要在命令里 sleep
nohup 写法nohup sh -c '…' >/dev/null 2>&1 & ✔ | A && nohup B & ✘(会把 A 一起放后台并随 shell 退出被杀)
无 CJK 字体matplotlib 图例一律 ASCII
算与画分家绘图可能 >2 分钟 → 先落盘数据,再由独立脚本出图
curl 超时不可靠iSH 上 curl --max-time 有失灵个案 → 关键探测用 subprocess 硬超时兜底(preflight.py 已内置)

§13 测试门控与验收口径

  • 入场:python3 scripts/tests_gate.py。指纹 = sha256(scripts/*.py + tests/test_pipeline.py)。
  • 未变(== 上次全绿指纹) → 只跑快类(12 类整组一个进程),重类(StateDigestTests/BondLegTests/PipelineSafetyTests,本机实测 68.5s/44.1s/~124s)跳过,打印"门控命中:跳过 N 类,指纹 <前 8 位>"。
  • 已变 → 整类逐个跑(每类独立子进程 + 超时,串行不并发),禁止逐项;仅当某类失败时对该类 --bisect 逐项二分。
  • 逃生:--all 强制全跑、--only <Class>、--status。
  • 红线:门控只允许在"代码未变"时跳过;代码一变必须整类跑,不得为省时间跳过。结果写 state/tests_cache.json(可断点续跑)+ /tmp/tests_<class>.json。
  • 测试项数以现场 grep -c "def test" tests/test_pipeline.py / grep -c "^class .*Tests" 为准,不写死数字。
  • 收尾三件套(缺一即交付失败):arch_check.py(11/11,第 10 项 0 点不到、第 11 项可解析)、doc_sync_check.py --strict(13 项 rc=0)、moc_index.py(登记)。

§14 复盘文件写入路径硬规则(v5.1,无例外)

项规定
唯一合法目录复盘/(根目录,禁子目录)
唯一合法命名YYYY-MM-DD 收盘复盘.md / 收盘数据快照.md / 盘前简报.md / 非交易日备忘.md / 数据缺失占位.md(日期与中文名间一个半角空格)
覆盖规则已存在默认不覆盖(人工收盘复盘绝不可覆盖),需 --force
登记义务写完后必须确认 ✔ 导航页可直达
python3 scripts/review_write.py --print-path 2026-09-23 收盘复盘
python3 scripts/review_write.py 2026-09-23 收盘复盘 --src /tmp/draft.md   # → ✔ 已写入 + ✔ 导航页可直达
python3 scripts/moc_index.py --verify "复盘/2026-09-23 收盘复盘.md"        # 补跑校验
  • 类型简写:复盘/快照/简报/备忘/占位 自动归一化。
  • 退出码:0=写入且可直达;2=已存在未覆盖(仍登记);1=失败或点不到。
  • moc_index.py 有重名冲突 / 命名不规范未登记时以 ⚠ 列出——这是"写进去却点不到"的元凶。