Skip to content

等待链 · 参考、数据、故事与交互 ​

状态:原型探索,2026-10-28,分支 codex/case-chain;已实现,第 5–6 节记实现与验证。第四轮候选 05(INSPIRATION.md)按第三轮的六步流程(reference → data → story → motion → direct → ship)做成完整形式 sketches/chain.html。第 1–4 节在任何东西动起来之前写定:参考、“谁在等你”由哪条规则现算、一个论点一个英雄数字三拍、交互;第 5–6 节是实现的取舍、与故事的出入和验证。页面只读同一份 scenario.mjs 回放,不加字段、不改契约;下面的数都由页面用同一推导现算,推算脚本只留在本机。范本是回应时序(时间走、刻度上硬切)与 B 时间展开(三拍、答了要等下一轮整理)。

1 参考 ​

起点:第四轮的静态草图 ​

草图读 composite 的 f26(8/16 00:00),一根朱红竖脊上排着七个“你”,一件事一行;左边是等你的人,离脊越远等得越久(对数距离),线上写小时数;右边是你答了之后才能动的下一环,带期限的写“期限还有 34 时”;底部灰着两条不经过你的链。用户看过说可以往下做。它讲不动的地方:

  1. 谁在等是手工标注的。 草图的 9 人里,有两件事(母亲搬迁、后刹)此刻没有登记问题,三个旧 PR 的三位作者不在那件事的依据里,6B 班主任是学校 App 的群发;这些都来自读者对原文的理解,状态里没有。做成形式必须按一条写明的规则现算,见第 2 节。
  2. 下一环也是手写的。 “水管工周二开工”“#13587 关闭”“Signe 19 日开学”写在条目的 reason 与 summary 里,是自然语言;规则能拿到的只有问题的选项、approve 要执行的外部动作(subject)与期限。
  3. 一帧。 等待会变长,问题会关上,人会被放走;静态图看不出“答掉一件,放走一串人”。

两张参考图 ​

参考画面上读到的搬什么不搬什么
#77 Flighty “Where's My Plane?”一根竖线倒着读上游:最上是“我的航班”,往下是正在飞的那一段与更早的几段;飞完的段是实心点,没到的是空心圈;每段的迟到数一律右对齐一根脊、一件事一个结:开着的问题是空心结,你答了就填实;等了多久写在线上,像每段的迟到数深灰卡片、渐变、飞机图标;红色表示迟到(这里朱红只给你)
#82 AMAN 到达时间梯中间一根竖向时间尺,此刻在最下端,刻度随时间往下走;每架飞机写在尺左侧,左列是还要吸收的延误分钟数;选中的一架加黑框时间尺跟着此刻走:这里的横轴是“离此刻多久”,时间往前走,所有等你的人一起离脊更远,近的走得快、远的几乎不动(对数);选中的一行加墨框灰底窗口、编号标注、彩色航班号

已有形式都没有画的 ​

回应时序画每个问题开了多久、怎样关上;B 画期限在此刻之后的哪里;D 只取最急的 3 张;来源矩阵数谁喂了哪件事。没有一种画“这个问题后面站着谁”,也没有一种让人看见“答掉一件,放走的是一串人”。

从回应时序与 B 搬什么 ​

要素出处等待链理由
时间本身是节拍回应时序:此刻缓出走完 12 小时,在批次刻度上硬切搬,换参照系横轴以此刻为原点,时间走的时候每个点按 log₂(1 + 小时) 往左滑;问题的开闭、等你的人换了谁、英雄数字都在批次刻度上硬切
数字只在节拍上动回应时序的 240、B 的“还有几小时”搬“N 人在等你”在切点后 0.4 秒硬翻,不滚动;线上的小时数跟着点走,那是几何,不是节拍
答了要等下一轮整理读到B、D:卡原地收成回执,下一轮读到了才让出份额搬你答的那一刻结在脊上填实,人还挂着;下一轮整理关上这个问题,人才松开
一颗一条回应时序批次条里的灰点搬到概念层每行底下一道细刻是这件事上进来过的一条输入,落在它自己“离此刻多久”的位置
循环、一直动、暗底辉光拨盘、脉冲不搬复盘工具;落定后整页静止

概念层约一成,只在时间走的时候动。 每行底边一道“地毯”:这件事上进来过的每条输入一道 1 像素的灰刻(relatedIds 含这件事,或被它引作依据),落在同一条对数横轴上;等你的人那几条另画成墨点,不在地毯里重复。时间走时地毯跟着往左滑,新进来的一条在脊旁淡入;静止、悬停、展开时零运动,prefers-reduced-motion 时不画。它不进脊右边的字,最亮不超过灰色的不经过你那几行。

2 数据:谁在等你,由规则现算 ​

规则 ​

页面用 live.mjs 的 askPaths 口径认“开着的问题”(登记时条目在根树上;条目改写而这一帧没有重登记就关上),再对第 k 帧开着的每个问题:

  1. 读它所在条目第 k 帧那一版的 sources,取其中 ref 指向输入(event:…)的那些,且输入已经到达(event.at ≤ frame.at)。只读依据,是让 Agent 自己的判断先筛一遍:同一件事 relatedIds 关联的输入多得多(主水管 29 条,三个旧 PR 39 条),大半是你自己、机器与旁证。
  2. 去掉你自己(self,或 from 等于人物名)。
  3. 去掉机器:author_kind 为 bot 或 automation(GitHub Actions、Copilot 评审、学校与幼儿园 App 的群发、银行与诊所的自动短信、语音信箱)。
  4. 去掉公开资料:带 publicSourceId 的输入(story 的上海博物馆、web.dev、MDN)。
  5. 去掉旁观者:家庭流群聊里通讯录外的人(from 以 ~ 开头,WhatsApp 给没存的号码就这样显示),以及公开站点上的陌生人(stream 为 life、community、subscription:问答站、论坛、订阅)。在问答站回你帖子的人与班级群里提醒查头虱的家长,不是在等你回答。
  6. 剩下的作者(from 取 · 前的部分)每人算一个“等你的人”。等了多久 = 此刻 − 他在这一版依据里最早的那条输入;他后来又开口的条数写在名字旁边。
  7. 一个问题一个人也剩不下:左边只画问题自己,从登记起算,写“没有人开口,问题自己等了 N 时”。

英雄数字 = 第 k 帧所有开着的问题上不同的人数(同一个人挂在几件事上只算一次)。旁边写挂得最多的那个人与等得最久的那个人。

下一环(脊的右边)只用此刻已知的:问题的选项(推荐项标出)、approve 的执行对象(ask.subject.label,如“合并 skarv/skarv#13572”)、期限(ask.due_at,没有就取条目第 k 帧的 due_at)。答了之后真实动了什么只在它发生之后回看:问题关上的那一帧,那件事从脊上移到底部,右边写它这一帧的新标题与份额变化,同一件事登记了下一问就写“下一问:…”,还挂在下一问上的人跟着走。

不经过你(底部灰行):第 k 帧在根层、此刻没有登记问题的事里,按同一条规则仍有人开过口的,按份额取前 4 件,每件写最近开口的那个人与多久之前;其余记成“另有 N 件”。它们此刻不在你这里等。

规则的口径与回应时序、份额拨盘一致:askPaths 与 stage.mjs 的 askLife 在 composite 上逐帧一致,只认登记时条目在根树上的问题。推算方法:用 engine.mjs 的 replayScenario 重放,照抄上面的规则逐帧列出;脚本是一次性的,不进仓库。

composite(默认,Jonas 的两周) ​

29 帧,f00 8/3 00:00 到 f28 8/17 00:00(Europe/Stockholm),每 12 小时一轮。

量值
开着的问题(逐帧累计)171 个问题·帧,其中 137 个(80%)至少有一个等你的人
每帧在等你的人0–10 人;最多是 f08(8/7 00:00)的 10 人
两周里等过你的人20 人:Kajsa 挂了 45 个问题·帧,hardy_birch 24,Joakim Ek 23,Mamma 22,lichen71 与 Ulrika 各 18,Göran Wallin 16
各条排除去掉的依据(输入·帧)你自己 92;机器 98(10 个作者);群里通讯录外的人 26(~Emir、~Josefine、~Liselott、~Pär K);公开站点上的陌生人 74(15 个作者,如问答站的 Wilma、calm_kelp);公开资料 0
等得最久lichen71,f22 时等了 262.9 小时(11.0 天),挂在“#13572 堵复用绕过:批准?”上
一个人挂在三件事上f04 的 hardy_birch(三个 PR)、f22 的 Kajsa

故事那一轮(规则见第 3 节):f22 → f23。 f22(8/14 00:00,旁白“热浪第一天:药量超过失明线”)5 个问题开着、9 人在等你:

问题份额等你的人(等了多久)下一环
母亲九月住哪?24母亲 9.7 天(3 条)· Kajsa 3.1 天 · Ulrika 9 时住我们家 / 去临时公寓 / 各住一段 · 期限还有 24 时
Smilla 多吃了药:打诊所?24Kajsa 2 时打给诊所(推荐)/ 先观察 · 期限还有 8 时
VAB 报了吗?3Kajsa 17 时 · Signe 11 时已申报
#13572 堵复用绕过:批准?6lichen71 11.0 天 · noble_isle 3.5 天 · hazel_thistle 15 时 · hardy_birch 11 时(3 条)· zesty_egret 10 时批准(推荐)/ 要求修改 / 评论 ⇒ 合并 skarv/skarv#13572
Signe 的同意书签了吗?1没有人开口(依据只有学校 App 的群发与 6B 群里三位通讯录外的家长)已签 · 期限还有 5.0 天

Kajsa 一个人挂在三件事上。这一轮里你答了两件:8/14 08:02 给诊所打了电话(答“打诊所?”,比 08:00 的期限晚 2 分钟),11:38 在 GitHub 上批准了 #13572。f23(12:00,旁白“打了诊所;母亲自己定了”)只剩 3 个问题、2 人在等你:

这一轮关上的怎样关上放走答了之后(f23 回看)
Smilla 多吃了药:打诊所?你答后关上Kajsa(她还挂在 VAB 上,不算被放走)24 → 12 份,“Smilla已减量,24日9:30复诊”;移到不经过你,最近开口的是诊所(4 时前)
#13572 堵复用绕过:批准?你答后关上,同一件事登记了下一问lichen71、hazel_thistle、hardy_birch、zesty_egret6 → 6 份,“#13572已批准,另3个PR待审”;下一问“三个旧 PR 推到哪天?”,noble_isle 还挂着(4.0 天)
母亲九月住哪?改写后失效,没等你开口母亲、Ulrika24 → 6 份,“Mamma已交回执,选疏散公寓”

9 → 2:放走的 7 人里,4 人是你答掉的两件放走的;母亲与 Ulrika 是母亲自己定了;Signe 是 Agent 改写 VAB 那件事时不再引她那条“ture spydde”。这一轮是两周里“被你的回答放走的人”最多的一轮;其余你答过的 7 轮最多放走 3 人(f08 → f09,NDEBUG 那件的三位)。

和草图(f26)对一下。 规则在 f26 算出 4 人:Kajsa(VAB 2.7 天、主水管 11 时,挂两件)、水管工 Ronny(11 时)、hardy_birch(8 时,3 条)、quiet_sedge(3 时)。草图写的 9 人里:

  • 母亲搬迁、后刹此刻没有登记问题,规则把它们放在不经过你(Ulrika 7 时前、Kajsa 8 时前开口)。
  • 三个旧 PR 的依据只有你自己合入与关闭的三条,三位作者不在里面,所以左边只画问题自己(36 时);Agent 在 reason 里写着“三个旧PR还在等你”,规则读不到。
  • Signe 的同意书依据是学校 App 的群发(机器)与 6B 群里通讯录外的家长,左边只画问题自己(2.0 天),期限还有 3.0 天写在右边。
  • 草图里的 icing 是评审请求原文里的名字,事件的作者是 hardy_birch(化名改写只改了作者字段),规则按作者认。
  • 等得最久的是 Kajsa(VAB,从 8/13 07:12 那条“Glöm inte anmäla vab”算起 2.7 天),不是草图的 6B 班主任 5.4 天。

默认帧 f28(两周结束,旁白“两周结束:水管还没回”):7 个问题开着,7 人在等你:主水管上水管工 35 时、Kajsa 13 时,期限还有 10 时;#13596 上 hardy_birch 32 时、quiet_sedge 27 时;派对 Swish 上 Joakim Ek 12 时;“母亲 23 日来吃饭?”上 Ulrika 31 时、母亲 5 时;VAB 上 Kajsa 3.7 天,是等得最久的;同意书与三个旧 PR 没有人开口。

story(手写情境,林苒的两周) ​

37 帧,cold-00 10/12 08:30 到 f34 10/25 19:40(Asia/Shanghai),不定时。story 没有 stream、author_kind 与 self,你自己按人物名认,第 3、5 条排除在这里什么也不去掉。

量值
开着的问题(逐帧累计)131 个问题·帧,其中 113 个(86%)至少有一个等你的人
每帧在等你的人0–4 人
两周里等过你的人7 人:许宁 33、苏禾 21、妈妈 18、周屿 17、物业小赵 13、陈澄 12、唐可 5
各条排除去掉的依据你自己 41;公开资料 7(上海博物馆);其余 0
等得最久许宁,f21 时等了 83.1 小时(3.5 天),挂在“请店长解释暂存列”上
一个人挂在三件事上f04 的周屿;f05、f06、f22、f23 的许宁

故事那一轮:f25 → f26。 f25(10/21 09:15)2 个问题、3 人在等你:“苏禾改约周四 19:30”上苏禾 2.0 天(期限还有 34 时);“今天是否加开三店?”上周屿 14 分、唐可 6 分(期限 10:00,还有 45 分)。17:09 你回复“加开三店”,比期限晚 7 小时 09 分。f26(17:30,旁白“已从两店扩到五店,暂不全量开放”):这件事 24 份不变,标题“导出发布已扩至五店”,移到不经过你,最近开口的是周屿(9 分前);周屿、唐可被放走,3 → 1,只剩苏禾。

默认帧 f34:2 个问题,1 人在等你(“下周是否再加两店?”上周屿 9 分);“周一谈合作前,准备暂存列这个取舍”刚登记,没有人开口。

规则推不出来的 ​

  • 转述的等待。 story 的“周六中午去妈妈家吃面”(f30)依据只有林苒自己的一句“妈妈说明天中午煮面,问我去不去”,妈妈在等,规则看到的只有你。
  • 机构的期限。 Signe 的同意书是学校要的,但学校只发了群发;规则按“机器”去掉,左边只剩问题自己,期限照样在右边。
  • 没被引用的人。 三个旧 PR 的作者在等复审,依据里却只有你自己的三条。
  • 旁证里的人也算。 quiet_sedge 是报告者,他在 #13596 下说“it fixes it”,规则把他算作在等你批准;Signe 那条“ture spydde”被算进 VAB。规则只保证“这件事的依据里有他开过口”,不保证他真的在等这一问。

这些缺口记在 CONCEPTS.md「发现:状态缺少的信息」。两套数据下八成以上的开着的问题都找得到有名字的人,所以往下做;页面上照写规则,并在“怎样算出来”里列出上面四条。

3 故事 ​

论点:等你的人一串一串挂在问题上;答掉一件,放走的是一串人,那件事从此不再经过你。 composite 的 f22 有 9 个人挂在 5 个问题上,Kajsa 一个人挂在三件上。之后的 12 小时里你答了两件:给诊所打了电话,批准了 #13572。下一轮整理读到之后只剩 2 个人:#13572 后面的五个人走了四个,猫看病那件交到了诊所手里,母亲那件是她自己先定了。

英雄数字:N 人在等你。 不同的人,一个人挂几件只算一次。

  • 位置在右栏顶上,字高 64 px,全页只有它这么大;下面一行写挂在几个问题上、谁挂得最多、谁等得最久。
  • 第 1 拍逐个落定:每有一个新的人连到脊上,它就硬切加一;同一个人连到第二件事时不加,她的几个点之间亮一道细墨线。
  • 时间走的时候它不动(人还在等,Agent 还没读到);切点后 0.4 秒硬翻成下一轮的值。
  • 图上同步回声:脊上每个结旁写这一问后面几个人,加起来减去重复的人就是它。

故事那一轮怎样选。 规则:两周里“被你的回答放走的人”最多的一轮(一个人在 k 帧挂着的问题,到 k + 1 帧全都是你答后关上的,才算被你放走),并列取放走总人数多的,再并列取早的。帧号由规则算出,不写成常量:composite 是 f22 → f23(4 人),story 是 f25 → f26(周屿、唐可 2 人)。

三拍(composite 约 12 秒,括号里是 story,约 9 秒;放一次就停,不循环;时长按第 5 节的出入 1 改过)

拍时长与帧发生什么英雄数字观众此刻
1 谁在等0–4.6 秒,f22(f25,0–3.25 秒)0–0.4 秒静止,只有对数横轴与刻度;0.4 秒脊从“你”往下长出(0.5 秒);之后每 0.45 秒落一行:结出现,右边的问题与下一环淡入,等你的人从结往左拉出去、落在自己等了多久的位置(0.5 秒,缓出);Kajsa 第二、三次连上时她的点之间亮一道细墨线 1.5 秒0 → 9,逐人硬切(0 → 3)有一串人在等我,Kajsa 一个人挂在三件事上
2 你开口4.6–8.8 秒,f22 00:00 → 12:00(f25 09:15 → 17:30,3.25–5.8 秒)时间走:所有点一起往左滑,近的快、远的慢,地毯跟着滑;走到 08:02 停 0.9 秒,猫看病那一行的结填成朱红,旁边写“你给诊所打了电话 · 08:02”;再走到 11:38 停 0.9 秒,#13572 那一行的结填实,写“你在 GitHub 上批准了 #13572 · 11:38”(story:17:09 一次,“加开三店”);人都还挂着9 不动(3 不动)我答了,但人还没走:要等下一轮整理
3 一串人松开8.8–12.5 秒,切到 f23(f26,5.8–9.4 秒)切点前 0.3 秒其余行压到七成;切点:关上的三行的线从结上松开、缩回各自的点并变灰(0–0.45 秒),整行滑到底部的不经过你(0.45–1.05 秒),右边换成这一帧的新标题;#13572 那一行留在脊上换成下一问,noble_isle 的线重新系到新结上;母亲那一行的结变成灰空心,写“问题失效”;0.6 秒数字硬翻;静 2 秒9 → 2(3 → 1)答掉两件,走了一串人;剩下的还挂着

两层

  • 信息层(九成以上,少、准、有出处,只在节拍上动): 脊、结、等你的人的点、线与名字、小时数、问题与下一环、期限、不经过你的灰行、英雄数字与右栏。每个数都能在第 2 节对上。
  • 概念层(一成以内,只用灰): 每行底边的地毯,一道灰刻一条输入,f22 那五行共 119 道。
  • 共用几何与数量: 两层用同一条对数横轴,灰刻落在它那条输入离此刻多久的位置;墨点不重复画进地毯。
  • 不打架: 地毯只在行的底边,不进脊右边的字;静止时零运动;悬停或展开时压到四成。

动起来之前的约束

  • 绝不动: 脊的位置、对数横轴的范围与刻度(一个镜头到底;composite 到 2 周,story 到 4 天);朱红的含义(只给你:脊、脊上的结、你答的那一下)。
  • 此刻只向前走,不过冲。 往回(←、选更早的帧)时离散量一帧回到那一轮,点缓动回去,不倒放“松开”。
  • 每轮只硬切一次: 问题的开闭、等你的人换了谁、行的上下、英雄数字都在批次刻度上;你答的那一下在时间走到它的那一刻出现。
  • 不提前: 下一轮整理落地之前,结填实了,人不走。
  • 只读同一份回放: frames、批次、asks、feedback 与依据,不加只为这张图服务的字段,也不改契约。
  • 什么时候放: 只在顶层直接打开、不带 ?frame=、没有 referrer 时讲一遍;任意键或点空白跳到终态,顶栏“▶ 重演”从头再讲;带 ?frame=、画廊、合页(followFrames)、体验站弹框与从别处链来都静止;prefers-reduced-motion 时直接到终态。之后 ▶ 连播与 ←/→ 走同一套节拍:每 12 小时约 0.9 秒,刻度上停 0.12 秒;←/→ 一步 0.38 秒。

4 交互 ​

与回应时序、B 同一套标准,共用 motion/ix.mjs,时序取它的 IX;这里只写等待链几何上的对应。悬停与展开都让讲一遍或连播停在当前时刻,概念层随之静止。

  • 一件是什么。 两种:一行(一件事,i:<条目>,脊上的与不经过你的都算)和一个人(w:<名字>,她挂在几行上就有几个点)。
  • 悬停
    • 触发:一行的结、右边的字、等你的人之间的线(行的上下边界之内,最左一个点外 14 px 也算);一个人的点与名字(点外 10 px)。Tab 到隐藏按钮,先行后人;触屏第一下是悬停。

    • 一行出概要卡,卡上的数守当前这一轮,f22 悬停母亲那一行写:

      text
      选择 · 家庭
      母亲九月住哪?
      3 人在等:母亲 9.7 天 · Kajsa 3.1 天 · Ulrika 9 时
      期限还有 24 时 · 开了 9.5 天
      你在这件事上动了 8 次,回答它 0 次
      这件事上进来过 40 条输入
    • 一个人出概要卡:名字、在哪里开口、挂在几件事上、每件等了多久;她的几个点之间亮一道细墨线。

    • 其余降到七成,概念层降到四成;离开 0.15 秒宽限,卡 0.12 秒淡出,再过 0.4 秒接着走。

  • 展开
    • 触发:点一行或一个人,或它的概要卡;Tab 后按 Enter 或空格。
    • 0 秒是切点:页头改写为“这一件 · f22 · 8/14 00:00 / 母亲九月住哪?”,右栏切到“这一件”。
    • 0–0.3 秒一行整行向上弹出 8 px(垂直于等待线,缓出,过冲 3.7%);一个人的点沿各自的等待线往外(离脊)弹出 8 px。
    • 0.4–0.6 秒引线从这一行右边的字末端(一个人从她最远的点)出发,0.6–0.9 秒详情卡从引线末端展开。一行的卡放在脊右边、这一行上下哪边地方大放哪边;一个人的卡贴着她最远的点(第 5 节的出入 5)。
    • 卡上:问题全文与选项;等你的人逐个(在哪里、等了多久、最近一次、还挂在几件别的事上);下一环(选项、执行对象、期限);你在这件事上的动作句;开着的写“去回答 →”,链到当前帧的 D(../../index.html?variant=d&frame=<当前帧序号>,经 withDataset 带上 ?data=);已关的(不经过你那几行)写它的上一问怎样关上,不给链接;最后是“全部记录 →”,打开现有的详情抽屉。
    • 一个人的卡:她挂着的每一件(问题、等了多久、开着的带“去回答 →”)与她在依据里的每一条(时刻与渠道,不贴原文)。
    • 收回:Esc、点空白、再点同一件;卡 0.2 秒收起、引线 0.15 秒缩回、弹出的 0.2 秒落回,然后一帧切回页头与右栏,0.4 秒后接着走。换帧、连播与合页顶栏选帧立即收起。
  • 面板“这一件”:一行时,问题、事项与份额,英雄位写“这一问后面 N 人”,下面是等你的人、下一环、你的动作与链接;一个人时,英雄位写“挂在 M 件事上”。
  • 钩子:window.foldChain 与 foldTiming 同名同义:player、hold、startPlay、startHero、skip、seek、perf、resetPerf,加上 ix.hooks() 的 hover / unhover / open / close / ixAt / paused / pointOf / ixState,以及给检查用的 pick()、geom(name);另有 chain(i) 返回第 i 帧按规则算出的人数与每行的人,供核对第 2 节,story 与 cue() 给出讲一遍选中的那一轮与各拍的秒数。?at=秒 把故事冻在那一秒,供截静帧。

5 实现与出入 ​

文件与结构 ​

  • sketches/chain.html、chain.mjs、chain.css。页框、帧导航、详情抽屉与动作句用 live.mjs,回放与文字度量用 kit.mjs,家庭流的称呼与群名用 variants/shared.mjs 的 familyPlace(只读,不改)。
  • 第 2 节的规则在页面里逐帧现算一次(chainAt),讲一遍的那一轮也由规则选出(releaseRound),没有任何帧号或人名写成常量;foldChain.chain(i) 返回第 i 帧算出的人与每行,本文第 2 节的数都能用它对上。
  • 一个 requestAnimationFrame 时钟管讲一遍、▶ 连播与 ←/→ 的节拍(同回应时序的 track:每段从 ta 缓动到 tb,跨过批次刻度时提交那一帧)。信息层是 SVG,每行、每个人是带键的元素,换轮时只换目标位置,动在 paint() 里;概念层的地毯画在 SVG 下面的 canvas 上。
  • 横轴的范围由数据算:两周里最长的等待加 12 小时,向上取到刻度(composite 2 周,story 4 天),整个回放不变。
  • 行高 46 px,一行几个人就按 16 px 一档展开;行多放不下时整体压到 0.55,空余时最多放大到 1.3。“不经过你”最多 4 行。

与故事的出入 ​

  1. 第 1 拍的停顿改短。 原定 0–5.4 秒;story 那一轮只有 2 行,1.85 秒就落完,再干等 3.5 秒太长。改成最后一行落定后停 1.4 秒(够读出谁挂在几件事上)再让时间走:composite 0–4.6 秒、4.6–8.8 秒、8.8–12.5 秒,story 0–3.25 秒、3.25–5.8 秒、5.8–9.4 秒(切点的动作留 0.9 秒,讲一遍时放慢 1.5 倍)。
  2. 地毯的数改正。 第 3 节原写 f22 那五行共 193 道,是推算时算错了;按第 1 节的口径(relatedIds 含这件事,或被这一版引作依据,去掉等你的人自己那几条)是 119 道(猫看病 55、母亲 35、VAB 18、#13572 7、同意书 4)。概要卡上的“这件事上进来过 N 条输入”含等你的人那几条,所以母亲那一行写 40,第 4 节的例子已照页面改。
  3. 线上的数只在节拍上换。 时间走时点按对数往左滑,旁边的“2 时”要到下一轮刻度才改写;讲一遍停在 11:38 时,猫看病那一行的 Kajsa 点已在 12 时附近、字还写 2 时。这是“数字只在节拍上换”的代价,切点后两者重新一致。你答了的那一行改写成“✓ 你给诊所打了电话 · 08:02 · 比期限晚 2 分 · 等下一轮整理读到”,原来的“期限还有 8 时”让位:答的那一刻是节拍,答得比期限晚多少是那一刻就定下的事实。页头的时刻仍是批次的时刻,不跟着走。
  4. 换区的行走的时候压暗。 第一次截切点中间的静帧,滑向“不经过你”的几行与往上补位的几行交叉,字叠在一起。改成换区(上脊或下脊)的行在移动中按正弦压到四成,新的字等它落定(切点后 0.62–0.85 秒,讲一遍时再放慢 1.5 倍)才淡入;留在原区的行照原来 0.4–0.7 秒换字。
  5. 一个人的详情卡放在她自己的点旁边。 原定和一行一样放在脊右边,引线从她最远的点横穿所有行,难看;改成卡贴着她最远的点、放在她那几个点的上方或下方,引线一段直下。弹出仍是往外(往左)8 px,几何(引线起点、再点收回的命中)按弹出前的位置算,人的命中半径放到 10 px。
  6. 讲一遍从静止的那一轮开始。 ?at=秒 冻在切点之后时,页面以前直接从空页切到下一轮,留下来的行从全透明淡入;改成开讲时先把那一轮整理好、所有行就位(第 1 拍的显现由 reveal() 管,不靠行自己的淡入),冻帧与现场演一致。“▶ 重演”同时把页头切回那一轮。
  7. 右栏跟着数字翻。 切点后 0.4 秒数字翻成新值时,右栏的总览(这一轮放走的、等你的人)才换成新一轮,免得数字还是 9、名单已经只剩 2 人。
  8. 去回答的链接用帧号。 ?variant=d&frame=f22 写帧的 id,不写序号;story 的帧号与序号不同(f26 是第 28 个),写序号会链错一轮。
  9. 详情卡里开着的问题用空心朱红圈, 和脊上的结一样;ix.css 默认的是实心小方块。
  10. 页面不链打磨记录。 体验站把 Markdown 放在另一处,页面上的“怎样算出来”只写出处的文件名与节号。

还没做 ​

  • 规则推不出的四种情形(第 2 节末)只在“怎样算出来”里列出,没有在图上区分;状态里没有等待方,记在 CONCEPTS.md。
  • 一个人挂在多件事上时,悬停与讲一遍里有一道细墨线连起她的点;行很多、她的点相距很远时,这道线会斜穿别的行。
  • 手机宽度没有专门排版,和其余复盘图一样按桌面设计。

6 验证 ​

2026-10-28,分支 rebase 到 main 233ae85(含 #34 变形、#35 峰值保持、#36 驻龄)之后,本机起一个深队列的静态服务(不用 4173),无头 Chrome 1440×900;没有开 Safari。

规则的数(第 2 节):页面用 foldChain.chain(i) 读出逐帧结果,与第 2 节逐项对上:composite f22 9 人(5 个问题,等你的人与等了多久同表)、f23 2 人(noble_isle 4.0 天、Kajsa 29 时),关上的三问与放走的人同表;f28 7 人;story f25 3 人、f26 1 人(苏禾 2.4 天)、f34 1 人(周屿 9 分)。讲一遍选中的轮由规则算出:composite f22 → f23(你的两次回答 08:02、11:38),story f25 → f26(17:09 一次)。地毯 f22 共 119 道。

检查结果
make check通过
node scripts/check-ix.mjs,composite,全部页面16 个页面全过(chain 16 / 16,home 23 / 23)
同上,--data story16 个页面全过;第一遍回应时序“回车展开,焦点进卡”一项没过(卡还在展开),单独重跑 16 / 16。rebase 之前的两遍里,让位图与 D 手机首页也各有一项卡在展开时刻、重跑即过:都是本机多个 Chrome 同时跑时的时序抖动,这些页面本分支没有改
node scripts/shoot-forms.mjs --only chain,all --gpu --check all-sync,两套数据两套数据都无页面报错,all-sync 无失败(顶栏选帧后合页里每页都切到那一帧)
npm ci && npm run site:build通过(23 秒);dist/ 里有 chain 的页面、预览图与本记录
讲一遍的入口顶层直接打开讲;任意键、点空白跳到终态(composite 停 f23、story 停 f26);“▶ 重演”从 f22 再讲;带 ?frame=、从画廊链来(referrer 是别的页面)都静止;prefers-reduced-motion 直接终态,两套数据都对
去回答的链接f22 开着的问题与一个人的卡里链到 ../../index.html?variant=d&frame=f22;已关的(f23 的“Smilla已减量”)不给链接,写“答后关上 · f23”与你那一下

帧率(无头 Chrome --gpu,1440×900,foldChain.perf()):

场景compositestory
讲一遍(顶层直接打开,从头到停)12.5 秒,60.0 fps,p95 16.7 ms,最长 16.8 ms,每帧脚本 2.0 ms9.4 秒,60.0 fps,p95 16.8 ms,最长 16.8 ms,每帧脚本 1.4 ms
▶ 连播(从 f03 起 8 秒)60.0 fps,p95 16.8 ms,走到 f1160.0 fps,p95 16.7 ms,走到第 13 个帧
←/→ 换轮(8 次,每次 0.9 秒)59.9 fps,p95 16.8 ms,最长 33.3 ms(一帧)60.0 fps,p95 16.7 ms

静帧(1440×900,在本机 scratchpad 的 case-chain/ship/,不进仓库):composite 的三拍(?at=3.3、8.2、9.8 切点中、12.2 落定)、默认帧 f28,story 的三拍(?data=story&at=2.6、5.2、9.2)与 f34,以及 composite f22 一行与一个人的概要卡、详情卡。体验站预览图 site/previews/chain.webp 取 composite f28(弹框里停的最后一帧),命令见 docs/development.md。