duckerry-daily-review · reference.md(v1.8.0)
**Apple 风格不只靠 CSS,更靠写作逻辑。
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,更靠写作逻辑。 两条硬规则:
- 禁止 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 排版与交互规范。
- 章节标题 = 图标 + 中文序号 + 标题,如
## {icon('sliders','blue')}一、收盘数据;不写 emoji、不写花哨前缀。 生成器里用 apple_style.section(title, icon, color)(Markdown) 或 apple_style.heading(...)(HTML 看板,语法由调用方决定)。
- 字体阶梯 / 表格 hairline / 卡片圆角由
apple-hig.css统一提供;正文不要内联
字体、颜色、边框等一次性样式——那是设计系统该管的事。
- 数字统一
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 转 down | reduce 50%(受 min_hold 约束) |
| 持空且 L1 转 up | close_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.0 | SATELLITE_CAP=0.20 | 卫星(黄金方向择时)无 alpha;事件否决负 EV 保险 |
| 空头名义上限 | SHORT_SIZE_CAP=0.5 | 0.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) |
⚠ 三个已踩过的坑(改代码前必读):
- 改 CSS 变量名必须同步改所有引用处,含 SVG 属性值里的
stroke="var(--x)"—— 曾因改名导致折线整条不可见。 - 动画失败必须保证终态可见,不能只靠
try/catch(WebKit 上animate(strokeDashoffset)静默不生效,不抛错)→ 改数值动画 +onUpdate手写样式 +setTimeout兜底。 - 入场动画绝不能让元素的"无动画状态"是不可见的 ——
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、不 importpaper_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(含验证记录) | 幂等:一日多跑不会写重复批次 |
retrospective | forecast_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:ICONS8 枚几何图标 +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_check10→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_check10 项;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有重名冲突 / 命名不规范未登记时以⚠列出——这是"写进去却点不到"的元凶。