+
+
+
+ Target workflow · v1 +

从原盘证据,
到可验证的音乐库。

+

+ Web 端负责看清、比较和确认;Annim 后端负责编排状态、保存证据和执行安全边界;worker + 只处理已经冻结的计划。 +

+ +
+ +
+ +
+ 7 + 个阶段 +
+
    +
  1. 收件
  2. +
  3. 拆轨
  4. +
  5. 证据
  6. +
  7. 审阅
  8. +
  9. 补全
  10. +
  11. 执行
  12. +
  13. 发布
  14. +
+
+
+ +
+
+ 0 +
+ 原始文件被改写 +

源文件只读,处理发生在私有 staging。

+
+
+
+ 100% +
+ 字段可追溯 +

值、来源、方法、置信度与决定一起保存。

+
+
+
+ 1 +
+ 明确发布点 +

验证完成后才允许原子提交到正式库。

+
+
+
+ +
+
+ Operator journey +

每个阶段要做什么

+
+

+ 阶段顺序是真实的状态约束。后一步不能绕过前一步的证据与校验,也不能在后台“猜着完成”。 +

+
+ +
+
+
+ 01 +
+ Receive & seal +

收件与原件封存

+
+ 核心已实现 +
+
+
+

你要做

+

选择 CD 抓轨目录或流媒体文件,登记取得来源,并确认本次入库对象。

+
+
+

系统做

+

建立不可变 manifest,记录路径、大小与 SHA-256;源目录随后只读,所有输出进入 staging。

+
+
+

完成标志

+

每个输入都有摘要,manifest 被冻结,后续计划只能引用摘要而不能替换源文件。

+
+
+
+ anni-ingest/src/manifest.rs + anni-workspace + annim/src/ingest +
+
+ +
+
+ 02 +
+ Parse & split +

CUE/WAV 解析与安全拆轨

+
+ 核心已实现 +
+
+
+

你要做

+

确认 CUE 对应的 WAV、轨道边界和 HTOA 等异常提示;不需要手工搬运输出文件。

+
+
+

系统做

+

先解析、再生成冻结执行计划;worker 写入独立临时文件,校验完成后才登记产物。

+
+
+

完成标志

+

轨道数量、时长与摘要可复核;失败只留下隔离记录,不会删除或覆盖整轨 WAV。

+
+
+
+ anni-split + anni-ingest/src/plan.rs + anni-ingest-worker +
+
+ +
+
+ 03 +
+ Evidence, not overwrite +

元数据证据化

+
+ 核心已实现 +
+
+
+

你要做

+

优先录入 Booklet 与包装上的原文;保留全角、半角、大小写、空格和括号形态。

+
+
+

系统做

+

每个候选值绑定来源、定位信息、采集方法与置信度。AI 和网络只添加候选,不改 canonical 值。

+
+
+

完成标志

+

标题、艺人、日期、曲种等必需字段都有可追溯候选,且 Booklet 冲突被明确呈现。

+
+
+
+ exact text + 作品・A〜B~C(初回) +

项目既有的中点与波浪线约定视为已确认实践,不作为冲突项;其余字符不做静默归一化。

+
+
+ anni-ingest/src/metadata.rs + annim/src/graphql/ingest_metadata.rs +
+
+ +
+
+ 04 +
+ Human decision +

逐字段审阅与版本冻结

+
+ 人工工作台已实现 +
+
+
+

你要做

+

在一个视图里比较候选、查看证据并接受或拒绝;重点确认曲种、艺人职责与多碟结构。

+
+
+

系统做

+

计算缺失必填项,保存每次 revision;用 row version 拒绝过期页面的覆盖写入。

+
+
+

完成标志

+

审阅 completeness 为 100%,被批准 revision 冻结;任何后续改动都产生新 revision。

+
+
+
+ annim GraphQL metadata review + annim-web / metadata workbench +
+
+ +
+
+ 05 +
+ Catalog & artwork +

目录同步与封面择优

+
+ 后台核心已实现 +
+
+
+

你要做

+

为艺人绑定 Apple、官网或 VGMDB 信源;对候选封面比较像素、来源与版本后确认。

+
+
+

系统做

+

后台分页拉取目录并保留原始响应;下载封面时禁止私网跳转,验证格式后按摘要存储。

+
+
+

完成标志

+

艺人拉表显示已收集、缺失和音质;选定封面指向已验证的本地不可变资产。

+
+
+
+ Cover strategy +

+ Apple artwork 展开尺寸模板;艺人/厂牌官网保留原始链接;Amazon 只在已知图片 CDN + 上移除文件名中的压缩块(例如 ._AC_SL1500_),不会删除可能承载签名或凭据的任意查询参数。 +

+
+
+ anni-catalog-worker + anni-cover-worker + annim/src/catalog + annim/src/cover +
+
+ +
+
+ 06 +
+ Execute the frozen plan +

执行、校验与隔离

+
+ 核心已实现 +
+
+
+

你要做

+

启动已经批准的 plan;如果输入摘要或 revision 已变化,回到审阅而不是强行继续。

+
+
+

系统做

+

worker 持 lease 执行,逐项核对 plan digest、输出摘要和媒体属性;异常进入 quarantine。

+
+
+

完成标志

+

verification digest 绑定本次产物,所有步骤幂等;重复执行不会生成不一致的第二份结果。

+
+
+
+ anni-ingest-worker + annim ingest state machine +
+
+ +
+
+ 07 +
+ Atomic publish +

原子发布与进度回写

+
+ 闭环待完善 +
+
+
+

你要做

+

在验证摘要一致后确认发布;之后只在正式库中查看,不再手工移动 staging 文件。

+
+
+

系统做

+

原子提交到 Anni 仓库,关联 artist/release/copy/ingest job,并回写音质与取得来源。

+
+
+

完成标志

+

正式库可读、拉表状态变为 Published;审计记录能从成品反查到输入、计划和证据。

+
+
+
+ Copy provenance +

+ 每份实际音频单独记录 source kind 与自由文本 source label,例如“天使动漫”“某 PT/BT + 站”“群友分享”;同一发行可同时保留多个音质与来源,不用互相覆盖。 +

+
+
+ anni-repo integration + catalog collection copy + disaster recovery runbook +
+
+
+ +
+
+
+ Server–client boundary +

目标架构

+
+

浏览器只发控制命令;耗时、敏感和文件相关工作全部离开请求线程。

+
+ + +
+ +
+
+
+ Metadata authority +

冲突时听谁的

+
+

优先级不等于自动接受。所有来源先成为候选,再由规则推荐、由人确认。

+
+
    +
  1. + A +
    + CD Booklet / 盘面 / 包装 +

    收藏实体的原始记载,最高权威;逐字符转录并保留版次。

    +
    +
  2. +
  3. + B +
    + 唱片公司与艺人官网 +

    用于补充发行信息、职责与版本;与实体冲突时必须提示。

    +
    +
  4. +
  5. + C +
    + 官方商店 / Apple Music +

    适合补齐目录和封面;流媒体版可能不同于 CD 版。

    +
    +
  6. +
  7. + D +
    + VGMDB 与社区来源 +

    VGMDB 适合发现专辑,社区来源适合定位线索;两者都不能静默定稿。

    +
    +
  8. +
  9. + E +
    + 文件名与 AI 推断 +

    只用于产生待审候选,必须标注 inference,不能补写不存在的事实。

    +
    +
  10. +
+
+ +
+
+
+ Safety & recovery +

失败也不能伤到原件

+
+

安全不是一个确认弹窗,而是从输入、执行、提交到备份都无法绕过的不变量。

+
+
+
+ S1 +

原件只读

+

服务不提供删除源文件的命令。manifest 记录摘要;摘要变化时停止任务,而不是继续使用“看起来相同”的路径。

+ 故障结果:任务失效,原件不变 +
+
+ S2 +

私有 staging

+

临时路径由 worker 创建,拒绝越界与覆盖;拆轨和封面都先写 partial,再校验摘要与媒体结构。

+ 故障结果:partial 被隔离,可重试 +
+
+ S3 +

冻结计划 + CAS

+

每个写操作携带 row version、metadata revision 与 plan digest;过期页面和重复 worker 不能相互覆盖。

+ 故障结果:冲突显式返回,等待刷新 +
+
+ S4 +

验证后发布

+

产物通过数量、摘要和媒体属性验证后才进入 Ready to commit;发布点必须可重放且幂等。

+ 故障结果:正式库仍保持旧状态 +
+
+ S5 +

3-2-1 灾备

+

目标部署需同时备份数据库、内容寻址资产和正式仓库;至少一份离线/异地不可变副本,并定期做恢复演练。

+ 建设项:backup/restore runbook + 演练记录 +
+
+ S6 +

审计闭环

+

成品反查到 copy、ingest job、verification、plan、manifest 与 evidence;排障不依赖易失日志。

+ 建设项:发布回写与审计查询页 +
+
+
+ +
+
+
+ Implementation map +

现有模块与后续建设

+
+

“已有”表示当前仓库中有真实执行路径和测试;“下一步”表示仍需要产品界面、适配器或运维闭环。

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
能力当前调用点状态下一步
入库状态与并发控制annim/src/ingest · annim/src/graphql/ingest.rs已有Web 写操作与冲突恢复提示
不可变 manifest / plananni-ingest/src/manifest.rs · plan.rs已有从浏览器创建 staging job 的受控上传/登记入口
CUE/WAV 拆轨anni-split · anni-ingest-worker已有在 Job 详情中展示边界、时长和验证报告
字段证据与审阅 revisionanni-ingest/src/metadata.rs · ingest_metadata.rs · annim-web/app.js已有Booklet 扫描资产、OCR/AI 候选 Agent、批量字段导入与对照
Artist 拉表与音质来源anni-catalog · annim/src/catalog已有Web 新建/编辑 Release 与 Copy,以及批量差异确认
Apple Music 同步anni-catalog-worker/src/apple_music.rs · src/bin/catalog-worker.rs已有部署 supervisor、developer token 轮换、运行指标与告警
VGMDB 同步anni-vgmdb(legacy CLI)受限先用 DiscoveryOnly/人工导入;获得稳定且允许的访问入口后再做 FullSnapshot
封面获取与择优anni-cover-worker · annim/src/cover已有Web 候选对比、来源标注和选择操作
灾备与可观测性部署层待建设PITR/SQLite backup、资产清单校验、恢复演练、指标与告警
+
+
+ +
+
+ Explainable Rust +

测试覆盖行为,不堆数量

+
+
+
+ Unit + 规则与纯函数 +

Unicode 原样保存、状态转换、URL 重写、分页与重试分类。

+
+
+ Integration + 真实仓储边界 +

SQLite/PostgreSQL 持久化、CAS、lease、不可变 revision 与幂等。

+
+
+ Journey + 关键闭环 +

从 staging 到发布的少量高价值流程;外部网络使用 fixture,不做脆弱 live test。

+
+
+
+
+ + + + +