Skip to content

复盘类三张图的打磨记录(B 组) ​

状态:2026-10-15,原型探索记录,不是产品规范。记录写于第一次自由运行(free-composite-2026-10-15)打磨出的演示数据,2026-10-15 晚按第二次自由运行(free-20261015-161501)的演示数据更新了引用:事项、计数与例句换成新数据;性能数字与截图是在旧数据上测得、拍下的,没有重做。分支 codex/polish-review-b,起点 codex/real-data-prototypes(0974595)。范围是第二轮草图里的 03 来源矩阵、04 让位图、05 批次记谱:从单帧静态草图做成完整版,默认数据是 composite(Jonas 的两周,29 帧、3196 条输入),手写情境 ?data=story 同样可用。概念卡与真实数据下的问题清单见 CONCEPTS.md,本文不改它。

三张都是复盘类:不承载作答,只标出问题的开闭和作答之后份额的去向。

共同的页框 ​

三张共用新的 sketches/stage.mjs 与 stage.css,每张图自己的画法在 <id>.mjs 与 <id>.css,<id>.html 只负责加载。

  • 帧导航与 shell 一致:?frame=<序号> 记在 URL 里(也接受帧 id,进入后改写成序号),←/→ 逐帧,Home/End 首尾,空格播放(每帧 1.5 秒,减弱动效时 1.8 秒),‹ ▶ › 按钮,顶栏一排帧刻度可点、可按住拖动,悬停刻度显示时间与旁白。刻度在换天处留 3px、换章处留 7px。
  • 侧栏:没有固定时写“这一轮”(或“累计到此刻”);固定一件事或一个来源后写详情,Esc 或 × 取消。详情统一给摘要、依据、登记过的问题(开着 / 已答 / 已失效)、你的回应、来源(引用 + 可展开的来源原文 + 原链接)与版本列表。侧栏底部是“同一帧在其他形式”,链接带当前 ?frame= 和 ?data=,去身份线、回应时序、另两张、两周小倍数与 A/B/D。
  • 来源处的回应写成动作句:responseSentence 把 via: source 的反馈写成“你在 GitHub 上批准了 #13572”“你在问答站回复了 Liv Juhl”,对象取链接里的 PR / issue 号,没有号就用事项短名;同一线程的多次评论折成“……(6 次)”。家庭流的动作改用共享的 familyMove,写成“你用 iMessage 回复 Kajsa”“你给母亲打了电话”,与手机首页、回应时序等其他形式一致(见文末家庭动作的句子)。只有带 ask 的反馈才算作答,其余只说“指向事项”。原文只在详情里的“来源原文”折叠块里出现。
  • 一份提示框:悬停与键盘聚焦给同样的提示,位置在标记上方,贴边时翻到下方。
  • 计时:每次切帧把顶栏、图与侧栏的重绘放进 performance.now() 计时;URL 带 ?perf 时再强制一次样式与布局,读数写在图例右端,也可从 foldSketch.perf() 取。
  • 不重算状态:切帧直接读回放预先算好的快照,不调用 createModel 的投影与 diff,这是单步能留在一帧之内的前提。

演示数据只动了一处,经 edits.json 重放:为 60 件根层事项手写短名(categories.<id>.short,如“猫看病”“主水管”“NTLM 复用”“复用绕过”),只有让位图与批次记谱用它,记录在 POLISH.md。

04 让位图 ​

2026-10-20 起,这张图的动画与交互按第三轮的标准重做,见 yield-motion.md:一轮按“出账、过池、入账、平账”过账,直接打开时讲一遍三拍,悬停与展开改用 motion/ix.mjs,↩ 旁加了失效的 ○。下面的“交互”“动画”“性能”是重做之前的样子;画法要点与“还没解决”仍然有效,卡与侧栏现在写“同一轮拿到”,不写“让给了谁”。

主关系:每一轮份额从谁那里来、到谁那里去;左翼让出、右翼拿到,根层永远 64 份,所以每行两翼等长。

场景:复盘某一件事为什么变大了、它的份额是从哪些事项和留白挪来的;作答之后,那件事让出的份额给了谁。

画法要点

  • 每帧一行,行的位置固定,此刻之后只留淡色时间;此刻行加框。
  • 1–3 份的变化在每一翼合成一个“其余 N 件”(只有一件时不合),底边一条细色带显示成员;点开后色带升成逐件的色块,再点收起;顶栏“合并小额 / 逐件”一次切换全部。
  • 色块里写短名与份数,放不下时退为截短的短名,再放不下才只写数字。
  • 一轮挪动超过 30 份的行(8/3 冷启动)整行按比例缩小,左右仍等长,侧栏注明。上限取各行挪动份数的第二大值(不低于 18),旧数据里是 28。
  • ↩ 标在这一轮你作答了登记问题的行;✎ 是批注(手写情境)。

交互

操作结果
悬停色块同一件事在每一行亮起;它让出的那几轮,右翼拿到份额的事项保持原色;它拿到的那几轮,左翼让出的保持原色;其余淡到 18%;提示写前后份额
点击色块固定,侧栏写“份额往来”:每一轮的前后份额与同轮的让出方或拿到方,点时间跳帧;下接事项详情
点击 ↩固定被作答的事项,侧栏先写作答的动作句与问题,再写“之后份额让给了谁”(之后的轮次一并列出,灰色表示在此刻之后);它藏在“其余”里的那几行自动展开
点击“其余 N 件”展开或收起这一组
点时间或旁白跳到那一帧
键盘Tab 逐个标记,↑/↓ 换到上一行或下一行最近的标记,Enter 固定或展开,Esc 取消

动画

  • 新的一行从左到右扫出:左翼从外端扫到中线(220ms),中线一道细线划过、留白数字滑入,右翼再从中线扫向外端(260ms,延迟 230ms),旁白最后淡入。份额的方向就是扫的方向。后退时这一行淡出(160ms)。
  • 此刻框沿纵向滑到新行(320ms)。
  • 一次跳多帧时新行依次扫出,间隔不超过 45ms,总长约 320ms。
  • “其余”展开:色带高度升成色块(240ms),名字在 150ms 后淡入。
  • 高亮变化只动透明度(100ms)。

性能(headless Chrome,1440×900,composite,76 次切帧:逐帧前进、逐帧后退、20 次跳帧):整步重绘脚本 p50 1.4 ms、p95 3.2 ms、最大 3.3 ms;含强制样式与布局 p50 2.8 ms、p95 6.8 ms、最大 7.2 ms。悬停到高亮生效 p50 2.1 ms、最大 7.1 ms。

截图(本机 .local/polish-review-b/yield/,不提交):frame-f22.png、frame-f08.png、frame-f28.png;seq-f20-f21-000ms.png 到 -400ms.png(动画放慢十倍,每 80ms 一张);hover-cat.png、detail-cat.png、answer-13572.png、expand-row21.png、unfold-all.png、tick-hover.png、reduced-motion-f11-60ms.png、story-default.png。

还没解决

  • 回执没有“谁为谁让位”的配对,图只能把同一轮的让出与拿到并排;“之后份额让给了谁”写的是同轮拿到方,侧栏有说明,但读者仍可能读成因果。
  • 8/3 冷启动一行缩到 0.53(旧数据 0.55),色块里多半只剩数字。
  • 只画根层;子层的 64 份没有入口。
  • “其余”里的单件只有悬停或展开才看得到名字。

03 来源矩阵 ​

主关系:每件事由谁推动:谁的输入被用到了哪件事、在哪几天,每个来源又有多少被判为重复、暂缓或噪音。

场景:复盘某件事背后是谁在推动(master CI 由 github-actions、你自己和 windy-drift 推动),以及哪些来源整块都没进事项(社区 719 条一条也没被采用,订阅 0%;旧数据里社区还有 4%)。

画法要点

  • 行先按流分组(你自己、工作、家庭、生活、社区、订阅;手写情境没有流,按人、机器、订阅、官方资料),组内按贡献排序(采用条数,其次总条数)。
  • 本人在四个平台的署名(Jonas Berglund、jberglund、jonasbe、Jonas B.)合成一行。
  • 两周采用率低于 10% 的组默认折成一行:一条比例条 + 这组合起来的格子,▸ 展开成组内的人。
  • 每组按可用高度显示前几位,其余折成“其余 N 位”,▸ 展开后按贡献排序,每次 40 位,可继续“再显示”;展开后矩阵可纵向滚动,列头不动。
  • 列是根层事项:按到此刻的采用条数取前几件,按首次出现排列,其余合成“其余 N 件事”,最右是“没进任何事项”。颜色只在列头。
  • 累计时每格是一条两周的小时间线,每帧一根细柱,高度随条数对数增长,深色是采用;本轮时每格逐条画 ● ○ ◌ ×。
  • 右栏是这个来源全部输入怎么判的比例条、条数与采用率。

交互

操作结果
悬停格子十字高亮:这一行与这一列保持,其余变淡;提示写条数、怎么判、在哪几天
悬停来源名 / 列头只留它喂过的列 / 喂过它的行
点击格子侧栏列出那几条输入:时间、处置、Agent 的判断理由、关联事项,原文可展开
点击来源名侧栏写署名或渠道、条数、用到了哪些事(可点)、你在来源处的动作(本人行)、最近的输入
点击列头侧栏写“谁推动它”的排名,再接事项详情
▸ / ▾展开或折叠一组、一段长尾
累计到此刻 / 只看本轮切换范围,快捷键 T
键盘Tab 逐个来源名与格子,↑/↓ 换行并保持在同一列,Enter 固定(在折叠行上是展开),Esc 取消

动画

  • 行与列都是按身份保留的元素:切帧后排名变化的行纵向滑到新位置,列头与格子横向滑到新列(320ms);新出现的行、列淡入,离开的淡出(200ms)。
  • 累计时这一帧新增的细柱从底部长出(320ms),只在逐帧前进时出现。
  • 切换累计 / 本轮几乎每一行都会换位,不让行交叉滑动,改为整块淡出、原地重排、淡入(约 260ms)。
  • 格子只在内容变化时重写,没变的格子不动。

性能(同上,累计 57 次切帧、本轮 28 次):累计时整步脚本 p50 4.1 ms、p95 5.9 ms、最大 6.0 ms;含样式与布局 p50 8.1 ms、p95 10.5 ms、最大 11.1 ms。本轮时脚本 p50 2.8 ms、p95 3.1 ms;含布局 p50 7.4 ms、p95 8.4 ms、最大 8.6 ms。悬停 p50 1.3 ms,第一次悬停 21 ms(提示框首次布局)。

截图(.local/polish-review-b/provenance/):frame-f28-cum.png、frame-f08-cum.png、frame-f22-cum.png、frame-f22-round.png;seq-f21-f22-*.png(切帧)、seq-scope-*.png(切换范围);hover-cell.png、detail-cell.png、detail-column.png、detail-self.png、unfold-community.png、open-rest-work.png、open-rest-work-scrolled.png、reduced-motion-f11-60ms.png、story-default.png。

还没解决

  • 60 件事只能给出约 10 列,“其余 N 件事”一列最密,读者的眼睛会先落到它上面;列的取舍随帧变化,播放时偶尔有一列换掉。
  • 累计格里的细柱只有 1.4px 宽,能看出“在哪几天”,看不出单条;单条要点开格子。
  • 处置(采用、重复、暂缓、噪音)仍只存在于演示数据的 disposition,状态与回执里没有;来源类型(机器、订阅)来自语料构建时推断的 author_kind。
  • 展开的长尾一次 40 位,几百位的组要多次“再显示”。

05 批次记谱 ​

2026-10-19 起,批次记谱按第三轮的动画标准改过:列序(收到挨着改动)、收到条的画法(采用的颗粒、外框、行下灰烬)、谱底合计行、默认帧(最后一帧)、开场与换帧的动画、悬停与展开(接 motion/ix.mjs)都以 notation-motion.md 为准;本节下面的画法、交互与动画是此前的样子。

主关系:每一轮整理由什么组成:收到几条、各怎么判,对哪几件事做了什么;两周里整理的疏密,和你插话的时刻。

场景:复盘某一轮 Agent 读了多少、丢了多少、动了几件,这一轮登记了几个问题、哪些悄悄失效、哪些被你答掉;点一行把其他形式带到同一帧。

画法要点

  • 每帧一行:时间、与上一轮的间隔(线长 = 小时,节奏变了才写数字)、收到(条形长度按条数,分采用、暂缓或重复、噪音;上沿朱红是你自己的输入)、问题(◆ 新登记、◇ 失效、↩ 你答了)、改动、回执、旁白。
  • 改动只为新增 +、变大 ▲、撤下 ⊘、合并 ⋈ 逐件画记号,变小 ▼ 与只改内容 ◇ 只写件数;记号超过 12 个改成“记号 × 数”,问题超过 6 个也一样,不挤进下一列。
  • 旁白不截断:先缩一点字号,再折成两行;全文和 narrative 在侧栏。
  • 朱红只表示来自你本人:你的输入、批注与作答。

交互

操作结果
点一行跳到那一帧;URL 改成 ?frame=,侧栏底部的链接带着它去其他形式
悬停收到 / 问题 / 改动提示写各处置条数 / 每个问题的原文 / 每类改动的事项名
悬停某个改动记号这件事在每一轮的记号一起亮起,其余记号变淡,右侧记号列标出它每一轮的改动
点击记号或侧栏的事项名固定这件事,侧栏写它在每一轮的改动(可跳帧)与事项详情
侧栏“这一轮”收到的处置与流,来自你的动作句,登记、失效、答了的问题,按类列出的改动,回执
键盘↑/↓ 也逐帧(记谱里行就是帧),Tab 进侧栏逐个事项名,Enter 固定,Esc 取消

动画

  • 新的一行落下:收到条从左长出(260ms),问题与改动记号淡入下移(120ms 后),回执与旁白最后(220ms 后);此刻线滑到新行(320ms)。后退时这一行淡出(160ms)。
  • 追踪一件事时右侧记号列的圆标弹出(160ms)。

性能(同上,76 次切帧):整步脚本 p50 1.5 ms、p95 3.3 ms、最大 3.9 ms;含样式与布局 p50 3.1 ms、p95 7.4 ms、最大 7.6 ms。悬停 p50 0.8 ms、最大 3.1 ms。

截图(.local/polish-review-b/notation/):frame-f22.png、frame-f10.png、frame-f28.png;seq-f21-f22-*.png;hover-ops-row18.png、hover-mark-trace.png、hover-chip-trace.png、detail-item.png、click-row16.png、reduced-motion-f11-60ms.png、story-default.png。

还没解决

  • composite 每 12 小时整理一次,间隔一栏几乎不变,“疏密”主要靠收到条的长短读出。
  • 收到一栏仍依赖演示数据的逐条处置;批次说明仍借用回放旁白(frame.title、narrative),契约里没有。
  • 改动的件数含子项,子项与根项用同样的记号,没有区分大小。
  • “你上次看到这里”画不出来:last_seen_at 恒为 null。

验证 ​

  • 截图与交互检查用本机 Chrome 无头运行(CDP),服务在 4195 端口;切帧过渡序列用 Animation.setPlaybackRate(0.1) 把动画放慢十倍,每 800ms 截一张,相当于每 80ms 一张。
  • 键盘检查逐项通过:←/→、空格播放、Home、↑/↓、Enter 固定与展开、Esc 取消、T 切换范围、侧栏链接带 frame=。
  • prefers-reduced-motion: reduce 下三张切帧后 60ms 截图都已是终态。
  • node scripts/shoot-forms.mjs --only yield,provenance,notation,lineage,timing,gallery 与 --data story 都无报错;画廊缩略图正常。

没有改的共享文件 ​

shell.mjs、kit.mjs、sketches.css、forms.css、catalog.mjs、forms/index.html、respond.*、engine.mjs 都没有改。需要别处同步的文字:画廊卡片与 catalog.mjs 仍把这三张写成“单帧草图”,原型说明仍写“每张只画一个选定帧,没有帧导航与交互”。

Safari 检查(2026-10-15) ​

合页 all.html 做完后,在 Safari 27 里实际打开看过,并用离屏 WebKit(WKWebView,与 Safari 同一引擎)按 1440×900 逐节截图,和 Chrome 无头截图并排对比;顶栏切到 f05 后再截一遍。让位图、来源矩阵与批次记谱与 Chrome 一致,没有需要修的差异。

家庭动作的句子(2026-10-15) ​

演示数据换成含家庭流的版本后,stage.mjs 的 responseSentence 仍按工作流的模板写本人在家里的动作:渠道取频道头、对象取事项短名,于是 21:31 回 Kajsa 的那条 iMessage 写成“你在 iMessage 上回复了 猫看病 的讨论”,手机首页同一条写的是“你用 iMessage 回复 Kajsa”。模板还把不认识的动作原样拼进句子:“你在 iMessage 上done了 猫看病”“你在 iMessage 上keep了 9/14 航班”“你在 Telefon 上打电话了 母亲换水管”“你在 iMessage 上回了表情了 猫看病”。分支 codex/review-b-family。

  • 句子:via: source 且 familyMove(event) 有值时,句子写成“你” + familyMove,meaning: decide 时接“,选了「选项」”,与 shared.mjs 的 familyMove 及手机首页、回应时序的写法相同:“你用 iMessage 回复 Kajsa”“你在兄妹群里回复”“你给诊所打了电话”“你用短信回复邻居 Gunnel”“你给 Kajsa 的消息点了赞”“你用 iMessage 回复 Kajsa,选了「照原航班」”。composite 里 49 条家庭动作的句子变了;工作、社区与生活流的 111 条逐条比对没有变,手写情境的 15 条也没有变。
  • 折叠与事项名:家庭动作的句子按设计写人不写事项,和 Kajsa 的一个对话会涉及猫、Ture、主水管好几件事。foldSentences 对家庭动作按“句子 + 事项”折叠,并带出 item;批次记谱的“来自你”、来源矩阵本人行的“你在来源处的动作”在句子后面加事项色标(可点、可固定),让位图的“你作答的问题”加不可点的色标(整行本身就固定那件事),↩ 的提示框加“· 事项短名”。事项详情里的“你的回应”与让位图固定作答时的“作答”本来就在那件事里面,不加。工作流的句子自带对象(PR 号、对方或事项短名),不加色标,折叠方式不变。
  • 批次记谱的余数:“N 条你自己的输入没有指向事项的动作”改为逐条数没有反馈链接的本人输入(原来是本人输入数减去有链接的输入数,只在本人输入多于反馈链接条数时才显示,一条输入带多个链接时会漏);其中有家庭流时,括号里的例子加上“家里的消息”。
  • 没有改的:来源矩阵里家庭各行的副标题与详情里的来源行仍照原样写频道(“iMessage · Kajsa”“WhatsApp · Kräftskiva 22/…”),和手机首页的来源列表一样是来源标注,不是本人的动作;瑞典语群名要不要在所有形式里统一译成“家庭群”“派对群”,是跨形式的决定,这里不单改。

验证:在 worktree 里另起服务(4196 端口),node scripts/shoot-forms.mjs --base http://127.0.0.1:4196 --only yield,provenance,notation --frame 22(以及 18、26)截图逐张看过:批次记谱 f22 的“来自你”写“你在家庭群里回复 · Ture 发烧”“你用 iMessage 回复 Kajsa(2 次)· 猫看病”“你给母亲打了电话 · 母亲换水管”,f18 写“你给诊所打了电话 · 猫看病”;让位图 f23 写“↩ 你给诊所打了电话 · 猫看病”,f16 的提示框与侧栏写“你用 iMessage 回复 Kajsa,选了「照原航班」· 9/14 航班”;来源矩阵本人行详情、事项详情的“你的回应”(8/13 21:31 你用 iMessage 回复 Kajsa)都对,没有溢出,长句带色标时色标折到下一行。手写情境三张无报错;--only all --check all-sync 通过。截图在本机 worktree 的 .local/review-b-family/,不提交。