Vertical-sign detection — pass 8

AI3D-339 · 2026-08-06 · the pass that falsified its own fatigue narrative: rail half-posts, a retroactive holdout pass, and a rule refused on principle
TL;DR — The fresh-eyes strategist forecast a STOP for this panel and gave the CONTINUE branch ~35%. That branch landed. The panel returned CONTINUE 3–1, Sol dissenting STOP-3 at 78%. Three things moved. (1) A rail-relative half-post search on A4_5 — built on the guardrail repo's own detections — produced 101 candidates, of which the 45-item bright/multi-record prime stratum was fleet-judged and then reviewed PNG-by-PNG by Miro: 43 real half-posts, 1 full post, 1 wall. A4_5 goes 141 → 184. (2) An 11-case blind human session flipped two of the four holdout "vegetation FPs" to real, which makes the pass-7 PRIMARY criterion retroactively PASS (10 real : 3 FP conservatively, 11 : 2 with the med flip) against a bar it had missed by one verdict. (3) The saturated-head rule was refused and never built — the same session proved it kills a human-confirmed-real device — so the 46-segment reserve is still unconsumed. Also shipped: the carriageway edge-line gate, rebuilt three times until it was driven by the run7 lane XML at full-carriageway scope (2.9 s / 16.8 s per corridor, zero accepted devices rejected, median controls 821/821 and 911/911), and the crown_circles OOM is fixed bit-identically. A1 is unchanged at 75 — byte-identical to pass 7 — and that is exactly Sol's argument.
1 Headline numbers · 2 The human session · 3 Rail half-posts · 4 The edge-line gate · 5 crown_circles fixed · 6 A rule refused · 7 Panel & Sol's dissent · 8 Pass-9 queue

1 · Headline numbers

corridorCSV-accepted by typeCSVJSON-only by typeJSONtotal
A1 p8_final_a1 (= p7, byte-identical)delineator 55, sign 12, pole_other 269delineator 6675
A4_5 p8_final_a45 baselinedelineator 118, pole_other 7, sign 4, gantry_or_gate 2131delineator 7, rail_half_post 2, gantry_or_gate 110141
A4_5 after pass-8 overlaydelineator 118, pole_other 7, sign 4, gantry_or_gate 1130delineator 8, rail_half_post 45, gantry_or_gate 154184

141 + 44 admissions − 1 removal = 184, an exact match to the projection. The build is cp -r p7_final_* p8_final_* then admissions, then removals — removals last, the pass-7 invariant preserved. Re-running both apply steps against the already-overlaid tree gives applied 0 / NOOP and a recount of 184: idempotent. Every clusters.csv and verticalsigns.json under p8_final_a1 md5-matches its p7_final_a1 counterpart, zero diffs — A1 received no overlay at all this pass.

The pass-7 holdout burn retroactively PASSES its PRIMARY criterion. Original: 9 real / 4 FP = 1 FP per 2.25 gains, against a pre-registered bar of 1 per 3 — failed by a single verdict. After the blind human session flipped s013c246 (real delineator, HIGH) and s007c14 (sign, med): conservative reading (high flips only) 10 real / 3 FP = 1:3.33 → PASS; with the med flip 11 / 2 = 1:5.5 → PASS. SECONDARY already passed and is now stronger: the road-context gate's single holdout removal, s026c43, is human-confirmed a field stake — a genuine non-device.

Sol's counter, accepted on record: this validates the pre-registered FP:gain criterion after targeted human adjudication. It does not measure unseen missed devices and it does not validate corridor recall.

2 · The human session — 11 blind cases, 2 flips, controls 6/6

The package was blind (key held in p8_relook_key.csv), built on the proven pass-7 pattern: plain-path .bat, RGB-only PLY, cages, CloudCompare one-click. Standing authority rules applied unchanged — human HIGH is the truth apex, human MED against a standing LLM false-positive verdict is authoritative, LOW is a note, unsure changes nothing.

#true identityhuman verdictconsequence
01a1 s013c58CONTROLreal, medcontrol PASS
02a1 s012c211 — holdout "veg FP"other, high — field stakestays FP; family reclassified stake, not veg
03a1 s026c43 — roadctx rejectionother, med — field stakegate removed a non-device → SECONDARY holds, stronger
04a45 s066 JSON gantryunsure, med — "hanging from a gate"keep, flagged
05a45 s134c293 gantryvegetation, HIGHPULL → judged_removals_pass8.csv
06a1 s007c14 — holdout "veg FP"sign, medFLIP → real device
07a1 s029c120CONTROLreal, highcontrol PASS
08a1 s013c246 — holdout "veg FP"real delineator, HIGHFLIP → real (apex)
09a45 s055c278 gantryother, high — "probably a gate"keep as gantry_or_gate
10a1 s012c188 — rule-cost casereal delineator, HIGHsaturated-head rule kills a human-real → rule REFUSED
11a1 s017c136 — holdout "veg FP"sign, LOW — "halfpost sign"stays FP; note carried

3 · Rail half-posts — 101 → 45 → 43

~91% of A4_5 is guardrailed, and freestanding shape gates can never catch an Aufsatzleitpfosten — a stub bolted to the beam. Pass 7 researched a rail-relative search and never built it. Pass 8 built it, on Miro's directive to use the guardrail repo's own detector rather than our internal rail registry:

itemvalue
repo / branch3dai.iolabs.pointcloud.guardrails, worktree ai3d-tcs-recall-impl
commit7e0d8b2d065e084d4cc89c3a039c438a5c1c0b00
entry / configpython -m guardrails.detect, package default, no --set overrides
result143/143 segments, 367 rail instances, 16 288 m of centreline, 13 min on 4 workers, 0 errors
cross-checkreproduces the guardrail repo's own A4_5 audit exactly ("all 367 runs classify as w_beam across all 143 segments")

Environment note worth keeping: the guardrails pyproject.toml pins private Nexus packages and battlebox has no Nexus credentials, so uv sync was never attempted — the detector imports and runs unmodified under the verticalsigns venv, which already satisfies every version floor. The only degraded path is the XML exporter (STAND-IN XML exporter used); we consume guardrails.json only. No fallback rail extraction was needed.

The measurement that made it work

polyline_top_z_m is built from the median member height, so on many rails the beam's own crest sits up to ~0.5 m above it. Anchoring the search band on the fitted top fused every cluster into one 45-metre, 190 000-point blob per rail. The fix is to measure the crest directly — per dense sample, the p95 elevation of returns within 0.45 m laterally and −0.35…+0.55 m of the fitted top, gap-filled and rolling-median-smoothed over ±1.0 m of station, on the reasoning that a 0.15 m-wide half-post cannot lift its own floor. After re-anchoring the widest real-band cluster is 0.22 m along-rail. The fusion is gone.

Calibration was the two pass-7 rail_half_post admissions. One was rediscovered at 0.01 m (and on the neighbouring segment's rail, which is why the search is cross-segment) — a 0.11 m column standing clear of the beam with its retroreflector saturating at 65535 at +0.30…+0.50 m above the crest. That single candidate defined the gate; every threshold admits it with margin. The other was not rediscovered, because there is no rail under it: nearest detected rail vertex anywhere in A4_5 is 11.91 m away, and the lateral return histogram at the site shows a smooth embankment ramp where the seg125 site shows a sharp W-beam peak. The pass-7 type label on that device is impeached — it is a ground-mounted delineator on the verge; its admission is untouched, only its type is wrong (retype queued as pass-9 bookkeeping).

Null separations — the strongest label-free evidence in the pass

All four bands share identical geometry, clustering, features and gate; only the band's position moves, and every band is terrain-corrected to sit the same height above local ground. mirror and lat3 samples within 1.5 m of any detected rail are dropped, so those bands provably have no rail beneath them.

extra requirementreal (on-rail)along30mirror (rail-free)lat3 (rail-free)
none102 (0.626/100 m)104 (0.638)17 (0.130)33 (0.290)
n_sat ≥ 147 (0.288)24 (0.147)3 (0.023)0 (0.000)
n_sat ≥ 1 and nrec ≥ 246 (0.282)20 (0.123)1 (0.008)0 (0.000)
n_sat ≥ 5 and nrec ≥ 318 (0.110)11 (0.067)00

A saturated return plus multi-record support takes real:mirror from 4.8× to 35× and empties both rail-free nulls. Honest caveat, stated in the report before anyone asked: along30 is degenerate as a null and carries no evidential weight in its base form — a band displaced 30 m along the heading on a 91%-railed corridor lands back on rail, and its base rate (0.638) duly equals the real rate (0.626). Only mirror and lat3 are real nulls. And nulls bound the background rate, not precision: 35× enrichment says the band finds rail-attached structure, not that the structure is a delineator.

Judging: fleet, then Miro on every PNG

101 candidates, spanning 83 of 143 segments, strikingly homogeneous (median height above rail top 0.49 m, median width across 0.11 m, median maxI 51 816, median distance to the nearest already-accepted device 100 m — these are not re-detections). The 45 in the prime stratum (n_sat ≥ 1 ∧ nrec ≥ 2) were rendered as crop pairs and judged by Opus and Grok independently; Fable tiebroke 13 disputes by viewing, and all 13 went to real — Grok's vegetation credulity biting for the third pass running. Miro then reviewed all 45 PNGs himself before anything was admitted; the draft admissions were committed HELD pending exactly that.

43 real half-posts · 1 full post · 1 wall. 43 admitted as rail_half_post, of which 12 are half-vs-full unclear and default to half-post per Miro's instruction (the note travels with each row). rhp_s025_r0_c2 is a full post next to a wall — admitted as delineator, and it is veg-overturn #7 against the fleet. rhp_s107_r0_c0 is a wall and was rejected. That is 44 admissions, 1 rejection, 45/45 human-adjudicated — and the provenance string on every admitted row names the fleet votes and the human confirmation.
clean rail half-post on a W-beam
rhp_s034_r0_c0 — the family archetype. The cross-section (top right) resolves the W-beam and three bare support posts; a ~0.12 m stub with a saturated head rises exactly from the beam crest (cyan = fitted rail top). Grok called this vegetation at med; Opus called it real/high; Fable's tiebreak agreed with Opus at high. maxI 65535, n_sat 4, nrec 4.
rail half-post with a dense tree line behind
rhp_s022_r0_c0 — the case for measuring in rail coordinates. A dense tree canopy sits immediately behind the rail in plan view, yet in the along-rail panel the stub is the only thing standing above the beam line. n_sat 14, nrec 4 — both fleets high, no tiebreak needed.
rail half-post with a head-on-neck silhouette

rhp_s117_r0_c0 — the silhouette the judges converged on: a compact head on a thin neck, rooted at the beam crest, with the fuzzy vegetation mound to the left staying below and behind the rail. The along-rail panel underneath resolves the W-beam and its bare support posts for scale. maxI 62 935, n_sat 2, nrec 3 — Fable tiebreak, real/high.

half-post with adjacent vegetation column
rhp_s111_r2_c2 — a tiebreak. Fable: "the marked candidate is a compact stub seated on the beam; the ragged taller ground-rooted column ~0.7 m aside over the embankment is separate vegetation, not this cluster." The along-rail panel (bottom right) shows exactly that: one wispy multi-stem mass, one compact stub.
half-vs-full unclear candidate
rhp_s033_r0_c0one of the 12 half-vs-full unclears. Geometry is clean (stub on the crest, directly over a support post, no splay, no ground rooting) but at nrec 2 / n_sat 1 the crops cannot settle whether the shaft continues to the ground behind the beam. Admitted as rail_half_post by default rule, with the ambiguity recorded rather than hidden.
full post beside a wall, overturned from vegetation
rhp_s025_r0_c2admitted as a full delineator, not a half-post. The band found it because a wall behaves like a rail crest; the human read it as a full post standing beside the wall. Both fleet seats had called it vegetation. Veg-overturn #7.
wall panels rejected
rhp_s107_r0_c0rejected. Two solid ~0.9 m slabs on bare carriageway with n_sat 6826 and no guardrail anywhere in frame. The fleet read it as a large transient panel or vehicle; Miro read it as a wall. Different label, same conclusion: not a device. The one rejection in 45.
road context view of a rail half-post candidate

The context panel every judge saw alongside the close-up — rhp_s019_r0_c0, 40 m of corridor from above. This is the view that keeps "regularly spaced verticals in a field" from being mistaken for a delineator row: the candidate (circled) sits on the rail line between the carriageway and the tree band, not out in the vegetation.

What this search still cannot see, stated up front in the report: the band floor at crest + 0.15 m is forced by beam fusion, so the NCHRP valley-mounted delineator class — reflectors set into the W-beam trough — is structurally outside the search and remains unmeasured. Rail-reference recall is also a hard ceiling: a half-post on an undetected rail is invisible (segment_126 has no right-side rail instance at all). And the 55-candidate non-prime tail is unjudged — which is precisely why it is pass-9 item 1.

4 · The edge-line gate — three rounds to get one directive right

Miro's directive: "Signs between the detected edge lines should be rejected. This is a car." Motivating case: holdout b0 s011 c88, the smeared single-record vehicle from pass 7. Then, after the first attempt: "Do not use the road mask. Use the lines from run7 … from the XML. Much more reliable. And much faster."

roundroad modeloutcome
1 (08-05)paint, carriageway edge-line pairINERT — 0/33 and 0/46 segments armed. "0 rejects" was a non-measurement. A1 ships no run4; run4 on A4_5 is a featureless full-tile rectangle; the 55 000 saturation cut shows only the paint line nearest the drive line; the axis-elongation guard misfired on 51 × 34 m tiles.
2 (08-06)paint, driven-lane bandVALIDATED but narrow — paint cannot distinguish an edge line from a lane line, so it can only bound the lane the survey vehicle drove. Superseded.
3 (08-06)run7 lane XML (run7_xml.py)VALIDATED at Miro's original full-carriageway scope. Paint demoted to a default-off fallback.

The XML's Axis of the Edge features carry a LaneID and a role (A_OuterEdge_3, B_InnerEdge_1) with spline control points, so a carriageway is looked up, not inferred: the band between one lane's outer and inner edges. The median is the space between the two lanes' inner edges and is therefore outside every band by construction — which is what lets the gate keep the full-carriageway promise without endangering median devices. The <Geoshift> is already the point clouds' frame, so no coordinate shifting is needed.

Census, round 3

corridordevicesarmed segmentskeepflagrejectnull safetyruntime
A17632 / 337500PASS2.9 s
A4_513936 / 466800PASS16.8 s
control probeA1A4_5requirement
carriageway centre821/8211133/1139must be CAUGHT
outer verge821/8211135/1139must be KEPT
verge on an adjacent carriageway8/8must be KEPT
median (between the two inner edges)821/821911/911must be KEPT

Runtime is the "much faster" half of the directive: the XML path reads no point cloud at all — segment extent from tile metadata, edges from a cached per-corridor XML parse. A1 went from minutes to 2.9 s. Armed fraction rose from 22/33 to 32/33 on A1 (the one holdout is b0 053 at coverage 0.14) and 35/46 to 36/46 on A4_5, where only 6 of 31 XML files carry complete outer+inner lane pairs.

Two geometry faults the controls caught — both invisible without them.

1 · Lane letters are file-local. A4_5 ships 31 per-drive XMLs, and LaneID "A" in one drive is not the same carriageway as "A" in another. Pooling by letter mixed two carriageways into one pair and 39 median probes read as on-road — median devices would have been called vehicles. Lane identity is now scoped <file>:<LaneID>, held by test_lane_letters_are_never_pooled_across_files.

2 · Best-of-all-files is not safe. Taking the most generous band across 31 files let a single misaligned variant put the median on the carriageway. Replaced with cross-file consensus — a majority of the files covering a point must agree — plus abstention: a file whose band is more than xml_vote_slack_m away is describing a different stretch of road and does not vote.

A third finding was a fault in the control, not the gate: on A4_5 the nearest different-letter inner edge is typically 46 m away (p90 3 km), so unguarded midpoint probes landed anywhere and produced 61 bogus "median failures". A1, which has a real ~4.3 m median, was never affected — that measurement is what distinguished a broken control from a broken gate.

The decision rule stayed unchanged throughout: REJECT (onroad_transient) requires all of a gated type (gantry_or_gate exempt by type — its centroid is mid-span), on_road == 1 with a 0.3 m inward margin (delineators stand on the paint), h_max < 4.5 m, and transient corroboration (nrec ≤ 1 and n_records_local ≥ 2). Position without corroboration is a FLAG only. 408 tests green (17 new in test_run7_xml.py, 27 in test_edgeline.py).

Residuals, stated rather than smoothed over. A4_5's verge control fails 4 of 1139 in the unsafe direction (0.35%) — the binding null still passes, but that is the number to watch if the gate is ever widened. XML red flags: accepted judged-real devices reading as ON a carriageway — 2 on A1 (b1 seg008) and 8 on A4_5 (segs 025, 046, 066, mostly pole_other). None is rejected, because the corroboration rule and the height/type exemptions hold them, but the lane model disagrees with reality there and those segments are disarmed rather than trusted. And the census evaluated 76/139 devices against canonical 75/141 — a JSON-handling difference that owes a reconciliation (Sol's finding 6, pass-9 item 8).

5 · crown_circles — the regression that killed 6% of A1, fixed bit-identically

Pass 7's burn surfaced a MemoryError in radius.crown_circles that killed b0 segments 015 and 016 even on the 85 GB box. Pass 8 fixed it (ca39229: a bounded neighbour-chunk budget instead of one materialised radius-neighbour graph) and re-ran the two dead segments.

segmentwall clockpeak RSSrcdevices
b000 segment_0156:26 (387 s)1.14 GB00
b000 segment_0163:36 (216 s)0.84 GB01 delineator

Under the identical 45 GB virtual-memory cap these two segments blew through in pass 7, peak RSS was ~2.5% of the cap. The fix is verified bit-identical to sklearn DBSCAN across 360 randomised configurations, zero mismatches, so the two segments are directly comparable to their 28 siblings; the suite went 364 → 408 tests. p7_holdout_verify.py now reports VERIFY OK: 34/34 segments valid on both sides.

Nothing here rescores the burn. The branch-wide lattice pass was deliberately not re-run: p7_holdout_finish.py would rewrite the other 28 segments' outputs, which directly contradicts "do not touch any other segment" on a scored, consumed burn. run_summary.json was instead rebuilt merge-only and verified purely additive (added 015, 016; removed none; changed none). Consequence, stated rather than assumed: those two segments carry pre-lattice raw counts. Segment_015 is the densest input in the branch (1.1 GB, 10 records, 31 321 seed cells, 495 clusters) and contributes zero devices — the OOM was a huge crown band, not a device-rich stretch.

6 · The saturated-head rule: refused, nothing built, reserve intact

Pass 7's holdout produced an obvious candidate rule — require a saturated/compact bright head for solo non-rail delineators — which would have killed all 4 leaked FPs at the cost of one real find, turning a PRIMARY failure into a pass. The strategist wrote two refusal terms before the human session. Both triggered.

(a) The motivating FP family is contaminated — a flip occurred inside it (two, in fact). (b) The rule provably kills human-confirmed-real s012c188 (maxI 213), which Miro called a real delineator at HIGH in case 10 of the blind session.

Item 2 is CLOSED — REFUSED. No eval-slice validation was run, no null controls were built, no reserve was burned. The 46-segment reserve b0 091–136 remains UNCONSUMED.

This is the cheapest good outcome available: the rule was reverse-engineered to kill exactly four items, and the moment one of them turned out real, spending validation effort — let alone the single remaining fresh-data read — on it would have been sunk-cost work. It cost nothing to refuse because the human session ran first, which was the strategist's whole point in sequencing it there.

7 · Panel: CONTINUE 3–1, with Sol dissenting

Fable's seat was sealed first (d4a0df6) before any other seat read the dossier, as in pass 7.

seatverdictconfcore argument
Fable (sealed first)CONTINUEhighpass 8 falsified its own fatigue narrative (+43 human-ratified); rescue sieve + instrument repair + reserve burn LAST either finish the job or make the next STOP true rather than tired
OpusCONTINUE~0.85the highest-yield recall pass so far, with zero labels, refutes stop-1; stop-3 is unearned while a free instrument repair and an unread reserve exist; the 55-candidate control arm must be judged to finish the flagship experiment
GrokCONTINUEmed-highstop-3 conflates a broken measurement instrument with genuine data poverty; fix the instrument and burn the reserve before declaring a data gap
SolSTOP-378%recall observability failure: A1 coverage 0.20, trees and gates lack class-wide truth; candidate adjudication cannot prove the goal's "all" quantifier; the reserve protocol tests precision, not completeness

Sol's seat is worth reading in full rather than summarising away. The sharp version:

"Candidate adjudication cannot prove class completeness because it labels only surfaced candidates; a stratified human inventory or equivalent independent ground truth is needed to measure misses."
"Burning reserve merely to finish a checklist would test little about the unresolved A1 recall denominator."

And his self-check is honest in the other direction too — he names the strongest case against his own verdict and prices it into the 78%:

"Risk of premature stop: an A1 rail-relative probe could uncover a cheap repeat of the A4_5 gain … If that probe yields a material, independently auditable A1 population, the premise that only more data can move the main result would be weakened and the panel should reopen."

Sol's dossier-overreach findings — all seven accepted onto the record

  1. "The pass-7 directed queue is fully executed" is too absolute. The strategist's burn-LAST and half-split amendments were not executed. The rule branch closed without a burn — correct, but the dossier should say that rather than claim every directed action ran.
  2. The holdout retro-pass validates the pre-registered FP:gain criterion, not corridor recall. It "does not measure unseen missed devices". A1 recall remains instrument-weak at coverage 0.20.
  3. 6/6 controls is agreement evidence, not independent calibration. Six selected agreement cases estimate neither human sensitivity, specificity, nor candidate-selection bias.
  4. The 43/43 human ratification is not auditable from the rail report Sol was given. True and fair: it lives in the verdicts_pass8 CSVs, the admissions provenance strings and Miro's message — auditable, but poorly cross-referenced. It also covers the prime stratum only, not the unjudged tail or the valley-mounted class.
  5. "The A4_5 rail-band search is consumed" is wider than the actual audit — and the dossier's "35× worse null separation" for the 55-tail was a misattribution: 35× is the prime stratum's real-to-mirror enrichment. The source calls the complement "near-null-rate" and gives no comparative factor. That one was simply wrong in the dossier.
  6. Census device counts (76 / 139) are not reconciled to canonical (75 / 141). JSON-only handling differs. The zero-reject claim holds for census inputs; the reconciliation is owed.
  7. Three-case gantry adjudication closes the known disputes, not the gate class.

Recorded alongside: Opus's pre-committed falsifier — STOP-3 next pass if the pass-9 queue yields fewer than 5 A1 gains, an uninformative-or-empty instrument, and a clean burn — and Sol's four reopen conditions. Both dissent directions are on the record before the evidence, which is the point: pass 9 is built so the next verdict is decisive either way.

8 · Pass-9 queue (panel-directed)

  1. Judge the 55-candidate non-prime rail tail. The control arm. Converts +43 into a measured precision and closes Sol's overreach-5 as mandatory hygiene. Same protocol, fleet + tiebreak; expect near-null yield.
  2. Half-split record-partition Chao2 repair on A1. Replace single-drive occasions (a degraded protocol, per-drive p≈0.05, coverage 0.20) with random disjoint half-partitions of the record set, Chao2/jackknife across many replicates. Explicitly not the banned Chapman split-half. Pure battlebox compute, judge-free, zero holdout contact.
  3. A1 rail-relative probe. A1 is lightly railed so it is cheap — and Sol names it the one move that could reopen a material A1 delta.
  4. Valley/trough-mounted rail-delineator band on A4_5 — the class structurally excluded by the pass-8 band floor.
  5. Rescue sieve over unjudged full-run rejects (short_bare_post, unclassified) — a new physical signature applied to never-judged detector-internal rejects, not the exhausted veg-rescreen of already-judged items. 7 lifetime veg-overturns say gold remains.
  6. TREES SCOPE DECISION → Miro. Opus and Sol converge that stop-1 plausibly already holds for trees (the vegetation RF has no real supervision). Formal descope or supervised re-entry is his call; runs in parallel, blocks nothing.
  7. Reserve burn LAST and ONLY IF ≥5 plausible AFTER-only A1 gains accumulate. Full stack, per-rule toggle columns computed in the same single read, pre-registered before any read.
  8. Bookkeeping: seg126 retype; census-count reconciliation; s066 stays flagged; the 12 half-vs-full unclears carry their note.

Baselines: p8_final_a1 (75) / p8_final_a45 (184) on battlebox · holdout CONSUMED and retro-passed · reserve b0 091–136 intact · instruments in out_eval/pass8/ · zero human training labels · reports: pass 7 · pass 6 · journey