design-v2 · media-governance-v1.md
Markdown 原文逐字发布,未经渲染加工。版本 8508aeb。
# EXO-TRACE 媒体治理规范 v1(media-governance-v1)
> 状态:设计稿,待站点所有者批准 | 依据:审计 §7.4、§8、§9.1–9.4、§11.3、§13.5、§15.3、§16 | 2026-08-02
> 适用对象:全站一切图片、视频、音频、3D、文档扫描件及其派生物。当前线上媒体为 0(审计 §2.1),本规范无存量迁移负担,从第一件媒体起全量生效。
> 上位规范:`docs/01-研究章程.md` 第二条四层区分。媒体只作用于 L1/L3 展示,任何媒体不得自动改变 X 分(审计 §15.3)。
## 0 三条不可协商原则
1. **无媒体即诚实空状态**:缺原件是重要事实,禁止用图库或 AI 图填空(审计 §7.4、§16-1/2)。理由:一张来源不明的图会摧毁全站「可追溯」定位。
2. **媒体角色永久可见**:M1–M5 标识必须出现在卡片、缩略图、查看器和分享卡上,不允许只在详情页脚注(审计 §8 首段)。理由:媒体会被截图脱离上下文传播,标识必须随像素走。
3. **AI/概念内容与证据物理隔离**:数据字段、存储路径、UI 组件三层同时隔离(审计 §8、§15.3)。理由:单层隔离总会被后续开发无意打穿。
## 1 五级诚实语法与 UI 规范(审计 §8)
| 级 | 名称 | generation 允许值 | 边框/色 | 常驻标识 | 进入证据区 |
|---|---|---|---|---|---|
| M1 | 证据原件/最早已知副本 | camera_original, institutional_master, first_known_copy, institutional_scan | 青色实线(token `--media-m1`,暂定 #14B8A6) | 徽章「原件/最早副本」+ 代际 + 保管链入口 | 是 |
| M2 | 证据派生件 | platform_transcode, editorial_extract, enhanced_derivative | 青色虚线(同色、虚线区分) | 徽章「派生件」+ 父文件链接 + 处理步骤数 | 是,但必须与父文件并排或一键跳转 |
| M3 | 分析图/本站可视化 | (本站生成) | 紫色(`--media-m3`,暂定 #8B5CF6) | 徽章「本站分析」+ 数据/算法/版本入口 | 作为分析层,不作为原始证据 |
| M4 | 重建/模拟 | reconstruction | 琥珀色(`--media-m4`,暂定 #F59E0B) | 左上大字「重建/模拟」,不可折叠 | 否,仅解释假说 |
| M5 | 概念视觉/AI 艺术 | ai_generated 或人工概念图 | 洋红(`--media-m5`,暂定 #D946EF) | 对角水印「概念视觉,非证据」烧录进像素 | 绝对不能 |
UI 细则(每条附理由):
- **位置**:卡片与缩略图左上角固定角标;查看器工具栏常驻文字标签;灯箱放大时标签不消失。理由:角标是用户判断「我在看什么」的第一信号,不能因交互态丢失。
- **不只靠颜色**:角标 = 颜色 + 边框样式(实/虚线)+ 文字 + 图标四重编码。理由:色盲用户与灰度打印场景下颜色不可用(WCAG,审计 §15.5)。
- **水印烧录**:M4/M5 的公开派生件在生成管线中把标识烧进像素(非 CSS 覆盖);M5 加对角半透明水印。理由:右键另存后 CSS 标识即消失,烧录才能防脱离语境传播。【需批准】(不可剥离标识会永久改变观感)
- **分享卡(og:image)**:默认只允许 M1–M3 生成分享卡;M4/M5 一律不进分享卡(审计 §8「AI 图成为对外分享卡而没有醒目标识」的更严格实现)。理由:分享卡是最易脱离上下文的载体,禁比标更稳。【需批准】
- **M5 出现范围**:仅「故事模式」背景区,默认折叠,且与证据组件不同的独立组件类型渲染(审计 §7.4 第 6 条、§11.3)。可选更严方案:全站禁用 M5。【需批准】
- **增强件展示**:enhanced_derivative 必须与父文件滑杆并排(审计 §7.2),文案禁用「识别出更多真实细节」类表述,入禁用词表。理由:增强只改变观感,不产生新信息(审计 §8 末条)。
## 2 存储路径隔离与 GCS 原则(审计 §8、§9.4)
双桶 + 五前缀,前缀在保存桶、公开桶、元数据 `asset_class` 三处一致:
```text
gs://<preserve-bucket>/ 私有保存桶:对象版本化 + 保留锁(不可覆盖不可删)
gs://<public-bucket>/ 公开桶:只放审核通过的派生件与构建产物
前缀(两桶一致):
/evidence M1 /derived M2
/analysis M3 /reconstruction M4
/concept M5
```
- **保存桶**:开启 Object Versioning + Retention/Bucket Lock;写入即封存,纠错只能新增版本。理由:审计 §9.4「原始/最早副本进入不可覆盖桶」,保管链的技术底座。桶名、区域、保留年限与存储成本上限【需批准】。
- **公开桶**:只接收 manifest 中 `review_status=approved` 且 `rights_status` 属允许集的对象(联动 `rights-policy-v2.md` §6);同步脚本前置校验,不满足即拒绝上传。理由:把权利门禁下沉到存储层,网页层漏了也发不出去。
- **Git 只存元数据**:清单、schema、sha256、小型分析产物;媒体母版不进 Git(审计 §9.4)。理由:Git 无法承载 GB 级母版,且历史不可清除会放大权利事故。
- **派生件自动生成**:图片 AVIF/WebP、视频 HLS/MP4、字幕 WebVTT、音频波形(PNG+JSON)、3D LOD;生成管线记录工具与版本号。理由:审计 §9.4 与弱网/中国大陆可达性(§13.6)都要求轻量派生件。
- **构建快照**:每次构建记录所引用对象的 GCS generation、sha256、rights_status、生成工具版本。理由:审计 §13.8「构建可复现、版本可回退」。
- **路径—角色一致性**:`evidence_role`(M1–M5)与 `asset_class`(路径前缀)由校验器强制映射(M1→/evidence … M5→/concept),不一致即构建 error。理由:双写冗余专为防「一处改了一处没改」的错位。
## 3 三层媒体对象模型(审计 §9.1)
- `MediaWork`:一次拍摄/一张照片/一份扫描件这一**知识对象**;绑定主张与来源。
- `MediaFile`:一个具体**比特流**;内容语义有变(裁剪、增强、标注、稳定化、片段提取)即为新 File,必填 `parent_file_id`。
- `MediaRendition`:纯技术派生(缩略、转码、字幕封装、波形、LOD),不改变内容语义,由管线自动生成。
- 划分理由:增强件需要并排审视与谱系追溯(File 级义务),缩略图不需要(Rendition 级免义务);混在一层会导致要么缩略图也要人工审、要么增强图逃过审。
JSON Schema(草案,字段即审计 §9.1 最低字段清单的分层归位):
```json
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://exo-trace.local/schema/media.schema.json",
"title": "EXO-TRACE Media Objects v1",
"$defs": {
"MediaWork": {
"type": "object",
"required": ["work_id", "title", "evidence_role", "asset_class", "source_id",
"claim_ids", "rights_id", "alt_text", "cannot_show_zh", "review_status"],
"properties": {
"work_id": { "type": "string", "pattern": "^mw-[a-z0-9-]+$" },
"title": { "type": "string" },
"caption": { "type": "string" },
"claim_ids": { "type": "array", "items": { "type": "string" }, "minItems": 1,
"description": "M1/M2 必须绑定具体 claim 及 locator(页码/时间码/区域),审计 §11.3、§15.3" },
"source_id": { "type": "string" },
"evidence_role": { "enum": ["M1", "M2", "M3", "M4", "M5"] },
"asset_class": { "enum": ["evidence", "derived", "analysis", "reconstruction", "concept"],
"description": "必须与 evidence_role 映射一致,校验器强制" },
"creator": { "type": "string" },
"custodian": { "type": "string" },
"captured_at": { "type": "string" },
"published_at": { "type": "string" },
"location": { "type": "object" },
"instrument": { "type": "string" },
"original_url": { "type": "string" },
"archive_url": { "type": "string" },
"rights_id": { "type": "string", "description": "指向 RightsStatement,见 rights-policy-v2.md" },
"sensitivity_id": { "type": "string", "description": "指向 SensitivityReview,见 sensitivity-policy-v1.md" },
"alt_text": { "type": "string", "description": "事实性描述,禁止暗示性措辞,审计 §15.5" },
"cannot_show_zh": { "type": "string",
"description": "本媒体不能证明什么——每件媒体必填,审计 §9.2 右列与 §11.3" },
"transcript": { "type": "string" },
"timecodes": { "type": "array", "items": { "type": "object" } },
"review_status": { "enum": ["draft", "forensic_reviewed", "rights_reviewed", "approved", "withdrawn"] },
"reviewed_by": { "type": "string" },
"reviewed_at": { "type": "string" }
}
},
"MediaFile": {
"type": "object",
"required": ["media_id", "work_id", "generation", "mime", "sha256", "object_uri"],
"properties": {
"media_id": { "type": "string", "pattern": "^mf-[a-z0-9-]+$" },
"work_id": { "type": "string" },
"generation": { "enum": ["camera_original", "institutional_master", "first_known_copy",
"institutional_scan", "platform_transcode", "editorial_extract",
"enhanced_derivative", "reconstruction", "ai_generated"],
"description": "无充分保管链时禁写 camera_original,只能写 first_known_copy(审计 §9.1)" },
"mime": { "type": "string" },
"file_size": { "type": "integer" },
"dimensions": { "type": "string" },
"duration": { "type": "number" },
"codec": { "type": "string" },
"sha256": { "type": "string" },
"perceptual_hash": { "type": "string" },
"parent_file_id": { "type": ["string", "null"],
"description": "generation 属派生类时必填,校验器强制(审计 §15.3 谱系可追溯)" },
"transformations": { "type": "array", "items": { "type": "object",
"description": "每步含 op/tool/version/params/operator,审计 §9.3 变换日志" } },
"metadata_extraction": { "type": "object", "description": "EXIF/容器元数据原样留存" },
"c2pa_status": { "enum": ["valid", "invalid", "absent", "stripped_suspected", "not_checked"] },
"authenticity_status": { "enum": ["provenance_verified", "consistent", "unresolved",
"suspected_manipulation", "suspected_ai_generated",
"confirmed_ai_generated", "confirmed_hoax"] },
"ai_detection": { "type": "array", "items": { "type": "object",
"description": "每次检测含 tool/version/score/date——只是信号,不是结论(审计 §13.5)" } },
"object_uri": { "type": "string", "description": "gs:// URI,前缀须与 asset_class 一致" }
}
},
"MediaRendition": {
"type": "object",
"required": ["rendition_id", "file_id", "purpose", "object_uri", "sha256"],
"properties": {
"rendition_id": { "type": "string", "pattern": "^mr-[a-z0-9-]+$" },
"file_id": { "type": "string" },
"purpose": { "enum": ["thumbnail", "web_image", "hls", "mp4_lowband", "captions",
"waveform", "spectrogram", "keyframe", "lod3d", "share_card"] },
"tool": { "type": "string" },
"tool_version": { "type": "string" },
"params": { "type": "object" },
"object_uri": { "type": "string" },
"sha256": { "type": "string" }
}
}
}
}
```
## 4 各媒体类型上线前最低证据要求(审计 §9.2)
下表「必备项」进入校验器:缺任一项则该媒体不得进入公开构建(error);「禁止推论」写入该媒体 `cannot_show_zh` 的措辞底线,并入禁用词表检查。
| 媒体类型 | 上线前必备项(除 §3 通用必填外) | 禁止推论(cannot_show 底线) |
|---|---|---|
| 古籍/档案扫描 | 馆藏机构、档案/卷页号、版本、扫描来源、OCR 置信度 | 文本存在 ≠ 叙述真实 |
| 照片/底片 | 代际、设备/扫描信息、时间地点(或标注不明)、编辑链 | 画面存在 ≠ 物体已识别 |
| 视频/胶片 | 最早副本认定依据、完整时长、帧率编码、剪辑史、原音轨、时间码 | 片段 ≠ 完整事件 |
| 音频/无线电 | 采样率、频段带宽、接收机、校准、干扰环境、波形/频谱 | 异常信号 ≠ 外星来源 |
| 雷达/红外/声呐 | 原始数值或明确标注「屏幕翻拍」、仪器、校准、坐标变换、处理参数 | 操作员证词 ≠ 原始数据 |
| 天文图像/光谱 | 观测 ID、仪器、原始数据链接、处理管线、校准、不确定度、DOI | 伪彩/处理图 ≠ 肉眼外观 |
| 样本/器物 | 样本号、采集/出土语境、保管链、取样、实验室、污染控制、盲测 | 器物真实 ≠ 外星解释真实 |
| 证词/听证 | 完整首发出处、日期场合、是否宣誓、逐字稿、时间码、后续版本变化 | 军衔/名气/真诚 ≠ 准确 |
| 3D 模型 | 扫描或重建之别、单位精度、设备、缺失区、网格处理、许可 | 艺术重建不得冒充扫描 |
| 模拟/动画 | 模型假设、输入、代码版本、误差、复现包 | 模拟是分析,不是现场证据 |
| 社交媒体截图 | 原帖 URL/ID、抓取时间、完整上下文、账号归属、存档 | 无原文件时只能证明「帖子存在」 |
| AI 图像/视频 | 模型、版本、提示词、生成时间、作者、内容凭证、大幅水印 | 永远不进证据评分 |
## 5 媒体鉴证室(审计 §9.3)
功能全集即审计 §9.3 十二项。首版(P2 标杆阶段,审计 §14)建议裁剪为六项,其余随对应模态标杆再上:
| 首版必做 | 理由 |
|---|---|
| 原件/派生件并排 + 滑杆对比 | M2 展示义务(§1)依赖它 |
| 图像深缩放与区域引用(IIIF 兼容) | 古籍标杆(审计 §12-9)依赖 |
| 视频逐帧、关键帧、时间码链接 | 官方 UAP 视频标杆(审计 §12-1)依赖 |
| EXIF/编码/哈希/C2PA 面板 + 传播谱系 | §7 核验流程的用户可见出口 |
| 字幕、全文转写、可搜索时间码 | 可达性与中国大陆无平台场景(§13.6)依赖 |
| 变换日志(软件/版本/参数) | M2/M3 可信度的最低披露 |
后置:音频声谱/瀑布图、雷达轨迹回放、3D 测量、复现包下载——随 SETI/传感器/器物标杆逐个上线。首版裁剪范围【需批准】。
## 6 「无公开原件」诚实空状态(审计 §7.4)
空状态是数据驱动组件(`media_absence` 记录),禁止在页面模板里手写填图。按审计 §7.4 优先级严格降级:
1. **声明**:固定文案「目前未找到可公开的原始影像/视频」+ 已检索入口清单(入口名、检索日期、结果)+ 缺失原因枚举 `never_public / known_but_restricted / claimed_destroyed / lost / unknown`。理由:把「查过哪里、为什么没有」变成可核验陈述,而非borrowed 遗憾语气。
2. **可核情境件**:原始文档封面、档案目录页、报告页码——按 M1/M2 正常登记。
3. **情境材料**:地点地图、天空坐标、仪器照片、结构示意——标 M3「情境」,不进证据区。
4. **本站分析图**:时间线、来源传播图、视场/误差范围——M3,附数据与版本。
5. **标注「模拟/重建」的可复现动画**:M4,仅解释运动/结构假说。
6. **概念艺术**:仅故事模式背景区,M5 永久水印(联动 §1【需批准】项)。
已知存在但无权公开的原件:显示元数据 + 外链/馆藏索取路径(`link_only`,见 rights-policy-v2.md §1)。理由:审计 §15.3「无权公开时显示诚实空状态、元数据和外链」。
## 7 AI 生成内容检测与 C2PA 核验流程(审计 §13.5)
**入库管线(每个外来 MediaFile 必经,顺序执行):**
1. **C2PA/Content Credentials 解析** → 写 `c2pa_status`;`absent` 不是可疑证据,`invalid/stripped_suspected` 是升级信号。理由:2026 年生态下大量真材料无凭证,缺失不能当罪证。
2. **元数据原样留存**(EXIF/容器/编码指纹)→ `metadata_extraction`;公开渲染前剥离精确 GPS(联动 sensitivity-policy)。
3. **AI 生成检测**:至少两个检测器独立打分,记录 tool/version/score/date 于 `ai_detection[]`;**检测结果只是信号,永不单独决定处置**(审计 §13.5 第 1 条)。是否调用第三方付费 API(媒体数据外发)【需批准】。
4. **最早上传追踪**:反向图片/视频关键帧检索,记录检索式、平台、命中最早日期 → 传播谱系;发现更早副本时降级本件 generation。理由:审计 §13.5「原帖和最早上传追踪」。
5. **人工媒体取证审核**:以上信号汇总给「媒体取证」审核角色(审计 P0-2 角色表)签署 `authenticity_status`;AI 与自动流程只能建议,不能签署。理由:审计 §13.5「AI 内容不得自动发布」。
**处置规则:**
- `suspected_ai_generated`:冻结在候选区,不进公开构建,直至人工裁定。
- `confirmed_ai_generated`:generation=ai_generated → 强制 evidence_role=M5(校验器硬规则);若该件曾被当作证据传播,转为「骗局与误认」对照条目展示,标识保留。理由:确认的 AI 假证据本身是有研究价值的污染样本(审计轨道 A10)。
- 本站自产 M3/M4/M5:必须写全模型/版本/提示词/作者/时间;对外派生件建议签发本站 C2PA 凭证(需证书与管线成本)【需批准】。
- AI OCR/转写/翻译产物:标注模型与置信度,人工校对前 review_status 不得为 approved(审计 §13.5、§13.2)。
## 8 构建期硬门禁清单(审计 §8、§15.3;逐项进入 validation-report.json,格式按审计 P0-4)
**error(阻断公开构建,不可 waiver):**
| 规则 ID | 内容 |
|---|---|
| E-M01 | M5/concept 资产被证据组件、评分输入或案例默认缩略图引用 |
| E-M02 | 分享卡使用 M4/M5,或使用无烧录标识的 M4 |
| E-M03 | enhanced_derivative 缺 parent_file_id,或渲染处无父文件并排/跳转 |
| E-M04 | 自托管媒体缺 sha256 / rights_id / evidence_role / generation / review_status 任一 |
| E-M05 | rights_status ∈ {unknown, restricted, do_not_publish} 的媒体进入公开构建(联动 rights-policy-v2.md §6) |
| E-M06 | evidence_role 与存储路径前缀 / asset_class 不一致 |
| E-M07 | M1/M2 未绑定 claim_id + locator(页码/时间码/区域) |
| E-M08 | 图片缺 alt_text;视频缺 transcript 或字幕;媒体缺 cannot_show_zh |
| E-M09 | generation=ai_generated 而 evidence_role ≠ M5 |
| E-M10 | 无保管链依据却标 camera_original/institutional_master |
| E-M11 | 禁用词命中:「识别出更多细节」「原件」(无保管链时)、「证实为外星」等(词表随评分手册维护) |
| E-M12 | review_status ≠ approved 的媒体进入公开构建 |
**warning(公开逐项列出,须有 owner 与期限):** 缺 archive_url、缺 perceptual_hash、缺 captured_at、缺 caption、C2PA=stripped_suspected 未复核、§4 表中「建议项」缺失。
## 9 与现行 case.schema.json 的衔接
现行 `media[]`(kind/license/material_state/in_evidence_block,见 `/Users/liyandong/Documents/alien-atlas/schema/case.schema.json`)为过渡结构,v2 起:`material_state` 并入 `generation`;`license` 移交 `RightsStatement`;`in_evidence_block` 由 `evidence_role` 推导后废弃。理由:单一事实源(审计 §13.8),布尔开关会与角色枚举冲突。现库媒体为 0,无迁移成本,直接切换。
## 10 待批准决策
| # | 决策 | 建议 |
|---|---|---|
| 1 | M5 概念视觉允许范围:仅故事模式背景区 vs 全站禁用 | 仅故事模式背景区 + 永久水印 |
| 2 | 分享卡 og:image 允许角色集合 | 仅 M1–M3,M4/M5 一律禁止 |
| 3 | M4/M5 标识烧录进像素(不可剥离) | 接受烧录 |
| 4 | GCS 桶名、区域、保留锁年限、存储成本上限 | 保留锁 ≥10 年;成本上限由所有者定 |
| 5 | 本站自产派生件是否签发 C2PA(证书成本) | P2 标杆先行试点 |
| 6 | AI 检测是否调用第三方付费 API(媒体外发第三方) | 优先本地模型,敏感材料禁外发 |
| 7 | 媒体鉴证室首版功能裁剪(§5 六项) | 按 §5 表执行 |
| 8 | GB 级科学数据(Breakthrough Listen 等)缓存预算上限 | 按需缓存 + 只存派生预览 |