# FSD 附录 · PRD 对照 / 代码域索引 / 差异台账

LLMS 索引： [llms.txt](/llms.txt)

---

> [← 总则](/qmtv/fsd-qmtv/00-%E6%80%BB%E5%88%99/) ｜ 上游：[PRD](/qmtv/product/prd-qmtv-v1/)（§3 模块清单 / §4 差异登记）

## 附录 A1：PRD 模块 → FSD 分册对照（权威）

| PRD 模块 | 分册 | F-ID 段 | 端点数 | 覆盖期 |
|---|---|---|---|---|
| 基础（SSE/health/release-mode） | 总则 §2.2/§2.5 覆盖，无独立分册 | — | 3 | 骨架期 |
| M1 认证与用户 | [m01-认证与用户](/qmtv/fsd-qmtv/m01-%E8%AE%A4%E8%AF%81%E4%B8%8E%E7%94%A8%E6%88%B7/) | F1.01~ | 9 | 二十八期 |
| M2 任务与拆解 | [m02-任务与拆解](/qmtv/fsd-qmtv/m02-%E4%BB%BB%E5%8A%A1%E4%B8%8E%E6%8B%86%E8%A7%A3/) | F2.01~ | 38 | **二十九期** |
| M3 生成与素材 | [m03-生成与素材](/qmtv/fsd-qmtv/m03-%E7%94%9F%E6%88%90%E4%B8%8E%E7%B4%A0%E6%9D%90/) | F3.01~ | 19 | **二十九期** |
| M4 导出交付 | [m04-导出交付](/qmtv/fsd-qmtv/m04-%E5%AF%BC%E5%87%BA%E4%BA%A4%E4%BB%98/) | F4.01~ | 10 | **二十九期** |
| M5 通知公告 | [m05-通知公告](/qmtv/fsd-qmtv/m05-%E9%80%9A%E7%9F%A5%E5%85%AC%E5%91%8A/) | F5.01~ | 4 | **三十期** |
| M6 组织协同 | [m06-组织协同](/qmtv/fsd-qmtv/m06-%E7%BB%84%E7%BB%87%E5%8D%8F%E5%90%8C/) | F6.01~ | 29 | **三十一期** |
| M7 分销提现 | [m07-分销提现](/qmtv/fsd-qmtv/m07-%E5%88%86%E9%94%80%E6%8F%90%E7%8E%B0/) | F7.01~ | 11 | **三十一期** |
| M8 充值 | [m08-充值](/qmtv/fsd-qmtv/m08-%E5%85%85%E5%80%BC/) | F8.01~ | 8 | **三十一期** |
| M9 剧本库与投稿 | [m09-剧本库与投稿](/qmtv/fsd-qmtv/m09-%E5%89%A7%E6%9C%AC%E5%BA%93%E4%B8%8E%E6%8A%95%E7%A8%BF/) | F9.01~ | 25 | **三十期** |
| M10 导演与融合 | [m10-导演与融合](/qmtv/fsd-qmtv/m10-%E5%AF%BC%E6%BC%94%E4%B8%8E%E8%9E%8D%E5%90%88/) | F10.01~ | 28 | **三十期** |
| M11 评估与工具 | [m11-评估与工具](/qmtv/fsd-qmtv/m11-%E8%AF%84%E4%BC%B0%E4%B8%8E%E5%B7%A5%E5%85%B7/) | F11.01~ | 14 | **三十期** |
| M12 管理后台 | [m12-管理后台](/qmtv/fsd-qmtv/m12-%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/) | F12.01~ | 39 | **三十一期** |
| M13 火花计划 | [m13-火花计划](/qmtv/fsd-qmtv/m13-%E7%81%AB%E8%8A%B1%E8%AE%A1%E5%88%92/) | F13.01~ | 2 | **三十期** |

## 附录 A2：代码域 → 分册反向索引

| backend 域包 | 分册 |
|---|---|
| `internal/domain/auth` | m01 |
| `internal/domain/task` | m02 |
| `internal/domain/generation` | m03 |
| `internal/domain/export` | m04 |
| `internal/domain/notification` | m05 |
| `internal/domain/org` | m06 |
| `internal/domain/distribution` | m07 |
| `internal/domain/recharge` | m08 |
| `internal/domain/scriptlib` | m09 |
| `internal/domain/director` | m10 |
| `internal/domain/evaluation` | m11 |
| `internal/domain/admin` + `internal/domain/llm` | m12 |
| `internal/domain/spark` | m13 |
| `internal/domain/credits`（计费横切） | 总则 §2.3 + 各分册扣费节 |
| `internal/infra/{hub,ids,storage}` + `internal/gateway` | 总则 §2.2/§2.5/§2.7 |
| `cmd/server/routes.go`（基础 3 条：/api/events、/api/health、release-mode） | 总则 §2.2/§2.5 |
| `internal/recovery`（启动恢复四扫描） | 跨域，见总则 §2.3 退款唯一口 + m02/m03 |

## 附录 B：实现差异台账（DIF）

> 格式 `DIF-<期>-<序号>`；FSD 撰写期新发现逐条登记。**PRD §4 已登记的移植差异不重复立目**，功能节内直接引用（如「差异⑤族」）。处置列：`登记`（有意保真）/`待裁决`/`已修`。

| ID | 日期 | 位置 | 现象 | 影响 | 处置 |
|---|---|---|---|---|---|
| —（基线） | — | PRD §4 M1~M13 | 移植期已登记差异全集（wire 形态/时间双轨/Mock 台账 desc 参数化/估算法等） | 见 PRD §4 对应模块节 | 登记（引用不重复） |
| DIF-28-1 | 2026-10-20 | F1.01 §7（auth/service.go:121） | 注册台账行描述硬编码「注册赠送 200 积分（初始）」，而实发积分与欢迎通知文案均跟随 trial_credits settings 实际值——配置改非 200 时台账文案与实发不符 | 仅台账展示文案失真，余额正确；冻结 index.js:92 同 quirk（文案字面 200） | 登记（冻结 quirk 保真，勿修——改文案即偏离冻结对拍基准） |
| DIF-29-1 | 2026-10-20 | F2.01 §5 等（task/repo.go 多处） | 读面空列表 wire `null` vs 冻结恒 `[]`——GET /tasks data、/tasks/:id assets、scenes2、shots/:id/histories、asset-library、ShotView.slots 六处（gorp nil slice） | 前端 `|| []` 兜底面感知；冻结 `.all()` 恒数组 | 登记（低危；前端已有兜底，二十六期 E1 迁移面已覆盖） |
| DIF-29-2 | 2026-10-20 | F2.06 §7（service_gen.go:62） | extract v1 单张失败 502 文案「（<总额> 积分已退回）」用总额；冻结 v1 传单价「（10 积分已退回）」 | 仅文案金额失真，退款金额正确（单价） | 登记 |
| DIF-29-3 | 2026-10-20 | F2.06 §5（service_gen.go:128） | extract2 响应 item 与 full2 variants 合并缺 `variants` 键（omitempty）；冻结每项显式 `variants: []` | 前端消费面未读该键，零功能影响 | 登记 |
| DIF-29-4 | 2026-10-20 | F2.11 §8（task/service.go:642、service_gen.go:529） | image_histories 行 id 前缀 `si_`（ids.PrefixShotImage）；冻结恒 `uid('ih_')`——`ids.PrefixImageHistory="ih_"` 仅 director 域消费（repo.go:319 InsertImageHistory），task 域历史行走 `si_`：**前缀双轨并存**（三十期勘正，原「已定义未用」表述不实） | GET /shots/:id/histories 行 id 形态分叉；前端零消费 | 登记（改前缀即偏离现行测试锚；前缀双轨事实随 m10 F10.06 展开） |
| DIF-29-5 | 2026-10-20 | F2.02 §4（repo.go:136-143） | legacy/duplicate INSERT 显式写 18 列零值（script_type=''/min_duration=0/split_status='' 等覆盖 DDL 默认）；冻结仅 5 列走 SQLite DEFAULT | wire 上 legacy/副本任务 `script_type:""`、`min_duration:0` 与冻结键值不同 | 登记 |
| DIF-29-6 | 2026-10-20 | F2.03 §7（task/service.go:263-266） | CreateV2 token 计费 `ceil` 向上取整；冻结 `Math.round`——`credits.TextCost` 已实现正确 round（billing.go:118-131）却未被调用（死代码并存） | 计费边界差 1 积分（est 非 tokens 整倍数时）；对拍基准偏离 | 登记（修则同步回归测试期望；二十九期未动） |
| DIF-29-7 | 2026-10-20 | F2.03 §7（task_assembly.go:122-137） | V2 台账 desc 模型名可空串（`textModelName()` 无缺省兜底）；冻结 `getSetting('text_model')` 缺行回「星芒文本引擎」 | 台账 desc 出现「…tokens / ，-N）」空串形态 | 登记 |
| DIF-29-8 | 2026-10-20 | F2.07 §5（task_handlers.go:524-532） | resplit 响应回显**原始** instruction（trim 只在 service 内部）；冻结回显 trim 后值；库存 trim 值 | 带首尾空格请求时响应与冻结 wire 不同 | 登记 |
| DIF-29-9 | 2026-10-20 | F2.09 §4（service_gen.go:596-603） | preview 台账 desc「2K预览（-15）」缺「生成」二字（冻结「2K预览生成（-15）」）；Mock label 随 desc 全串（冻结 label「分镜图」/「2K预览」——影响 Mock SVG 文件名） | 台账文案+Mock 落盘文件名形态 | 登记 |
| DIF-29-10 | 2026-10-20 | F2.05 §4（service.go:183/200-204） | duplicate title 截 60（冻结不截）；仅复制源镜存在 slot_no=1 的槽位（冻结每镜无条件插） | 长 title 副本与槽位缺失分叉 | 登记 |
| DIF-29-11 | 2026-10-20 | F2.10 §3（task_handlers.go:494/505） | 场景重命名/删除 groupNo 非数字→归 0 匹配零行 200；冻结 NaN 绑定 TypeError→500 | 异常路径语义分叉（Go 更宽容） | 登记 |
| DIF-29-12 | 2026-10-20 | F2 通用（各 handler） | JSON bind 失败统一 400「请求体格式错误」；冻结 express.json 语法错误走中央中间件透出 SyntaxError message 截 300 | 错误文案形态不同（中文统一 vs 异常文本透传） | 登记 |
| DIF-29-13 | 2026-10-20 | F2.02 §3（service.go:155/160） | legacy 缺省标题「未命名」；冻结 INSERT title 用「未命名剧本」而台账 desc 用「未命名」——Go 把 desc 缺省同化进 title | 缺省标题 wire 值不同 | 登记 |
| DIF-29-14 | 2026-10-20 | F2.03 §3（service.go:278-279） | V2 script_type/face_style 仅 orDefault 补空串、任意值透传；冻结二值化归一（'overseas'?'overseas':'domestic' 等） | 非法枚举值入库透传 | 登记 |
| DIF-29-15 | 2026-10-20 | F2.03 §7（service.go:262） | token 估算用 rune 数×1.6；冻结 UTF-16 `.length`——BMP 外字符（emoji 等）计数不同 | 计费估算边界差（astral 字符面） | 登记 |
| DIF-29-16 | 2026-10-20 | F2.04 §4（service_gen.go:332-341） | full/full2 的 assets_data fallback 拼装收窄 5 键 item；冻结直接塞 assets 原始全列行 | 缓存缺失时降级形态不同；前端消费 5 键内无感 | 登记 |
| DIF-29-17 | 2026-10-20 | F3.02 §7（generation/model.go:19/:27） | videos `standalone`/`refunded` wire 出 bool true/false；冻结 SQLite SELECT * 透传 1/0 数字 | 前端类型未声明零消费，低危 | 登记 |
| DIF-29-18 | 2026-10-20 | F3.09 §8（generation/service.go:122-141） | `contentTypeOf` 缺 .mp3/.m4a/.aac/.ogg/.flac/.mp4 分支——音频上传/真实成片 Content-Type 落 default image/svg+xml | URL 直读功能面不受影响，响应头 wire 形不同 | 登记（补扩展映射为低成本改进候选） |
| DIF-29-19 | 2026-10-20 | F3.08 §4（generation/service.go:114-119） | Mock 图片落盘文件名=label+ObjectKey 随机名；冻结 `img_<uid>.svg` 且 uid 即行 id（文件名与 id 解耦 vs 绑定） | 文件名形态差异；url 键形不变 | 登记 |
| DIF-29-20 | 2026-10-20 | F3.06 §7（generation_handlers.go:193-196） | style-presets 有 requireDB——降级模式 503；冻结零 DB 依赖恒 200（纯目录+文件系统） | 降级面可用性收窄（faq 无 requireDB 与冻结一致） | 登记 |
| DIF-29-21 | 2026-10-20 | F3.08 §7（service_media.go:84-86） | ref_image_ids 追加错误 `_ =` 吞掉；冻结同语句抛错进中央 500 | 触发面仅 DB 故障 | 登记 |
| DIF-29-22 | 2026-10-20 | F3.01 §7（service_video.go:316-318） | 真实通道 LinkShotVideoKeep 失败→videoFailFast 退款+500「视频生成失败」；冻结 providers.js:103-105 shots UPDATE 在 try 外不退款走中央 500 | Go 更保守（多退一次款语义）——integration_test.go:320-323 裁决范围收窄注记引用 | 登记（裁决保真） |
| DIF-29-23 | 2026-10-20 | F4.01 §3（export_handlers.go:24/:113） | export 创建/单镜参数 `_ = c.Bind` 静默忽略解析错误，malformed JSON 零值续走业务（② → 404 `task not found`）；冻结 express.json 400 SyntaxError | 错误路径语义分叉（Go 更宽容） | 登记 |
| DIF-29-24 | 2026-10-20 | F4.05 §7（export/service.go:259-260） | deliver 空 file_path 视频行跳过 200；冻结 `path.basename('')` → readFileSync(目录) 崩溃 500 | Go 不复刻冻结崩溃（代码注释已登记、PRD §4 M4 正文未含） | 登记（修后语义保真） |
| DIF-30-1 | 2026-10-20 | F9.04 §7（scriptlib/repo.go:713） | GetWriterJoinedAt 原生 QueryRow 对 users 行查无**透传错误→500**；冻结 studio.js null 兜底 | FK 语义死路径（writer_profiles.user_id 外键恒存在）——十四续 B8 注释改实在先 | 登记（不可达面） |
| DIF-30-2 | 2026-10-20 | F9.05 §8 等（scriptlib_handlers.go:119/:189/:261/:290/:309/:351/:408/:426 八处） | 域内 `_ = c.Bind` 静默按空载荷续走（admin create/put/cover rating/submissions/profile/review/narrations）；冻结 express.json malformed→400 SyntaxError | 错误路径语义分叉（DIF-29-23 同族扩域：export→scriptlib 八端点）；notify handlers :45 同形 | 登记 |
| DIF-31-1 | 2026-10-20 | F6.01/F6.04/F6.08（org/model.go:72-84/:110-125/:153-166） | members/ShareRow/assets 行 created_at 键序位次三处同族——冻结 ALTER 尾插序 vs Go struct 列序，键集相等序不同，前端按键取值无感 | wire 键序方言（M4 ① 同族先例整批登记） | 登记 |
| DIF-31-2 | 2026-10-20 | F6.11/F6.13（org/service.go:747-753/:686-696） | perm-groups/material-perms 响应 map 字母序输出（冻结展开序）；且 PUT perms 传非数组时冻结 `Array.isArray` 判否 200 沿用旧值 vs Go echo bind []string 直接 400 | 键序方言+类型宽容差两点合一 | 登记 |
| DIF-31-3 | 2026-10-20 | F12.01/06/08/11/12/13（admin/model.go:122/:172/:205/:256 等） | 布尔 wire 型 enabled/active/is_active/refunded Go true/false vs 冻结 SQLite 0/1 | 方言级 wire 分叉（六节波及；JS truthy 消费面无感） | 登记 |
| DIF-31-4 | 2026-10-20 | F12.02/F12.04 §3（admin_handlers.go:40-44/:89-93）+F8.01 §7 扩域 | bind 严格性：冻结 `+credits`/`+amount`/`+amount_cny` 一元加强转宽收 JSON 数值字符串；Go int64/float64 bind 失败→400「请求体格式错误」/echo 400 裸信封 | 请求侧类型宽容差（M7 ⑥ credits 面同族扩域：m12 用户/发放面+m08 下单面） | 登记 |
| DIF-31-5 | 2026-10-20 | F12.10 §7（service_billing.go:92-109） | PUT settings 非标量值字符串化：Go jsString default `fmt.Sprint` 对 map→`map[a:1]` vs 冻结 `String(v)`→`[object Object]` | 仅 body 值为对象/数组时；存储面方言 | 登记 |
| DIF-31-6 | 2026-10-20 | F12.12 §8（service_prompts.go:244-250） | upload 点文件名：Go regexpStripExt idx<=0 保留 `.md` 作版本名 vs 冻结 `/.[^.]+$/` 匹配整段清空→缺省名兜底 | 仅 `.xxx` 形态文件名边缘 | 登记 |
| DIF-32-1 | 2026-10-20 | F11.08 §5（evaluation/model.go:210-211+service_viral 列表展开） | viral list wire：冻结带 `status` 键且 `result` 为 JSON 原串直出；Go `Result`/`Status` 均 `json:"-"`、result 经 service 展开为对象、status 整键不出 | **三十二期双跑对账新发现**（scripts/dev/parity 首扫抓获；F11.08 §5 只记了 Go 侧 json:"-" 面，未立冻结差）；前端 ViralAnalysisView 自行 JSON.parse 冻结串，Go 对象形态恰兼容 | 登记 |
| DIF-32-2 | 2026-10-20 | F9.02 §5（service_studio.go:31-46 market list） | market list 行宽：冻结 15 列窄投影（id/title/genre/market/audience/form/tags/highlights/description/rating/cover_path/char_count/uses_total/uses_7d/enabled）vs Go 宽行（另含 content/created_at/episodes/planned_chars/writer_name/synopsis/setting/preview_text/characters/worldview 等裸行键） | **三十二期双跑对账新发现**（同上）；多余键前端零消费无感 | 登记 |

---

反链：

- [功能规格（FSD）](/qmtv/fsd-qmtv/)
- [QMTV 功能规格说明书（FSD）v1.0 · 总则](/qmtv/fsd-qmtv/00-%E6%80%BB%E5%88%99/)
- [FSD M1 · 认证与用户](/qmtv/fsd-qmtv/m01-%E8%AE%A4%E8%AF%81%E4%B8%8E%E7%94%A8%E6%88%B7/)
- [FSD M2 · 任务与拆解](/qmtv/fsd-qmtv/m02-%E4%BB%BB%E5%8A%A1%E4%B8%8E%E6%8B%86%E8%A7%A3/)
- [FSD M3 · 生成与素材](/qmtv/fsd-qmtv/m03-%E7%94%9F%E6%88%90%E4%B8%8E%E7%B4%A0%E6%9D%90/)
- [FSD M4 · 导出交付](/qmtv/fsd-qmtv/m04-%E5%AF%BC%E5%87%BA%E4%BA%A4%E4%BB%98/)
- [FSD M5 · 通知公告](/qmtv/fsd-qmtv/m05-%E9%80%9A%E7%9F%A5%E5%85%AC%E5%91%8A/)
- [FSD M6 · 组织协同](/qmtv/fsd-qmtv/m06-%E7%BB%84%E7%BB%87%E5%8D%8F%E5%90%8C/)
- [FSD M7 · 分销提现](/qmtv/fsd-qmtv/m07-%E5%88%86%E9%94%80%E6%8F%90%E7%8E%B0/)
- [FSD M8 · 充值](/qmtv/fsd-qmtv/m08-%E5%85%85%E5%80%BC/)
- [FSD M9 · 剧本库与投稿](/qmtv/fsd-qmtv/m09-%E5%89%A7%E6%9C%AC%E5%BA%93%E4%B8%8E%E6%8A%95%E7%A8%BF/)
- [FSD M10 · 导演与融合](/qmtv/fsd-qmtv/m10-%E5%AF%BC%E6%BC%94%E4%B8%8E%E8%9E%8D%E5%90%88/)
- [FSD M11 · 评估与工具](/qmtv/fsd-qmtv/m11-%E8%AF%84%E4%BC%B0%E4%B8%8E%E5%B7%A5%E5%85%B7/)
- [FSD M12 · 管理后台](/qmtv/fsd-qmtv/m12-%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0/)
- [FSD M13 · 火花计划](/qmtv/fsd-qmtv/m13-%E7%81%AB%E8%8A%B1%E8%AE%A1%E5%88%92/)
