实体中心 Work 化改造执行计划(2026-06)
目的
这份文档不是再讨论“目标架构是否正确”,而是把当前 Kototoro 的实体治理、ownership 上移、历史兼容收敛,整理成一份真正可执行的改造路线。
本文的核心判断只有一句话:
不再继续“修 entity 补丁层”,而是把现有 entity graph 直接演进为过渡期 Work 内核。
同时明确一个边界:
当前讨论的“同步隔离”只针对现行的
backup / restore / WebDAV auto upload / WebDAV auto restore主链;仓库中的sync/与旧kotatsu sync源码仅为历史保留,不再作为当前 authoritative 同步方案依据。
当前事实
截至当前工作树,系统已经不是单纯的:
Manga 主模型
+ Entity 外挂聚合而更接近:
Entity = 过渡期 Work
Manga = 过渡期 Projection
Tracking = enrichment / binding evidence
Resolved state = entity/work-first已经完成的关键收口:
work_history/work_favourites/work_stats已落地;- tracking / scrobbling / history / recent list 已开始走 work-aware owner 解析;
- metadata default 主链已基本回到
entity_preferences; - blind mirror 已退出主链,projection prefs 越来越接近 local override;
- backup / restore 当前 schema 已转为 work-aware;
tracking_site_links已开始从 owner 解析主链退出。
因此,下一阶段不该再做“概念层争论”,而应该直接推进 ownership、写入边界和运行时入口的彻底收口。
改造目标
1. 主模型目标
运行时只允许存在一个主模型:
Work(当前由 entity 承担)其它对象全部降级:
Manga-> Projection / source-native execution anchor- tracking binding -> Work enrichment
- resolved metadata -> derived cache / derived selection
tracking_site_links-> cache / audit / suppression history
2. 语义目标
所有高价值用户状态最终都要满足:
- owner 在 Work
- projection 只承载来源上下文和执行锚点
- tracking 不直接拥有用户状态
- metadata 不再多点复制为“多个真相”
3. 工程目标
本轮不追求:
- 一次性全量 rename
- 一次性表结构大爆炸
- 一次性删光所有 legacy 字段
本轮只追求:
- 新写路径彻底 Work-first
- 旧兼容路径明确降级
- repair / restore / migration 不再继续放大污染
- 后续命名统一时不再需要反复返工 ownership
执行原则
1. 先 ownership,后 rename
顺序必须是:
ownership 上移
-> 写入边界收口
-> 运行时入口统一
-> 兼容字段降级
-> 最后才做 Entity -> Work / Manga -> Projection 命名统一2. 先止血,后清理
只要旧 mirror、旧 fallback、旧 restore 回写仍在持续制造新污染,任何“整理实体”都会持续返工。
3. 当前同步边界只认 backup / WebDAV
当前跨设备主链以:
- 本地 backup
- restore
- WebDAV auto upload
- WebDAV auto restore
为准。
仓库里的旧 sync/ 代码不作为本次 Work 化路线的主设计依据,也不作为验收对象。
4. Projection 允许继续存在,但不得继续持有 owner 语义
这意味着:
mangaId仍可作为大量 API 的执行锚点;- 但不得再默认等价于“作品 owner id”。
工作流拆分
Stream A:Work Ownership 收口
目标:
- 把用户状态 ownership 全部收敛到 entity/work;
- 限制 projection 只保留执行上下文。
实施范围:
- favourites
- history
- reading record
- stats
- tracking / scrobbling
- details 的默认状态读写
完成定义:
- 新增状态写入不再依赖 projection 作为 owner;
- projection fallback 只在 no-entity / legacy import 场景触发;
- 公共 helper 默认表达 “resolve work owner”,而不是 “resolve manga owner”。
Stream B:Metadata 写入边界收口
目标:
- Work default 与 projection override 完全分流;
- 停止一切 blind mirror 变体。
实施范围:
ContentDataRepositoryEntityGraphRepository- details metadata selection
- tracking bind / merge 后的 metadata 写入
- repair / migration worker
完成定义:
- Work authoritative write 只写 Work/entity prefs;
- projection metadata write 只在显式 local override 场景出现;
- source-native metadata 更新不反向定义 Work 默认值。
Stream C:Projection 降级与本地锚点统一
目标:
- 明确
manga的当前语义是 projection; - 所有“代表内容”选择都通过 work preference 解析。
实施范围:
- recent history / continue reading
- updates / tracker / new chapter counters
- source migration
- preferred local manga / representative content
完成定义:
- 同一 work 的多 projection 不再在高频列表里重复放大;
- source switch 后 continue reading / updates / shortcut / widget 跟随当前 work representative;
- 同一 work 的 tracker anchor 不再分裂。
Stream D:Restore 与历史兼容隔离
目标:
- 旧数据允许导入;
- 旧语义不允许重新成为主真相。
实施范围:
- backup schema
- restore normalization
- WebDAV auto restore / auto upload gate
- legacy section degrade
完成定义:
- legacy payload 导入后默认进入 normalize / degrade / repair;
- 不自动回灌为 authoritative work state;
- restore 后 auto upload 必要时继续禁写,直到本地归一化完成。
Stream E:Repair 与治理工具重构
目标:
- repair 结果重新可信;
- organize / migration / merge 工具只处理真正的边界问题。
实施范围:
inspectRepairIssues()- organize panel categories
- prune 系列动作
- suspect / stale / redundant 分类
完成定义:
SUSPECT_TRACKING_BINDING只反映真实 work tracking identity 问题;- metadata drift、cache drift、mismerge 风险独立呈现;
- repair 动作不再混合不同层级语义。
分阶段执行顺序
Phase 0:冻结错误主链
目标:
- 不再继续扩散旧语义。
必做项:
- 禁止新增任何
entity -> all mangamirror 写法; - 禁止新增任何基于
tracking_site_links的 owner fallback; - 禁止新增任何 restore 后直接 authoritative writeback 的 shortcut;
- 所有新入口默认走 entity/work-first helper。
验收:
- 新 PR 不再引入 projection-owned 新状态;
- metadata 新写链全部可归类到 authoritative / override / source-native 三类之一。
Phase 1:高价值 ownership 主链补齐
目标:
- 把最容易污染用户感知的状态先完全 Work-first。
优先级:
- favourite / category
- history / continue reading
- stats / reading duration
- tracking / updates / scrobbling
验收:
- 上述链路的主写路径都能在不依赖 projection owner 的情况下闭环;
- source 切换后用户状态不再分叉。
Phase 2:metadata authority 完全分流
目标:
- 真正切开 Work metadata default 与 projection override。
必做项:
setEntityMetadataSourceSelection(...)只保留 Work 语义;- projection override 改成显式单项入口;
- repair / worker 分别处理 Work drift 与 projection drift;
- 用户 override 开始从 manga prefs 向 Work override 迁移。
验收:
- 不再存在“同一方法长期混写 Work default + projection override”的主链;
- per-manga metadata source 明确降级为局部 override / legacy fallback。
Phase 3:projection 锚点运行时统一
目标:
- 所有运行时“代表内容”都显式走 Work preference。
必做项:
- continue reading / recent list / shortcuts / widgets 统一代表内容解析;
- tracker / update counter / new chapters 统一 anchor;
- source migration 只迁移当前 projection anchor,不波及整个 work 的其它证据。
验收:
- 同 work 多 projection 不再在 recent、updates、tracking 主链里造成重复和分裂;
- preferred source 切换后共享入口表现一致。
Phase 4:restore / backup 旧语义隔离收尾
目标:
- 完成“能导入旧数据,但旧数据不再继续写坏新模型”。
必做项:
- 继续推进
WORK_*/ENTITY_GRAPH_*authoritative sections; - legacy sections 保持 import-compatible,但不回升为主真相;
- WebDAV auto upload gate 与 restore normalization 状态严格绑定;
- 明确 remote payload 的 semantic schema version 语义。
验收:
- restore 后不会重新制造 mirror 型污染;
- auto upload 不会把 legacy import 结果直接传播为 authoritative state。
Phase 5:术语与表结构统一
目标:
- 在 ownership 和写入边界稳定后,再处理命名债务。
候选项:
Entity -> Worklocal_manga / manga -> projectionpreferred_local_manga_id -> preferred_projection_id语义统一- backup section / DTO / helper 命名去 legacy 化
前置条件:
- 运行时主链已经稳定;
- 兼容字段已降级;
- repair 和 restore 不再依赖旧语义名称做判断。
代码层责任矩阵
1. EntityGraphRepository
角色:
- 过渡期 Work 内核
- identity / binding / repair / ownership 治理中心
禁止:
- 继续承担 projection mirror 批量写入分发器
2. ContentDataRepository
角色:
- metadata 读取与局部 override 网关
禁止:
- 再把 source-native metadata 更新回写成 Work authoritative truth
3. History / ReadingRecord / Stats / Tracking Repository
角色:
- 逐步改造成“Work owner + projection anchor”结构
禁止:
- 继续把任意传入
mangaId直接等价解释为 owner id
4. Backup / Restore / WebDAV Coordinator
角色:
- 导入导出边界控制器
禁止:
- 让 legacy section 或 legacy restore 直接变成当前 authoritative state
里程碑验收
M1:治理止血完成
标准:
- repair 噪音显著下降;
- blind mirror 不再扩散;
tracking_site_links不再回流 owner 解析。
M2:用户状态主链 Work-first
标准:
- favourite / history / stats / tracking 主链完成 ownership 上移;
- 多 projection 下用户状态不再系统性分裂。
M3:metadata 写入边界稳定
标准:
- authoritative / override / source-native 三类写入边界清晰;
- 用户 override 不再主要挂在 manga prefs。
M4:restore 隔离稳定
标准:
- restore 与 auto upload 不再传播旧语义污染;
- backup 当前 schema 与 legacy import 的边界清晰。
M5:命名统一可启动
标准:
- rename 只剩工程噪音问题,而不再夹杂 ownership 风险。
非目标
本计划当前不包含:
- 重启或扩展旧
kotatsu sync体系; - 引入远程 work/entity 服务端;
- 一次性重写所有详情页 UI;
- 用模糊匹配自动决定全部最终身份真相;
- 为未来未落地场景预建新抽象层。
推荐下一步
按当前工作树状态,下一步应直接进入下面三个并行切口:
- 继续完成 override ownership 上移
- 把 title / cover / content rating 等 override 从 manga prefs 往 Work 收。
- 继续削减 projection-owned runtime path
- 逐条审计 details / reader / player / download / preview 的
mangaId == owner惯性。
- 逐条审计 details / reader / player / download / preview 的
- 继续收紧 restore write gate
- 让 legacy import、normalize、authoritative upload 三段彻底分离。
这三项做完,后续的 Entity -> Work、Manga -> Projection 命名统一才值得开始。