| corridor | CSV-accepted by type | CSV | JSON-only by type | JSON | total |
|---|---|---|---|---|---|
A1 p8_final_a1 (= p7, byte-identical) | delineator 55, sign 12, pole_other 2 | 69 | delineator 6 | 6 | 75 |
A4_5 p8_final_a45 baseline | delineator 118, pole_other 7, sign 4, gantry_or_gate 2 | 131 | delineator 7, rail_half_post 2, gantry_or_gate 1 | 10 | 141 |
| A4_5 after pass-8 overlay | delineator 118, pole_other 7, sign 4, gantry_or_gate 1 | 130 | delineator 8, rail_half_post 45, gantry_or_gate 1 | 54 | 184 |
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.
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.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 identity | human verdict | consequence |
|---|---|---|---|
| 01 | a1 s013c58 — CONTROL | real, med | control PASS |
| 02 | a1 s012c211 — holdout "veg FP" | other, high — field stake | stays FP; family reclassified stake, not veg |
| 03 | a1 s026c43 — roadctx rejection | other, med — field stake | gate removed a non-device → SECONDARY holds, stronger |
| 04 | a45 s066 JSON gantry | unsure, med — "hanging from a gate" | keep, flagged |
| 05 | a45 s134c293 gantry | vegetation, HIGH | PULL → judged_removals_pass8.csv |
| 06 | a1 s007c14 — holdout "veg FP" | sign, med | FLIP → real device |
| 07 | a1 s029c120 — CONTROL | real, high | control PASS |
| 08 | a1 s013c246 — holdout "veg FP" | real delineator, HIGH | FLIP → real (apex) |
| 09 | a45 s055c278 gantry | other, high — "probably a gate" | keep as gantry_or_gate |
| 10 | a1 s012c188 — rule-cost case | real delineator, HIGH | saturated-head rule kills a human-real → rule REFUSED |
| 11 | a1 s017c136 — holdout "veg FP" | sign, LOW — "halfpost sign" | stays FP; note carried |
s025 overturn in §3. This is a measured, repeated defect of the judge stack, not an anecdote.s012c211 and s026c43 are both "stake in the field". Two of the four holdout "vegetation FPs" were never vegetation at all — the stack was wrong about the family, not just the verdict.~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:
| item | value |
|---|---|
| repo / branch | 3dai.iolabs.pointcloud.guardrails, worktree ai3d-tcs-recall-impl |
| commit | 7e0d8b2d065e084d4cc89c3a039c438a5c1c0b00 |
| entry / config | python -m guardrails.detect, package default, no --set overrides |
| result | 143/143 segments, 367 rail instances, 16 288 m of centreline, 13 min on 4 workers, 0 errors |
| cross-check | reproduces 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.
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).
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 requirement | real (on-rail) | along30 | mirror (rail-free) | lat3 (rail-free) |
|---|---|---|---|---|
| none | 102 (0.626/100 m) | 104 (0.638) | 17 (0.130) | 33 (0.290) |
n_sat ≥ 1 | 47 (0.288) | 24 (0.147) | 3 (0.023) | 0 (0.000) |
n_sat ≥ 1 and nrec ≥ 2 | 46 (0.282) | 20 (0.123) | 1 (0.008) | 0 (0.000) |
n_sat ≥ 5 and nrec ≥ 3 | 18 (0.110) | 11 (0.067) | 0 | 0 |
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.
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.
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.
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.
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.
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.
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.
rhp_s033_r0_c0 — one 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.
rhp_s025_r0_c2 — admitted 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.
rhp_s107_r0_c0 — rejected. 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.
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.
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."
| round | road model | outcome |
|---|---|---|
| 1 (08-05) | paint, carriageway edge-line pair | INERT — 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 band | VALIDATED 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.
| corridor | devices | armed segments | keep | flag | reject | null safety | runtime |
|---|---|---|---|---|---|---|---|
| A1 | 76 | 32 / 33 | 75 | 0 | 0 | PASS | 2.9 s |
| A4_5 | 139 | 36 / 46 | 68 | 0 | 0 | PASS | 16.8 s |
| control probe | A1 | A4_5 | requirement |
|---|---|---|---|
| carriageway centre | 821/821 | 1133/1139 | must be CAUGHT |
| outer verge | 821/821 | 1135/1139 | must be KEPT |
| verge on an adjacent carriageway | – | 8/8 | must be KEPT |
| median (between the two inner edges) | 821/821 | 911/911 | must 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.
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.xml_vote_slack_m away is describing a different stretch of road and does not vote.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).
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.
| segment | wall clock | peak RSS | rc | devices |
|---|---|---|---|---|
| b000 segment_015 | 6:26 (387 s) | 1.14 GB | 0 | 0 |
| b000 segment_016 | 3:36 (216 s) | 0.84 GB | 0 | 1 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.
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.
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.
s012c188 (maxI 213), which Miro called a real delineator at HIGH in case 10 of the blind session.Fable's seat was sealed first (d4a0df6) before any other seat read the dossier, as in pass 7.
| seat | verdict | conf | core argument |
|---|---|---|---|
| Fable (sealed first) | CONTINUE | high | pass 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 |
| Opus | CONTINUE | ~0.85 | the 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 |
| Grok | CONTINUE | med-high | stop-3 conflates a broken measurement instrument with genuine data poverty; fix the instrument and burn the reserve before declaring a data gap |
| Sol | STOP-3 | 78% | 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."
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.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.
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.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