# 企业历史沿革 History Evolution Qcc

> 企业历史沿革与发展历程分析 Skill — 企查查MCP驱动的KYB立体叙事报告生成器。 基于企查查 MCP 146 个工具自动生成 11 章 + 附录的 KYB 历史沿革报告。 V1.2 核心特性（schema-driven · 防编造）： - **USCC 校验位**：GB 32100-2015 校验位算法，编造的统一社会信用代码会被拦截 - **count ≡ rows**：股东/历史股东/董监高/对外投资等列表，声明数量必须等于实际行数 - **evidence 锚点**：每个字段都有 `(tool_name, json_path, snapshot_ts, raw_value)` 四元组溯源 - **跨章节一致性**：处罚状态禁止"已处置/已闭环"等需 MCP 显式返回的状态词； 专利年度分布加和必等于总数；时间合理性自检 - **manifest.json**：每份报告产出字段级溯源链，可用于审计回溯 核心功能： - 11 章结构：§1 公司概况 / §2 发展里程碑 / §3 注册资本 / §4 名称变更 / §5 股权演变 / §6 经营轨迹 / §7 地址变迁 / §8 总结 / §9 发展综览 / §10 附录 / §11 审计留档 - 立体叙事：许可资质矩阵、知识产权布局、业务扩张与员工规模、行业地位与荣誉 - 档位自适应：小微（¥4.5）/ 融资（¥13）/ 上市（¥18）三档自动识别并差异化调用 - 视觉风格：圆点+竖线时间轴 + kyb-opus 风格蓝色章节条 + 斑马纹表格，直接出 PDF 适用场景：投前尽调（PE/VC）、IC Memo 附件生成、银行授信 KYB、供应商主体背调、 管理层背景与发展历程核查。 使用方式：/history-evolution-qcc 企业名称 [统一社会信用代码] 客户体验：一句话指令 → 60 秒自动生成 MD + PDF + manifest.json，零干预、零编造。

- Skill: `duhu2000/history-evolution-qcc` (Agent Skill, multi-file: 51 files)
- Install (CLI): `npx skillmds@latest add duhu2000/history-evolution-qcc`
- Raw SKILL.md: https://api.skillmd.com/api/skills/duhu2000/history-evolution-qcc/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- License: Apache-2.0
- Author: duhu2000 (https://skillmd.com/u/duhu2000)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/duhu2000/history-evolution-qcc

---


# 企业历史沿革与发展历程分析 SKILL（V1.2 · schema-driven）

> ## 加载方式（W1-9 整改 · 2026-05-04）
>
> 本 SKILL 支持两种加载方式：
>
> - **方式 A · 推荐 · 单 SKILL.md 直链**
>   通过 `https://agent.qcc.com/skill/v1/financial-services-qcc/history-evolution-qcc/SKILL.md` 加载本文件后，AI 工具按本文档内的业务规则、MCP 工具清单与档位策略**直接执行**即可，**无需访问任何 `scripts/` 或 `references/` 文件**——本 SKILL.md 自包含全部业务规则与工具调用约束。
>
> - **方式 B · 高级 · GitHub 完整仓库**
>   通过 `git clone https://github.com/duhu2000/financial-services-qcc` 拉取完整仓库后，可使用 `scripts/mcp_orchestrator.py` / `scripts/cost_counter.py` / `references/05_工具调用清单.md` 等配套 Python 实现做自动化编排（适用于自建产线、批量跑数、想 fork 升级业务规则的高级开发者）。
>
> **下文中所有 `scripts/...` 与 `references/...` 路径仅适用于方式 B**。AI 工具用方式 A 加载时按 SKILL.md 描述自行 MCP 调用即可，对应工具列表与成本规则见正文。

> 🚨 **AI 加载本 SKILL 后必须遵守的 5 条防编造硬约束（V1.2 红线）** 🚨
>
> 历史教训：本 SKILL V1.1.3 版本的示例报告曾出现 13 项数据错误（统一社会信用代码编造、
> 股东漏列、专利数错位、行政处罚状态编造等）。V1.2 通过以下 5 条**绝对硬约束**根除这类问题。
> AI 在生成报告的每一步、每一个字段，都必须自检以下规则：
>
> 1. **统一社会信用代码（USCC）禁止任何形式的编造或猜测**
>    - USCC 必须直接来自 MCP 工具 `qcc-company.get_company_registration_info` 的返回字段
>    - 如果 MCP 没返回，就标注「未披露」
>    - **不允许**根据企业名称、注册地推测 USCC
>    - 18 位 USCC 的最后一位是 GB 32100-2015 校验位，编造的 USCC 大概率过不了校验
>
> 2. **任何"列表"型字段必须全量展示，禁止省略中间项**
>    - 当前股东、历史股东、历任董监高、对外投资 等
>    - 如果 MCP 摘要里说"共 X 条"，渲染的表格行数就必须等于 X
>    - **不允许**为"美观"或"重要性"截断中间项
>    - 如果数据量真的太大，写"完整列表见附录"而非省略
>
> 3. **行政处罚 / 司法记录的「处置状态」字段，仅当 MCP 显式返回时才能写**
>    - 严禁写"已处置 / 已闭环 / 当期整改 / 整改完毕"等结论性状态
>    - MCP 没返回的字段（如违法行为类型详情），写"违规细节未公开"
>    - 处罚日期、处罚机关、决定书文号必须**直引** MCP 返回的原文
>
> 4. **统计字段（年度分布、级别分布、数量统计）必须从原始数据 group-by 算出**
>    - 专利年度分布、荣誉级别分布、资质类别统计
>    - **不允许**凭印象写数字
>    - 加和必须严格等于总数（如 94 项专利的年度分布加和必须 = 94）
>
> 5. **MCP 没返回的字段，绝不"补全"或"合理化"**
>    - LLM 倾向于让故事完整 — 这是 V1.1.3 编造"递交主板申报稿""2010 年最早专利"
>      的根本原因
>    - 严守纪律：MCP 给什么就写什么；没给的就明确标注「未披露」/「数据缺失」
>    - 严禁基于行业常识、企业规模、发展轨迹"推测"或"补全"
>
> **如果你（AI）在生成内容时无法遵守上述 5 条，请明确拒绝并告知用户："本字段缺数据，
> 不能在不违反防编造规则的前提下生成"。**

## 定位（V1.0 硬约束）

- **数据源唯一**：企查查 MCP 共 138 个工具（`qcc-company` 14 + `qcc-risk` 34 + `qcc-ipr` 6 + `qcc-operation` 14+1 + `qcc-history` 34 + `qcc-executive` 35）
- **输出原则**：MCP 能拿到 → 写进章节；拿不到 → 章节不出现，**不留空占位、不要求客户补材料**
- **客户负担**：零。客户只需连接企查查 MCP，提供目标企业名称/统一社会信用代码即可
- **升级路径**：客户如需补充非公示数据（代持、承诺函、关联交易明细等），请参考 `references/06_V2.0客户自升级指引.md` 自行扩展至 V2.0，本 SKILL 作者不提供 V2.0 模板或支持

## 执行工作流（调用 SKILL 后 Claude 应遵循的步骤）

### 步骤 1 · 收集输入

从用户消息中识别：
- 目标企业名称 或 统一社会信用代码（必需）
- 报告用途（可选：信贷尽调 / IPO 辅导 / 投前尽调 / 合规 KYB）——仅用于语气调节，不影响字段清单

### 步骤 2 · 档位识别（先调用 3 个 5c 工具，共 15c）

按 `references/04_档位识别规则.md` 的决策树：
1. `mcp__qcc-company__get_company_profile`（5c）——获取基本信息
2. `mcp__qcc-company__get_listing_info`（5c）——判断上市状态
3. `mcp__qcc-operation__get_financing_records`（5c）——判断融资阶段

按以下规则判定档位：
- **上市档**：已上市 或 发债（A 股/港股/美股 或 有债券发行记录）
- **融资档**：未上市但有融资记录（天使—Pre-IPO 任一轮次）
- **小微档**：无上市、无融资记录、注册资本 ≤ 1000 万 或 人员规模 ≤ 50 人

### 步骤 3 · 按档位批量调用 MCP 工具

按 `references/05_工具调用清单.md` 中对应档位的工具清单，使用 `scripts/mcp_orchestrator.py` 的 `call_tools_by_tier()` 方法批量调用。

**成本控制**（由 `scripts/cost_counter.py` 自动强制）：
- 小微档：预算 15–30c
- 融资档：预算 50–80c
- 上市档：封顶 100c/企业（折合人民币 10 元）
- 累计达 95c：仅允许 ≤5c 工具
- 累计达 100c：停止一切调用，剩余字段标注「本次未采集（成本封顶）」

### 步骤 4 · 按 7 章模板组装报告

按 `references/02_报告模板.md` 的 7 章结构渲染内容：
- §1 公司概况（全档位）
- §2 注册资本（全档位）
- §3 名称变更（全档位）
- §4 股权演变：4.1 注资 / 4.2 设立 / 4.3 大股东更替（全档位）
- §5 经营轨迹：5.1 经营范围 / 5.2 分支与许可 / 5.3 风险记录（全档位）
- §6 地址变迁（全档位）
- §7 总结（全档位）

**条件扩展子节**（档位达标时自动启用；不达标时整节不输出，**不要**留空占位）：
| 子节 | 启用条件 |
|---|---|
| §4.4 实控人认定 | `get_actual_controller` 返回非空 |
| §4.6 申报前 12 月新增股东 | 档位 = 上市档 或 Pre-IPO |
| §5.4 董监高与治理 | 档位 ≥ 融资档 |
| §5.5 关联方网络（公开可查） | 档位 ≥ 融资档 且 `get_executive_controlled_companies` 返回非空 |
| §5.6 处罚与担保 | `get_administrative_penalty` / `get_guarantee_info` / `get_equity_pledge_info` 任一返回非空 |
| §7 财务摘要 | 档位 = 上市档（A 股 + 发债） 且 `get_financial_data` 返回非空 |

### 步骤 5 · 生成报告（双模式）

V1.2 提供两种渲染模式 —— AI 应根据所处运行环境自动选择：

#### 模式 A · Prompt 严约束直接生成 MD（默认，所有 AI 应用通用）

适用：百炼 / Coze / OpenClaw / 任何不能直接跑 Python 的云端 AI 应用

AI 严格遵守上方"5 条防编造硬约束"，按以下模板生成 Markdown 报告：

````markdown
# 企业历史沿革与发展历程报告

## {企业名称}

**目标企业：** {MCP 直接返回}
**统一社会信用代码：** {MCP 直接返回 — 严禁编造}
**报告版本：** v1.2
**报告生成：** {当前日期}

---

## 执行摘要（Decision Pack）

> **一句话结论：** {基于 MCP 真实数据组织的总结，含「N 次注册资本变更、N 次更名、
> N 次办公地迁移、N 位股东退出、当前 N 位股东」等具体数字 — 数字必须与下方各章节
> 一致，不允许"约""大约""若干"等模糊词}

---

## 一、公司概况

> 业务化呈现：单一表格 + 业务化表头「项目 / 内容」，**禁止使用「字段 / 值」等
> 技术化表头**。字段顺序按「主体识别 → 注册信息 → 经营状态」逻辑排列。

| 项目 | 内容 |
| --- | --- |
| 企业名称 | {get_company_registration_info → 企业名称} |
| 统一社会信用代码 | {同上 → 统一社会信用代码} |
| 法定代表人 | {同上 → 法定代表人} |
| 企业类型 | {同上 → 企业类型} |
| 所属行业 | {同上 → 国标行业} |
| 成立日期 | {同上 → 成立日期} |
| 注册资本 | {同上 → 注册资本} |
| 实缴资本 | {同上 → 实缴资本} |
| 注册地址 | {同上 → 注册地址} |
| 所属地区 | {同上 → 所属地区} |
| 登记状态 | {同上 → 登记状态} |
| 登记机关 | {同上 → 登记机关} |
| 最近核准日期 | {同上 → 核准日期} |
| 参保人数 | {同上 → 参保人数} 人 |

---

## 二、发展里程碑

按时间排序的关键节点（**仅来自工商登记 + 国家级首次荣誉**，不允许编造未来事件
如"递交主板申报稿"等）：

| 日期 | 里程碑 | 说明 |
| --- | --- | --- |
| {成立日期} | 企业成立 | {设立时名称} |
| {历史名称变更日期} | 名称变更 | {旧名} → {新名} |
| {国家级荣誉首次获得日期} | 获国家级『xxx』认定 | {发布单位} |

---

## 三、注册资本变更轨迹

共 **N 个注册资本节点**（**N 必须等于 历史注册资本列表长度 + 1**）：

| 变更日期 | 注册资本 | 有效期 |
| --- | --- | --- |
| {历史第一项的终止日期} 至今 | {当前注册资本} | 当前 |
| ... | ... | ... |

---

## 四、名称变更时间线

共 **N 个名称节点**（**N = 历史名称列表长度 + 1**）

---

## 五、股权演变

### 5.1 当前股东与出资结构

共 **N 位股东**（**N 必须等于 get_shareholder_info 摘要里的"共 X 条"**），按持股比例
降序，**全量展示，禁止省略**：

| 股东名称 | 持股比例 | 持股数 |
| --- | --- | --- |
| ... | ... | ... |

### 5.3 股东进出历史

共 **N 位股东已退出**（**N = 摘要里的"共 X 条"**），按退出日期倒序，**全量展示**：

| 退出日期 | 股东名称 | 退出比例 | 认缴 | 类型 |
| --- | --- | --- | --- | --- |
| ... | ... | ... | ... | ... |

### 5.4 实际控制人

| 姓名 | 直接持股 | 总持股 | 表决权 |
| --- | --- | --- | --- |
| ... | ... | ... | ... |

---

## 六、经营轨迹

### 6.1 对外投资

共 **N 家**被投资企业（**N = get_external_investments 摘要里的"共 X 条"**），全量：

| 被投资企业 | 持股比例 | 成立日期 | 状态 |
| --- | --- | --- | --- |
| ... | ... | ... | ... |

### 6.2 现任董监高

共 **N 人**（**N = 摘要里的"共 X 条"**）

### 6.2.b 历任董监高

共 **N 位已卸任**（**N = get_historical_executives 摘要里的"共 X 条"**），全量

> 注：招投标 / 客户群 / 中标记录 等属于「经营动态」而非「历史沿革」范畴，
> 本 SKILL 不纳入。如需此类信息，请使用单独的 SKILL（如 经营轨迹分析、商业能力
> 评估、客户关系穿透 等），保持本 SKILL 的焦点为「主体演变脉络」。

---

## 七、地址变迁

共 **N 个地址节点**

---

## 八、总结

| 维度 | 评价 |
| --- | --- |
| 股权清洁度 | ... |
| 经营合规 | {如果有处罚：处罚日期 + 处罚机关 + 决定书文号 + 罚款金额，
| | **严禁写"已处置/已闭环"，写"违规细节及处置状态以原始公告为准"}** |
| 成长轨迹 | ... |

---

## 九、发展综览

### 9.1 许可与资质

共 **N 项资质**（**N = get_qualifications 摘要里的"共 X 条"**），有效 **M 项**
（**M = 资质表里 证书状态 = "有效" 的条数**）

### 9.2 知识产权 - 专利

共 **N 项专利**（**N = get_patent_info 摘要里的"共 X 条"**）

**类型分布：** 发明授权 X 项、外观设计 Y 项（**X + Y 必须等于 N**）

**申请年度分布：** {从 get_patent_info → 专利信息 list 里按 申请日期[:4] group-by 算出
— **加和必须严格等于 N**}

### 9.4 行业地位与荣誉

共 **N 项荣誉**（**N = get_honor_info 摘要里的"共 X 条"**）

---

## 十、附录 · 工商变更大事年表

MCP 工商变更总数：**N 条**（**N = get_change_records 摘要里的"共 X 条"**）

### 行政处罚（共 N 条）

| 处罚日期 | 处罚单位 | 决定书文号 | 处罚结果 |
| --- | --- | --- | --- |
| {直引 MCP} | {直引 MCP} | {直引 MCP} | {直引 MCP} |

> 注：本字段直引 MCP `qcc-risk.get_administrative_penalty` 原始返回，
> 严禁补全"已处置/已闭环/违法行为类型"等 MCP 未返回字段。

---

## 十一、审计留档

| 项目 | 数据 |
| --- | --- |
| 报告编号 | SKILL-HE-QCC-{YYYYMMDD}-001 |
| 数据源 | 企查查 MCP |
| 防编造规则 | V1.2 5 条硬约束 |

*本报告仅供尽调研究参考，不构成投资建议。*
````

#### 模式 B · Python 校验保险（如果环境支持）

适用：Cursor / Claude Code / 任何能跑本地 Python 的 AI 应用。

在生成 MD 后，AI 自动尝试调用 V1.2 schema 校验 + ReportLab PDF 渲染：

```bash
# 第 1 步：把 12 个 MCP 返回组装为 JSON
# AI 把已收集的 MCP 数据写入 data/mcp_responses.json

# 第 2 步：跑 V1.2 校验 + 出高质量 PDF
cd skills/history-evolution-qcc
python -m scripts.v1_2.render_pdf \
    --uscc <USCC> \
    --mcp-responses-json data/mcp_responses.json \
    --report-id SKILL-HE-QCC-<YYYYMMDD>-001 \
    --out output/<企业名>_历史沿革.pdf
```

**这一步会自动 enforce 5 条防编造规则**：
- USCC 校验位算法（GB 32100-2015）
- pydantic schema：count ≡ rows
- 跨章节一致性：处罚状态词拦截、专利年度加和检查
- 圆点时间轴 PNG 渲染（kyb-opus 风格）
- 字段级 evidence 锚点 → 产出 manifest.json 溯源链

如果任一规则触发，**Python 会直接 raise**，这时 AI 应该回看自己生成的 MD，找出问题并重新生成。

#### AI 决策树：选择哪种模式？

```
1. 当前 AI 应用能不能跑 Python（执行 bash 命令）？
   ├── 不能（如 百炼 / Coze 云端） → 用模式 A，仅出 MD
   │   告知用户："已生成 MD 报告，遵循 V1.2 防编造规则。
   │              如需高保真 PDF（圆点时间轴），请联系企查查云端服务。"
   │
   └── 能（如 Cursor / Claude Code / 本地 Cowork）
       └── 先用模式 A 生成 MD，再用模式 B 跑 V1.2 校验
           ├── 校验通过 → 出 PDF + MD + manifest，三件套交付
           └── 校验失败 → 回看 MD，找出冲突字段，修正后重新生成
```

> **关键原则：无论模式 A 还是 B，5 条防编造规则都必须遵守。**
> 模式 A 靠 AI 自律（prompt enforce），模式 B 多一道代码 enforce 保险。

## 关键原则

1. **有数据就写，没数据就不写**——不要生成 "本次未采集" 类提示填满章节
2. **整体评价三档**：`clean_baseline` / `recovered` / `evasive_high_risk`（见 `references/02_报告模板.md`）
3. **穿透规则**：遇到合伙企业 / 持股平台 / SPV 等关键词，自动追加 `get_shareholder_info` 二级穿透，最多 3 层
4. **行级溯源**：每个写入章节的字段需附 `[来源: qcc-xxx/tool_name · snapshot=YYYY-MM-DD]` 标签（build_docx 自动处理）
5. **不得虚构**：如工具返回空，章节条目留空或不生成，不得补写"推测"、"可能"

## 文件结构（V1.2）

```
history-evolution-qcc/
├── SKILL.md                            # 本文件：入口与工作流
├── README.md                           # GitHub 落地页
├── CHANGELOG.md                        # 版本记录
├── mcp_config_example.json             # MCP 连接示例
├── references/
│   ├── 01_方案文档.md
│   ├── 02_报告模板.md
│   ├── 03_MCP字段映射表.md
│   ├── 04_档位识别规则.md
│   ├── 05_工具调用清单.md
│   ├── 06_V2.0客户自升级指引.md
│   └── 07_升级建议稿.md
├── scripts/
│   ├── tier_detector.py                # 档位识别
│   ├── cost_counter.py                 # 100c 封顶保护
│   ├── mcp_orchestrator.py             # MCP 批量调用
│   ├── build_timeline.py               # 圆点+竖线时间轴 PNG（DPI 240）
│   ├── build_docx.py                   # V1.1.3 legacy DOCX/PDF（保留）
│   ├── requirements.txt                # pydantic ≥ 2.0 / reportlab ≥ 4.0 ...
│   └── v1_2/                           # ★ V1.2 schema-driven 框架（默认入口）
│       ├── uscc_validator.py           # GB 32100-2015 USCC 校验位算法
│       ├── evidence.py                 # MCP 调用 evidence 锚点 + manifest
│       ├── data_contract.py            # pydantic schema（count ≡ rows 强约束）
│       ├── data_extractor.py           # MCP 返回 → ReportSchema 转换
│       ├── consistency_check.py        # 跨章节一致性 + 状态词编造拦截
│       ├── render_md.py                # Schema → MD 渲染
│       ├── render_pdf.py               # Schema → PDF 渲染（圆点时间轴）
│       ├── build_report_v1_2.py        # 主入口（同时出 MD + manifest）
│       ├── test_v1_2.py                # 红绿对照测试（7 项 V1.1.3 事故回归）
│       ├── README.md                   # V1.2 框架文档
│       └── sample_data/
│           └── mcp_responses_qcc.json  # 企查查科技完整 12 工具数据快照
└── assets/
    ├── 示例_上市档_企查查科技_V1.2.md
    ├── 示例_上市档_企查查科技_V1.2.pdf
    └── 示例_上市档_企查查科技_V1.2.manifest.json   # 字段级 evidence 溯源
```

## 客户快速开始（一键化体验）

### 安装（一次性）

```bash
# 1. 拉取 SKILL
git clone https://github.com/<org>/financial-services-qcc.git
cd financial-services-qcc/skills/history-evolution-qcc

# 2. 创建虚拟环境（推荐）
python3 -m venv .venv
source .venv/bin/activate              # Windows: .venv\Scripts\activate

# 3. 装依赖
pip install -r scripts/requirements.txt

# 4. 跑一次 V1.2 自检（应该 7 项测试全过）
python -m scripts.v1_2.test_v1_2
```

### 使用（每次报告）

#### 方式 A · 在 Claude Code / Cowork 中（推荐，零编码）

```
客户 → Claude：帮我生成企查查科技股份有限公司的企业历史沿革报告
```

Claude 会自动：
1. 读 SKILL.md 知道怎么做
2. 调用 12 个企查查 MCP 工具拉真实数据
3. 通过 V1.2 框架生成 PDF + MD + manifest（schema 校验 + 一致性自检）
4. 回复客户产出文件路径

**约 60-90 秒完成**，零干预。

#### 方式 B · 命令行（高级用户）

```bash
# 自己抓 MCP 数据存为 JSON（或先用 sample_data 跑通流程）
python -m scripts.v1_2.render_pdf \
    --uscc 91320594088140947F \
    --mcp-responses-json scripts/v1_2/sample_data/mcp_responses_qcc.json \
    --out output/qcc_history.pdf
```

### 成本

| 档位 | 成本 | 触发条件 |
|---|---|---|
| 小微档 | ¥1.5–3 | 无上市、无融资、注册资本 ≤ 1000 万 或 ≤ 50 人 |
| 融资档 | ¥5–8 | 未上市但有融资记录（天使—Pre-IPO 任一轮）|
| 上市档 | 封顶 ¥10 | 已上市 或 发债 |

## 客户报告与原厂示例的等价保证

> **客户在自己的 Claude 环境跑 SKILL 拿到的报告，与官网示例报告（`mcp_web/apps/web/public/examples/history-evolution-opus.{md,pdf}`）质量等同。**

原因：
1. **同一份代码** — 客户从 GitHub 下载的就是我们打磨过的 V1.2 schema-driven 框架
2. **同一套防御机制** — USCC 校验位 / count ≡ rows / evidence 锚点全部被代码 enforce
3. **同一种渲染** — 圆点时间轴 + 蓝色章节条 + 斑马表，由 ReportLab 自动生成
4. **同一份样本** — `scripts/v1_2/sample_data/mcp_responses_qcc.json` 是企查查科技真实数据快照，可直接复现示例

**客户不需要做的事**（这是我们 V1.0 → V1.2 演进过程中踩过的坑，已经在代码层闭合）：
- ❌ 不需要写"schema-driven + USCC 校验位 + count ≡ rows + evidence 锚点"代码框架（V1.2 已写好）
- ❌ 不需要逐字段对照 MCP 真实返回核验数据（schema 校验自动做）
- ❌ 不需要担心 LLM"自信地编造"上市信息 / 行政处罚状态（一致性检查自动拦截）
- ❌ 不需要写时间轴 PNG 渲染代码（build_timeline.py 已就绪）
- ❌ 不需要本地搭 LaTeX/xelatex 环境（V1.2 用 ReportLab 直接出 PDF）

## 版本策略

- **V1.2（本版本）**：schema-driven、防编造硬约束、配套圆点时间轴 PDF 渲染器
- **V1.1.3（legacy）**：保留 `scripts/build_docx.py` + `build_timeline.py` 作为兼容层
- **V2.0（客户自升级）**：客户在私域追加尽调底稿 / 承诺函 / 关联交易明细等，参见 `references/06_V2.0客户自升级指引.md`

