Where to improve next
The recall question
out_final/segment_*/verticalsigns.json; rail coverage from
the guardrails repo's out_full run on the same corpus. Both expectation bands are
estimates, not surveys — but they differ by an order of magnitude, which is the whole point:
a denominator this sensitive to an unstated assumption cannot support a recall claim either way.
Blind visual audit — 4 of 4 confirm
Four vision agents were given only the perspective renders for four segments, told neither the hypothesis nor which arm their segment was in. Every segment with a free side showed a row of free-standing posts; neither both-railed segment did.
| Segment | Detector | Judge: guardrail | Judge: posts |
|---|---|---|---|
| 131 | left 99 m, right 0 m · 18 posts | absent on the post-bearing road (high) | present on both verges, ≥8, plausibly 10–14 (high) |
| 134 | left 99 m, right 0 m · 6 posts | median side present, outer side bare (both high) | 5–8 in one regularly spaced row (medium) |
| 019 | left 50 m, right 50 m · 0 posts | present on both outer verges (high) | 1 ambiguous candidate, none confirmed |
| 011 | left 50 m, right 50 m · 0 posts | reported absent — wrong, see below | none (high) |
Segment 134's judge ruled out the confound that matters most, unprompted: the posts “stand inboard of and slightly taller than the guardrail beam — separate posts, not reflectors on a barrier” — the same conclusion the 1.5 m distance test reached numerically. Where counts differ the detector is higher, which is expected: the renders crop near-field verges and truncate at tile boundaries, so a judge sees a subset. No judge reported posts the detector missed.
Calibration, and a render bug. Segment 011's judge called the rails absent where
the detector reports two 0.6 m w_beam runs. The detector is right — across all 367
rails in the corpus, mean height spans 0.452–0.709 m with zero at paint height. But segment 019
proves rails are visible when the framing cooperates: what differs is camera geometry.
Low-oblique views along the road resolve a beam clearly; near-grazing top-down views flatten it
into the shoulder, and those were all segment 011 had left — because in all four segments only
about 2–4 of 9–12 renders carry usable evidence, with byte-identical blank frames in two of them.
Treat a judge's “absent” on low horizontal structure as “not visible in these
framings.”
Two corrections to the working notes. The critique cited “54 posts from segments 131/132/134/135” and “~135 zero segments”; the measured values are 52 and 114. More seriously, it read this concentration as a recall failure. It is mostly a map of where the guardrails aren't.
What the sweep returned
Five search angles, 40 unique sources, 15 deep-read, every extracted technique put through an adversarial verifier that was told to refute by default. Of 31 techniques, 21 were killed — several by measurements the verifier ran on battlebox during review, not by argument. Nothing was rated above low payoff.
ring_fill_ratio, the p98 intensity gate),
or cannot run on this data. Two extractions failed outright — both in the label-free angle,
which is why the weak-supervision ideas below come from the critique pass instead.
data/qc_verdicts.json · visual-QC verdicts on the 143-segment sweepRecommended next steps
-
Delineator recall audit highest magnitude
Project detections onto the road centreline to get station, then autocorrelate per side. A 25 or 50 m peak confirms the class is being found systematically; the gaps at integer multiples enumerate the missed posts by location — a targeted worklist and a set of predicted-position weak labels, with no annotation anywhere. Then examine the three mechanical suspects:seed_min_vertical_span_m = 0.80against a ~0.7 m usable post above the 0.30 m floor; the self-referential p98 brightness gate (one large guide panel raises segment p98 and suppresses the post class);delineator_min_points = 300. -
Record-multiplicity feature + split-half repeatability
~5 lines
n_records_present, record entropy, max per-record point share — purely additive, andcandidate_record_idis already computed ingrid.pyand carried intoprocess_segment. Then run the detector on odd vs even records, match by XY, report agreement: that number becomes the project's standing label-free evaluation metric, and the consensus set is the auto-label seed for the rules → auto-labels → human-correction ladder. -
Threshold-margin census as a standing instrument
For every accepted detection, distance to each conjunct's threshold. Tells you which of ~40 hand-tuned constants are load-bearing and which are inert — and becomes the cheap pre-filter that kills future technique proposals before they cost a research round. Phase 6 did this once and it produced the sharpest result on that branch. -
Plate-normal vs road-tangent scalar hours
_plate_thicknessalready eigendecomposes the upper-half covariance and throws the eigenvector away. One additive |cos| scalar between plate normal and corridor tangent attacks the guardrail top, both road-paint FPs and the verge strip: a real plate faces traffic, guardrails and paint run parallel to it. -
Merge-splitting: deprioritize, and run the zero-code probes first
payoff arithmetic
It remains the tree path's #1 defect, but the adjudicated merged population is about six objects on a path that ships off by default. Before writing a splitter: a config-only eps/hull-margin sweep on the known-merge segments, connected components at ~0.3 m on the six dumped masks, and a footprint-bimodality census. If those say “splittable”, the paper-backed design is multi-stem flag → Dijkstra voxel-graph assignment (Hui 2022).
Experiment portfolio
Fourteen probes, sorted by cost inside four goals. Several are deliberate long shots — the brief asked for experiments that may or may not pay off, and the cheapest ones buy information either way.
All 14 probes, with what each one buys
| Probe | Cost | What it buys or kills |
|---|---|---|
| Scanline recovery — walk one run3 file in stored row order, plot consecutive-point distance periodicity | ~20 min | Unlocks or permanently closes the entire sensor-topology family (range image, along-scan normals, ray-cast occlusion reasoning). |
λ̂₁ closed form — compute linearity from the existing omnivariance and change_of_curvature columns | zero new code | Normalized eigenvalues have 2 DOF, so λ̂₁ is already implicit in the dumped CSV (verified to 1e-15). Tests whether explicit linearity separates known pole FPs from accepts. |
| Dawid–Skene EM over the judge panels already collected | ~2 h | Per-judge reliability and a soft consensus label. Directly tests whether “no shape feature separates conifers” — the verdict that killed four techniques — rests on reliable judges or one confident outlier. At n≈13 that verdict is no evidence, not a refutation. |
| Off-ground intensity bimodality — histogram candidate-point intensity against the p98 actually in use | ~2 h | Quantifies how content-dependent the delineator brightness gate is; tests whether a mode split is stable where a percentile is not. |
| Nadir trajectory reconstruction — per record, take |scan_angle| ≤ 2°, test whether the XY locus is a 1D curve | 1–2 h | Sensor path → per-point range → true incidence angle. Reopens radiometrics on a defensible basis and enables ray-cast reasoning for the fusion and occlusion failure modes. |
| Grid-phase stability — re-run seeding at four half-cell XY offsets | cheap | Flags detections that exist only because of where the occupancy grid happened to land. |
| Point-thinning stability — keep every 2nd/4th point | cheap | Separates robust geometric cues from density artifacts — directly relevant to the conifer density band. |
| Multi-radius texture — recompute curvature/omnivariance at 2–3 neighbourhood radii | cheap | Whether scale robustness recovers any of the fence/bush confusions a single radius misses. |
| Road-referenced intensity normalisation — per-file median over the run4 road mask | read-only pass | The one surviving radiometric fragment: a label-free per-file gain reference. Reject it if it tightens one proxy population by collapsing another. |
| Leave-one-record-out feature jitter | ~half day | A free per-detection confidence score. Any detection that survives via a single record is a ghost. |
| Station-periodicity autocorrelation | ~half day | Confirms systematic detection and enumerates missed posts by location — the recall worklist. |
| Windowed continuity counter on the 13 curated conifer candidates | ~1 day | The one taper-family variant not yet falsified: longest run of adjacent decile-pairs passing a size-monotonicity test, evaluated only on masks that already exist. |
| Per-record multi-view agreement — recompute cluster features per record, require consistency | ~days | The correct reading of “evaluate per azimuth”. A line-of-sight-fused pair is a cone from one record and two blobs from another; a real cone is a cone from every record. Object-centric sector binning was measured saturated — 8 of 8 sectors for delineators, signs and trees alike. |
Copy-paste recall probe — translate verified masks from point_masks.npz into ~20 segments at known coordinates | ~1 day | Manufactured ground truth with zero annotation: exact recall vs range, vs record count, vs point count. The decimation variant (75/50/25% of points) prices delineator_min_points = 300 directly. |
| Corpus audit — does any corpus have real RGB in leaf-off? Do A1 and A4_5 overlap geographically? | ~hours | Season and colour availability are perfectly confounded across corpora, so no colour result is currently separable from a season result. Geographic overlap would give repeat-epoch pairs — another free-label source. A2 and A3 are unused. |
What's dead, and why
Two of these deserve promotion to repo-level constraints so they stop being re-argued per technique.
promote to constraint Multiplicative radiometric corrections
promote to constraint All colour work on A1
plate_thickness_m ≥ 0.175) passes zero, and 25 threshold
combinations changed no verdicts. No colour index at any threshold can alter any A1 output
until that clause moves. Separately, GLI is not a second cue: it shares ExG's numerator
exactly, and measures Spearman ρ = 1.000 against it.
The taper family — one technique, already built
_decile_radii / _conicity /
_crown in the conifer worktree, and already measured.
Caveat: that negative rests on n ≈ 11–13 objects adjudicated by blind agent
judges. At that sample size it is a no-evidence result, not a refutation — which is what the
Dawid–Skene probe is for.
Trunk-seeded tree delineation
Anything that changes cluster membership in place
FEATURE_NAMES input of the locked RF, breaking the
additive-only and byte-identical regression gate. Viable only as experimental parallel paths.
Three techniques that are descriptions of shipped code
ring_fill_ratio; the per-segment intensity percentile
is hi_intensity_all_points_percentile = 98; the billboard-size ceiling is
panel_len_major_max_m. The literature sweep rediscovered existing code three
times — which is itself a useful signal about where the pipeline already sits relative to
published practice.
Beware the vacuous census: any tree-path-only change trivially zero-diffs the
143 A4_5 segments because tree_detection.enabled defaults false. That null is not
evidence of regression safety — the gate it claims to pass was never exercised.
Sources worth keeping
| Source | What it gives |
|---|---|
Hui et al. 2022, Forests · 10.3390/f13081245 | Multi-stem under-segmentation flag + Dijkstra voxel split; F1 0.81 roadside. Fails on ground-touching branches — our own skirt failure mode. |
Cabo et al. 2014, ISPRS JPRS · 10.1016/j.isprsjprs.2013.10.008 | Slice-and-link pole detection, the classical baseline. |
| Li & Oude Elberink 2013, ISPRS Annals II-5/W2 | Percentile-windowed continuity; N-of-M cue voting. |
El-Halawany & Lichti 2013, GIScience & RS · 10.1080/15481603.2013.866815 | Road-pole detection; PCA linearity plus RANSAC line support. |
Tao et al. 2015, ISPRS JPRS · 10.1016/j.isprsjprs.2015.10.007 | Shortest-path crown segmentation from ecological theory. |
Li et al. 2016, ISPRS JPRS · 10.1016/j.isprsjprs.2016.07.009 | Dual-growing individual tree extraction from MLS. |
Kashani et al. 2015, Sensors · 10.3390/s151128099 | Radiometric processing taxonomy — the reference for why our channel supports none of it. |
Wen et al. 2016, IEEE T-ITS · 10.1109/TITS.2015.2418214 | Traffic-sign inspection from MLS. |
Remote Sensing 2023 · 10.3390/rs15133254 | Vegetation-index thresholds for coloured point clouds (SCND) — superseded by phase 6's three-population fit. |
JSTARS 2019 · 10.1109/JSTARS.2019.2929546 | Rapid roadside tree inventory; height-slice profiles. |
Schwab & Kolbe 2026 · arXiv:2603.11252 | Radiometric fingerprinting. Needs an LoD3 semantic model and a trajectory, so dead here — but the road-surface gain-reference fragment survives. |
Brunner & Houtmeyers 2022, Eur J Forest Res · 10.1007/s10342-022-01481-5 | Conifer crown segmentation in mixed Scots pine–Norway spruce stands. |
Method & caveats
Five parallel Codex web-search agents (one per angle) → URL dedup, capped at four sources per angle → 15 deep-readers fetching and extracting techniques mapped onto concrete pipeline stages → an adversarial verifier per source, instructed to assume the technique does not transfer → two independent completeness critics, one search-grounded and one reasoning from first principles. 36 agents, ~1.8M subagent tokens.
- Two deep-readers emitted schema stubs, both in the label-free angle — so that angle returned essentially nothing from the literature, and its content here comes from the critique pass instead.
- Verdicts described as measured were backed by real runs on battlebox during review, not by argument alone.
- All delineator counts on this page were re-derived from
out_final/segment_*/verticalsigns.jsonafter the first draft's figures failed to reconcile withdata/qc_verdicts.json, which is a QC sample of 23 confirmed detections and 13 confirmed false positives — not a census. - The expected-count band is an estimate from regulation spacing, not a survey. It assumes posts on both sides for the whole corridor and so overstates the gap somewhat; the audit in step 1 is what would replace it with a measurement.
Full working notes: docs/research/deep-research-20260801.md in the repo.