跳转到主要内容

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

← 总则 | 上游:PRD(§3 模块清单 / §4 差异登记)

附录 A1:PRD 模块 → FSD 分册对照(权威)

PRD 模块分册F-ID 段端点数覆盖期
基础(SSE/health/release-mode)总则 §2.2/§2.5 覆盖,无独立分册—3骨架期
M1 认证与用户m01-认证与用户F1.01~9二十八期
M2 任务与拆解m02-任务与拆解F2.01~38二十九期
M3 生成与素材m03-生成与素材F3.01~19二十九期
M4 导出交付m04-导出交付F4.01~10二十九期
M5 通知公告m05-通知公告F5.01~4三十期
M6 组织协同m06-组织协同F6.01~29三十一期
M7 分销提现m07-分销提现F7.01~11三十一期
M8 充值m08-充值F8.01~8三十一期
M9 剧本库与投稿m09-剧本库与投稿F9.01~25三十期
M10 导演与融合m10-导演与融合F10.01~28三十期
M11 评估与工具m11-评估与工具F11.01~14三十期
M12 管理后台m12-管理后台F12.01~39三十一期
M13 火花计划m13-火花计划F13.01~2三十期

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

backend 域包分册
internal/domain/authm01
internal/domain/taskm02
internal/domain/generationm03
internal/domain/exportm04
internal/domain/notificationm05
internal/domain/orgm06
internal/domain/distributionm07
internal/domain/rechargem08
internal/domain/scriptlibm09
internal/domain/directorm10
internal/domain/evaluationm11
internal/domain/admin + internal/domain/llmm12
internal/domain/sparkm13
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-12026-10-20F1.01 §7(auth/service.go:121)注册台账行描述硬编码「注册赠送 200 积分(初始)」,而实发积分与欢迎通知文案均跟随 trial_credits settings 实际值——配置改非 200 时台账文案与实发不符仅台账展示文案失真,余额正确;冻结 index.js:92 同 quirk(文案字面 200)登记(冻结 quirk 保真,勿修——改文案即偏离冻结对拍基准)
DIF-29-12026-10-20F2.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)前端 `
DIF-29-22026-10-20F2.06 §7(service_gen.go:62)extract v1 单张失败 502 文案「(<总额> 积分已退回)」用总额;冻结 v1 传单价「(10 积分已退回)」仅文案金额失真,退款金额正确(单价)登记
DIF-29-32026-10-20F2.06 §5(service_gen.go:128)extract2 响应 item 与 full2 variants 合并缺 variants 键(omitempty);冻结每项显式 variants: []前端消费面未读该键,零功能影响登记
DIF-29-42026-10-20F2.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-52026-10-20F2.02 §4(repo.go:136-143)legacy/duplicate INSERT 显式写 18 列零值(script_type=’’/min_duration=0/split_status=’’ 等覆盖 DDL 默认);冻结仅 5 列走 SQLite DEFAULTwire 上 legacy/副本任务 script_type:""、min_duration:0 与冻结键值不同登记
DIF-29-62026-10-20F2.03 §7(task/service.go:263-266)CreateV2 token 计费 ceil 向上取整;冻结 Math.round——credits.TextCost 已实现正确 round(billing.go:118-131)却未被调用(死代码并存)计费边界差 1 积分(est 非 tokens 整倍数时);对拍基准偏离登记(修则同步回归测试期望;二十九期未动)
DIF-29-72026-10-20F2.03 §7(task_assembly.go:122-137)V2 台账 desc 模型名可空串(textModelName() 无缺省兜底);冻结 getSetting('text_model') 缺行回「星芒文本引擎」台账 desc 出现「…tokens / ,-N)」空串形态登记
DIF-29-82026-10-20F2.07 §5(task_handlers.go:524-532)resplit 响应回显原始 instruction(trim 只在 service 内部);冻结回显 trim 后值;库存 trim 值带首尾空格请求时响应与冻结 wire 不同登记
DIF-29-92026-10-20F2.09 §4(service_gen.go:596-603)preview 台账 desc「2K预览(-15)」缺「生成」二字(冻结「2K预览生成(-15)」);Mock label 随 desc 全串(冻结 label「分镜图」/「2K预览」——影响 Mock SVG 文件名)台账文案+Mock 落盘文件名形态登记
DIF-29-102026-10-20F2.05 §4(service.go:183/200-204)duplicate title 截 60(冻结不截);仅复制源镜存在 slot_no=1 的槽位(冻结每镜无条件插)长 title 副本与槽位缺失分叉登记
DIF-29-112026-10-20F2.10 §3(task_handlers.go:494/505)场景重命名/删除 groupNo 非数字→归 0 匹配零行 200;冻结 NaN 绑定 TypeError→500异常路径语义分叉(Go 更宽容)登记
DIF-29-122026-10-20F2 通用(各 handler)JSON bind 失败统一 400「请求体格式错误」;冻结 express.json 语法错误走中央中间件透出 SyntaxError message 截 300错误文案形态不同(中文统一 vs 异常文本透传)登记
DIF-29-132026-10-20F2.02 §3(service.go:155/160)legacy 缺省标题「未命名」;冻结 INSERT title 用「未命名剧本」而台账 desc 用「未命名」——Go 把 desc 缺省同化进 title缺省标题 wire 值不同登记
DIF-29-142026-10-20F2.03 §3(service.go:278-279)V2 script_type/face_style 仅 orDefault 补空串、任意值透传;冻结二值化归一(‘overseas’?‘overseas’:‘domestic’ 等)非法枚举值入库透传登记
DIF-29-152026-10-20F2.03 §7(service.go:262)token 估算用 rune 数×1.6;冻结 UTF-16 .length——BMP 外字符(emoji 等)计数不同计费估算边界差(astral 字符面)登记
DIF-29-162026-10-20F2.04 §4(service_gen.go:332-341)full/full2 的 assets_data fallback 拼装收窄 5 键 item;冻结直接塞 assets 原始全列行缓存缺失时降级形态不同;前端消费 5 键内无感登记
DIF-29-172026-10-20F3.02 §7(generation/model.go:19/:27)videos standalone/refunded wire 出 bool true/false;冻结 SQLite SELECT * 透传 1/0 数字前端类型未声明零消费,低危登记
DIF-29-182026-10-20F3.09 §8(generation/service.go:122-141)contentTypeOf 缺 .mp3/.m4a/.aac/.ogg/.flac/.mp4 分支——音频上传/真实成片 Content-Type 落 default image/svg+xmlURL 直读功能面不受影响,响应头 wire 形不同登记(补扩展映射为低成本改进候选)
DIF-29-192026-10-20F3.08 §4(generation/service.go:114-119)Mock 图片落盘文件名=label+ObjectKey 随机名;冻结 img_<uid>.svg 且 uid 即行 id(文件名与 id 解耦 vs 绑定)文件名形态差异;url 键形不变登记
DIF-29-202026-10-20F3.06 §7(generation_handlers.go:193-196)style-presets 有 requireDB——降级模式 503;冻结零 DB 依赖恒 200(纯目录+文件系统)降级面可用性收窄(faq 无 requireDB 与冻结一致)登记
DIF-29-212026-10-20F3.08 §7(service_media.go:84-86)ref_image_ids 追加错误 _ = 吞掉;冻结同语句抛错进中央 500触发面仅 DB 故障登记
DIF-29-222026-10-20F3.01 §7(service_video.go:316-318)真实通道 LinkShotVideoKeep 失败→videoFailFast 退款+500「视频生成失败」;冻结 providers.js:103-105 shots UPDATE 在 try 外不退款走中央 500Go 更保守(多退一次款语义)——integration_test.go:320-323 裁决范围收窄注记引用登记(裁决保真)
DIF-29-232026-10-20F4.01 §3(export_handlers.go:24/:113)export 创建/单镜参数 _ = c.Bind 静默忽略解析错误,malformed JSON 零值续走业务(② → 404 task not found);冻结 express.json 400 SyntaxError错误路径语义分叉(Go 更宽容)登记
DIF-29-242026-10-20F4.05 §7(export/service.go:259-260)deliver 空 file_path 视频行跳过 200;冻结 path.basename('') → readFileSync(目录) 崩溃 500Go 不复刻冻结崩溃(代码注释已登记、PRD §4 M4 正文未含)登记(修后语义保真)
DIF-30-12026-10-20F9.04 §7(scriptlib/repo.go:713)GetWriterJoinedAt 原生 QueryRow 对 users 行查无透传错误→500;冻结 studio.js null 兜底FK 语义死路径(writer_profiles.user_id 外键恒存在)——十四续 B8 注释改实在先登记(不可达面)
DIF-30-22026-10-20F9.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-12026-10-20F6.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-22026-10-20F6.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-32026-10-20F12.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-42026-10-20F12.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-52026-10-20F12.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-62026-10-20F12.12 §8(service_prompts.go:244-250)upload 点文件名:Go regexpStripExt idx<=0 保留 .md 作版本名 vs 冻结 /.[^.]+$/ 匹配整段清空→缺省名兜底仅 .xxx 形态文件名边缘登记
DIF-32-12026-10-20F11.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-22026-10-20F9.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 等裸行键)三十二期双跑对账新发现(同上);多余键前端零消费无感登记