新诉讼可视化 · 时间轴大师
时间轴大师,用数学,画准一张时间轴。
它替你解决的那件事
律师手上的材料是散的。一份判决书、几份合同、一叠证据目录、一段微信记录、 几张手机拍的照片,时间散落在其中。要把这些变成一张能交出去的图,难的从来不是画, 是两件事:该上图的事有没有抽全,抽全了排不排得下。
这个模块把这两件事分开做。前半段读材料,判断哪一句写的是已经发生的事实,把它们 归成事项;后半段接过这份清单,用纸张的物理尺寸算出每一个模块该摆在哪里、能有多宽、 能写多少字。两段之间只交接一个数,交接完就互不干涉。
材料怎么顺手怎么给:判决书、起诉状、答辩状、代理意见、合同、证据目录、银行与 支付宝流水、微信聊天记录、扫描件、手机照片,甚至一段口述。不必先整理,不必改格式, 也不必自己先画一张。没有文字层的扫描件与照片同样读得出来,做法是先逐页探测可读 字符数,再按 150 DPI 栅格化,然后逐页看图;交付时会声明哪几份出自读图,那几项请你 自己回原件复核一遍。
为什么能画准:位置、尺寸、容量全部是算出来的
一张 A4 有多宽是定死的。绘图宽 958 px,来自 A4 横版的 1070 减去两侧各 56 的留白。 这个数不由人改,后面所有的数都从它推出来。
推的顺序是一环扣一环的。时间轴上有几个时点,轴就被分成几段,每一段的长度决定了模块 落在哪里;位置定住,才知道相邻两个模块之间还剩多少空;剩多少空,决定一个模块能有 多宽;宽度定了,才知道这个模块能写几个字。所以先定位置,再定尺寸,最后才定能写 多少字,不能倒过来。
这些数不是查表得来的,换一份材料就换一组。编号型的卡宽由事项数压出来:八个事项时 189 px、十二个时 121 px、十六个时 96 px,卡片跟着变矮变窄,列距也从 110 收到 58。 日期型不一样,它的卡宽固定 214 px,因为时点多了是轴上挤、不是卡片变窄,正文至多 六行、约 84 字。期间型更特别,它的容量不是一个数而是每段各一个,条身长度由那一段的 真实天数决定,同一张图上各段差别可以从一个字到三十九个字。
放得下几个模块,同样是算的。第一道是一条不等式:
模块宽 × n ≤ 绘图宽 × 层数
全部模块的横向总宽不许超过绘图宽乘层数。它抓的是逐字段比对抓不住的那一类错,也就是 每个数看着都对、合起来却自相矛盾。
参数交出来之后还有第二道,用一组恒成立的关系把它验算一遍:
图宽 = 2 · 边距 + (n−1) · 列距 + 最小模块宽
等式两边只要差 0.5 像素就当场报错,并指名是哪一处尺寸算漏了。四项、八项、十二项、 十六项、二十项五档实测,差全部是 0.00。这一列不是差不多,是精确相等。
交接的顺序也是定死的:前端交出事项清单,后端按这一档的几何算出每个模块能写多少字, 把这个数交回去,前端再按这个数把字写到位。反过来先写好再排,就只剩两条路, 把字截掉或者把版面挤坏。
抽事实那一段没有公式可用。哪一句是事实、哪几句属于同一件事,是读懂内容之后的判断, 正则拿不到(试过一版按日期与文书名切分的正则切割器,在真材料上切出三组同名、一组 吞掉六成句子)。所以那一段交给模型做,代价是每一条判断都要能对回原句去核。
图上的字,回得去原句
卡片上每一段文字,都必须是原句删掉一些字之后剩下的样子。以原句「2021年3月5日, 双方签订设备采购合同」为例:写成「双方签订设备采购合同」通过;写成「双方签署」 换了词,拦住;写成「设备采购合同由双方签订」调了词序,拦住;补一个原句没有的字, 同样拦住。所以图上的每一句都指得回材料里的哪一句。
不进主轴的有三类:合同条款是约定,诉请是主张,付款计划是承诺。要画到期未付, 材料里得另有记载,比如一笔付款回单、一份催告函、一次对账。它不评价证据, 不认定事实,不给法律意见。
三种形态,由材料的性质定
编号型(numbered_point_timeline)的轴上距离只表先后,等距排开。时点密集、或者
没有精确日期时用它。它是阶梯的底,永远画得出。
日期型(dated_point_timeline)的轴按等长单位格铺开,距离本身在说话。时效届满与
起诉之间隔了多久、催告之后沉默了多久,这一类论点不在事情本身、在事情之间的距离上。
只有日期型能让空白成为证据。
期间型(proportional_gantt)把几段有长度的期间画成条,条长与重叠位置就是主张。
诉讼时效、保证期间、借款与计息起止、工期顺延与停工、租赁期、代持期,都属于这一档。
它还能同时承载时点,落在轴上画成虚线竖线加标注,所以不必另造一种混合型。
形态不由人选。判定顺序是期间型、日期型、编号型,材料的性质满足哪一档的硬条件就走 哪一档。
泳道:有几方各自的主张,就分几道
单侧用于只有一方叙述的材料,全部事项落在轴的一侧。这一档是有讲究的:一方转述对方的 话仍然带着这一方的身份,所以只有一方的材料就是单侧,不许分两侧标上原告主张与被告 主张。
双泳道用于两方各自的材料对读,比如判决书里的诉称与辩称、起诉状对答辩状。原告在上、 被告在下,这个上下是材料给的语义,不许翻转。
同一侧还可以再拆成多条横带,每侧最多三条、两侧共六条。它用来体现层级关系, 比如集团与子公司与项目公司、一审与二审与执行、主债务与保证与反担保。要说明的是, 横带是几何上的错开,泳道是语义上的分方,两件事不是一件:同一方的内容始终放在一起, 所以侧标签始终只有两个,上方一个、下方一个。
侧标签只写百分百确认得了的东西:材料上写着的身份或角色,比如原告与被告、甲方与乙方、 供货方与采购方、支出与收入、公司名。自认、违约、抗辩这类法律定性一律不写,说不准就 不出侧标签。
排不开的时候它不硬画
不缩字号,不截断,不硬塞。横向放得下几个事项由这一档的几何算出来,字越多每张卡越高, 能叠的层就越少,上限跟着降。走不通就自动落到下一档:日期型排不开就走编号型,横向排 不开就转成纵向长图并分页,纵向的事项数没有上限。所以它总归给得出一张图,或者当场 指名是哪一条约束不成立。
同一份材料,换谁跑、跑几次,出来都是同一张图。难的那部分不在模型手里,所以换一个更 弱的模型,出来仍是同一张。
它只画时间轴
流程图、当事人关系图、层级树、A/B 对比表不在这里,柱状图折线图饼图这类数据图表
也不做。那三类共七种由同一个插件里的 mqc-litigation-visual-redraw(诉讼可视化重画)
负责,它同时也能把你已经有的一张图重画得更好看。
你会拿到什么
一次交出五个文件,全部转写自同一份母版,位置与尺寸逐元素对齐,不是各画一遍:
| 文件 | 用什么打开 | 给谁用 |
|---|---|---|
.svg |
Illustrator · Figma · 浏览器 | 主交付物,插进 Word 再编辑 |
.pptx |
PowerPoint · WPS | 讲课与庭前演示,每个方框双击就能改字 |
.vsdx |
ProcessOn · Visio · WPS · Edraw | 在你本来就在用的那个工具里接着改 |
.drawio |
draw.io | 同上 |
.png |
任何看图工具 | 定稿位图,插进 Word 直接打印、微信发 |
除 .png 是位图之外,另外四种都能继续编辑,方框选得中、文字改得动,不是把图片贴
进容器。
三种视觉风格共用同一套几何,变的只是表达。奇川风以灰阶为底、一处深红标重点,交 当事人与客户;白描是纯黑白线稿,为打印、复印与卷宗附件准备;歸藏风用克莱因蓝, 适合讲课与对外传播。
另附一份溯源索引,是一份 Word 三线表,五列:序号、图上的元素、出自哪一份材料、 哪一句、核验方式。文字层材料标逐字,读图来的那几项标读图并单独说明它们没有文字层 可以逐字比对,请你自己回原件复核。打印出来夹在卷宗里,逐项对得回去;哪一项不对, 当场指得出来。
重画那一套的优势,整套继承下来
时间轴大师不是从零起步的。同一个插件里的第一个模块诉讼可视化重画已经开源并冻结, 它的四样东西这里原样继承,一个字都没重写:同一套几何(圆角、拐角、箭头、连线, 一个数都没重新拍过)、同一套视觉(三档风格、灰阶分层、深红是唯一的重音)、同一套导出 (五种格式的转写器,逐元素对齐)、同一套纪律(只许删不许改写,排布走不通就落档、 不硬画)。
所以它一上手就是成品的样子:同样的审美、同样的克制、同样能直接打印。新增的那一半是 把材料读成事实、把排布算准,这两件重画本来不做。
装在哪都能用
这是一个标准的 SKILL.md 目录,没有任何产品特定的胶水代码。凡是能读 skill 指令的
agent 都装得上:Claude Code 用两行命令从插件市场装(/plugin marketplace add 加
/plugin install),Codex 放进 skills 目录,DeepSeek Harness 挂 customSkillDirs
即可、不必构建,Cursor 与 Aider 等读的是同一份 SKILL.md。同一份仓库,不维护两套。
两个模块都不联网、不调外部接口、不需要任何凭据,只读你给的材料,只往你指定的目录 写文件。
你要做的只有勾选
最多五个问题:材料用哪几份、时间取哪一段、这张图呈报给谁、整份还是取其中几段、深红 标在哪一处。报个编号就行,不写代码,不改配置,不学语法。
该问的才问,三处会自己跳过:只有一份材料时不问第一问;材料里日期不足八个、或者只 覆盖一小段时间时不问第二问;风格不是奇川风时不问标红那一问,因为白描是单色、 歸藏风有自己的视觉规则。不回答就走默认。
其余的一律不问:图种、层数、卡宽、字数、分页,那些是算出来的。
质量
排布的五条产出路径各有一套常驻穷举,合计 2476 种情形:期间型 1260、期间型形态 360、 日期型 640、纵向 180、分页 36。每一组的结局只许两种,要么拒绝并给出机械理由, 要么画出来且十项全过,中间那种一组都不许有。此外还有横向容量附表 44 格逐格实际 渲染核对、阶梯兜底 6 组(四个到一百二十个事项,必须永远给得出图)。不是抽样, 不是挑几组跑给人看,每改一次全跑一遍,碰坏任何一种当场就红。
两百多条回归判据,每一条都做过故意改坏必须报错的验证。约束表分 C、D、M、P 四个 系列,每条约束带编号,代码里执行它的那一行带同样编号的标记,守卫比对两边的编号 集合,缺一个多一个都报错,所以文档与实现漂开会被当场抓住。
零第三方依赖,纯 Python 3 标准库。
装完先跑一次自检
Python 3。出 PNG 需要 LibreOffice 或 poppler,读扫描件需要 poppler 的 pdftoppm,
溯源索引需要 node。装完跑一次环境自检,它会逐项告诉你缺什么、缺了会退化成什么样。
没有一项是装不上,都是少一种格式。
自检脚本属于共享内核。在完整仓库里,它在同级的重画模块下:
python3 ../mqc-litigation-visual-redraw/scripts/doctor.py
在 SkillHub 那种单目录分发包里,内核随包带上,直接跑:
python3 scripts/doctor.py
完整文档、约束表与决策记录:https://github.com/MiaoQichuan/new-litigation-visualization
以下为供 AI 读取的操作说明,请勿改写。
时间轴大师
这个 skill 是 mqc-timeline-master ——新诉讼可视化 · New Litigation
Visualization(把法律画出来)的时间轴模块。它把律师手上的原始材料忠实还原成一张
案件经过时间轴。
与 v1(mqc-litigation-visual-redraw,重画既有图)的分工:v1 重画,本模块从材料还原。
v1 已冻结,本模块复用它的渲染内核与五种格式导出器,不改它一个字。
这个 skill 的立场
它不是一个通用图表工具,是一个还原工具。
图上的每一个字都要能追回材料原文。所以这里的全部约束都指向一件事:模型可以答错, 但不许错得无声。凡是模型的判断,都要能对句子逐一核验。
三条最要紧的红线,违反其一这张图就不能交:
| 绝不 | 改为 |
|---|---|
| 手写 SVG 坐标、凭眼睛摆位置 | 写 JSON,几何全部由脚本算 |
| 改写材料的字(换词、调顺序、补字、概括) | 只许删减;卡片每段文字必须是原句的子序列 |
| 把没发生的事画成发生了(承诺、约定、诉请、我的判断) | 只画客观发生过的事;说不准就不画 |
先读什么
总是先读这一份。 然后按需要打开,不要全部预载:
| 你要做的 | 读这个 |
|---|---|
| 判哪句是事实、抽事项、写正文(模型那一半的活) | references/model-steps.md |
| 前后端怎么对接、容量握手、读图、侧标签怎么起名 | references/front-end.md |
| 图为什么长这样、每个数从哪来(C / D / M / P 约束表) | references/layout-constraints.md |
| 报错了、卡住了、不确定某句提示是不是失败 | references/troubleshooting.md(一处查完,不用翻别处) |
| 一件事为什么这么定、当时否掉了哪些做法 | docs/adr/(动手改之前先读) |
| 四份 JSON 的形状与判据 | python scripts/pipeline.py shape verdicts.json |
docs/adr/ 那一条要认真:几十轮接力里,同一件事被重新讨论过多次(扫描件能不能读三轮、
侧标签怎么定两轮)。你想到的做法多半已经被试过并写了失败原因。
黄金律:模型读懂意思,代码算和验
- 模型做:读材料(含读图)、判哪句是已发生的事实、划分、抽事项、按容量把字写到位。
- 代码做:算容量、验模型的输出、出图。代码不做拆解 —— 哪几句属于同一件事, 是读懂内容之后的判断,正则拿不到(试过一版正则切割器,在真材料上切出三组同名、 一组吞掉六成句子)。
所以这条路是两趟,不是猜一趟:先定骨架 → 代码算出容量 → 再按容量写字。
工作流(agent 的执行管线)
下面这张表是给你(agent)看的,不是用户要做的步骤。 用户那一侧只有一句话加几次 勾选:他把材料丢进来、说一句「把这些材料画成时间轴」,然后在你问的时候报个编号。 这些命令由你来跑,他不需要敲任何一条,也不需要知道它们存在。
python scripts/pipeline.py next # 现在走到第几步、下一步跑什么、缺哪个文件
python scripts/pipeline.py steps # 随时打印这张表
中途接手就先跑 next。 换了会话、跑错顺序、文件写坏之后,不要靠猜 —— 它按产物
而不是自称判断走到了哪一步。
没有「一键跑完」,这是故意的:表里标着「用户」的那几步必须等他回答,一口气跑完 等于替他答了,而那几轮勾选是这个 skill 的设计核心。对用户来说这不是几个步骤,是几次 勾选 —— 该问的才问,不回答就走默认。
| 命令 | 谁做 | 做什么 | 要先写的文件 |
|---|---|---|---|
read <材料...> |
代码 | 读材料、切句、认叙述块 | |
pick |
用户 | 第一轮:勾材料来源(可全选;只有一份时自动跳过) | |
span <编号|全部> |
用户 | 第二轮:勾时间段(粒度按跨度自适应:多年按年、半年按季度) | |
style <1-4> |
用户 | 第三轮:呈报给谁 → 白描 / 奇川风 / 歸藏风 / 让我定 | |
offer |
模型 | 划分并给勾选清单 | verdicts.json + parts.json |
budget <编号|all> |
用户 | 勾哪几个部分 | |
capacity |
代码 | 按真实骨架算形态与容量 | skeleton.json |
title '…' |
模型 | 图名(容量内) | |
render <出图.svg> |
代码 | 校验 → 出图 → 顺带写溯源索引 | items.json |
表里没有 mark(第五轮:深红标在哪一处,0 = 不标)—— 它在抽取完事项之后、出图之前问,
且只有奇川风才问,所以不在主序里。python scripts/pipeline.py steps 会一并打印它。
第三轮的三档对应三种风格:法官(开庭、提交法院)→ 白描;当事人与客户(当面讲、 微信发)→ 奇川风;同行、讲课、公众号 → 歸藏风。
扫描件与照片:读图三步
律师给的材料几乎总有扫描件与照片,对方提交的那部分尤其如此。不读图就永远只看得见 一方,而只看见一方的时间轴恰恰是最危险的产物 —— 它看起来完整,实际是单方陈述。
python scripts/read_image.py probe 材料.pdf # ① 逐页量可读字符
python scripts/read_image.py rasterize 材料.pdf pages/ # ② 150 DPI 栅格化
# ③ 你逐页看图,写转写稿
python scripts/read_image.py check 转写账目.json # ④ 页数账 + 编号缺号
用的全是 poppler 自带命令,不装模型、不调 API。判据是「逐页可读字符数」,
不是「pdffonts 有没有字体」(真材料上有反例)。
转写稿要存档(Markdown,每页一节、标页码、写明「这是转写不是原件」),并作为材料
进管线 —— 这样全套忠实判据原封不动生效。图像来源的事项标 medium: "image"、
locator 用「第 N 页」、image_docs.json 列出读了图的材料,出图时会打印
「这些事项未经逐字核验」。细节见 references/front-end.md 与 ADR 0001、0002。
交付什么
一次出五种可编辑格式加一份溯源索引:
| 格式 | 给谁用 |
|---|---|
| SVG | 主交付物,插进 Word、再编辑 |
| PNG | 预览、归档、微信发 |
| PPTX | 讲课、庭前演示,每个对象可改 |
| VSDX | ProcessOn / Visio / WPS |
| drawio | draw.io 内继续改 |
| 溯源索引 docx | 图上每个元素出自材料何处(五列三线表) |
pptx 与 vsdx 是读最终那张 SVG 逐元素转出来的,所以「交付的就是那张图」。
集中红线
| 绝不 | 改为 |
|---|---|
| 手写 SVG 坐标 | 写 JSON,几何由脚本算 |
| 改写材料的字 | 只许删减,卡片每段必须是原句的子序列 |
| 编造日期,或把「2020 年」判成 2020/1/1 | certainty 四档按材料精度填;raw 必须逐字可查 |
| 把承诺或约定的时点当事实(付款计划的付款日、合同交货期限) | 不进主轴;要画「到期未付」,材料里得另有记载 |
| 把诉请、申请事项、法律评价当事实 | 那是要什么,不是发生了什么 |
| 侧标签写法律定性(自认、违约、抗辩…) | 只写材料上写着的身份;说不准就不出侧标签 |
| 一方材料却分两侧,标「原告主张 / 被告主张」 | 只有一方叙述就是单侧 —— 一方转述对方的话有身份性 |
| 图上出现省略号、截断、缩字号 | 超容量在出图前拒绝并要求改短 |
| 为了好看等距画不等距的时间 | 那会宣称一个材料没有的精度;比例轴不成立就走编号型 |
| 自己拍视觉决定(颜色、字号、要不要标记) | 视觉决定归作者,问他 |
三种图种,由材料决定
| 图种 | 什么时候用 |
|---|---|
| 编号型 | 时点密、跨度不成比例、或无确切日期。轴上距离只表先后。它永远画得出,是阶梯的底 |
| 日期型 | 全部时点精确到日、且在轴上分得开。轴按等长单位格铺开,距离本身在说话 |
| 期间型 | 争点是几段有长度的期间,且互相重叠或包含 —— 条身长度与重叠位置就是论点 |
图种不由人选,由材料的性质按几何算出,走不通就自动落到下一档(render_figure.deliver
永远给得出一张图)。事项多到横向排不下时自动转纵向并分页。
环境
Python 3,零第三方依赖(读 docx 时用 python-docx,出 PNG 与栅格化用 poppler /
LibreOffice,溯源索引用 node 的 docx 库)。全部脚本在 scripts/,全部守卫在
tests/run_checks.py(跑一次约半分钟,两百多条判据;确切条数看它自己,不要在这里写死数字 —— 写死就会漂)。
若这是 SkillHub 的分发包,tests/ 不在其中 —— 回归套件需要若干二进制样本,那个平台不允许上传;要跑回归请取完整仓库:https://github.com/MiaoQichuan/new-litigation-visualization
改动之前跑一次 python tests/run_checks.py,改完再跑一次 —— 它红了就是你改坏了。