← Back to skills
extension
Category: Data & AnalyticsAPI key required

A股个股深度分析T-DIVS报告

生成深色主题单文件 HTML 的 A 股个股深度研报(T-DIVS 框架)。十节固定模板 + V4 量化估值层 + V5 定价范式扩展层 + 三支柱联锁 + 七道机械门禁。当用户要求"写一份 XX 股票的深度分析/研报""按 T-DIVS 框架出个股报告""这份报告和标杆差距太大/太薄/数据不对",或需要基于 Tushare / westock / 麦蕊实测数据产出个股 HTML 研报时使用。核心价值 = 版式与标杆 1:1(克隆签名可验)+ 内容厚度可量化(不得比标杆薄)+ 数值可对账(真源同快照)。版本沿革见 references/CHANGELOG.md。

personAuthor: user_7f0ed823hubcommunity

个股深度分析 HTML 报告(T-DIVS 框架)

Overview

产出一份深色主题、单文件 HTML 的 A 股个股深度分析报告。报告基于 T-DIVS 整合框架(八维 0–8 制 + V4 量化层 + 三支柱联锁 + 四共振 + A/B/C/D/E/F/G 触发判定),数据来自 Tushare / westock / 麦蕊真实接口实测。

报告不是"生成完就结束",而是带一整套版式纪律 + 七道机械门禁。这套门禁的价值主张有三条,缺一条即为不合格交付:

| 主张 | 可验证判据 | |---|---| | 像标杆 | 克隆签名(viewBox 集合 + h2/h3 id 序列)与标杆完全一致 | | 够厚 | 内容厚度项(div/tr/td/b/li/ul/chars/cjk)≥ 100% 标杆;逐节字数 ≥ 70% | | 数对 | 真源数值覆盖率 ≥ 85% + 六条数学恒等式自洽 + 与真源同快照 |

⚠️ 这三条是 1.3.0 才补齐的。1.2.x 的门禁只能验第一条 —— 一份结构全对、签名全对、 24 项 ALL PASS 的报告,内容可以只有标杆的 57%(<b> 数),数字可以全是上一版残留, 真源可以跟它不同日期。门禁全绿从来不等于交付合格。

合规声明(生成与交付时必须遵守)

  • 本 skill 产出的是研究分析工具,报告中的估值区间、操作路径为分析框架推演,不构成投资建议或买卖邀约。
  • 报告内不得出现"买入/卖出/加仓到 X 元"等指令式措辞;用"参考区间 / 观察 / 证伪"等表述替代。
  • 文末必须附带免责声明(如"本报告仅作研究参考,不构成任何投资建议,决策责任在读者自身")。
  • 不承诺收益、不喊单、不代客决策。

起稿选型(1.3.0 新增 · 最高优先级)

这一节解决本 skill 最大的历史缺陷:1.2.x 只承认一条起稿路径(canonical 底稿逐块 rep), 而实战中更优解常常是另一条。路径选错,后面所有门禁都在给一个偏薄的底子抛光。 用户 2026-09-15 追问"这次对了,为什么?"的答案就在这里 —— 那次走的是路径 A,不是 skill 里写的路径 B。

三条路

| | 路径 A · 基准择优 + 文本级补丁 | 路径 B · canonical 底稿逐块 rep | 路径 C · ❌ 从零手写 / 包外旧版式 | |---|---|---|---| | 做法 | ① check_lib_dup.py 查库内同标产物 → ② 比饱满度择优(剥平台注入后比 chars/cjk/b/li/tr)→ ③ 以更厚的那份为底 → ④ 用「编辑键对双基线唯一命中」的纯文本级补丁改数据 | ① 复制 _tiqi_base.html + build_skeleton_tianqi_v100.py → ② 生成 _XX_tq_base.html(pristine,勿覆盖)→ ③ 写 _gen_XX_base.py 逐块 rep() 换数据 → ④ _XX_base_v100.html → ⑤ build 成品 | 手工另写版式,或引入包外旧版本样本(三花/阳光旧/中天 v105/凯盛…) | | 何时用 | 默认首选:库内已有同标产物,或本标的维度比天齐多(周期+资源+权益三重叙事等) | 库内无同标产物;或标的维度与天齐高度同构(同行业同范式) | 永不 | | 厚度实测 | chars 157% / cjk 159% / b 164% / li 114% / 逐节 146–199% | chars 100–157%(取决于换股时是否按标杆元素清单逐节铺满) | —— | | 风险 | 底的选择错 → 拿旧快照当基准(必须配 verify_data_truth.py ⓞ 段) | 换股时只换数字不铺维度 → 结构性偏薄(必须配 check_density_parity 内容项) | 首版必漂移,用户连判两轮"偏差还是很大" | | 禁止 | 用未剥平台注入的线上产物当基准(体积差 ~1 倍会误判厚薄) | 引入包外旧版式样本 | —— |

路径 A 的四个操作要点

  1. 底稿必须先剥注入:线上产物含 data-page-node-id / data-pnid-children / <!--pnid:-->,剥完再比厚度,否则被 ~1 倍体积差误导(本地剥注入基线 vs 含注入线上基线)。
  2. 补丁必须"纯文本级":改线上已有页面时禁止新增 span/br/div(会破 pnid 树)。裸字形(如 ▼ 个人股东减持)与宿主 td.b/span.cg 天然同色,比套 span 更安全。
  3. 编辑键双向唯一命中:设计一套编辑键,对「剥注入本地基线」与「含注入线上基线」都能唯一命中;改完校验「线上剥注入 == 本地」,差异须为 0。
  4. 换股即换口径:路径 A 借的是版式厚度,不是数据。所有数值仍须走 data_XX.json 真源,并跑 verify_data_truth.py。

路径 B 的三步(skill 内自带的 canonical 底稿)

① 复制到工作目录:_tiqi_base.html + build_skeleton_tianqi_v100.py + css-baseline.css + css-semantic-layer.css
② 在 _tiqi_base.html 上逐块换数据(章节骨架 / <nav> / SVG 函数 / 两段 CSS 一律不动)
   ├ 取数契约:references/data_dict_template.json(字段 → 接口一一对应)
   └ 换股模板:references/gen_stock_template.py(含严格 rep(old,new,label,expect=1))
③ python build_skeleton_tianqi_v100.py <out.html> → 跑七道门禁
  • 底稿产出与 sample-report-天齐锂业-v100版式标准.html 逐字节完全相同(cmp 验证)。
  • 脚本最后一步自动把两段 <style> 整段换成两个 CSS 真源 —— 所以换股时不必动 CSS; 该步骤必须在所有正文变换之后,否则图标字形替换会连 CSS 注释一起改。
  • gen_stock_template.py + data_dict_template.json 是 1.2.22 就写好的取数契约 + 换股模板, 但 1.2.x 的 SKILL.md 从未引用它们(补了白补)。1.3.0 起它们就是路径 B 的标准入口。

❌ 永不做

  • 从零手写新结构(历史后果:无 <nav> 侧栏、H3 21→16、SVG 8→5、缺 hl 块,page 与真源"差距太大")。
  • 引入包外旧版式样本。包内只有天齐一套版式 —— 多版本交叉参照正是"偏差"的来源。

关键文件(基准与范例,均在 skill 内,无需外部文件)

  • 版式标杆样本:references/sample-report-天齐锂业-v100版式标准.html —— 用户指定的唯一版式标杆。全门禁 ALL PASS,维度最全(10 h2 / 31 h3 / 6 h4 / 26 表 / 9 SVG / 7 类 viewBox)。配色、字号、SVG 尺寸、章节层级、表格密度一律以它为准。
  • canonical 底稿(路径 B 用):references/_tiqi_base.html + references/build_skeleton_tianqi_v100.py —— 天齐 v100 的 1:1 内容源与生成器;「内容源 + 规范层」变换式架构。门禁的默认标杆是交付标准那份 sample-report-天齐锂业-v100版式标准.html(见「标杆必须先自证」);本文件是生成器输入,作回退。
  • 取数契约(1.3.0 接入):references/data_dict_template.json —— meta/quote/technical/consensus/dividend/shareholder/income/balance/cashflow/peers/data_gaps 全字段模板,键结构与 rep() 调用一一对应。
  • 换股模板(1.3.0 接入):references/gen_stock_template.py —— 严格替换 rep(old,new,label,expect=1),每次断言命中数 == 1。
  • CSS 基准(必须整段复制):references/css-baseline.css(与报告第 1 段 <style> 块内文逐字节一致)+ references/css-semantic-layer.css(第 2 段;配色唯一真源)。svg{width:100%} 那条必须在。
  • 配色规范(唯一真源·必读):references/color-spec.md —— 语义三色 / 层级冷色阶梯 / 警示橙 / 6 条硬性禁止项 / SVG 尺寸三档 / 字号 15 档 / 交付前校验片段(与 gate-24 对齐)。references/style-guide-版式与配色规范.md 与之冲突时以 color-spec.md 为准。
  • 章节骨架:references/skeleton-10sections.md —— 固定 10 节清单 + 每节要点 + 图表清单(viewBox/类型)+ 配色类速查。
  • 数据来源映射(必读):references/data-sources-map.md —— 每节/字段 → 具体接口(westock MCP 6 工具 / Tushare / 麦蕊)+ 应急通道 + 已知缺口 + 一致预期分层纪律。
  • 坑库:references/pitfalls-数据口径红宝书.md —— 五十余节多股复盘全集。新人上手与交付前必读。
  • 方法论:references/v5-extension.md(V5 五维度)+ references/module-汇率风险专项.md(出海个股 §7 模板)。
  • 沿革:references/CHANGELOG.md —— 1.2.0 → 1.3.0 全版本变更(1.3.0 起从 description 外置)。

门禁链(1.3.0 · 七道 + 一钻取)

交付 = 七道连续全过。任何一关 FAIL 必须回内容源修,严禁带 FAIL 上传资料库。

⓪ verify_benchmark_integrity                            # 尺子自证(1.3.0 新增,改 skill / 换标杆后必跑)
① preflight_source_check   <生成器.py> --name <本股>          # 源码层,FAIL 即禁止构建
② validate_structure       <report.html>                      # 24 项:形状 + 估值口径联锁
③ check_density_parity     <report.html>                      # 形状 + 内容厚度 + 逐节字数 + 克隆签名
④ verify_data_truth        <report.html> --data data_XX.json   # 数值真值(1.3.0 新增)
⑤ verify_report            <report.html> --name … --code … --forbid …
⑥ validate_v5              <report.html>                      # V5 方法论(advisory)
⑦ render_probe             <report.html>                      # 渲染级:按字符数加权的字号分布(仅对成品)
   钻取(③ FAIL 时)        diff_section_signature <report.html> --strict

| # | 脚本 | 关键参数 | 判据 | 通过 | |---|---|---|---|---| | ⓪ | verify_benchmark_integrity.py | 零参数即可(自动解析 references/);--ref-dir 覆写 / --skip-build | ① 两份标杆的两段 <style> 逐字节 == CSS 真源;② 底稿跑生成器的产出与交付标准 cmp 逐字节相同;③ 两份标杆内容厚度项无实质漂移 | exit 0 | | ① | preflight_source_check.py | --layer final(成品必加) / .py 自动走 build 层 / --layer raw 内容源 | P1–P16 静态扫描:旧色残留、禁用 emoji、标题内联色、标题内语义色、nodeid 噪声、<script>、「折价」错色、viewBox 越界、SVG 宽度越界、单引号 class、%-format 风险、克隆源指纹、语义反色、未定义色类、打分卡配色组内一致性(WARN)、折价落带色 span 才触发 | exit 0 | | ② | validate_structure.py | —— | 24 项:div 配平 / h2 序号 1..N 连续 / 侧栏无死链 / 无"模块"占位 / SVG 内联宽度 / 零 <script> / §7.1 三角顶点 / §3.4 季度表 / 兑现压力块 / §10.1 价位+估值列 / 三支柱 / 18–22 估值口径联锁(§4.3 每行 目标价==EPS×PE、单调递增、⑯中性档≡§4.3中性档、§10.1 下沿≤现价、全表隐含 EPS 唯一)/ 第 23 项 V5-deep / 第 24 项配色纪律 | 24/24 | | ③ | check_density_parity.py | --min-ratio 0.80 --min-content-ratio 1.00 --min-section-ratio 0.70 --no-signature(仅限经用户确认的裁剪) | A 形状项 h2/h3/h4/table/svg ≥80%;B 内容厚度项 div/tr/td/b/li/ul/chars/cjk ≥100%(1.3.0 起纳入 FAIL);C 逐节字数比(按 h2 切段,<70% FAIL / <90% WARN);D 克隆签名 viewBox 集合 + h2/h3 id 序列完全一致 | exit 0 | | ④ | verify_data_truth.py | --data data_XX.json(必需)--forbid … --forbid-from … --require-path … --allow-stale(明知旧快照才用) | ⓞ 快照同源:真源 meta.report_date 必须出现在报告正文;A 覆盖率 ≥85%;A2 硬需求;B 六条恒等式(前瞻PE≈现价÷预期EPS〔软项〕/ PE-TTM≈市值÷归母TTM / 涨跌幅 / 总市值≈现价×总股本 / EPS(TTM)≈归母TTM÷总股本);C 禁用指纹 = 0 | exit 0 | | ⑤ | verify_report.py | --name <名> --code <码> --forbid "<克隆源指纹>" | 股票名 ≥3 次、代码存在、禁用指纹命中 0 | exit 0 | | ⑥ | validate_v5.py | —— | V5 五维度落地 + 结构基线;WARN 非阻塞(可在报告注明"未启用"后忽略)、FAIL 须修 | 无 FAIL | | ⑦ | render_probe.py | —— | 按字符数加权的字号分布:某字号占比与标杆差 >2pp 即 FAIL("字号不一样"的真判据) | 无 FAIL |

③ 的门禁补丁故事(1.3.0 核心)

旧判定集:h2 / h3 / h4 / table / svg          阈值 0.80
          → 一份内容塌陷的薄版这五项**全部 100%** → 门禁 ALL PASS → 交付 → 用户:"指标展示的是不是少了"

实测薄版(剥注入后):h2/h3/h4/table/svg 全 100%
                     div 161/161 · tr 159/171(93%) · b 202/364(58%) · li 91/127(72%)
                     chars 22886/25582(89%) · cjk 12646/14184(89%)
                     逐节:§6 67% · §7 68% · §8 51%(三节内容饥荒)

新判定集:形状项(同上,0.80)+ 内容项(div/tr/td/b/li/ul/chars/cjk,1.00)+ 逐节字数比
          → 同一份薄版现在 exit 2,并点出「b 58% → 回内容源按标杆逐节补写」+「§8 字数 51% · 该节内容饥荒」

钻取工具的分工(③ FAIL 之后才用):门禁说"§8 只有 51%",diff_section_signature.py 说"§8 的 ul 3→2、li 10→4、div.note 4→1"。它按 sN 分层切段(h2 行 = 整节,h3 行 = 子节),比 h2/h3/h4/任意子节的字符数与 15 类关键 class 计数。

④ 的真值门禁故事(1.3.0 核心)

旧五道门禁里,没有任何一道校验"报告里的数字 == 真源的数字":
  preflight  → 源码正则 · validate_structure → 形状+口径自洽
  density    → 元素个数/字数/签名 · verify_report → 只查名称/代码/指纹 · v5 → 方法论
→ data_XX.json 里 pe_ttm=34.43 写成 34.4 甚至 24.43,五道全绿。

首次运行实证(新宙邦 300037):
  交付成品用 09-14 快照:现价 73.02 / PE-TTM 34.46 / MA5 70.06 / DIF 1.1611
  data_xz.json 是 09-15 快照:      72.95 /      34.43 /      71.146 /      1.476
  两份**各自自洽**,但已**不同源** → 真源无法为交付物背书。旧门禁零感知。

设计要点:不同源时 A/B 段自动降级为 WARN 并只报一条清晰 FAIL(否则 15 条"字段缺失"噪音会掩盖真因)。--allow-stale 供"明知旧快照"的场景显式降级。

⚠️ 「目标价 = EPS × PE」不是恒等式(目标价隐含的是分析师自选 PE 档),不要校验。同理 pe_fwd 是行情商口径,与其自身 price ÷ consensus_eps 本就可能差 15%(实测新宙邦 27.95 vs 24.32),故列为软项(仅 WARN 作口径交叉提示)。

标杆必须先自证(1.3.0 新增 · 教训 5)

尺子自己没被校验过,它量的每一份报告都可能被判错 —— 而且错得很有说服力。

1.3.0 体检时发现:_tiqi_base.html(生成器输入)的第 2 段 <style> 是 1.2.3c 旧配色层(1369B), 而交付标准 sample-report-天齐锂业-v100版式标准.html 是 1.2.6 层(2728B,== css-semantic-layer.css)。 根因:1.2.6 升级时更新了 CSS 真源 + 交付样本 + 生成器,唯独底稿内嵌的副本没跟着改; 而 build_skeleton_tianqi_v100.py 最后一步会整段替换两段 <style>,陈旧副本永远不进成品,所以无人发现。 故成品从未受影响(已实证:旧版底稿跑生成器 → 产出与标杆 cmp 逐字节相同); 真正被污染的是"把底稿当基准"与"直接读/手改底稿"这两种用法。 后果:拿陈旧底稿当基准,会把每一份正确报告的 th 字重(600 vs 700)判成样式不一致。

不变式(交付/改 skill 前必跑,两份文件都要验):

blk(f, 0) == "\n" + open('css-baseline.css').read()        # 两份都必须 True
blk(f, 1) == "\n" + open('css-semantic-layer.css').read()
# f ∈ {_tiqi_base.html, sample-report-天齐锂业-v100版式标准.html}

# 产出等价(最强自检):底稿跑生成器 → 必须与交付标准 cmp 无差异
# 一条命令同时验住「底稿是否干净」与「生成器是否有效」
  • 默认基准 = 交付标准那份(sample-report-天齐锂业-v100版式标准.html),_tiqi_base.html 作回退。 两者在密度上等价(div/tr/td/b/li/ul/cjk 完全相同、chars 差 11;仅 span 因内容而异), 唯独样式口径不同 —— 所以基准选错只污染样式类校验。
  • render_probe.py 只对过完规范层的成品有意义(底稿/中间态本来就用旧样式层,会正常报不一致)。

处置顺序固定为:先验尺子,再量东西。 同类坑见 pitfalls-数据口径红宝书.md §五十六。

门禁脚本自检纪律(1.3.0 出包后复查补的 · 血泪)

任何写进 skill 的脚本,都必须在 3 个不同 cwd 下各跑一次「零参数默认调用」。

S=~/.workbuddy/skills/stockdivsreport__skillhub
for wd in "$S" "$S/scripts" /tmp; do
  cd "$wd"
  python3 "$S/scripts/verify_benchmark_integrity.py"   # 必须 exit 0
  # 其余门禁同理
done

实证事故:verify_benchmark_integrity.py 的 --ref-dir 默认值是相对 cwd 的 "references" —— 从 skill 根跑正常,但按最顺手的 cd scripts && python3 verify_benchmark_integrity.py 就报 找不到 references 目录: .../scripts/references。 七道门禁全绿、包都打出来了,换一个 cwd 就崩 —— "全绿"只在你恰好用的那个 cwd 下成立。

修法:所有默认路径改为基于 __file__ 自动解析(dirname(dirname(__file__))/references), HOME 位置与 ./references 作二三级回退;--xxx 参数保留覆写能力。

连带纪律(同样适用于内容改动):

  • 修完脚本/内容 → 必须重打包并跳版本号。同一个版本号名下存在两份不同内容的包, 等于把"这份包到底测过没有"变成不可回答的问题。本次 1.0.9 → 1.0.10, 旧包归档为 stockdivsreport-1.0.9_SUPERSEDED.zip。
  • 报告里给出 zip 的 sha256,这是对抗"同名不同内容"的最终防线。

skill 卫生(1.3.0 新增 · 教训 2)

同名孪生会静默降级最多 20 个版本。 实证:tdivs-stock-report/(v1.2.1) 与 stockdivsreport__skillhub/(v1.2.21) 的 frontmatter name: 字段完全相同(都是 tdivs-stock-report),平台选中哪个取决于扫描顺序,且不报错。

纪律:

  • 改/装本 skill 前后各扫一次 name: 重名(遍历 ~/.workbuddy/skills/*/SKILL.md 的 name: 字段,重复即清理)。
  • {目录名}__skillhub 形态是从市场安装的;手工版本用不带后缀的目录名,name: 保持唯一。
  • 删除旧版前必做逐文件哈希比对,确认旧库无唯一知识(本次实测:旧库 pitfalls 是子集,但 data-sources-map.md 有 4 处唯一内容,已回补后才删)。
  • ⚠️ 现存同类问题(不在本 skill 职责内,已知悉、未擅自删除):
    • main-capital-cycle 与 main-capital-cycle__skillhub 同名;
    • tdivs-public-demo 与 tdivs-public-demo.bak.1788218631 同名 —— 2026-09-15 实测 diff -rq 空输出(逐字节相同,零信息量),删除零风险,但按"不擅自批量重构 skill"纪律只报告不删。

黄金规则(任何改动都不得违反)

1. 图表尺寸:内联宽度,三档锁定

  • 全局 CSS 含 svg{display:block;width:100%},会覆盖 HTML 的 width 属性与 max-width。
  • 因此每个 SVG 必须写内联 style="display:block;width:NNNpx;height:auto;margin:…"。width="NNN" 属性无效。
  • 只允许三档(依据 = 天齐 v100 标杆):420px 窄图(八维雷达 / 双视角 PE / 产业链 / 三难三角)· 560px 数据图(行业估值双轴 / 盈利规模增长 / 相对强弱横条 / 筹码评分行)· 640px 长对比图(同业 PE 横向对比)。440px 为 1.2.5 前旧档,仅门禁兼容。
  • 逐图对应表见 color-spec.md §4 第 8 条。内容列宽 .wrap{max-width:980px}。

1b. 字号:只许基准 15 档

  • 允许集合 = css-baseline.css 出现的全部字号:10 / 10.5 / 11 / 11.5 / 12 / 12.5 / 13 / 13.5 / 14 / 15 / 16 / 17 / 18 / 23 / 28 px。
  • 出现 9px 等基准外字号即偏差,一律归一到 10px。不要凭手感新造字号。
  • ⚠️ 「字号不一样」的真身常是裸 <ul> 掉在 .card 下 → 继承 body 16px。判据是按字符数加权的字号分布(render_probe.py 第 ⑤ 项),不是"我明明写了 12.5px"。

2. 图表/表格下方的注脚必须"解释图表",不是声明出处

  • 禁止把注脚写成"数据来源声明/回填说明"。应写成解读:怎么读这 N 张卡: / 表内解读: / 表内四档沙盘共用同一算法…。
  • 逐张/逐档点出结论,而不是罗列参数。
  • 例外:当确有诚实口径需要披露(如分产品是年报近似值非逐笔实测),把来源压缩成句末括号附注,主句仍是解读。

3. 重点文字配色 + 加粗

  • 语义三色(类名与色值同向,禁反色):cr=红 #ff9a9a(利好:净流入/上涨/达标/已兑现/不贵)、cg=绿 #7ee2a8(利空:净流出/下跌/未达成/偏贵/风险)、cy=黄 #e8c66a(不确定:待观察/时效警示/近似值);辅助:cw=橙 #f0883e(警示/风险旗标 ⚑)、co/b=金(非语义强调,关键计数如 5/8、S=4.76)。标题·子标题·表头一律避开这三色(走冷色阶梯)。
  • 对每张卡/每段结论里的关键词加 <b> 加粗并上色;只标 ≤2 组关键词,不整句染色。
  • A 股红涨绿跌:流入/偏多/利好=红(cr),流出/偏空/利空=绿(cg)。图标字形必须与同段文字同色(✓↑▲红 / ✗↓▼绿 / !●↔黄 / ⚑橙)。零 emoji。
  • ⚠️ class="chk" 外层 span 恒为 class="b"(.b{color:var(--gold)});给 ✅ 写 class="r" 会触发 preflight P14 FAIL。

4. 数据诚实口径(不可妥协)

  • 取不到的字段只标注、不手工填充。常见缺口:券商一致预期(无权限返回 40101)、data_shareholder.shareholderNum 空数组(改东财 RPT_HOLDERNUM_DET)。
  • 扣非归母净利润用 Tushare profit_dedt 实测补齐。
  • 分产品/分部数据若来自年报分部口径(非逐笔实测),必须诚实附注"为分部口径近似值,非逐笔实测"。
  • 数字修正前必须 grep 全部上下文确认所指实体:同一数字在不同语境可合法共存——82.62% 在同业表里是巨化股份 PE-FWD、在营收句里是 26Q2 单季同比。误按"同名=同事项"去改会删掉真值。
  • 全文口径以真源为准,零臆测。

5. 图标语义要对

.ic 卡片图标必须贴合内容("实际值"用 📊 而非 🎯;🚩=红旗风险、🔗=共振/联动、⚠️=缺口/警示、✅=已覆盖/取数)。改完做一遍全报告图标↔标题↔小字一致性扫描。

6. 结构纪律

  • 布局:grid g2 → 统一改单列 grid;grid g3 仅在"风险卡片"等多项并列处保留。
  • 删/移模块后:① div 开合配平;② h2 物理序号 1..N 连续无断号;③ 侧边栏不得有指向已删除 id 的死链;④ 不得残留"模块"占位字样。
  • 八维维度卡(s2):每张卡内联 得分×权重=加权分(如 5.5×0.18=0.99),卡组末尾给"合计"说明(加权 S、原始分、达标计数、仓位结论)。
  • 核心风险(s9):用 grid g3、重要项置顶、已缓释/已满足项不展示,并展开"自身风险干净"的佐证(质押率/解禁/融券/大宗/股东户数)。
  • ⚠️ 侧栏 <nav> 文案必须从正文标题派生(硬编码短标题表必失配,且门禁查不出)。

7. 预览自动刷新

每次编辑后用 present_files 重新打开预览(服务器按内容哈希生成 URL,重开即加载最新版)。不要指望用户手动刷新。


格式化后处理铁律(解释块 ▸ + 黄绿红 + 去竖线)

全报告解释块的统一格式化,必须在 build 脚本末尾用 regex 栈平衡后处理器做,而不是逐块手写、更不能用 BeautifulSoup。

1. ⚠️ 禁用 bs4 做 HTML 后处理

beautifulsoup4 会把 SVG 的 viewBox 属性小写化为 viewbox → 全部 SVG 图表失效(viewBox 7→0)。一律用 references/post_format_utils.py 的 post_format_all(html)(纯 regex + 栈平衡)。

2. 解释块统一「▸ 标签 + 黄绿红」

  • 每个 .note 自动补 <b style="color:#...">▸ label</b> 前缀 + border-left-color 色条,分三档:
    • 绿 #7ee2a8 = 结论 / 锚定 / 达标 / 满足 / 纪律
    • 红 #ff9a9a = 风险 / 极难 / 不满足 / 红旗 / 待验证
    • 黄 #f0c674 = 推演 / 测算 / 方法论 / 估值(默认档)
  • 配色必须基于 label(首 <b> 到第一个「:」前的文本)判定,绝不可对整块正文做关键词打分——正文里的"成长/稳健"等词会污染归类导致反置。逻辑在 classify_tone(label):先 OVERRIDES(label 子串精确匹配)→ RED_CAT → GREEN_CAT → 黄。
  • 短 label(≤30 字)一体化;长标签/纯文本开头前置独立彩色 <b style="color:...">▸ </b>。

3. 去掉所有左侧竖线

默认 CSS 给 .note 加 2px 左竖线 → 在 <style> 末尾追加 HEAD_CSS_OVERRIDE(来自 post_format_utils):.note,.hl .note{border-left:0 !important;padding-left:4px !important}。 非 .note 解释块(§8/§10.4 的 <div>)直接把 ▸ 编进源码,不要用 add_border_to_div_containing 注入竖线。

4. 幂等,绝不碰已验证内容

已带 border-left-color 的块(顶部高亮框 5 条 / §10 双栏卡片 / §10.5 门禁 / 手动上色块)跳过。⚠️ 手动上色 + 带 border 的块会被后处理器跳过——改这类块配色须直接改源码。标准琥珀色统一 #f0c674。

5. f-string HTML 编辑铁律

删文本必须整段删(从 <div class="note"> 到 </div> 整行),不能只删内部文字保留开头标签——否则残留无主 <span> / 死 <div>,浏览器按"忽略未闭合标签"渲染出孤立字符。复检 grep 'note"> 以|span class=" </div'。

6. 篇幅纪律(1.3.0 补)

克隆版每子节只有 1 段 note 时 → 在 card 内插 <ul><li><b>…</b>…</li></ul>(禁新增 h3/h4)。 ⚠️ 裸 <ul> 掉在 .card 下会失去 .note.expl 的 12.5px 继承、退回 16px —— build 末必须硬断言栈扫裸 ul。


发布前数据自洽校验(机构级零容忍)

交付前必须跑 check_data_consistency(D)(post_format_utils.py),机械校验能判定的口径陷阱,空清单才过关:

  • EPS 自算:np = eps × 股本(同口径),误差 >1% 报警。
  • PE 口径:PE = price / eps(TTM/FWD/LYR 各切各的),误差 >5% 报警。
  • 总市值:mcap = price × 股本,误差 >2% 报警。
  • PB ≈ PE × ROE:差 >5% 报警——且禁止写"完美吻合",须注明"取数时点差异致微小误差"。PE/PB/ROE 来自不同快照,2–4% 偏差属正常。
  • H1 扣非占比 / OCF 比:扣非占比超 100% 需非经为负佐证;OCF/净利 越界(<0 或 >200%)报警。
  • 盈利趋势自洽:H1 = Q1 + Q2,误差 >2% 报警。

只覆盖"能机械判定"的部分;行业中位/同业 PE/叙事类结论仍需人工按 data-sources-map.md 复核。 改 D 后必须重跑 build 重新生成 HTML —— 只改 D 不重生成,用户看到的仍是旧数据。 跨快照对账另见门禁 ④(verify_data_truth.py)。


结构真源与克隆纪律

结构真源 = 天齐 v100 标杆(sample-report-天齐锂业-v100版式标准.html / _tiqi_base.html)。所有个股报告必须 1:1 对齐,唯一判定准绳 = 门禁 ②③ 联合通过。

节号基准:节号以天齐 v100 标杆为准 —— 扣非归母 §3.3、增长归因 §3.4、下季预测 §3.5、估值模型与股价预算 §3.6、全口径估值 §3.7、行业相对分位 §3.8、定价范式判定 §7.2。validate_structure.py 第 10/15/16/20 项按标题内容定位(不绑节号 id),故节号漂移不再造成误报或静默 SKIP。

  • validate_structure.py 24 项全过是交付门禁:任何新报告 / 大段删改后必须跑。
  • 包内只有天齐一套版式:其他版本样本(阳光 v104 / 中天 v105 / 三花 / 阳光旧)与旧构建脚本已全部下架。严禁从外部引入旧版式样本。

克隆手术残留四查(违一即"样式还是有很大区别")

以底稿逐字节克隆 + 区块替换改造新个股时,替换完成后必须执行四查:

  1. 查重复章节头:底稿 body 区块替换不完整时,旧区块与新区块同时保留、双渲染且 id 冲突。检查:源码中每个 # §N 注释头恰好 1 次;HTML 中每个 id="sN" 恰好 1 次(含 s5-1/s3-8b 等子锚点)。
  2. 查残留关键词:底稿是天齐锂业 → grep 个股名("天齐")、代码("002466")、行业词("锂"/"碳酸锂"/"锂精矿"/"SQM")、专属数字。区分两类:跨报告对比句是刻意内容、保留;天齐专属数据叙述必须改写。
  3. 查颜色联动:D["dim"] 色值(radar8 用)与 §2 八维维度卡手写块 <b style="color:..."> 必须同语义同步。维度卡配色(1.2.6):强项→红 #ff9a9a;弱项→绿 #7ee2a8;⑧量能真实性(否决项)→黄 #e8c66a。禁止全绿。
  4. 查侧栏与注释:区块注释/侧栏仍写底稿行业词 → 手术未净。

样式对齐复验(六要素)

  1. style 块逐字节一致(约定 = 块内文 == "\n" + CSS 文件全文,不要 strip);
  2. SVG viewBox 集合一致(check_density_parity 机械校验);
  3. 组件计数对齐:note expl / sig / chk / <table / <h2 / <h3 / hl / card 数量一致或差异可解释;
  4. 配色 token 分布:#ff9a9a / #7ee2a8 / #e8c66a / #d4af37(SVG 金)计数同量级——红绿比例随个股语义不同属正常,但禁止"全绿/全红"单色失衡;
  5. 静态五项:零 <script>、SVG 全带 xmlns、table 全带 tbody、class='r'(单引号)=0、标签平衡;
  6. 结构密度对齐:见门禁 ③(形状 + 内容厚度 + 逐节 + 签名)。
  7. ⚠️ 对比必须先剥平台注入:两侧都剥掉 data-page-node-id/data-pnid-children/<!--pnid:--> 再比,否则被 ~1 倍体积差假象误导。

德业 v101 事故复盘 · 十五坑清单与机械防线

背景:生成德业股份研报时第一版手工另写版式而非克隆底稿,被用户连判两轮"页面还是不对,偏差还是很大";改走克隆重做后,又在配色 / 估值口径 / 工程实现三类上连踩坑。以下逐条给出机械防线,目标是「同类错误第二次必然被脚本拦下,而不是靠记性」。

| # | 坑 | 现象 / 代价 | 机械防线 | |---|---|---|---| | 1 | 非克隆 · 自建版式(根因坑) | 元素计数碰巧凑齐(10 h2 / 31 h3 / 26 表),但 SVG viewBox 全是自造值、h4/h2 id 是资料库垃圾串 → 多花 3~4 轮返工 | ③ 克隆签名比对:viewBox 集合 + h2/h3 id 序列须完全一致 | | 2 | 旧色残留 | 内联 SVG fill / KPI 卡用了反色事故期旧色 #ff7b72/#3fb950 → 同屏两个红、两个绿 | preflight P1 + gate24(final 层 FAIL / build 层 WARN);build 归一 #ff7b72→#ff9a9a、#3fb950→#7ee2a8 | | 3 | 禁用 emoji | ✅❌⚠🟠⬇△ 共 41 处 → gate24 FAIL(emoji 无法被 CSS 染色) | preflight P2 → 换字形 ✓✗▲▼⚑;源层全清(build 只清 🟠) | | 4 | 标题内联色 / 标题内语义色 | 6 处 h4 带 color:#9da7b3 盖住层级色;1 处标题内 span.cg | preflight P3/P4 + gate24 | | 5 | §4.3 目标价 ≠ EPS×PE | 用了逐情景 EPS,与报告自述"EPS 固定 × PE"及 §3.6 五档脱节 → gate18 FAIL | §4.3 与 §3.6 必须同口径(EPS 固定 × PE 变),gate18/20 硬校验 | | 6 | %-format 字面 % 冲突 | max-width:100% 被当作格式符 → build TypeError | preflight P11(字面 % + 格式符/参数数量不匹配) | | 7 | 资料库回写 nodeid 污染 | 工作区那份 HTML 被回写 1784 处 data-page-node-id | preflight P5;铁律:上传源只能用底稿产出 | | 8 | 「折价」双色并存 | 同一报告 5 处红 + 2 处绿,语义自相矛盾 | preflight P7(折价一律归绿)+ color-spec.md 真源 | | 9 | CSS 注释里的禁用符号 | 在 CSS 注释里写 ⚠ → gate24 FAIL(注释里的文字同样受约束) | 注释说明一律用纯文字「注 …」 | | 10 | 改 CSS 真源未同步标杆 | 改了 CSS 却没改标杆 HTML → 破坏逐字节不变式 | 铁律:改 CSS 真源必须同步改标杆,改完立刻跑不变式复验 | | 11 | 语义反色继承到 class 使用(含 span 级漏改) | 内容源 class 与旧反色语义层配套写 → 克隆后两段 style 被整段替换,着色全反;第一轮修正器只正则 <td class="[bry]">,漏掉 16 处 span 级 | ① 修正器必须 td + span 双覆盖;② preflight P13 断言「父格与首子 span 语义同向」;③ 修正后必须跑语义一致性扫描 + 渲染抽检 | | 12 | 克隆法的内容层污染(门禁全绿 ≠ 数值正确) | 上海合晶首版以睿创微纳终稿逐位翻译,结构/签名零偏差、五道门禁 ALL PASS,但睿创的转债/实控人/同业 PE 表/研发额整段残留 → 本股真值全错 | ① verify_report --forbid 须补数值/事实指纹;② forbid 词表须按标的豁免自身合法词(否则假阳性);③ 克隆后必做逐表真源对账;④ 污染面过大时弃用翻译版、全量重写正文 | | 13 | 未定义色类:写了 class 却根本不上色 | 72 处 <td class="g"> + 6 处 <span class="g"> 全部无色——.g 只出现在组合选择器里,.y 更全无定义 | preflight P14:按 标签.类名 精确登记生效规则(td.r 只给 td 上色)。合法组合仅 td.r/td.b/td.a + span.cr/span.cg/span.cy/span.cw。必须精确到 tag.class,按「类名」判定会漏报 span.r | | 14 | 打分卡配色与得分不同向 | 壁垒 6.5「达标」被写成绿色,与同排达标卡(红)自相矛盾 | preflight P15(WARN 级):按达标(≥5.5)/未达标分组,组内颜色须一致。刻意不硬编码「≥5.5 必红」——标杆自己就不统一。修完必须同时看叙事自洽 | | 15 | 「标杆对比」不可省:自查全绿 ≠ 达标 | 与标杆同口径逐项对比,才挖出上面 13/14 两类缺陷 + §2.1 卡片信息量只有标杆 23% | 交付前必做同口径对比(先剥注入);逐节比 h2/h3/h4/table/svg/tr/td/th/li/中文字数,任何一节中文 <100% 标杆即视为缺口 |

三层防线(标准顺序,缺一层即降级交付)

⓪ 克隆后  逐表真源对账(坑 12)——底稿每张表/每张 SVG 拉到真源逐格核,
            并把克隆源的名称 + 数值/事实指纹写进 verify_report 的 --forbid-file
① 构建前  preflight_source_check <生成器.py> --name <本股>      ← P1–P16 扫完,把七成坑拦在 build 之前
② 构建后  validate_structure(24) + check_density_parity(厚度+签名) + verify_data_truth(真值) + verify_report(残留)
③ 上传前  check_lib_dup(命中即 --node-block-id 覆盖)+ 上传源净化五项 = 0

preflight 的三层语义(按 --layer 自动推断):build=.py 生成器(净化规则行自动豁免、字符类降级 WARN);final=成品 HTML(严格无豁免,上传前必跑);raw=显式声明的待净化内容源(跳 P1–P5)。 ⚠️ 成品必须显式加 --layer final:默认按扩展名推断,若对 .py 走 build 层会豁免净化行 → 误判。

为什么 preflight 要分三层:生成器里出现 rep("#ff7b72","#ff9a9a") 是为了清除这些字符,不是输出它们;内容源本身就是待净化的中间态。一刀切按成品标准扫,基准文件自己就会 FAIL —— 这类"工具误报自家基准"正是最容易让人放弃用工具的原因。


估值联锁门禁 · 克隆回填四纪律

以下四条是「阳光电源审计 → 回流骨架」沉淀的门禁配套纪律。任何新克隆 / 大改估值节前必读,否则会反复踩中 SKIP/FAIL。

纪律 ① 估值模型节(§3.6)「股价预算 5 档」三要件(gate-20 前提)

  • 标记字符必须是 U+246F(circled 16),绝对禁止 U+244A(形近 glyph)。校验器 gate-20 字面量 = U+246F;用 U+244A 会让"估值模型节未定位到 ⑯ 五档区块"永久 SKIP(不报 FAIL 但门禁失效)。
  • 标记必须落在 <td colspan="4"> 的 body 行,不能放在 <th> 表头(gate-20 只扫 body rows)。
  • 该表须为估值模型节首表,且含「中性 · 一致预期达成」行(PE 与 §4.3 中性档相同,容差 0.6x / 价差 2%)。

纪律 ② §4.3 拆表模式(单调 + 峰值 + 反事实)

  • 目标价 = EPS × PE 全程统一(与 §3.6 同口径)。§4.3 行须严格单调递增(<3 档不触发 gate-19)。
  • 多增长曲线用「层级拆表」:L0 主营单调档 + L1 第二曲线期权档(标「不计入硬指标」)。

纪律 ③ §10.1 估值列格式「年份前缀 + x」

  • 须写成 26E 16x–18x(含 26E 前缀),不能写 26E 16–18x——后者 _pe_values 只提一个 PE,gate-22 隐含 EPS 验算会失真。
  • §10.1 须 ≥3 行 + 全表「价位 ÷ PE」隐含 EPS 唯一(容差 3%);含 PE-LYR 等无年份前缀的估值列会被丢弃 → FAIL。
  • ⚠️ PB 单元格避 Nx 写法:gate-22 会误读 PB 2.5x 的 2.5 为 PE。

纪律 ④ §7.1 出海不可能三角顶点固定

  • 三顶点 = 出口贸易壁垒 / 海外建厂重资产 / 发债再融资稀释。禁画旧三角「汇率 + 成本 + 利息」。

这四条已沉淀进 validate_structure.py(gate 18–22);「U+246F vs U+244A 形近字」属肉眼难辨类,克隆时用 s.replace("\u244a", "\u246f") 兜底,写完 grep 确认全文件仅剩 U+246F。


数据口径踩坑纪律

详版见 references/data-sources-map.md §4–§5 与 references/pitfalls-数据口径红宝书.md。三条硬纪律:

  • 行业中位必须实拉,禁止手挑样本:§3.1 行业均值须实拉同行业全部样本算中位数。曾手挑 5 家算出 37x、倍数 0.87,实拉全样本后中位 32x、倍数约 1.0——手挑会系统性高估"低估程度"。阈值带 0.7/1.3 必须以可视化色带呈现。
  • 麦蕊 API 域名唯一:api.mairuiapi.com:严禁 api.mairui.club 及任何 host 变体。端点 hsstock/history 与 Tushare 单日查询交叉验证。
  • 关键字段双源校验(Tushare 主 + 麦蕊辅):同业 PE、扣非归母等核心字段优先 Tushare 实拉(daily_basic / fina_indicator.profit_dedt),麦蕊作交叉验证;两源冲突以 Tushare 为准并显式标注,不得取平均值糊弄。
  • Tushare 区间截断:免费账号单日 trade_date 查询才可靠,区间参数会被截断到最后约 3 天。
  • 扣非 PE 推算:TTM 扣非 =(FY 扣非 − H1 扣非)+ 当前 H1 扣非;前瞻 PE 必切。
  • 分产品对比:半年报只给聚合层营收 → 必须诚实标注。
  • 机构覆盖:查 consensus.institutionCnt;股本用 quote 实测禁反推;股东户数取东财 RPT_HOLDERNUM_DET,人均 = 总股本 ÷ 户数(转增造成口径断点须分段看)。
  • 数据源降级:Tushare Pro 需自注册 token;westock 可直接用;无二者时降级公开接口(qt.gtimg.cn/q= / ifzq.gtimg.cn / push2.eastmoney.com)并在注脚标注来源。

各节内容易错点清单

skeleton-10sections.md 已逐节标注「✅ 必含 / ❌ 易错」,这里给速查:

  • 估值模型与股价预算(§3.6)图:必须统一灰柱 + Y 轴刻度 + 金色现价线 + 保/中/乐三档;禁三色柱、禁红色现价线、禁把中性档误标「底」。三档目标价须与 §4.3 一致。
  • 扣非 vs 归母季度对照表(§3.3):必须展开 Q1–Q4 单季 + 末行"全年/累计"对照;隐去 Q4 单季会误导读者把累计相减成错误的 H2 量级。次年列"2026E"须标"预期"。
  • §4.2 分产品兑现度矩阵:表列 = 产品曲线/当年收入/毛利率/收入趋势/兑现状态;包 .card;用年报分部真实数,禁用"主体/成长/承压"定性词。
  • §4.3 分层估值沙盘:表列 = 层级/业务边界/隐含E/隐含PE/目标价/兑现状态;锚定 目标价=隐含E÷股本×PE;补「两个口径词怎么读」+「盈利 E 锚定」;L1 档标「不计入硬指标」。
  • §6.1 行业壁垒定位对比:画「综合壁垒评分」纵向柱;禁画「毛利率对比」。
  • §7.1 出海不可能三角:必须含「必要条件 / 时点 / 区间」三件套;禁画旧三角。境外收入 >10% 启汇率专项,否则改行业专项;⑪ 未触发须注「未启用」。
  • §10 操作路径:「试错信号」与「建仓区」必须同一逻辑(都突破或都低吸),禁止"站回 MA20 突破"配"深跌低吸"并存;深跌区只作止损/证伪。
  • 三支柱一致性:维度固定 = 政策/资金/技术,§2 与 §10 必须逐字一致,未确认信号不得打 ✅。
  • 「全年目标兑现压力倒推」块:必含;结论按本股 H1 实绩判定触发与否(H1 变脸股会触发红线,禁照抄"不触发")。
  • §3.4 须含「去年实绩」+「今年预期」(双视图,禁单灰柱退化);§4.2 须含「兑现状态」。

工作流程

  1. 取数(先读映射):打开 references/data-sources-map.md,按"字段→接口"逐条拉取;记下哪些真实取到、哪些是缺口。出海个股(境外收入>10%)额外取汇率专项三数据。产出 data_XX.json(键结构照 data_dict_template.json)与 meta.report_date(本快照日期)。
  2. 选路起稿:按「起稿选型」决定走路径 A(库内择优 + 文本级补丁)还是路径 B(canonical 底稿逐块 rep)。禁止路径 C。
  3. 构建前预检:python3 scripts/preflight_source_check.py <build_xx.py> --name <本股>,exit 0 才继续。生成器层自动豁免净化规则行。
  4. 三层解释块:正文所有解释性内容用 .note expl 三层结构(结论行 .v → 要点 → 依据),覆盖率目标 ≥90%。
  5. 语义配色纪律:.cr=红利好 / .cg=绿利空 / .cy=黄不确定(禁反色);标题·表头走冷色阶梯;只标重点词语(≤2 组);图标字形与文字同色;实数格禁 class='r'。
  6. 写注脚 + 诚实标注:每张图/表下方写"解释图表"的注脚;数据缺口只标注不填充。
  7. 七道门禁:按「门禁链」①→⑦ 连续跑,全过方可交付;③ FAIL 时用 diff_section_signature.py --strict 钻取到具体 class。
    • ⚠️ 成品跑 preflight 必须 --layer final。
    • ⚠️ 任何一关 FAIL 必须回内容源补写/修正,严禁带 FAIL 上传资料库。
  8. 格式化后处理:f.write 前调用 post_format_all(html);改 D 后必须重跑脚本重生成 HTML。
  9. 合规检查:按"合规声明"检查措辞与免责,无指令式买卖表述。
  10. present_files 刷新预览;多轮微调后大段删改必须重跑第 7 步全量门禁。
  11. 存资料库:先查重,命中就覆盖(铁律):
    printf '%s' "$TOKEN" | python3 scripts/check_lib_dup.py --name <股票名> --token-stdin
    
    • 退出码 0(未命中) → 新建节点,必须同时传 --space-id + --parent-id: import_html.py <html> --space-id wzau5CEFMAlv4GnC3TaUJN --parent-id fc6JQAHRpE6P988lzizEPG。 只传 --parent-id 会落到个人空间根(spaceId=parentId=15msfzDJNqo9JU0fbrwjy4),不在「分析报告」夹里,只能手动搬。 另 --file-name 必须带 .html 扩展名(无扩展名报「不支持的文件扩展名:(仅支持 .html / .htm / .zip)」)。 传完用 space.workspace.node-info --nodeId <ID> 回读 parentId/spaceId 确认落位。
    • 退出码 2(命中) → 必须用脚本给出的 --node-block-id <id> 覆盖更新,禁止新建副本;
    • 命中多份时按脚本给出的 move-node 命令归档到 _重复待清理(AI1IvVGuSJAYbTSy4x62qU)。
    • ⚠️ 上传源铁律(精确版):上传源必须 data-page-node-id 计数为 0(gate24 检此项)。 · 工作区构建产物(_XX_final.html)本身干净(海兴实测 0 处),可直接传,无需先拷 /tmp; · 危险的是「下载回来的线上产物」(含 2,700+ 处 node-id)——拿它当上传源 = 把注入带进新版 → gate24 FAIL; · 传前一行自检:python3 -c "print(open('<src>',encoding='utf-8').read().count('data-page-node-id'))" → 必须为 0。
    • ⚠️ --node-block-id 仅对「本身份创建」的节点有效。若节点 createdBy 属其他账号,会报 code=56161 reimport requires admin permission → 改走事务协议: create_page_transaction → list_page_artifacts → 下载含注入的线上产物 → 本地按「路径 A 要点 2/3」做纯文本级补丁 → get_page_upload_url + PUT → commit_page_transaction --pnid <首个被改元素>。
    • ⚠️ 判新旧别只看 version / updatedAt(node-info 的 content 恒为 0,标题日期 ≠ 上传时间)。 内容一致时重传不会 bump version(海兴 v101 重传后仍 version:3)→ 版本号既非充分也非必要条件,靠它自证会误判。 正解 = 读回自证:page/download_page_artifacts.py --node-id <ID> --source edit --out-dir <dir> --token-stdin → 剥样式/标签、压空白后比 纯文本 sha1(线上被注入 node-id,原始字符数会差几十万,别比长度)。 sha1 相等 = 交付完成(不论 version 是否变化);不等 = 线上为旧版须重传;data-page-node-id 计数差 = 平台注入,不是缺陷。 同法可读回他人创建的节点(只读,不受 56161 限制)→ 先比基线再决定是否走事务协议。详见红宝书 §六十三。
    • ⚠️ 资料库没有删除节点的 Agent API —— 只能用 move-node 移到归档区(可逆),或给清单让用户手动删。
    • ⚠️ 落库前必须查该标的是否已有他会话产物:若他版更饱满且非本文件血统(调研数据源不同),按"不同源"处理,覆盖 = 降级 → 先请示用户。

发布包打包纪律(违一即「部分文件被跳过」)

事故:上传 stockdivsreport-1.0.10.zip 时平台提示「部分文件被跳过」。根因:包里带了 _icon.png —— 这是平台下发给本地的图标(见 _skillhub_meta.json 的 iconSource/iconLocalPath),图标由平台托管,不走上传包。证据:平台官方包从不含 _icon.png;本地已装的全部市场 skill,.png 文件数全为 0。

纪律:

  1. 发布包里绝不放 _icon.png —— 平台会跳过,且提示会让用户以为包坏了。
  2. 一并排除:.DS_Store、__pycache__/、*.pyc、AppleDouble ._*、.git/、node_modules/、*.bak。
  3. 根目录平铺:SKILL.md / _meta.json / _skillhub_meta.json / references/ / scripts/ 直接在 zip 根,不套一层目录。
  4. 必须用 scripts/pack_release.py,不要用 macOS zip —— 后者给中文文件名写 GBK、解压端乱码;本脚本用 Python zipfile,自动带 UTF-8 标志位。
  5. 中文文件名本身不影响上传,无需改成英文名。
  6. _meta.json / _skillhub_meta.json 照原样打包即可(含 iconLocalPath 等本机字段)。
# 打包(在 skill 根目录执行)
python3 scripts/pack_release.py --src . --out ../skill_release/stockdivsreport-1.0.9.zip
# 脚本自检:顶层是否平铺 / 是否有 png 残留 / 发行版与内部版号是否读出

上传前五问:包里有 png 吗?有 __pycache__ 吗?是平铺吗?用 pack_release.py 打的吗?版本号双轨递增(内部 SKILL.md / 发行 _meta.json)了吗?


Resources

references/

  • _tiqi_base.html —— canonical 底稿内容源(路径 B 的起点);同时是所有门禁的默认标杆。
  • build_skeleton_tianqi_v100.py —— 天齐 v100 的 1:1 生成器;「内容源 + 规范层」变换式架构;产出与标杆样本逐字节相同。
  • sample-report-天齐锂业-v100版式标准.html —— 唯一版式标杆样本(用户指定)。
  • css-baseline.css / css-semantic-layer.css —— 两段 <style> 的唯一真源(后者含语义三色 + 标题冷色阶梯 + 警示橙)。
  • color-spec.md —— 配色唯一真源:语义三色 / 层级色阶梯 / 警示橙 / SVG 三档 / 字号 15 档 / 6 条硬性禁止项 / 交付前校验片段。
  • style-guide-版式与配色规范.md —— 三层解释块模式 / 配色六条纪律 / 交付校验清单。
  • skeleton-10sections.md —— 10 节骨架 + 每节要点 + 图表清单(viewBox/类型)+ 配色类速查。
  • data-sources-map.md —— 数据来源映射:westock MCP 6 工具真实名 / Tushare 字段速查 / §5 应急通道 / §5.1 一致预期分层纪律 / §5.2 secid 规则 / 已知缺口。
  • data_dict_template.json —— 取数契约模板(复制为 data_XX.json)。
  • gen_stock_template.py —— 换股生成器模板(严格 rep(old,new,label,expect=1))。
  • pitfalls-数据口径红宝书.md —— 五十余节多股复盘坑全集。
  • v5-extension.md —— V5 扩展层方法论 + 中天科技案例 + 七项 self-check。
  • module-汇率风险专项.md —— 出海个股 §7 完整代码模板。
  • post_format_utils.py —— post_format_all(html)(regex 栈平衡,禁 bs4)+ HEAD_CSS_OVERRIDE + check_data_consistency(D)。
  • quickstart-guide.md —— 快速上手(环境 / 数据源 / 克隆 / 校验 / 发布)。
  • CHANGELOG.md —— 1.2.0 → 1.3.0 全版本沿革(1.3.0 起从 description 外置)。

scripts/(门禁链 · 按编号对应上文)

  • verify_benchmark_integrity.py —— 门禁 ⓪ 尺子自证(CSS 不变式 + 产出等价 + 密度等价)。改 skill / 换标杆后必跑。
  • preflight_source_check.py —— 门禁 ①(P1–P16,三层 --layer,成品必加 --layer final)。
  • validate_structure.py —— 门禁 ②(24 项,含 18–22 估值口径联锁 + 23 V5-deep + 24 配色纪律)。解析不到目标表格时 SKIP(不计 FAIL)。
  • check_density_parity.py —— 门禁 ③(形状 0.80 + 内容厚度 1.00 + 逐节字数 + 克隆签名)。
  • verify_data_truth.py —— 门禁 ④(快照同源 + 覆盖率 + 硬需求 + 六条恒等式 + 禁用指纹 + 孤儿统计)。
  • verify_report.py —— 门禁 ⑤(--name/--code/--forbid)。
  • validate_v5.py —— 门禁 ⑥(V5 advisory)。
  • render_probe.py —— 门禁 ⑦(按字符数加权的字号分布;仅对过完规范层的成品有意义)。
  • diff_section_signature.py —— ③ FAIL 后的钻取工具(--level 2/3 --strict,逐节 class 计数差异;h2 行 = 整节、h3 行 = 子节)。
  • check_lib_dup.py —— 资料库上传前查重(exit 0 可新建 / exit 2 必须覆盖)。
  • audit_class_coverage.py —— 类名生效覆盖审计(配合 preflight P14)。
  • pack_release.py —— 发布包打包器(排除 _icon.png、平铺、UTF-8 文件名、双轨版本号自检)。

零号铁律:未来个股研报必须对齐「黄金样本」_dh_final.html

硬性要求:本 skill 产出的每一份个股深度研报,其「页面样式、数据维度、章节骨架、配色、门禁口径」 必须与 references/sample-report-大华股份-v100黄金样本.html(即已落地的大华股份 002236 研报 v100 去冗余版)逐点一致。 该样本 = canonical 路径 B 的标杆落地件,已通过八道门禁 + 资料库读回 sha1 自证(线上=本地)。

为什么用大华样本做黄金基准:它是在天齐 v100 标杆(_tiqi_base.html)之上,经大金/海兴/大华三轮实证打磨出的 「数据维度最全、无冗余、八道门禁全绿」的成品。后续任何股票(路径 A/B)生成的页面,都要达到它的厚度与口径。

对齐判定(不靠肉眼,靠门禁):

  1. 起稿走路径 B:复制 _tiqi_base.html → _XX_base.html(pristine)→ _gen_XX_base.py 逐块 rep 换数 → _XX_base_v100.html → _build_XX_skeleton.py 规范层 → _XX_final.html。路径 A(库内择优 + 纯文本级补丁)仅在论据类型与天齐不重合时用。
  2. 八项 parity 必须对标杆 100%:h1=1 / h2=10 / h3=31 / h4=6 / table=26(富集后允许更厚≥1.00) / svg=9 / style=2 / nav=1;div 配平;viewBox 7 类集合一致;h2/h3 id 序列一致。
  3. 数据维度最低集(缺任一即不达标):六维度(data_chip 筹码 / data_score 诊股 / data_report 研报 / data_rating 评级 / data_risk 风险逐项 / data_quote 全字段)、V4 量化层(EPS 硬锚=H1×2÷总股本)、V5 定价范式、八维 0–8 打分 + 三支柱 + 四共振、五档股价预算(只变 PE、同隐含 EPS、三方同值)。
  4. 样式铁律:配色 .cr #ff9a9a / .cg #7ee2a8 / .cy #e8c66a;td.r 红 / td.b 绿 / td.a 黄;「折价」一律归绿 .cg/td.b;零 emoji;.chk 外层 span 恒 class="b"。
  5. 不得复刻的旧冗余:§2「八维评分锚定」整块(s2_boost)已从大华样本删除——未来生成器禁止再加回,保持与天齐标杆一致(§1 强/弱项 + §2.1 kpi 卡即可)。
  6. 落库前 verify_data_truth 覆盖率 ≥85%,新补维度必须回写 data_XX.json(孤儿数字会拉低覆盖率)。