AI3D-382 · detection pass 6: is robust seeding enough without the clamp? — no

6 Sep 2026 · segments 018 / 060 / 066 / 085 · roots: r4pr (pass-5 code, per record) | r5pr (pass-6 code, per record — byte-identical to r4pr) | r5 (per-segment, per-bin sparse supported seeding, 3 m window, NO clamp) | r5c (same + clamp to the per-record surface) · runs at wt-vs-382 @ 740854e, review fixes on top · previous rounds: passes 2–3 · pass 4 · pass 5 · background: what the DEM (Digital Elevation Model) bias was

  1. Pass 6 shipped three things: (A) fixed seeding semantics — per-bin support instead of cumulative, a sparse histogram (12–19 MB instead of 650 MB), a 3 m window and logged tiers (per-bin covers 59–87 % of populated cells, cumulative 6–16 %, raw min-Z 7–25 %); (B) a hard-blob survivor test; (C) pole-guard hardening plus a marker fix. The decisive test: the segment union without the clamp, against per record.
  2. The answer is NO. Robust seeding alone does not reach per-record parity. r5 fails 5 of 7 canaries and reproduces the pass-4 failure exactly: the 018 sign is lost again, 066 Record071 keeps 0.13 of its points against 0.61 per record, truth-spot z_ground p5 is −2.7 m with 23 clusters more than a metre low, and paint churn is 5.2 % — more than double naive pass-4.
  3. The clamp is the whole mechanism. On 066, union kept fraction goes 0.3744 naive → 0.4002 with per-bin seeding → 0.5944 with the clamp. Seeding bought +0.026; the clamp buys +0.194.
  4. r5c passes 6 of 7 but still misses the hard-contamination bar: the 060 billboard cell returns because the instance’s blob loses one cell as its hard share slips 0.58 → 0.51 — and it newly loses a 42k-point tree at 018’s west segment edge.
  5. Decision: ship per_segment OFF; restore the clamp default to ON (review found it flipped to false by 38ca14e; clamp-off is not a supportable configuration). TCS gets one last, principled attempt — neighbourhood low-outlier rejection, as in PDAL’s extended local minimum — and then the ground work moves to the tablecloth repo.
  6. Review found a blocker and a hazard. Blocker: the pole guard’s min_fraction 0.0 would have rejected every unstripped pole — fixed. Hazard: per-bin support can seed 2.8 m ABOVE ground in a cell holding 2 ground returns under 40 canopy returns. Sparse ground under canopy and isolated noise are indistinguishable per cell; only spatial context separates them — and that is the mechanism behind the lost west-edge tree.
  7. B and C were byte-neutral on this corpus (unit-tested only). Worse, the survivor test guards the wrong branch: the fragility is blob-cell membership below the 0.6 cap, where the survivor test never runs.

0. How to read the renders

Every render is one spot in the raw no-scan-angle-filter cloud, 6 columns left to right: true RGB | number_of_returns (grey = 1, orange = 2, red = ≥ 3) | r4pr (pass-5 code, per record) | r5pr (pass-6 code, per record) | r5 (per-segment, no clamp) | r5c (per-segment + clamp). The two BEFORE columns come first, and they are byte-identical to each other on this corpus; top row oblique, bottom row the same points top-down; each column is labelled in the image itself.

unmaskedtreemedium_vegetationsign-ish (sign / pole / delineator)guardrailother

Click any image for full resolution; ← / → (or swipe) step through the images of that card only; Esc closes.

1. What changed

featureknobverdictreason (one line)
per-bin supported seeding (instead of cumulative support)tcs_seed_min_support = 3keepReal robustness now covers 59–87 % of populated cells instead of 66 %; the raw min-Z fallback drops to 7–25 %.
sparse histogram (populated cells only)internalkeep12–19 MB peak against 194–253 MB dense — 10–16x, and it kills the 650 MB bounding-box blow-up.
seed window 1.0 → 3.0 mtcs_seed_hist_m = 3.0keep, but not freeFewer cells fall out of the window, but r5c is no longer identical to pass-5’s r4 — churn 0.20 % → 0.53 %, and it did not fix the segment-edge weakness.
per-segment TCS without the clampsegment_clamp_to_record = falserevert5 of 7 canaries fail; the pass-4 catastrophe returns in full. Clamp-off is not a supportable configuration.
clamp to the per-record surfacesegment_clamp_to_record → default truerestore default38ca14e flipped it to false. On 066 the clamp moves the union kept fraction 0.4002 → 0.5944; seeding moved it 0.3744 → 0.4002.
per-segment ground mode overalltcs_ground.per_segmentship offEven clamped it buys third-decimal metric moves, misses M3, and now loses a 42k-pt tree at a segment edge.
hard-blob survivor testhard_blob_reject_max_survivor_mrf / min_survivor_pointswrong branchA behavioural no-op: 0 mixed-instance hits in 12 logs, instances_skipped = 0 in all 16 runs. The fragility is blob-cell membership below the 0.6 cap.
pole guard + sign_post dtypereject_promoted_poles_min_fraction = 0.03keep (blocker fixed)Review caught min_fraction 0.0 rejecting every unstripped pole. Target FP still rejected at sf 0.0659; all six accepted signs with sf > 0 untouched.
per-cell seeding, no spatial context— (design hazard)openPer-bin support can seed 2.8 m above ground where 2 ground returns sit under 40 canopy returns; per cell, sparse ground and isolated noise are the same signal.
round-6 code in per-record mode (B, C, ae988ba)unexercisedr5pr is md5-identical to r4pr on all five artefacts, all four segments — unit-tested only, not validated by the corpus.

2. The decisive test — per-segment without the clamp

r5 reproduces the pass-4 failure verbatim 5 of 7 canaries fail

This was the whole point of pass 6: if better seeding alone reached per-record parity, per-segment would become the default for correctness (one ground surface, no record seams). It does not. Every catastrophic pass-4 symptom comes back with the better seeding in place, which means seeding was never what was broken.

BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · canary 1 · 018 (−3212.87, −2195.74), a real post with plate at the road edge in front of dense foliage · magenta in r4pr/r5pr and in r5c (ml 0.6653), absent in r5 — the pass-4 failure verbatim, with the better seeding in place
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; canary 1 &middot; 018 (&minus;3212.87, &minus;2195.74), a real post with plate at the road edge in front of dense foliage &middot; magenta in r4pr/r5pr and in <b>r5c</b> (ml <b>0.6653</b>), <b>absent in r5</b> &mdash; the pass-4 failure verbatim, with the better seeding in place
BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · canary 7 · 066, 68 m of carriageway with lane markings and a belt each side · r5’s lane-marking line is visibly brighter and thicker (139 813 pts vs the 126 761 bar, +10.3 %) and extra green appears at the left road edge; r5c is back on the per-record line at 126 987 (+226, marginal fail)
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; canary 7 &middot; 066, 68 m of carriageway with lane markings and a belt each side &middot; <b>r5&rsquo;s lane-marking line is visibly brighter and thicker</b> (139 813 pts vs the 126 761 bar, +10.3 %) and extra green appears at the left road edge; r5c is back on the per-record line at 126 987 (+226, marginal fail)

018 sign ABSENT in r5 (present at ml 0.6653 in r5c) · kept-fraction max deviation 0.4832 — 066 Record071 keeps 0.1286 vs 0.6118 per record · 066 truth-spot z_ground p5 −2.708 m (min −6.203), 23 clusters below −1 m, plus 3 on 085 and 1 on 060 · 066 streak 139 813 vs the 126 761 bar · M3 38 294 vs the 29 769 bar · paint churn 5.19 %, 19 removed / 27 added detections.

The clamp restores all of it: r5c is within 0.0247 of per record on real records, has zero clusters below −0.5 m at any truth spot on any segment, 3/3 detection churn and 0.53 % paint churn.

3. r5’s one real gain, and what it costs

Part of the +0.094 GT recall is a genuine stand but the trade is bad

Unlike pass 4, r5’s 085 recall gain is not purely leakage — one of the added areas is real multi-return foliage that all three other roots miss. That is worth recording, because it says the union surface does see things a per-record surface cannot. It is still bought at a price no one would pay.

BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 085, 30 m forest stand, circle mrf 0.804 · r5 is right here: it paints the left half of a genuine multi-return stand that r4pr/r5pr and r5c all leave grey. This is where r5’s +0.094 085-GT recall comes from — not all of the gain is ground leakage
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 085, 30 m forest stand, circle mrf <b>0.804</b> &middot; <b>r5 is right here</b>: it paints the left half of a genuine multi-return stand that r4pr/r5pr <i>and</i> r5c all leave grey. This is where r5&rsquo;s +0.094 085-GT recall comes from &mdash; not all of the gain is ground leakage
BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 018 (−3292.74, −2188.02), r5-only conic_rule tree n 172 420, ml 0.315 · r5 paints a much wider band that reaches down onto the low verge; ml 0.315 is far below the 0.6775 emit threshold (conic_rule bypasses it). r5c sits between r5pr and r5
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 018 (&minus;3292.74, &minus;2188.02), r5-only <code>conic_rule</code> tree n <b>172 420</b>, ml 0.315 &middot; r5 paints a much wider band that reaches down onto the low verge; ml 0.315 is far below the 0.6775 emit threshold (<code>conic_rule</code> bypasses it). r5c sits between r5pr and r5

085 GT tree recall 0.7547 → 0.8485 in r5, on 1 872 942 annotated points matched 100.000 % @ 5 cm.

Price: +8 024 hard FP (52 538 → 60 562), a −0.811 m truth-spot z_ground tail on the same segment, and an r5-only conic_rule blob of 172 420 points at ml 0.315 that reaches onto the verge.

False paint straight from the low DEM contamination

Both of these are the DEM-bias signature: with the union surface metres below the per-record ground, low ground and road become candidates, and single-return ground gets painted as vegetation or promoted into a detection.

BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 060, low scrub/hedge belt beside the carriageway, circle mrf(h>1 m) 0.070 · r5 paints a large low band that every other root leaves grey; single-return dominated, i.e. ground leakage under a DEM sitting metres low. It disappears again in r5c
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 060, low scrub/hedge belt beside the carriageway, circle mrf(h&gt;1 m) <b>0.070</b> &middot; <b>r5 paints a large low band</b> that every other root leaves grey; single-return dominated, i.e. ground leakage under a DEM sitting metres low. It disappears again in r5c
BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 018, grass bank, hmax 3.8 m, circle mrf 0.037, r5-only rescue_stage delineator n 405 · the whole circle is unpainted grass in every root and no post is visible — an added detection here is FP, not a find
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 018, grass bank, hmax 3.8 m, circle mrf <b>0.037</b>, r5-only <code>rescue_stage</code> delineator n 405 &middot; the whole circle is <b>unpainted grass in every root</b> and no post is visible &mdash; an added detection here is FP, not a find

060 scrub band: circle mrf(h>1 m) 0.070, single-return dominated · 018 grass bank: circle mrf 0.037, hmax 3.8 m, no post visible — an r5-only rescue_stage delineator on empty grass · both vanish under the clamp.

4. What the clamp still does not fix

The billboard cell returns, and a 42k-point tree is newly lost M3 40 141 vs a 29 769 bar

Two separate failures, both structural. The billboard is the pass-5 diagnosis unchanged: the survivor test was aimed at the instance-level 0.6 cap, but the instance never reaches the cap — it sits at 0.5815 and the leak happens when one cell drops out of the blob at 0.5056/0.5092. The west edge is new collateral: the union surface is thinnest where the fewest records overlap, so that is exactly where the clamp has least to clamp against, and where the review’s “2 ground returns under 40 canopy returns” hazard bites hardest.

BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · canary 2 · 060 billboard panel + frame beside a real conifer, cid93 · r4pr/r5pr leave the panel grey; r5 and r5c both speckle it green — the 10.9k-pt hard cell at (296, −67). The instance’s blob loses one cell as its hard share slips 0.5815 → 0.5056/0.5092, below the 0.6 cap the survivor test guards
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; canary 2 &middot; 060 billboard panel + frame beside a real conifer, cid93 &middot; r4pr/r5pr leave the panel grey; <b>r5 and r5c both speckle it green</b> &mdash; the 10.9k-pt hard cell at (296, &minus;67). The instance&rsquo;s blob loses one cell as its hard share slips 0.5815 &rarr; 0.5056/0.5092, <i>below</i> the 0.6 cap the survivor test guards
BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 018 west segment-edge wood · r5 fills the grey patch r4pr/r5pr leave; r5c bites a large grey hole out of the left/centre — a lost n 41 953 tree and −70 810 net painted points on 018. Edge cells have the fewest overlapping records, so the union surface (and the clamp) is weakest exactly there
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 018 west <b>segment-edge</b> wood &middot; r5 fills the grey patch r4pr/r5pr leave; <b>r5c bites a large grey hole out of the left/centre</b> &mdash; a lost n <b>41 953</b> tree and &minus;70 810 net painted points on 018. Edge cells have the fewest overlapping records, so the union surface (and the clamp) is weakest exactly there

M3 hard points r5pr 28 556 → r5 38 294 → r5c 40 141 (worse than pass-5’s 38 792): 060 (296, −67) 0 → 10 952 / 10 851, and r5c also brings back 018 (−3306, −2188) at 4 545 · 018 west edge: lost tree n 41 953, −70 810 net painted points on 018.

The parts that are clean byte-identical, blocker fixed

r5pr matches r4pr md5-for-md5 on verticalsigns.json, clusters.csv, tree_clusters.csv, rail_halfposts.csv and point_masks.npz on all four segments — so the pass-6 code is provably neutral in per-record mode, and equally provably untested by it. The pole guard’s target is still rejected, and r5c does gain real foliage in places.

BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 018 dense wood, circle mrf 0.438 · r5c better: it fills the grey patch upper-centre that r4pr/r5pr leave, and it is real foliage — the good half of r5c’s 0.53 % paint churn
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 018 dense wood, circle mrf 0.438 &middot; <b>r5c better</b>: it fills the grey patch upper-centre that r4pr/r5pr leave, and it is real foliage &mdash; the good half of r5c&rsquo;s 0.53 % paint churn
BEFORE = 3rd/4th panel (r4pr, r5pr — per record, byte-identical) · 060 (293.58, −112.32), a big deciduous tree with a billboard and a thin stem in the crown · no magenta in any root: the target FP is still rejected as stripped_pole_unconfirmed at sf 0.0659, above the new 0.03 floor. r5pr is bit-identical to r4pr here
BEFORE = 3rd/4th panel (r4pr, r5pr &mdash; per record, byte-identical) &middot; 060 (293.58, &minus;112.32), a big deciduous tree with a billboard and a thin stem in the crown &middot; <b>no magenta in any root</b>: the target FP is still rejected as <code>stripped_pole_unconfirmed</code> at sf <b>0.0659</b>, above the new 0.03 floor. r5pr is bit-identical to r4pr here

Pole guard: clusters.csv churn 0 rows on all four segments, det_diff 0/0/0, sparse_sign 3 → 3 on 018 · target FP at (293.58, −112.32) still stripped_pole_unconfirmed, sf 0.0659 > the 0.03 floor · truth-spot recall 1.000 / 0 FP in every root · runtimes 292–504 s, all inside the 20 min budget.

Caveats: the widened sign_post dtype coverage is unexercised (no sign_post cluster on this corpus has sf > 0), and bf771a7, bc15683, 740854e, ae988ba now all have zero corpus coverage.

5. Results per segment

segmentcanopy recall > 10 m (M1 hi)
r4pr / r5 / r5c
M3 hard cells / points085 GT precision / recalldetections
r4pr / r5 / r5c
runtime s
r4pr / r5 / r5c
TCS union kept fraction
r5 / r5c (max dev vs per record)
seed tiers (share of populated cells)
per-bin / cumulative / raw
0180.10735 / 0.11557 / 0.16731r5c brings back (−3306, −2188) at 4 545 pts75 / 76 (8 out / 9 in) / 74 (2/1)301 / 337 / 3500.7732 / 0.7913 (0.0326 / 0.0247)0.869 / 0.058 / 0.074
0600.87665 / 0.87669 / 0.87684billboard cell (296, −67): 0 → 10 95210 851 pts80 / 84 (4/8) / 80 (0/0)340 / 349 / 3460.6507 / 0.6754 (0.0370 / 0.0098)0.708 / 0.091 / 0.201
066n/a (no truth spots)road-streak proxy 126 761 · 139 813 · 126 987 (bar 126 761)71 / 71 (6/6) / 71 (0/0)426 / 504 / 400*0.4002 / 0.5944 (0.4832 / 0.0134)0.627 / 0.156 / 0.217
085n/a (human-GT segment)hard fp 52 538 · 60 562 · 52 1100.4924 / 0.7547 · 0.4915 / 0.8485 · 0.4915 / 0.74799 / 12 (1/4) / 10 (1/2)425 / 491 / 403*0.5440 / 0.5919 (0.0730 / 0.0087)0.590 / 0.162 / 0.248
pooledM1 hi 0.83264 / 0.83315 / 0.83625
M1b mid 0.898 / 0.89197 / 0.8998
9 / 28 556 · 12 / 38 294 · 11 / 40 141 (bar 29 769)veg-tolerant precision 0.7483 / 0.7436 / 0.7482235 / 243 (19/27) / 235 (3/3)1 492 / 1 681 / 1 499paint churn 5.19 % / 0.53 % of 44.6 Mhistogram peak 11.96–19.42 MB (10–16x sparse saving)

M3 is defined on 018+060 only (the segments with truth spots); the 29 769-point bar comes from pass 5’s per-record root. Detections are 1 m, type-matched; the bracketed pair is REMOVED / ADDED against r5pr. “TCS union kept fraction” is the share of input points classified ground over the whole segment; the bracketed pair is the maximum per-record deviation from the per-record run (r5 / r5c) — r5c’s 085 figure excludes a 178-point record where it deviates 0.0899. * The three variants shared one tcs_cache_dir and ran in the order r5 → r5pr → r5c, so r5c’s lower 066/085 runtimes are at least partly cache warmth, not evidence that the clamp is free. The only safe reading is that every variant is well inside the 20 min/segment budget (worst 504 s = 8.4 min). r5pr’s own runtimes were 292 / 337 / 481 / 477 s.

085 human GT (1 872 942 annotated points, 100.000 % matched @ 5 cm)

metricbaser4prr5prr5r5c
tree precision vs GT tree(5)0.48930.49240.49240.49150.4915
tree recall0.75470.75470.75470.84850.7479
veg-tolerant precision0.74130.74830.74830.74360.7482
hard fp (not class 5/74/75)54 52052 53852 53860 56252 110

r5pr is bit-identical to r4pr here, confirming the pass-6 code is GT-neutral in per-record mode. r5c gives back 0.0068 of recall against r5pr and buys −428 hard FP — third-decimal noise. 085 GT precision is 0.49 in every root, which is its own open problem (see next steps).

6. Next steps — pass 7