# 人类投降派全片逐帧扫描数据库升级方案

本文为研究档案公开版，保留来源版本的论述与限制。公开时间：2026-09-08；不表示已完成同行评审。 本文属于公开研究资料（历史笔记、研究稿或来源记录）：已完成格式、来源限制与重复项筛查，尚未完成逐篇独立事实复核；原文中的解释、候选判断和未确认内容均按其原有限制阅读。

来源版本日期：2026-07-05

证据边界：本文是基于既有 T0 字幕/台词脊柱、T1 LocalForensics 本地证据、T2 MiMo 候选层与 T3 synthesis/wiki/site 层的数据库升级方案；不改写 raw，不新增片内事实裁决，不把搜索索引、观众短文或自动提取字段替代人工证据边界。

# 人类投降派全片逐帧扫描数据库升级方案

## 结论

刚完成的工作不只是“把电影逐帧扫完”。它实际上已经形成了一个四层证据系统：

1. `T0` 台词脊柱：句号、时间码、角色、文本、分段卷页。
2. `T1` 本地取证层：LocalForensics 页、精确音频窗、帧图、联系表、颜色/亮度/音量指标、不可升级边界。
3. `T2` 候选理解层：MiMo 报告、候选声画观察、待人工复核的线索。
4. `T3` 解释与公开层：综合文章、概念页、人物库、观众网站短文和搜索页面。

现在的问题不是材料不足，而是材料太多、关系太散。大量关键信息分布在 Markdown frontmatter、正文表格、正文段落、文件名、资产目录名、JSON 指标文件和站点导出的 `search-index.json` 里。人能顺着经验找到，但机器无法稳定回答这些问题：

- 某一句台词有哪些 T1 证据页支持？
- 哪些音频窗证明它不是纯静默？
- 哪几帧构成这一分钟的视觉锚点？
- 哪些判断被明确降级为“不能证明”？
- 某个概念到底由哪些台词、帧、音频窗和文章共同支撑？
- 观众网站该展示哪些内容，研究者后台又该保留哪些内容？

所以升级的核心不是再多写一批长文，而是把已经完成的取证工作变成一个可重建、可查询、可导出、可接前端的数据库。

## 现有成果盘点

### 台词与逐句卷页

当前主入口是 人类投降派逐句对白声画解读总入口-2026-06-20（馆内参考，未随本文公开）。它记录的关键事实是：`#1030-#2037` 已完成标准细读闭合，T0 台词线最终到 #2037，#2037 为片尾前低位尾句。

逐句正文已经按卷页拆分为 41 个 Markdown 文件，主阅读路径不应再把正文塞回总入口。总入口负责目录、进度、证据规则和恢复说明；数据库应从这些卷页中提取每句的稳定命名、声画判断、证据页链接和不可升级边界。

当前导出站点的 `search-index.json` 已有一个可用但偏扁平的台词层：

| 类型 | 数量 |
| --- | ---: |
| dialogue | 1995 |
| concepts | 470 |
| synthesis | 1274 |
| entities | 22 |
| parts | 6 |
| timecodeCards | 5 |

这个索引适合前端搜索，但不适合作为总数据库。它缺少 LocalForensics frontmatter、原始资产指标、证据包、帧级对象、音频窗对象和“不能证明”的结构化字段。

### LocalForensics 层

`wiki/sources/LocalForensics/` 当前约有 1439 个来源页，其中 `source_kind: local-forensics-line-review` 约 498 页，带 `hs4g/dialogue/line-` 标签的页面约 436 页。除此之外，还有分钟联系表、clip review、audio-visual review、exact-line review、4K micro review、p3/p6 window 等多种证据页。

这说明 LocalForensics 已经不是单一“来源摘要”。它已经承担了三种职责：

- 行级复核：锁定某句台词的 exact 音频、前后 gap、boundary、参照句和帧证据。
- 窗口复核：围绕一段时间建立联系表、画面连续性和动作/遮挡边界。
- 工程账本：记录批次、raw asset dir、指标文件、证据边界和回填状态。

数据库必须尊重这种多形态来源，而不是只抽 `title/timecode/text`。

### 原始资产包

4K no-sub restart 的核心资产包位于：

```text
〔本地资料路径省略〕
```

该目录现有约 480 个一级资产包目录，三层内文件约 21094 个；主要类型为：

| 扩展名 | 数量 |
| --- | ---: |
| jpg | 7719 |
| wav | 6779 |
| json | 6589 |

#2037 对应资产包 `2037-dont-care-final-line-to-postcredit-tail-chain/` 是一个成熟样板：同一证据包中同时有 exact 句窗、前后 gap、boundary、postcredit tail、帧图、contact sheet、音频概要 JSON、频谱/空间 JSON、颜色指标 JSON、100ms/20ms bin 指标等。

第一版数据库应该优先学习这种样板，而不是一次性理解所有历史资产目录命名。

### MiMo 候选层

`wiki/sources/MiMo/` 当前约 1970 个 Markdown 页，其中 `mimo-report` 约 1242 个，另有 run ledger、prompt、summary、video report card、synthesis card 等。

MiMo 层的价值在于候选发现和大范围扫视；风险在于它不能覆盖本地 T1。数据库设计上应把 MiMo 当作 `candidate_observations`，并显式记录它是否被 LocalForensics 确认、降级、拆分或废弃。

## 主要缺口

### 缺口一：台词编号体系没有完全并轨

前端 `search-index.json` 的 dialogue id 是 1 到 1995；逐句工程使用 #1 到 #2037；人物工程又有 `J001`、`A501`、`Z193`、`R101` 等角色内编号。这三个编号体系都合理，但现在缺少稳定映射表。

数据库需要把它们拆成不同字段：

- `canonical_line_no`：逐句工程编号，如 `2037`。
- `site_dialogue_id`：当前站点搜索 id，如 `1995`。
- `character_line_code`：角色内编号，如 `J425`、`A737`、`Z489`。
- `source_sequence_id`：来自 SRT 或其他转写源的原始序号。

没有这张映射表，未来任何“点击文章时间点让时间线亮起”的交互都会出现错位风险。

### 缺口二：证据边界还没有结构化

LocalForensics 页最珍贵的不是“证明了什么”，而是“明确不能证明什么”。例如 #2037 页明确限定：低位尾句接片尾尾部，不证明心理闭合、强宣言、角色主权恢复、音乐桥、设备声或系统 UI。

这些否定边界如果只留在正文里，前端、搜索和 AI 问答很容易把谨慎判断重新说过头。数据库应该把它们抽成一等对象：

- `supported_claims`：可以稳定说的判断。
- `unsupported_claims`：明确不能说的判断。
- `downgrade_reasons`：为什么不能升级。
- `risk_tags`：`consent`、`心理事实`、`医学事实`、`真实动作完成`、`设备声`、`配乐`、`现实身份` 等。

这是防止网站、文章和问答“穿帮”的底层机制。

### 缺口三：音频、画面和文章之间没有中间层

现在文章可以写到“#2037 exact RMS = -36.408dBFS”，但数据库不知道这个数来自哪个 JSON、哪个 wav、哪一个窗口、对应哪张帧图。前端也无法稳定做“点开台词 -> 看到对应声画证据 -> 再打开高清帧/音频窗”。

中间层应包括：

- `asset_packages`：一个证据包目录。
- `asset_files`：包内所有 wav/jpg/json/png/log。
- `audio_windows`：exact、gap、boundary、post、ref 等音频窗。
- `audio_bins`：100ms、20ms、10ms 曲线。
- `frames`：start/mid/tail/ref/contact sheet 中的单帧。
- `frame_metrics`：亮度、颜色、色相、dominant color 等。
- `contact_sheets`：联系图和它覆盖的时间/句号范围。

### 缺口四：公开网站和研究库还没有清晰的数据出口

观众网站不应该原样展示研究库技术话语，也不应该把“入口/资料库/导览/教你看”等后台姿态带到页面上。数据库需要同时服务两种出口：

- 研究者出口：完整字段、证据边界、raw 资产、关系图谱、复核状态。
- 观众出口：精选短文、关键时间、台词、角色、画面锚点、少量概念解释。

这两个出口共用底层事实，但使用不同视图。不要让公开页面直接扫完整 synthesis 列表。

## 建议数据库形态

第一版建议使用 SQLite + FTS5。理由是：

- 单文件，适合本地 App、网站服务器和版本化导出。
- 可以用标准 SQL 表达台词、来源、资产、概念、文章之间的关系。
- FTS5 足够支撑中文分词前的基础全文检索；后续可再叠加 `sqlite-vec` 或外部向量索引。
- 可以由 Markdown 和 raw assets 可重复构建，不把数据库变成新的唯一源头。

源头仍然是：

```text
wiki/**/*.md
raw/assets/**/*
exports/sites/**/audience-content.json
exports/sites/**/search-index.json
```

数据库是派生物，构建脚本可以随时重跑。

## P0 已落地

2026-07-05 已新增第一版构建脚本：

```text
inspool-wiki-zh/scripts/build_hs4g_memory_db.mjs
```

脚本使用纯 Node.js 读取 Markdown/JSON/资产目录，并调用系统 `sqlite3` 写入数据库；不依赖 npm 包。当前输出为：

```text
inspool-wiki-zh/exports/databases/hs4g-memory.sqlite
inspool-wiki-zh/exports/databases/hs4g-memory-build-report.json
```

本轮构建结果：

| 对象 | 数量 |
| --- | ---: |
| search-index 台词 | 1995 |
| LocalForensics 来源页 | 1439 |
| MiMo 来源页 | 1970 |
| evidence_sources 总数 | 3409 |
| 带台词 # 线索的来源页 | 3235 |
| canonical # 占位线 | 1765 |
| concepts | 470 |
| entities | 22 |
| synthesis | 1274 |
| 公开短文 | 24 |
| 文章时间锚点 | 72 |
| 资产包 | 480 |
| 资产文件 | 21113 |
| 证据边界 claim_boundaries | 14382 |

抽查 #2037 已能连通：

```text
canonical:2037
-> LocalForensics #2037 来源页
-> 2037-dont-care-final-line-to-postcredit-tail-chain 资产包
-> 28 个资产文件：10 图像、10 音频、8 JSON 指标
-> “不支持真实心理状态 / 完整退出 / 立即黑场”等边界
```

同时，观众短文中的 `2:23:57 / 揭示` 等时间锚点已进入 `article_time_anchors`，后续可由网站直接读取数据库来点亮时间线。

## P0.5 站点接入

2026-07-05 已新增站点轻量出口脚本：

```text
inspool-wiki-zh/scripts/export_hs4g_site_memory.mjs
```

输出：

```text
人类投降派台词搜索-2026-05-31/memory-lite.json
inspool-wiki-zh/exports/databases/hs4g-site-memory.json
inspool-wiki-zh/exports/databases/hs4g-site-source-map.json
```

当前轻量出口结果：

| 对象 | 数量 |
| --- | ---: |
| 带出处的站点台词 | 1995 |
| LocalForensics 来源页 | 1439 |
| 有时间窗的来源 | 978 |
| canonical # 线 | 1760 |

站点侧更新：

- `app.js` 加载 `memory-lite.json`，台词卡显示“出处 / 图 / 声”标记。
- 点击台词出处后，侧栏展示片中出处、图片缩略图、声音/图像/指标数量，以及“不能说成”的边界。
- `server.js` 新增只读 `/api/asset?path=...` 图片接口，只允许读取 offloaded raw assets 根目录下的文件。
- `server.js` 新增 `/source/<sourceKey>` 跳转，公开 JSON 不暴露 `LocalForensics` 路径、复核页名或后台字段；真实 source path 存在站外 `hs4g-site-source-map.json`。
- `service-worker.js` 升级到 `hs4g-search-v11-memory-lite`，`memory-lite.json` 走网络优先。

验收：

- `app.js`、`server.js`、`service-worker.js` 与两个数据库脚本语法检查通过。
- `/memory-lite.json` 返回 `200` 且 `Cache-Control: no-store`。
- `/api/asset` 对 #2037 联系图返回 `200 image/jpeg`。
- `/source/src_...` 返回 `302` 到对应 wiki source 页面。
- Playwright 检查当前 `?time=2:23:57&q=揭示` 页面有 3 个出处标记；最后一句 `我就是什么也不在乎` 打开侧栏后有 8 张图、图片加载成功、面板不含 `LocalForensics / MiMo / 复核 / 研究库 / 内部 / frontmatter / 总账`。
- public-copy guard 通过。

## 核心表设计

### 作品与时间结构

| 表 | 作用 |
| --- | --- |
| `films` | 作品元数据、版本、片长、母文件说明 |
| `film_parts` | 章节/段落，接收当前 `parts` |
| `time_spans` | 可复用时间段对象，给台词、来源、文章锚点、视觉锚点共用 |

### 台词脊柱

| 表 | 作用 |
| --- | --- |
| `dialogue_lines` | 每句台词的主表：文本、起止时间、说话者、编号体系 |
| `speakers` | 角色/说话者规范名、别名、人物页 |
| `line_number_aliases` | #号、站点 id、SRT id、角色内编号之间的映射 |
| `line_readings` | 从逐句卷页抽取的稳定命名、短读、证据层级 |
| `line_segments` | 41 个逐句正文卷页的范围、路径、状态 |

`dialogue_lines` 必须同时容纳“已有站点 1995 条”和“逐句工程 #2037”。不是强行二选一，而是显式标注映射关系、缺口和历史编号来源。

### 证据来源

| 表 | 作用 |
| --- | --- |
| `evidence_sources` | LocalForensics、MiMo、source 页总表 |
| `evidence_source_links` | 来源页支持/反驳/参照/继承的关系 |
| `source_line_links` | 来源页与台词句号之间的多对多关系 |
| `source_concept_links` | 来源页与概念之间的多对多关系 |
| `source_entity_links` | 来源页与实体/人物之间的多对多关系 |

`evidence_sources` 最少字段：

```text
id
source_path
title
source_kind
canonical_status
evidence_tier
timecode_start
timecode_end
raw_asset_dir
created
updated
run_slug
summary_text
boundary_text
```

需要同步做字段归一化：当前 LocalForensics 中 `evidence_tier` 有 `T1`、`T1_LOCAL_FORENSICS`、`T1_LOCAL_4K_AUDIO`、`T1_LOCAL_AV_PHYSICAL_MEASUREMENT` 等多种写法。数据库可以保留原值，同时增加 `evidence_tier_norm`。

### 资产和指标

| 表 | 作用 |
| --- | --- |
| `asset_packages` | raw asset dir 的一级包 |
| `asset_files` | 包内文件清单、类型、相对路径、大小、hash |
| `audio_windows` | exact/gap/boundary/ref/post 等音频窗 |
| `audio_metrics` | RMS、peak、duration、sample count、ratio 等 |
| `audio_bins` | 100ms/20ms/10ms 曲线 |
| `frames` | 单帧路径、时间点、角色、用途标签 |
| `frame_metrics` | 亮度、颜色、dominant color、对比度等 |
| `contact_sheets` | 联系图文件、覆盖范围、子帧数量 |

第一版不必做完整计算机视觉识别。只需把已经存在的 JSON 指标和命名角色抽进数据库，让前端能稳定打开高清图、联系图和证据包。

### 解释层与公开层

| 表 | 作用 |
| --- | --- |
| `wiki_pages` | 所有 synthesis/concepts/entities/meta 页的页面级索引 |
| `concepts` | 概念规范名、摘要、公开可见状态 |
| `entities` | 人物/机构/地点/作品实体 |
| `articles` | 观众短文、公开文章、研究长文 |
| `article_time_anchors` | 文章内时间锚点，驱动时间线高亮 |
| `article_line_links` | 文章关联台词 |
| `article_concept_links` | 文章关联概念 |
| `public_routes` | 哪些内容允许出现在公开网站/sitemap |

这里必须有 `public_visibility` 字段，例如：

```text
private_research
public_candidate
public_featured
public_noindex_follow
public_hidden
```

这样网站不会再因为“全库太大”而把研究后台误当观众入口。

### 判断与边界

| 表 | 作用 |
| --- | --- |
| `claims` | 稳定判断、候选判断、公开可说判断 |
| `claim_supports` | claim 被哪些来源、台词、帧、音频窗支持 |
| `claim_boundaries` | claim 不能升级到哪些说法 |
| `risk_terms` | consent、心理事实、医学事实、真实伤害、设备声等风险词 |
| `review_decisions` | 人工复核、降级、废弃、合并、保留 |

这一组表是整个数据库最重要的“刹车系统”。如果只做全文搜索，系统会越来越会“找材料”；如果把边界结构化，系统才会知道哪些材料不能被说过头。

## 查询能力目标

### 研究者查询

- 输入一句台词，返回句号、时间码、说话者、逐句卷页、所有 T1 来源页、证据包、exact 音频窗、关键帧、相关概念和不可升级边界。
- 输入一个时间点，返回前后 30 秒台词、视觉锚点、LocalForensics 窗口、MiMo 候选、文章锚点。
- 输入一个概念，返回支撑它的台词、来源页、文章、帧和被降级的误读。
- 输入一个角色，返回角色内编号、全片台词、声画状态变化、人物工程卷页和高风险复核队列。

### 观众网站查询

- 输入台词片段，直接定位到时间、角色、附近剧情、对应画面。
- 点击文章中的时间，首页视觉时间线亮起对应分钟/子帧。
- 点击概念，只显示少量白话解释、相关台词、相关短文，不直接抛出技术长文。
- 点击截图，优先打开高清帧/联系图，再允许展开证据来源。

### 维护查询

- 找出有 `raw_asset_dir` 但数据库没有资产清单的来源页。
- 找出有台词句号但无 T1 来源页的句子。
- 找出 `evidence_tier` 原值未归一化的页面。
- 找出公开文章中使用了研究后台禁词或教育姿态句式的页面。
- 找出 MiMo 候选长期未被 T1 复核、降级或废弃的队列。

## 构建管线

### 第 0 阶段：只读盘点

生成一个 `db-build-report.json`：

- Markdown 页面总数。
- LocalForensics source_kind 分布。
- evidence_tier 原值分布。
- canonical_status 分布。
- raw asset dirs 覆盖率。
- 逐句卷页覆盖范围。
- 站点索引与逐句编号映射缺口。

这个阶段不改变任何文件，只暴露问题。

### 第 1 阶段：SQLite 骨架

新增脚本建议路径：

```text
inspool-wiki-zh/scripts/build_hs4g_memory_db.mjs
```

输出：

```text
inspool-wiki-zh/exports/databases/hs4g-memory.sqlite
inspool-wiki-zh/exports/databases/hs4g-memory-build-report.json
```

第一版只建这些表：

- `dialogue_lines`
- `speakers`
- `line_number_aliases`
- `evidence_sources`
- `source_line_links`
- `asset_packages`
- `asset_files`
- `wiki_pages`
- `concepts`
- `articles`
- `article_time_anchors`
- `claims`
- `claim_boundaries`

### 第 2 阶段：T1 证据包解析

优先解析 #2037 样板资产包和 `1120-at-this-point-nooffset/` 下的后段 exact-line 包。目标是把 `audio_summary*.json`、`audio_frequency*.json`、`frame_color_metrics*.json` 和联系图路径抽入表中。

这一阶段先不要追求全库完美。先确保一条句子能完整展示：

```text
台词 -> T1 来源页 -> raw asset package -> 音频窗 -> 音频指标 -> 帧图 -> 联系图 -> 不可升级边界
```

### 第 3 阶段：前端 API 与搜索重构

现有 `build-search-index.js` 保留为前端轻索引生成器，不建议继续把它扩成总数据库脚本。更好的路线是：

1. SQLite 建成总库。
2. 从 SQLite 导出公开站点需要的轻 JSON。
3. 公开站点只读轻 JSON 或 API。
4. 研究者工具可直接查询 SQLite。

这样公开网站不会被全库 1000+ synthesis 和 400+ concepts 拖垮，也不会把研究后台原样暴露给观众。

### 第 4 阶段：语义搜索

关系查询稳定后，再加向量检索：

- 文章段落 embedding。
- 台词上下文 embedding。
- 概念解释 embedding。
- `supported_claims` 与 `unsupported_claims` 分开 embedding。

语义搜索只负责“找到可能相关的东西”；最终显示仍必须回到 SQL 关系和证据层级。

## 数据库与 Obsidian 的关系

Obsidian 仍然是作者工作台和人工判断源头。SQLite 不是新权威，而是重建出来的索引层。

推荐规则：

- 人工判断继续写 Markdown。
- 证据页继续保留 frontmatter 和正文边界。
- raw 资产不移动、不改写。
- 数据库构建脚本只读 Markdown 和 raw assets。
- 数据库输出可以被网站、桌面 App、审核脚本和 AI 问答使用。
- 任何自动生成的数据库字段如果要回写 Markdown，必须走人工确认或单独 approve 流程。

## 第一批实施优先级

### P0

- 建立 `dialogue_lines` 与编号映射表。
- 建立 `evidence_sources`，抽取 LocalForensics/MiMo 的 frontmatter。
- 建立 `source_line_links`，优先从 `hs4g/dialogue/line-` 标签、正文 `#2037` 格式和 related_sources 中提取。
- 建立 `asset_packages` 与 `asset_files`，先记录路径、扩展名、大小、mtime。
- 建立 `claim_boundaries`，从“证据边界 / 不证明 / 不兑现 / 不升级”段落中做保守抽取。

### P1

- 解析 #2037 与后段 exact-line 包的音频/帧 JSON。
- 给前端增加一个“证据抽屉”：台词卡可打开 T1 来源、关键帧、高清联系图和边界。
- 让文章时间锚点从数据库读取，而不是散落在 `audience-content.json` 中手写维护。
- 给概念页建立 `public_visibility`，公开站点只展示可公开解释的概念。

### P2

- 接入 MiMo 候选与 T1 复核关系。
- 加入语义搜索。
- 生成研究者仪表盘：覆盖率、未复核候选、证据层级漂移、公开文案风险。
- 把 macOS App 从“启动本地站点”升级成“本地数据库 + 本地站点 + 后台重建按钮”。

## 对网站升级的直接意义

完成数据库后，网站可以从“前端大 JSON 搜索页”升级为真正的记忆入口：

- 台词搜索：可直接返回角色、时间、上下文、画面、证据页。
- 视觉时间线：每分钟/每 6 秒子帧可回连到台词、来源页和文章。
- 文章阅读：文中时间点点击后，时间线亮起；文中概念点击后，显示短解释和证据链。
- 图片入口：截图不是装饰图，而是可回连到时间、台词、联系图和高清帧。
- 观众层：只展示精选短文和清楚的片内材料。
- 研究层：保留完整证据、字段、降级判断和 raw 资产路径。

这会让“人类投降派搜索记忆库”不只是一个网页，而是一个可持续升级的软件底座。

## 证据边界

本文只提出数据库结构和工程路线。它不新增任何片内事实裁决，不改变 #2037 的尾句判断，不改变角色归属、时间码、台词文本或 LocalForensics 页的证据层级。涉及公开网站的部分仅讨论数据出口，不直接生成新的观众文案。