实体中心 Work 化改造执行计划(2026-06)
WARNING
Archived: the entity graph and work ownership model was removed in September 2026, so this page does not describe the current app. See Entity System (Archived).
目的
这份文档不是再讨论“目标架构是否正确”,而是把当前 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 命名统一才值得开始。