Same model, 47 semantic-object VQA cases over a YOLO+odom object memory from the
go2_bigoffice replay. The only change is ImageDetections3DPC.agent_encode() —
one method, no extra skills, no wrapper stores (gate-enforced abstraction budget).
Stability replicates: 0.9997 / 0.953 / 0.9998 — mean 0.984, every replicate above 0.95. Residual is per-row sampling variance (one flaky MCQ), not encoding capability.
ImageDetections3DPC [1 detections @ 6.670]
┏━━━┳━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━━━┳━━━━━━━━┓
┃ # ┃ Name ┃ Class ┃ Track ┃ Conf ┃ Dist ┃ Points ┃
┡━━━╇━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━━━╇━━━━━━━━┩
│ 0 │ surfboard │ -1 │ -1 │ 0.51 │ 17.44m │ 1 │
└───┴───────────┴───────┴───────┴──────┴────────┴────────┘
bottle#0 conf=0.57 pos=(-4.0, -2.8, 0.3)
chair#2 conf=0.61 pos=(-1.4, 4.6, 0.3) ← instance ids pre-assigned
by the encoder's greedy scan
SEMANTIC OBJECT MAP -- reading guide and reasoning procedures.
Each observation below is one camera frame; each entry reads
"name#k conf=C pos=(x, y, z)": one detection of class name at world-frame
position (x, y, z) in meters (+x east, +y north, z up). The same physical
object is re-detected on many frames, so it appears as many entries with
slightly different positions; #k is its instance id — entries sharing a
tag (class AND id) are sightings of the SAME physical object (ids come
from an exact greedy scan: a detection joins the first same-class instance
whose running-mean position lies within 1.5 m, else it founds the next id).
Use these procedures exactly; do every computation numerically, step by step.
P1 BUILD THE OBJECT LIST FIRST (before answering anything):
a. Group entries by their full tag (class AND id). Each tag is ONE
physical object: position …
| recall | “List every distinct object class recorded.” | 10 classes (set-F1) |
| count | “How many distinct chair objects are in the mapped area?” | 6 ±1 |
| within | “List every class within 3 m of the bed.” | [laptop] |
| nextto | “Which class is nearest to the bed (other than bed)?” | laptop |
| between | “Which single class lies between the laptop and the teddy bear?” | chair |
| objdist | “How far apart horizontally are the bed and the refrigerator?” | 15.07 m ±3.77 |
| robotdist | “You are the robot (pose = last odom). How far are you from the book?” | 5.52 m ±1.38 |
| egoside | “You face your odom heading. Is the refrigerator ahead, behind, left or right?” | right |
| compass | “Which compass direction is the bed from the refrigerator?” | northwest |
| exp_0004 | 0.355 | baseline — raw per-frame rich tables (all information, no structure) |
| exp_0005 | 0.831 | closed-form recipe legend + compact name/conf/pos rows |
| exp_0007 | 0.945 | procedures made exactly mechanical (greedy time-order scan) |
| exp_0009 | 0.957 | clustering moved into the encoder — pre-assigned instance ids |
| exp_0011 | 0.978 | strictly-between admission test; dominant-axis compass caution |
| exp_0013 | 0.9997 | anti-salience rule forcing the per-class distance table — all 47 pass |
| structure lane | 0.827 | exp_0006→0010: compact canonical encoding lane (converged; recipes lane won) |