Skip to content

fix(canvas): 自审 C 组数据口径——job 所在画布刷新、素材页开页即新、大纲 / ⌘K 镜号走序列口径、take 号共用一个函数 - #295

Merged
KerroKapple merged 10 commits into
mainfrom
fix/data-consistency-audit
Oct 16, 2026
Merged

KerroKapple merged 10 commits into
mainfrom
fix/data-consistency-audit

Conversation

@KerroKapple

Copy link
Copy Markdown
Owner

背景

画布重设计合完后做了自审,这个 PR 修 C 组里数据口径与新鲜度的几条:同一个东西在不同地方显示的号不一样,或者显示的是旧数据。

修了什么

C1【中】从任务弹层「定位」到别的画布,看到的是旧节点表

  • 任务弹层开着时会保活别的画布的节点控制器(找源节点用),但 job 成功后原来只刷新当前画布。跳过去后:产物卡还写「等待中」,大纲没有子行,历史页是空的。
  • 改法:job 到终态时,刷新 job 所在画布的节点控制器。
  • 监听从画布页挪到了外壳根(InkShell)。原来挂在画布页里,没开画布时落的产物同样没人刷新。

C2【中】素材页看不到新图

  • 素材页打开时会把注册表里已成功的 job 全记成「已见」,前提是画廊图此刻是新的。可画廊图可能被画廊标签或角色页保活着,早就过期了。
  • 改法:素材页每次挂载都让画廊图失效一次,删掉「已见」记账;页面开着时 job 成功仍会刷新。

C3【中】大纲、⌘K 的镜号与序列视图、画廊对不上

  • 大纲按叙事链逐个节点编号。序列和画廊编的是折叠后的镜:借产物的后继并进前一镜,没产物也没备注的跳过。
  • 在「导入剧本 → 用本镜备注生成图像」这条主路径上,同一张图大纲写 03,画廊写序列 002。
  • 改法:大纲和 ⌘K 改用序列的口径,节点在哪一镜就显示那一镜的号,判据与「在序列中查看」共用。
    • 链上但不在任何一镜里的节点不编号。
    • 组头「N 镜」数的是不同镜号,不是行数。

C6【低】take 号两处不一致

  • 素材页把批量 slot 也算进 take 编号,检查器历史页只数产物节点。于是同一张图,左栏写 take 5,右栏写 take 2。只有一个产物时,素材页写「成片」,历史页写「take 1」。
  • 改法:两处共用一个编号函数 canvas/util/take_numbers.dart。
    • 批量 slot 不占号,照画廊写「#n」。
    • 只有一个产物时两处都写「成片」。新增 ARB 键 inspectorHistoryFinal。

C7【低】素材页不随删除刷新

  • 删掉的节点,格子立刻消失。
  • 点到已不存在的节点时不选中,不会出现状态栏写「选中 1」而检查器是空的。

C8:一处测试头注与断言相反,已改。

顺手整理

  • 「节点在哪一镜」的判据拆成纯函数 sequence/util/shot_index.dart。原来大纲的纯函数为了用这个判据,把要 ref、要切外壳标签的文件也 import 了进来。
  • take 编号函数从左栏素材页的 model 挪进 canvas/util。

验证

  • flutter analyze lib test:无问题。
  • flutter test --exclude-tags golden:3328 通过,0 失败。
  • 变异实测 14 条全部变红:
    • 只刷当前画布、不刷 job 所在画布
    • 监听挂回画布页、不在外壳根
    • 素材页打开时不让被保活的画廊图失效
    • 素材页开着时不再监听 job
    • 删掉的节点格子照样显示
    • 点到不存在的节点照样选中
    • 大纲用不折叠的链序
    • ⌘K 用不折叠的链序
    • 组头「N 镜」数行数
    • 只有一个产物也编 take 1
    • 历史页自己数号
    • 批量 slot 丢掉「#n」
    • 素材页标签按过期的画廊图数号
    • 素材页退回在产物列表上编号(含批量 slot)

自审修复 3 / 4。

🤖 Generated with Claude Code

KerroKapple and others added 10 commits October 15, 2026 05:19
头注还写着跨画布之后的「再选中」已知会丢、只断言切过去了;#289 之后挂起定位请求已经修好,同文件最后一条用例断言的正是选中 + 居中。按现状改写头注,说清跨画布那一下为什么要等目标画布挂上来再落地。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
状态栏任务弹层开着时,会为每个 job 去 job 所在画布的节点控制器里找源节点,别的画布的控制器因此一直活着;CanvasJobListener 却只让当前画布失效,那张画布上的 job 成功后,「定位」过去看到的还是旧节点表(产物卡「等待中」、大纲没子行、历史页空)。现在注册表里出现过 job 的每张画布都按同一份 CanvasJobEffects.diff 判一遍,命中就让那张画布的控制器(和批量网格)失效;没人 watch 的画布 invalidate 是空操作。监听器不再读当前画布 id。

测试:弹层 watch 着画布 B、当前画布是 A,B 上的 job 转成功且库里 result 已有 image_url ⇒ B 的控制器重新读库、读到带产物的新状态。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
画廊图不只素材页 watch:画廊标签物化后常驻、角色页的引用计数也读它。被它们保活着时,素材页 initState 把注册表里现有的成功 job 全记成「已见」,于是「进过画廊 / 停在角色页时生成成功 → 切到素材页」新图不出现。现在每次挂载时图若已活着就帧后失效一次(没活着本页这次 build 本来就现读),删掉「已见」记账;页开着时的 job 成功刷新改按注册表前后两刻比(上一刻还不是成功、这一刻是)。

删除:当前画布的条目按画布控制器里的实时节点表过一遍(assets_model.assetsWithoutDeleted),节点删了格子立刻消失、计数跟着少,不等画廊图重读;点格子时节点表里找不到就不选中,不再选中一个不存在的 id(状态栏「选中 1」、检查器空)。

测试:画廊图被别处保活着时生成成功、再切到素材页能看到新图;页开着时生成成功新图跟着出来(守住注册表监听);删掉节点格子立刻消失;点找不到的格子不改选中集;assetsWithoutDeleted 单测。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
大纲的「01」和 ⌘K 的「序列 NNN」原来是全部链成员的 DFS 序,不折叠;序列视图和画廊是折叠后的镜序(「借产物」的后继并进前一镜,既无产物也无备注的跳过)。「导入剧本 + 用本镜备注生成图像」那条主路径上,同一张图大纲写 03、画廊写序列 002。

现在镜号统一走 sequenceShotNumbers(outline_model.dart):镜 = buildSequenceLens 的镜,节点归哪一镜 = view_in_sequence.dart 新增的 shotIndexByNode——逐个节点问的就是 shotIndexForSelection 用的那个判据,不另写折叠规则,现有函数一字未动。借出产物的配置节点与借走它的镜头同号;链上但不在任何一镜里的节点不编号,仍留在泳道组里;组内行序仍是叙事链序。组头「N 镜」改成组内不同镜号的个数(OutlineGroup.shotCount)。头注写准:「未入链」组列全部不在链上的配置节点,序列状态栏的「未入链 · N」只数有产物的,两处口径不同。

测试:审查给的两个场景(镜头链 + 用本镜备注生成图像;C1→C2〔无提示词无产物〕→C3〔有图〕)交叉核对大纲镜号 == lens 判据 == 画廊「序列 NNN」;大纲面板的行号与组头「3 镜」;⌘K 路径的「序列 002」两条、没有 004;shotIndexByNode / sequenceShotNumbers / shotCount 单测(新文件)。旧用例里成镜要靠提示词的夹具补上了提示词。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
素材页在画廊产物列表上编号,列表里含批量 slot;历史页只数 result 节点。同一张图左栏写 take 5、右栏写 take 2;只有一个产物时素材页写「成片」、历史页写「take 1」。

统一成 assets_model.takeNumbersOn:每个来源(配置节点)名下有产物的 result 节点按时间正序编号(有没有产物、谁先谁后都照 resultsFor),名下只有一个的不进表 =「成片」;批量 slot 不参与 take 编号,格子照画廊对 slot 的写法写「源配置名 #n」。素材页当前画布的号在画布控制器的实时节点表上数(与历史页同一份,删一个 take 两处一起变),别的画布用画廊图。历史页改用同一个函数,名下只有一个时写「成片」(新 ARB 键 inspectorHistoryFinal,待补)。

测试:外壳级同屏核对——普通生成 + 三格批量混在一起时两处号一致、slot 写「#n」,只有一个产物时两处都写成片;历史页单产物写成片;assetCaptions 批量 slot 不占号(旧夹具补上产物 url 与时间戳);takeNumbersOn / slot 号 / 实时节点表单测(新文件)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nvas/util/take_numbers.dart

canvas/util 的大纲纯函数原来为了一个判据 import 了要 ref、要切外壳标签的 view_in_sequence.dart;检查器
历史页原来从左栏素材页的 model 里取编号函数。判据与编号函数本身一行没改,测试随文件搬家。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@KerroKapple
KerroKapple merged commit 24a9002 into main Oct 16, 2026
5 checks passed
@KerroKapple
KerroKapple deleted the fix/data-consistency-audit branch October 16, 2026 03:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant