Litigation visual redraw
This skill is mqc-litigation-visual-redraw — the first open-source module of
新诉讼可视化 · New Litigation Visualization (slogan: 把法律画出来 · Make the Law
Visible), 缪奇川's litigation-visualization project. It takes an ugly / hand-drawn /
"AI-flavored" source — or even plain judgment text — and redraws it into a
standard legal diagram (timeline · flowchart · relationship). This module stands alone.
Turn a messy or generic litigation diagram into a calm, professional legal
graphic. The guiding idea (先吃透,再重画): first understand the source
faithfully, then redraw it — never change the wording and never change the legal
meaning; only improve the visual expression. Method, in the spirit of
mqc-legal-skills: scenario is vertical, the SOP is tight, the output should look
like a McKinsey exhibit, not a student's slide.
Scope: timelines (three forms — numbered, dated, gantt), flowcharts, and
relationship diagrams (free-form network + hierarchical tree; a two-column
comparison table is the A-vs-B variant of the relationship family). All are
frozen and share one visual language. This skill draws these three families and
nothing else — do not invent new diagram types.
Intent router (what to read first)
Read SKILL.md + references/STANDARDS.md always. Then, by intent, open only what
you need (don't preload everything):
| The user gives / wants |
Read this |
Then |
| An ugly / hand-drawn / screenshot / AI-style diagram, OR plain text / a judgment to turn into a diagram |
references/extraction-guide.md (read→analyze→decompose, six steps) |
pick a layout below |
| A timeline (events over time) |
extraction-guide Step 1 timeline decision ladder |
numbered / dated / gantt |
| A flowchart / process / decision |
references/flowchart-spec.md |
graphviz_flow |
| A relationship / parties / hierarchy |
references/relationship-spec.md (tree-vs-network rule) |
graphviz_relation / relation_tree |
| A vs B side-by-side comparison |
schema comparison_table |
two columns |
| Field/shape details for the JSON |
references/semantic-map-schema.md |
write JSON |
Forbidden — never do these (集中红线)
| Never |
Do instead |
| Hand-write SVG coordinates / lay out nodes "by eye" |
emit JSON; the scripts compute all geometry |
| Blue / slate / any second accent colour |
neutral gray + the one deep red #991B1B (≤2 uses) |
| A diamond decision node |
rounded hexagon (angled ends, r≈2.5) |
| Put an argument / 本院认为 reasoning / a whole paragraph inside a node |
only facts & operative conclusions; reasoning is not a node |
| Change a frozen number (colour, radius, font, spacing) |
change it in the owning spec / style-tokens.json first |
| Reorder events for looks, merge/drop items, or invent a date |
verbatim, time-ordered; unknowns → provenance.uncertainties |
| Add a new diagram type / legend / icon / theme |
stay within the three families above |
Golden rule: the model extracts, the scripts draw
Do not hand-write SVG coordinates, and do not try to lay out nodes "by eye".
Language models place boxes/arrows badly (overlaps, overflow, crossings), and
this skill must work even on weaker models. So the division of labor is fixed:
- The model's job: read the source, transcribe every character verbatim,
and emit a
semantic-map.json. Judgement calls (which element is the single
most important, reading order, above/below placement) live in that JSON.
- The scripts' job (
scripts/): all geometry — column math, date scaling,
text wrapping, collision-free stacking, styling, and rasterization.
If you follow this split, output quality comes from the JSON being correct, not
from the model being clever about pixels.
Workflow
Read, analyze, decompose the source — this is the make-or-break stage of
this skill (turning an ugly/hand-drawn/cluttered source into a high-grade legal
diagram lives or dies here). Follow the six-step discipline in
references/extraction-guide.md: (1) classify the diagram type → pick the
layout; (2) find the spine first (the axis / the happy path / the core
party), then hang branches off it — never transcribe left-to-right blindly;
(3) transcribe every character verbatim — dates, labels, evidence numbers;
do not normalize ("2023年5月左右" stays as is), paraphrase, or merge; (4) strip
decoration (pie charts, waveforms, icons, flourishes) — this skill re-draws
STRUCTURE, it does not copy illustrations; (5) do NOT choose emphasis yourself —
the deep-red accent is the USER's call, asked at the checkpoint, and defaults to
NONE (no red anywhere) if they skip it; (6) when the source is dense, main structure goes in the diagram and
sub-notes go to provenance — do not cram. Anything you cannot read confidently
goes into provenance.uncertainties, never into a guess.
Write semantic-map.json. Follow references/semantic-map-schema.md.
Preserve original numbering if present; you may add numbering for readability
and must record that in provenance.
CHECKPOINT — one round of questions before rendering (not optional).
Do not compose the questions yourself. Generate them:
python3 scripts/checkpoint.py map.json --suggest=<n> # n = the mark you propose
Show that output to the user verbatim and wait. It asks the same three things
every time:
- ① structure — the layout, why that layout (the data decides it, not
taste), what was read, what is uncertain, and the sibling forms this data
could genuinely be swapped to. The layout is presented as a reading to
correct, never as a free menu: offering a date-proportional axis for events
with no parseable dates is offering something that cannot be delivered.
- ② style — each mode by what it LOOKS like and what it is FOR. Never by
whose style it is: these names are the author's, but the reader is another
lawyer choosing a look for their own file.
- ③ emphasis — your proposed mark, plus 0 for none. Short candidate lists
are numbered; a long one is not printed, because a sixteen-item list is a
wall rather than a menu — the user knows their own case and can name the
element. This is generated rather than written out here for the
same reason the geometry is computed rather than placed: a question that a
hurried model might drop, shorten or garble is not a reliable question, and the
consequences of these three answers are already enforced deterministically.
Then record the answers in the map and render:
"checkpoint": {
"confirmed": true, // the user confirmed the structure
"emphasis_source": "user" // "user" | "model" | "none"
}
"user" — they named the element. Up to two marks.
"model" — they skipped, said "you pick", or did not reply. Mark the
ONE element you judge the case turns on. render.py keeps exactly one and
clears any others, and you must say in the delivery which one you marked
and why, so the user can move or remove it. It is your legal reading, not
theirs — never let it pass silently as if it were.
"none" — they asked for no red. The figure is pure greyscale.
- Absent / anything else — the map cannot say where the red came from, so
the renderer draws none.
provenance.emphasis_note authorises nothing: it is
written by the same model whose choice it describes.
Defaults when the user does not choose: 奇川风, and emphasis_source: "model"
— a figure with no focal point at all is not the safer answer, it is just a
weaker one. Until confirmed is true, every file is written as *-draft.*.
Render deterministically, in the mode chosen at the checkpoint. From scripts/.
Every run writes the master .svg, a .png, and three editable hand-offs —
.drawio, .pptx (PowerPoint / WPS) and .vsdx (ProcessOn / Visio / WPS /
Edraw). All five are transcribed from the same master, so none can drift from
the delivered figure. This is deliberate: which tool the lawyer edits in is not
ours to guess. Narrow it only if asked, with --formats=svg,png.
On an unfamiliar machine (a fresh clone), run python3 scripts/doctor.py first —
it reports missing tooling (graphviz, rasteriser, fonts) instead of failing obscurely:
python render.py <semantic-map.json> final # 奇川风 (recommended, colour)
python render.py <semantic-map.json> final --guizang # 歸藏风 (online / lecture)
python render.py <semantic-map.json> final --baimiao # 白描 (pure black and white)
(Or set "visual_mode":"歸藏风" / "白描" in the JSON instead of a flag.) This
picks the layout, writes final.svg (primary, editable) and final.png
(preview/filing), and prints an audit summary. All three modes share ONE geometry
— only the surface differs. Never edit coordinates by hand; if something is wrong,
fix the JSON or the script, not the SVG. Mode standards: references/visual-style.md.
Deliver. Hand over final.svg + final.png + a one-line audit summary
(elements preserved, mode used, emphasis used or "none", any
uncertainties). Keep the summary in the reply / JSON — never draw it onto the image.
Pick a layout
Set "layout" in the JSON. Three timeline forms, chosen by what the spacing
should mean:
numbered_point_timeline — discrete events whose spacing carries NO
argument (a dense fact chronology, or events with no usable dates:
签约 → 转账 → 违约 → 起诉 → 判决). Axis is equidistant; markers are numbered
circles (1-2-3), cards alternating above/below. → render_points.py
dated_point_timeline — discrete events on a date-proportional axis, so
the distance between two events is faithful to the elapsed time. The axis is a
light-gray bar carrying an honest ruler (year ticks, or year+month for a short
span, auto-chosen); markers are dots (no numbering); the precise date sits in
each card. Best for long, well-separated chronologies (诉讼时效, 长期履行).
Every event needs a real date or it errors — use the numbered form for
undated/clustered events. → render_dated.py
proportional_gantt — periods that run, overlap, or leave gaps
(诉讼时效 / 保证期间 / 主债权 / 履行期间). Axis is date-proportional — bar
length and overlap ARE the legal point (e.g. whether 本诉 falls outside 诉讼时效).
One period per row. → render_spans.py
Rule of thumb: real time distances matter → dated_point_timeline (points) or
proportional_gantt (periods); only the ORDER matters → numbered_point_timeline.
Decide the timeline form with the ordered decision ladder in
references/extraction-guide.md (Step 1): if any event lacks a precise, parseable
date — or events are tightly clustered — use the equidistant numbered_point_timeline;
reserve dated_point_timeline for precise dates whose gaps carry legal meaning.
numbered_point_timeline is the safe default. A gantt may also carry point events
(转让公告, 提起本诉) as dashed vertical markers — put those in points (see schema).
For a process / procedure diagram (not dates but steps, decisions,
branches, merges), use the flowchart layout:
graphviz_flow — nodes + directed edges. graphviz (dot) computes node
positions ONLY; the renderer routes the connectors itself (orthogonal, rounded
corners, sibling branches share a level "bus"), because graphviz's own ortho
edge routes are unreliable. Node shapes encode function: rounded rect = step,
rounded hexagon = decision (angled ends, corners r≈2.5, same height as a
same-content step box — a hexagon holds multi-line Chinese far better than a
diamond, which is a poor container for CJK text), pill = start/end terminal.
→ render_flow.py. Requires dot (graphviz) on PATH. See
references/flowchart-spec.md.
For a party / relationship diagram (who the parties are and how they relate —
债权人/债务人/保证人, 股权, 资金流, 控制关系), use:
graphviz_relation — nodes are parties/entities; edges are labeled,
directed relationships; each node may carry a note below it. graphviz (engine
chosen by topology: dot for rows/chains, neato/fdp for networks, twopi/
circo for radial) positions nodes; the renderer draws cards, labeled lines,
notes, and top/bottom skip-routes itself. Layout is free-form — do NOT force a
fixed template (three-column, radial, etc.); let the source's real structure
decide. → render_relation.py. See references/relationship-spec.md.
For a hierarchical party/entity structure — a top-down 主体关系图: 实际控制人 →
控股公司 → 子公司, 集团/股权/控制层级, org-chart-shaped — use:
relation_tree — a tidy hierarchy tree. The renderer positions nodes itself
(no graphviz): leaves take equal horizontal slots and every parent sits at the
MIDPOINT of its children, so every fork is symmetric with equal branch
distances. Boxes are one uniform height, and one uniform width per level, so
the levels read as tidy columns. Connectors are bracket lines with the same tiny
r≈2.5 rounded corners; structural edges have no arrowheads (a hierarchy line,
not a directed relationship) unless "arrows": true. Node shading is depth-coded
(dark root → mid → light leaves; aesthetic only, red still the one meaning); each
edge may carry a short label (持股比例 …) and each node an optional note.
→ render_tree.py. Use this when the source is a hierarchy; use graphviz_relation
when it is a free-form network of labeled relationships. See
references/relationship-spec.md.
The frozen visual rules (summary)
Full details in references/visual-style.md. The non-negotiables:
- No blue. Grayscale is the base palette; if the source uses blue, convert
to neutral gray.
- Deep red
#991B1B = the single most important element, and nothing else.
It is a highlight, not decoration. An emphasized element is a solid deep-red
block with white text — no border tricks, no left accent bars.
- Dots, not diamonds for nodes/markers. Circles only.
- Boxes get small rounded corners; period bars are right-angle (a running
period is a bar, not a card — do not round it).
- Period-bar labels: centered inside the bar if they fit; if too long,
right-aligned hugging the bar's left edge. On the red bar the inside text is
white.
- Title: keep/generate a neutral chart name, centered at the top, with no
decorative underline. No lawyer/team credit, no date, no marketing text.
- A4-friendly aspect ratio — not too wide (text shrinks) nor too tall. The
scripts target roughly A4 landscape automatically.
Legal fidelity (summary)
Full details in references/fidelity-rules.md. Text is verbatim. Never reorder
events for looks. Do not invent emphasis the source doesn't support without
flagging it as a suggestion for the user to confirm. Gray vs. white fill is a
free aesthetic choice (it does NOT encode parties like 甲方/施工方) — only deep
red carries meaning.
Environment / rendering
SVG is the deliverable; PNG is derived. render.py auto-detects an SVG
rasterizer and falls back to soffice (LibreOffice) → PDF → pdftoppm when no
dedicated one is installed — which is the common minimal setup. CJK fonts
(e.g. Noto Sans CJK SC) must be present or the PNG shows blank boxes; verify
with fc-list | grep -i "CJK SC". See references/rendering-and-workflow.md.
Reference files
references/STANDARDS.md — the consolidated, authoritative standard (single
source of truth; on any conflict, this file wins). Read it first.
references/extraction-guide.md — how to read, analyze & decompose an ugly /
hand-drawn / cluttered source into a correct map (the six-step discipline). This
is the make-or-break input stage; read it before your first extraction.
references/semantic-map-schema.md — JSON schema + fields for all layouts.
references/visual-style.md — every frozen visual rule with values.
references/fidelity-rules.md — verbatim text, ordering, numbering, emphasis.
references/flowchart-spec.md — flowchart shapes, connectors, forks, tidy-up.
references/relationship-spec.md — relationship nodes, labeled edges, notes,
free-form layout, skip-routes, and the hierarchical tree standard.
references/rendering-and-workflow.md — render pipeline, env probe, audit,
the human checkpoint, output naming.
AUTHOR.md — author card and method.
examples/ — worked semantic-map.json inputs (numbered/dated/gantt timelines,
flowchart, relationship network, relationship tree).
把法律画出来 · Make the Law Visible | 新诉讼可视化 New Litigation Visualization | 缪奇川 出品 | v1.0.2
1---2name: mqc-litigation-visual-redraw3description: Redraw a litigation diagram into a restrained, court-ready presentation graphic (SVG + PNG) WITHOUT changing any text or legal meaning. Use this whenever the user supplies a case timeline, a legal process flowchart, OR a party/relationship diagram and wants it cleaned up, beautified, redrawn, made professional, de-cluttered, recolored, or turned into an exhibit for a complaint / hearing / arbitration. Timelines: fact chronology (事实经过时间轴), limitation/guarantee-period chart (诉讼时效/保证期间), gantt-style period chart. Flowcharts: case procedure / litigation process / claim-basis / attack-defense path (案件法律流程图). Relationship diagrams: parties and their legal relationships (当事人关系图 / 担保法律关系 / 股权·资金·控制关系). Also use it when the user hands over raw case facts and asks for such a graphic. Trigger even if the user only says "把这张图重画/美化一下", "做成诉讼材料能用的图", or "generate a case timeline/flowchart/relationship diagram" without naming this skill. Default scenario is Chinese litigation; internal instructions are in English.4---56# Litigation visual redraw78This skill is **`mqc-litigation-visual-redraw`** — the first open-source module of9**新诉讼可视化 · New Litigation Visualization** (slogan: 把法律画出来 · *Make the Law10Visible*), 缪奇川's litigation-visualization project. It takes an ugly / hand-drawn /11"AI-flavored" source — or even plain judgment text — and **redraws** it into a12standard legal diagram (timeline · flowchart · relationship). This module stands alone.1314Turn a messy or generic litigation diagram into a calm, professional legal15graphic. The guiding idea (先吃透,再重画): **first understand the source16faithfully, then redraw it — never change the wording and never change the legal17meaning; only improve the visual expression.** Method, in the spirit of18mqc-legal-skills: scenario is vertical, the SOP is tight, the output should look19like a McKinsey exhibit, not a student's slide.2021Scope: **timelines** (three forms — numbered, dated, gantt), **flowcharts**, and22**relationship diagrams** (free-form network + hierarchical tree; a two-column23**comparison table** is the A-vs-B variant of the relationship family). All are24frozen and share one visual language. **This skill draws these three families and25nothing else — do not invent new diagram types.**2627## Intent router (what to read first)2829Read `SKILL.md` + `references/STANDARDS.md` always. Then, by intent, open only what30you need (don't preload everything):3132| The user gives / wants | Read this | Then |33|---|---|---|34| An ugly / hand-drawn / screenshot / AI-style diagram, OR plain text / a judgment to turn into a diagram | `references/extraction-guide.md` (read→analyze→decompose, six steps) | pick a layout below |35| A **timeline** (events over time) | extraction-guide Step 1 **timeline decision ladder** | `numbered` / `dated` / `gantt` |36| A **flowchart / process / decision** | `references/flowchart-spec.md` | `graphviz_flow` |37| A **relationship / parties / hierarchy** | `references/relationship-spec.md` (tree-vs-network rule) | `graphviz_relation` / `relation_tree` |38| **A vs B** side-by-side comparison | schema `comparison_table` | two columns |39| Field/shape details for the JSON | `references/semantic-map-schema.md` | write JSON |4041## Forbidden — never do these (集中红线)4243| Never | Do instead |44|---|---|45| Hand-write SVG coordinates / lay out nodes "by eye" | emit JSON; the scripts compute all geometry |46| Blue / slate / any second accent colour | neutral gray + the one deep red `#991B1B` (≤2 uses) |47| A **diamond** decision node | rounded **hexagon** (angled ends, r≈2.5) |48| Put an argument / 本院认为 reasoning / a whole paragraph inside a node | only facts & operative conclusions; reasoning is not a node |49| Change a frozen number (colour, radius, font, spacing) | change it in the owning spec / `style-tokens.json` first |50| Reorder events for looks, merge/drop items, or invent a date | verbatim, time-ordered; unknowns → `provenance.uncertainties` |51| Add a new diagram type / legend / icon / theme | stay within the three families above |5253## Golden rule: the model extracts, the scripts draw5455Do **not** hand-write SVG coordinates, and do not try to lay out nodes "by eye".56Language models place boxes/arrows badly (overlaps, overflow, crossings), and57this skill must work even on weaker models. So the division of labor is fixed:5859- **The model's job**: read the source, transcribe every character verbatim,60 and emit a `semantic-map.json`. Judgement calls (which element is the single61 most important, reading order, above/below placement) live in that JSON.62- **The scripts' job** (`scripts/`): all geometry — column math, date scaling,63 text wrapping, collision-free stacking, styling, and rasterization.6465If you follow this split, output quality comes from the JSON being correct, not66from the model being clever about pixels.6768## Workflow69701. **Read, analyze, decompose the source** — this is the make-or-break stage of71 this skill (turning an ugly/hand-drawn/cluttered source into a high-grade legal72 diagram lives or dies here). Follow the six-step discipline in73 **`references/extraction-guide.md`**: (1) classify the diagram type → pick the74 layout; (2) find the **spine first** (the axis / the happy path / the core75 party), then hang branches off it — never transcribe left-to-right blindly;76 (3) transcribe **every character verbatim** — dates, labels, evidence numbers;77 do not normalize ("2023年5月左右" stays as is), paraphrase, or merge; (4) strip78 decoration (pie charts, waveforms, icons, flourishes) — this skill re-draws79 STRUCTURE, it does not copy illustrations; (5) do NOT choose emphasis yourself —80 the deep-red accent is the USER's call, asked at the checkpoint, and defaults to81 NONE (no red anywhere) if they skip it; (6) when the source is dense, main structure goes in the diagram and82 sub-notes go to `provenance` — do not cram. Anything you cannot read confidently83 goes into `provenance.uncertainties`, never into a guess.84852. **Write `semantic-map.json`.** Follow `references/semantic-map-schema.md`.86 Preserve original numbering if present; you may add numbering for readability87 and must record that in `provenance`.88893. **CHECKPOINT — one round of questions before rendering (not optional).**9091 **Do not compose the questions yourself. Generate them:**9293 ```bash94 python3 scripts/checkpoint.py map.json --suggest=<n> # n = the mark you propose95 ```9697 Show that output to the user verbatim and wait. It asks the same three things98 every time:99100 - **① structure** — the layout, **why** that layout (the data decides it, not101 taste), what was read, what is uncertain, and the sibling forms this data102 could genuinely be swapped to. The layout is presented as a reading to103 correct, never as a free menu: offering a date-proportional axis for events104 with no parseable dates is offering something that cannot be delivered.105 - **② style** — each mode by what it LOOKS like and what it is FOR. Never by106 whose style it is: these names are the author's, but the reader is another107 lawyer choosing a look for their own file.108 - **③ emphasis** — your proposed mark, plus 0 for none. Short candidate lists109 are numbered; a long one is not printed, because a sixteen-item list is a110 wall rather than a menu — the user knows their own case and can name the111 element. This is generated rather than written out here for the112 same reason the geometry is computed rather than placed: a question that a113 hurried model might drop, shorten or garble is not a reliable question, and the114 consequences of these three answers are already enforced deterministically.115116 Then **record the answers** in the map and render:117118 ```jsonc119 "checkpoint": {120 "confirmed": true, // the user confirmed the structure121 "emphasis_source": "user" // "user" | "model" | "none"122 }123 ```124125 - **`"user"`** — they named the element. Up to two marks.126 - **`"model"`** — they skipped, said "you pick", or did not reply. Mark the127 ONE element you judge the case turns on. `render.py` keeps exactly one and128 clears any others, and **you must say in the delivery which one you marked129 and why**, so the user can move or remove it. It is your legal reading, not130 theirs — never let it pass silently as if it were.131 - **`"none"`** — they asked for no red. The figure is pure greyscale.132 - **Absent / anything else** — the map cannot say where the red came from, so133 the renderer draws none. `provenance.emphasis_note` authorises nothing: it is134 written by the same model whose choice it describes.135136 **Defaults when the user does not choose: 奇川风, and `emphasis_source: "model"`**137 — a figure with no focal point at all is not the safer answer, it is just a138 weaker one. Until `confirmed` is `true`, every file is written as `*-draft.*`.1391404. **Render deterministically**, in the mode chosen at the checkpoint. From `scripts/`.141 Every run writes the master `.svg`, a `.png`, and three editable hand-offs —142 `.drawio`, `.pptx` (PowerPoint / WPS) and `.vsdx` (ProcessOn / Visio / WPS /143 Edraw). All five are transcribed from the same master, so none can drift from144 the delivered figure. This is deliberate: which tool the lawyer edits in is not145 ours to guess. Narrow it only if asked, with `--formats=svg,png`.146 On an unfamiliar machine (a fresh clone), run `python3 scripts/doctor.py` first —147 it reports missing tooling (graphviz, rasteriser, fonts) instead of failing obscurely:148 ```bash149 python render.py <semantic-map.json> final # 奇川风 (recommended, colour)150 python render.py <semantic-map.json> final --guizang # 歸藏风 (online / lecture)151 python render.py <semantic-map.json> final --baimiao # 白描 (pure black and white)152 ```153 (Or set `"visual_mode":"歸藏风"` / `"白描"` in the JSON instead of a flag.) This154 picks the layout, writes `final.svg` (primary, editable) and `final.png`155 (preview/filing), and prints an audit summary. All three modes share ONE geometry156 — only the surface differs. Never edit coordinates by hand; if something is wrong,157 fix the JSON or the script, not the SVG. Mode standards: `references/visual-style.md`.1581595. **Deliver.** Hand over `final.svg` + `final.png` + a one-line audit summary160 (elements preserved, **mode used**, **emphasis used or "none"**, any161 uncertainties). Keep the summary in the reply / JSON — never draw it onto the image.162163## Pick a layout164165Set `"layout"` in the JSON. **Three timeline forms**, chosen by what the spacing166should mean:167168- **`numbered_point_timeline`** — discrete events whose spacing carries NO169 argument (a dense fact chronology, or events with no usable dates:170 签约 → 转账 → 违约 → 起诉 → 判决). Axis is **equidistant**; markers are numbered171 circles (1-2-3), cards alternating above/below. → `render_points.py`172173- **`dated_point_timeline`** — discrete events on a **date-proportional** axis, so174 the distance between two events is faithful to the elapsed time. The axis is a175 light-gray bar carrying an honest ruler (year ticks, or year+month for a short176 span, auto-chosen); markers are dots (no numbering); the precise date sits in177 each card. **Best for long, well-separated chronologies** (诉讼时效, 长期履行).178 Every event needs a real date or it errors — use the numbered form for179 undated/clustered events. → `render_dated.py`180181- **`proportional_gantt`** — periods that run, overlap, or leave gaps182 (诉讼时效 / 保证期间 / 主债权 / 履行期间). Axis is **date-proportional** — bar183 length and overlap ARE the legal point (e.g. whether 本诉 falls outside 诉讼时效).184 One period per row. → `render_spans.py`185186Rule of thumb: real time distances matter → `dated_point_timeline` (points) or187`proportional_gantt` (periods); only the ORDER matters → `numbered_point_timeline`.188Decide the timeline form with the **ordered decision ladder** in189`references/extraction-guide.md` (Step 1): if any event lacks a precise, parseable190date — or events are tightly clustered — use the equidistant `numbered_point_timeline`;191reserve `dated_point_timeline` for precise dates whose gaps carry legal meaning.192`numbered_point_timeline` is the safe default. A gantt may also carry point events193(转让公告, 提起本诉) as dashed vertical markers — put those in `points` (see schema).194195For a **process / procedure** diagram (not dates but steps, decisions,196branches, merges), use the flowchart layout:197198- **`graphviz_flow`** — nodes + directed edges. graphviz (`dot`) computes node199 positions ONLY; the renderer routes the connectors itself (orthogonal, rounded200 corners, sibling branches share a level "bus"), because graphviz's own ortho201 edge routes are unreliable. Node shapes encode function: rounded rect = step,202 **rounded hexagon = decision** (angled ends, corners r≈2.5, same height as a203 same-content step box — a hexagon holds multi-line Chinese far better than a204 diamond, which is a poor container for CJK text), pill = start/end terminal.205 → `render_flow.py`. Requires `dot` (graphviz) on PATH. See206 `references/flowchart-spec.md`.207208For a **party / relationship** diagram (who the parties are and how they relate —209债权人/债务人/保证人, 股权, 资金流, 控制关系), use:210211- **`graphviz_relation`** — nodes are parties/entities; edges are labeled,212 directed relationships; each node may carry a `note` below it. graphviz (engine213 chosen by topology: `dot` for rows/chains, `neato`/`fdp` for networks, `twopi`/214 `circo` for radial) positions nodes; the renderer draws cards, labeled lines,215 notes, and top/bottom skip-routes itself. Layout is free-form — do NOT force a216 fixed template (three-column, radial, etc.); let the source's real structure217 decide. → `render_relation.py`. See `references/relationship-spec.md`.218219For a **hierarchical** party/entity structure — a top-down 主体关系图: 实际控制人 →220控股公司 → 子公司, 集团/股权/控制层级, org-chart-shaped — use:221222- **`relation_tree`** — a tidy hierarchy tree. The renderer positions nodes itself223 (no graphviz): leaves take equal horizontal slots and every parent sits at the224 MIDPOINT of its children, so **every fork is symmetric with equal branch225 distances**. Boxes are one uniform height, and one uniform width per level, so226 the levels read as tidy columns. Connectors are bracket lines with the same tiny227 r≈2.5 rounded corners; structural edges have **no arrowheads** (a hierarchy line,228 not a directed relationship) unless `"arrows": true`. Node shading is depth-coded229 (dark root → mid → light leaves; aesthetic only, red still the one meaning); each230 edge may carry a short `label` (持股比例 …) and each node an optional `note`.231 → `render_tree.py`. Use this when the source is a hierarchy; use `graphviz_relation`232 when it is a free-form network of labeled relationships. See233 `references/relationship-spec.md`.234235## The frozen visual rules (summary)236237Full details in `references/visual-style.md`. The non-negotiables:238239- **No blue.** Grayscale is the base palette; if the source uses blue, convert240 to neutral gray.241- **Deep red `#991B1B` = the single most important element, and nothing else.**242 It is a highlight, not decoration. An emphasized element is a **solid deep-red243 block with white text** — no border tricks, no left accent bars.244- **Dots, not diamonds** for nodes/markers. Circles only.245- **Boxes get small rounded corners; period bars are right-angle** (a running246 period is a bar, not a card — do not round it).247- **Period-bar labels**: centered inside the bar if they fit; if too long,248 right-aligned hugging the bar's left edge. On the red bar the inside text is249 white.250- **Title**: keep/generate a neutral chart name, centered at the top, with **no251 decorative underline**. No lawyer/team credit, no date, no marketing text.252- **A4-friendly aspect ratio** — not too wide (text shrinks) nor too tall. The253 scripts target roughly A4 landscape automatically.254255## Legal fidelity (summary)256257Full details in `references/fidelity-rules.md`. Text is verbatim. Never reorder258events for looks. Do not invent emphasis the source doesn't support without259flagging it as a suggestion for the user to confirm. Gray vs. white fill is a260free aesthetic choice (it does NOT encode parties like 甲方/施工方) — only deep261red carries meaning.262263## Environment / rendering264265SVG is the deliverable; PNG is derived. `render.py` auto-detects an SVG266rasterizer and falls back to `soffice` (LibreOffice) → PDF → `pdftoppm` when no267dedicated one is installed — which is the common minimal setup. CJK fonts268(e.g. Noto Sans CJK SC) must be present or the PNG shows blank boxes; verify269with `fc-list | grep -i "CJK SC"`. See `references/rendering-and-workflow.md`.270271## Reference files272273- **`references/STANDARDS.md` — the consolidated, authoritative standard (single274 source of truth; on any conflict, this file wins). Read it first.**275- **`references/extraction-guide.md` — how to read, analyze & decompose an ugly /276 hand-drawn / cluttered source into a correct map (the six-step discipline). This277 is the make-or-break input stage; read it before your first extraction.**278- `references/semantic-map-schema.md` — JSON schema + fields for all layouts.279- `references/visual-style.md` — every frozen visual rule with values.280- `references/fidelity-rules.md` — verbatim text, ordering, numbering, emphasis.281- `references/flowchart-spec.md` — flowchart shapes, connectors, forks, tidy-up.282- `references/relationship-spec.md` — relationship nodes, labeled edges, notes,283 free-form layout, skip-routes, and the hierarchical tree standard.284- `references/rendering-and-workflow.md` — render pipeline, env probe, audit,285 the human checkpoint, output naming.286- `AUTHOR.md` — author card and method.287- `examples/` — worked `semantic-map.json` inputs (numbered/dated/gantt timelines,288 flowchart, relationship network, relationship tree).289290---291292> **把法律画出来 · Make the Law Visible** | 新诉讼可视化 New Litigation Visualization | 缪奇川 出品 | v1.0.2