Vertical signs — pass 4: the vegetation-texture veto

AI3D-339 · 2026-08-02 · follows pass 3 · audience: Miro

TL;DR. Pass 4 killed 7 of the 9 vegetation false positives that pass-3's recall fixes had admitted — every removal adversarially confirmed, zero judged reals lost, validated by full re-runs on both datasets. The pass also produced a cautionary tale (the best instrumented feature collapsed on production values and was caught by the validation loop before shipping) and a strategy pivot for pass 5: chase recall, not precision — the fresh-eyes strategist and the Codex research memo both point at the StVO delineator lattice as the next big, label-free lever.
−7 FPs
validated removals, 0 additions
0 / 57
judged reals lost
4 / 4
A4_5 signs now judged real (was 4/6)
~12
judged-real misses still open on A1

The rule that shipped

Veto a delineator or sign verdict when plate_thickness_m ≥ 0.05 and hi_intensity_fraction_seed ≥ 0.668. Physically: a bush or a plastic shelter tube is a thick blob that is uniformly bright at the seed threshold, while every judged-real marker is either a thin plate (protected by the thickness conjunct no matter how bright — a plate is supposed to be all-bright) or a bright-head-dark-post delineator whose seed fraction stays moderate. Both cuts sit mid-gap on the 118 judged pass-3 clusters; the binding real (ag12, diamond+rectangle plates on a mast) sits at fraction 0.650 vs the 0.668 cut.

Rule in feature space
The 118 judged clusters on production feature values. The orange region is vetoed: it contains 5 judged-veg, 1 veg-leaning disputed, the newly judged s049 shelter tube — and no reals.

The transfer failure the validation loop caught

The pass began with a new instrumented feature: zbin_count_cv, the coefficient of variation of per-height-bin point counts (a marker concentrates mass at its plate; foliage fills every bin evenly). On the offline instrument it was the best vegetation cue ever measured here (AUC 0.854). Implemented in the pipeline and validated by a full re-run, it collapsed to AUC 0.542 — and the first-cut rule would have cost 3 judged reals (ag02, ag12, nm47).

AUC comparison
The instrument's separation came from neighbourhood context (a real post stands in empty surroundings; veg sits inside continuous vegetation) leaking into its approximate point selection — not from cluster texture. On exact cluster points the signal vanished.

Two lessons now in the working rules: thresholds are only ever derived on pipeline-computed values, and every candidate rule gets a full-rerun diff before it counts as shipped. The feature stays in clusters.csv as a diagnostic; the context-flavoured version of the idea (ring occupancy) is queued properly as a neighbourhood feature.

All seven removals, each with a verdict

The 7 removals

The one removal that had never been judged (an accepted "sign" in A1 segment 049) got the full adversarial treatment: crops rendered, Opus and Grok independently asked to refute the sign hypothesis. Both called it vegetation — a ~2.5 m uniformly bright cylinder with no plate flare and no head band, at the ragged edge of a canopy bank: a retroreflective tree-growth shelter tube (Grok high confidence, Opus medium).

s049 crops
s049: top-down 16 m (left), side elevations XZ / YZ (right). Uniform full-height brightness, constant ~5 cm radius — not a plate on a post.

Detection state after pass 4: A4_5 127 accepted (114 delineators, 4 signs — all four judged real, sign precision 33% → 67% → 100% of judged across passes 2→3→4), A1 57 (delineators ~40, signs 13). Remaining known FPs: the two dim scrub bands (too dark for this veto), two thin objects (yard cone, plant stem — the Codex memo confirms thin bare stems are a genuinely unresolved single-view ambiguity), and two other-manmade disputeds.

Lattice instrument: supporting prior only

Spacing-to-nearest-accepted-delineator separates in median (judged real 30 m vs judged veg 77 m) but overlaps badly — scrub bands sit on lattice positions too, and after fixing a self-match bug the collinearity cue mostly evaporated. Verdict: the lattice is never a standalone admit rule; it becomes useful as a phase-locked prior combined with texture gates — which is exactly what the research memo's HLB table enables (below).

Codex research memo (Q1–Q4)

Full memo: out_eval/research_pass4_memo.md (committed).

Fresh-eyes Fable strategist (new per Miro)

A context-free Fable subagent read only the session state + memo and judged the loop itself. Its verdict, condensed:

Pass-5 queue (merged: strategist × memo × pass-4 evidence)

  1. Freeze a blind holdout (untouched A1 + A4_5 segments) before touching any threshold — methodology fix, zero cost.
  2. Lattice-prior recovery of the ~12 judged-real sparse misses: fit phase + spacing per carriageway side (50 m straight / HLB curve table), admit near-misses that phase-lock within learned residuals, off at gores; validate with adversarial crops + spacing-residual distributions.
  3. Blind lattice-site occupancy audit — first external recall number, feeds the stop-condition evaluation directly.
  4. Cross-pass occupancy arbiter for every disputed/dim object (raw-point occupancy per driving pass at the object location) — physics tiebreak for the correlated-judges problem; also probes the dim scrub bands ag26/ag27.
  5. A4_5 count-contradiction audit (114 vs 26–51): delineator-vs-rail-reflector mass classification by rail presence and mounting height.
  6. RF refresh per memo Q2 recipe — last, once the above have generated more and harder labels.

Commits this pass (local only): 368046a (zbin veto, superseded), 997dd7e (recalibrated hi_seed veto), ede38e7 (research memo). Frozen baselines: p4_final_a45 / p4_final_a1 on battlebox. Pass-3 page: vsigns-pass3-20260802.