个股深度分析 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 的四个操作要点
- 底稿必须先剥注入:线上产物含
data-page-node-id/data-pnid-children/<!--pnid:-->,剥完再比厚度,否则被 ~1 倍体积差误导(本地剥注入基线 vs 含注入线上基线)。 - 补丁必须"纯文本级":改线上已有页面时禁止新增
span/br/div(会破 pnid 树)。裸字形(如▼ 个人股东减持)与宿主td.b/span.cg天然同色,比套span更安全。 - 编辑键双向唯一命中:设计一套编辑键,对「剥注入本地基线」与「含注入线上基线」都能唯一命中;改完校验「线上剥注入 == 本地」,差异须为 0。
- 换股即换口径:路径 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.py24 项全过是交付门禁:任何新报告 / 大段删改后必须跑。- 包内只有天齐一套版式:其他版本样本(阳光 v104 / 中天 v105 / 三花 / 阳光旧)与旧构建脚本已全部下架。严禁从外部引入旧版式样本。
克隆手术残留四查(违一即"样式还是有很大区别")
以底稿逐字节克隆 + 区块替换改造新个股时,替换完成后必须执行四查:
- 查重复章节头:底稿 body 区块替换不完整时,旧区块与新区块同时保留、双渲染且 id 冲突。检查:源码中每个
# §N注释头恰好 1 次;HTML 中每个id="sN"恰好 1 次(含s5-1/s3-8b等子锚点)。 - 查残留关键词:底稿是天齐锂业 → grep 个股名("天齐")、代码("002466")、行业词("锂"/"碳酸锂"/"锂精矿"/"SQM")、专属数字。区分两类:跨报告对比句是刻意内容、保留;天齐专属数据叙述必须改写。
- 查颜色联动:
D["dim"]色值(radar8 用)与 §2 八维维度卡手写块<b style="color:...">必须同语义同步。维度卡配色(1.2.6):强项→红#ff9a9a;弱项→绿#7ee2a8;⑧量能真实性(否决项)→黄#e8c66a。禁止全绿。 - 查侧栏与注释:区块注释/侧栏仍写底稿行业词 → 手术未净。
样式对齐复验(六要素)
- style 块逐字节一致(约定 = 块内文
== "\n" + CSS 文件全文,不要 strip); - SVG viewBox 集合一致(
check_density_parity机械校验); - 组件计数对齐:
note expl/sig/chk/<table/<h2/<h3/hl/card数量一致或差异可解释; - 配色 token 分布:
#ff9a9a/#7ee2a8/#e8c66a/#d4af37(SVG 金)计数同量级——红绿比例随个股语义不同属正常,但禁止"全绿/全红"单色失衡; - 静态五项:零
<script>、SVG 全带 xmlns、table 全带 tbody、class='r'(单引号)=0、标签平衡; - 结构密度对齐:见门禁 ③(形状 + 内容厚度 + 逐节 + 签名)。
- ⚠️ 对比必须先剥平台注入:两侧都剥掉
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 须含「兑现状态」。
工作流程
- 取数(先读映射):打开
references/data-sources-map.md,按"字段→接口"逐条拉取;记下哪些真实取到、哪些是缺口。出海个股(境外收入>10%)额外取汇率专项三数据。产出data_XX.json(键结构照data_dict_template.json)与meta.report_date(本快照日期)。 - 选路起稿:按「起稿选型」决定走路径 A(库内择优 + 文本级补丁)还是路径 B(canonical 底稿逐块 rep)。禁止路径 C。
- 构建前预检:
python3 scripts/preflight_source_check.py <build_xx.py> --name <本股>,exit 0才继续。生成器层自动豁免净化规则行。 - 三层解释块:正文所有解释性内容用
.note expl三层结构(结论行.v→ 要点 → 依据),覆盖率目标 ≥90%。 - 语义配色纪律:
.cr=红利好 /.cg=绿利空 /.cy=黄不确定(禁反色);标题·表头走冷色阶梯;只标重点词语(≤2 组);图标字形与文字同色;实数格禁class='r'。 - 写注脚 + 诚实标注:每张图/表下方写"解释图表"的注脚;数据缺口只标注不填充。
- 七道门禁:按「门禁链」①→⑦ 连续跑,全过方可交付;③ FAIL 时用
diff_section_signature.py --strict钻取到具体 class。- ⚠️ 成品跑 preflight 必须
--layer final。 - ⚠️ 任何一关 FAIL 必须回内容源补写/修正,严禁带 FAIL 上传资料库。
- ⚠️ 成品跑 preflight 必须
- 格式化后处理:
f.write前调用post_format_all(html);改 D 后必须重跑脚本重生成 HTML。 - 合规检查:按"合规声明"检查措辞与免责,无指令式买卖表述。
- present_files 刷新预览;多轮微调后大段删改必须重跑第 7 步全量门禁。
- 存资料库:先查重,命中就覆盖(铁律):
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,标题日期 ≠ 上传时间)。 内容一致时重传不会 bumpversion(海兴 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移到归档区(可逆),或给清单让用户手动删。 - ⚠️ 落库前必须查该标的是否已有他会话产物:若他版更饱满且非本文件血统(调研数据源不同),按"不同源"处理,覆盖 = 降级 → 先请示用户。
- 退出码 0(未命中) → 新建节点,必须同时传
发布包打包纪律(违一即「部分文件被跳过」)
事故:上传 stockdivsreport-1.0.10.zip 时平台提示「部分文件被跳过」。根因:包里带了 _icon.png —— 这是平台下发给本地的图标(见 _skillhub_meta.json 的 iconSource/iconLocalPath),图标由平台托管,不走上传包。证据:平台官方包从不含 _icon.png;本地已装的全部市场 skill,.png 文件数全为 0。
纪律:
- 发布包里绝不放
_icon.png—— 平台会跳过,且提示会让用户以为包坏了。 - 一并排除:
.DS_Store、__pycache__/、*.pyc、AppleDouble._*、.git/、node_modules/、*.bak。 - 根目录平铺:
SKILL.md/_meta.json/_skillhub_meta.json/references//scripts/直接在 zip 根,不套一层目录。 - 必须用
scripts/pack_release.py,不要用 macOSzip—— 后者给中文文件名写 GBK、解压端乱码;本脚本用 Pythonzipfile,自动带 UTF-8 标志位。 - 中文文件名本身不影响上传,无需改成英文名。
_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)生成的页面,都要达到它的厚度与口径。
对齐判定(不靠肉眼,靠门禁):
- 起稿走路径 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(库内择优 + 纯文本级补丁)仅在论据类型与天齐不重合时用。 - 八项 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 序列一致。
- 数据维度最低集(缺任一即不达标):六维度(
data_chip筹码 /data_score诊股 /data_report研报 /data_rating评级 /data_risk风险逐项 /data_quote全字段)、V4 量化层(EPS 硬锚=H1×2÷总股本)、V5 定价范式、八维 0–8 打分 + 三支柱 + 四共振、五档股价预算(只变 PE、同隐含 EPS、三方同值)。 - 样式铁律:配色
.cr #ff9a9a/.cg #7ee2a8/.cy #e8c66a;td.r红 /td.b绿 /td.a黄;「折价」一律归绿.cg/td.b;零 emoji;.chk外层 span 恒class="b"。 - 不得复刻的旧冗余:§2「八维评分锚定」整块(s2_boost)已从大华样本删除——未来生成器禁止再加回,保持与天齐标杆一致(§1 强/弱项 + §2.1 kpi 卡即可)。
- 落库前
verify_data_truth覆盖率 ≥85%,新补维度必须回写data_XX.json(孤儿数字会拉低覆盖率)。
Scan to join WeChat group