Two things changed our shared picture: (1) your orientation fix worked — orientation is now sufficient, don't chase more angling; (2) the leftover error is fixed, not jittery, and it lives on those specific long links — A3 ranges fine to the phone (+0.10) and to A4 (−0.15 m), so it's the path, not A3's radio.
And on glass (you had the Pixel in first-person the whole time): the phone now localizes itself and the anchors move smoothly — the client-side fixes work. But the view still points the wrong way and slowly slides the anchors in and out of frame, from two separate causes: (a) the map is warped by that fixed stretch, so bearings are off; and (b) the camera has no compass lock — the AoA heading was disabled because it read ±40° garbage, so it drifts on raw gyro. Two faults, two fixes — and neither is "more smoothing."
Each anchor measures distance to another by timing how long a radio pulse takes to travel between them. If the straight path is clear, the timing is the true distance. But if something blocks or weakens the straight path, the radio locks onto the next thing it hears — a reflection off a wall, the floor, or a metal object. That bounce travelled farther, so the anchor reports a distance that is too long, and it jitters as the reflection shifts. Engineers call this "non-line-of-sight." I'll just call it an echo.
Your four anchors and the six links between them, drawn to scale from the locations you gave me (A4 dropped to the floor at about 20 cm). Green links measure true. The two red links — both belonging to A3 — read about 0.6 m too long. One link (amber) reads oddly short.
"Measured" is the steady value each pair reported over the whole recording; "true" is the distance from your layout with A4 on the floor. "Spread" is the shape of the readings — a clean link sits on one value; an echo has a long tail of even-longer readings.
| Link | Measured | True (A4=0.20) | Difference | Spread | Reading | |
|---|---|---|---|---|---|---|
| A1 – A2 | 2.40 m | 2.29 m | +0.11 | tight · small offset | ||
| A1 – A3 | 4.27 m | 3.70 m | +0.57 | ↔ tight · steady +0.57 | ||
| A1 – A4 | 3.79 m | 3.85 m | −0.06 | clean ✓ | ||
| A2 – A3 | 5.10 m | 4.35 m | +0.75 | ↔ tight · steady +0.75 | ||
| A2 – A4 | 2.82 m | 3.15 m | −0.33 | ? short · noisy tail (A4) | ||
| A3 – A4 | 2.57 m | 2.72 m | −0.15 | clean ✓ |
Capture 4 flipped one of these tells. Last capture the two red links were inflated and carried a long tail — a jittery echo. After your re-aim the tails are gone (they read tight now) but the inflation stayed: a fixed +0.57 / +0.75 m stretch. It still isn't a per-device miscalibration — that would shift all of A3's links, yet A3–A4 is clean and the phone ranges A3 fine (+0.10 m) — so the stretch is tied to those two long cross-room paths, not to A3's radio. The one remaining tail is now on A2–A4, the loose floor anchor.
To pin four anchors into one rigid 3-D shape, the mesh needs all six distances to be right — there's no slack. A3 is held in place by three "ropes" (its three links). Two of them are too long, so they pull A3 to the wrong spot. Because every anchor's position is measured relative to the others, one wrong corner twists the whole shape — and each phone, solving from its own slightly different readings, lands on a different wrong shape. That's the "every diagnostics screen shows a different mesh" you saw.
The data still says A3's far side is the problem (short link clean, both long links off by a similar amount) — but capture 4 changed which cause is in play. The variable echo cleared, so a switching-reflection story no longer fits; a fixed stretch does. One candidate is ruled out and two remain, and a single A/B test tells them apart.
Was my first guess — an obstruction (TV/shelf/metal/person) on the cross-room lines. You confirmed the sight line is clear, and capture 4 agrees: a blocked path would have kept a jittery tail, but the tails collapsed while the offset stayed. A clear line that still reads long isn't a blockage. Dropped.
Across 3.7–4.3 m the straight signal is faint (but present), and the radio's first-arrival detector consistently latches a hair late → a fixed over-range. Fits the evidence: short/near links are clean, only the long ones stretch, and it's the same in both directions. This is orientation-independent — pinning bypasses it; removing it at source needs first-path-aware ranging inside the phone's radio, which we don't control.
UWB antennas delay the pulse by a small amount that varies with the angle you present them at (group delay). If A1/A2↔A3's mutual bearing sits in a slow part of A3's pattern, every reading on those links gains a constant offset. This is orientation-dependent — so the A/B rotation test (turn A3 90°) separates it from B: bias moves ⇒ C, bias holds ⇒ B.
A2–A4 comes in ~30 cm shorter than it should — in fact slightly shorter than the straight-line floor distance, which isn't physically possible if both anchors are exactly where we think. Echoes only make links longer, so this one is different: most likely A2 or the floor-anchor A4 isn't quite at its surveyed spot (A4 is loose on the floor at 20 cm and easy to nudge), or a strong floor-bounce is confusing that one low link. Minor next to the A3 echoes, but worth a glance while you're there.
Your four anchors are Samsung Galaxy S21+ phones; the moving observer is a Pixel 8 Pro. On all of them the ultra-wideband antenna sits near the top edge and is directional — strong out one face, weak out the others. Aim a weak side at an anchor and its straight signal loses to a reflection: that is the echo on A3's far links. Since you can set orientation exactly, use one deterministic rule for all four: upright, screen toward the room, top edge (the antenna) aimed at the mesh centre — the teal arrows on the map above. That gives every anchor a clear shot at every other, and it's repeatable test to test.
Turn A3 so its top edge points at the mesh centre (which faces it back across the room at A1/A2), stand it upright, and leave a few centimetres between it and the wall or any metal behind it. Its clean link to A4 proves the radio works — it's just pointed the wrong way.
A4 is the only anchor not on a tripod — propped at an angle in a cup at ~20 cm. Stand it upright on a proper mount, top edge toward the room. This should clear the noisy, slightly-short A2–A4 reading. (With pinning it won't block the map either way.)
Upright; top edge toward the middle of the mesh; out of any case with metal or magnets; not held in a hand (a body absorbs the signal); clear line of sight to every other anchor.
The engine does have echo defenses — but they're built to catch a sudden blip, not a steady echo, and the check that could catch a steady one doesn't run on the anchor-to-anchor measurements that build the map. So a link that is quietly 0.6 m too long on every single reading sails straight through.
Bottom line: the engine can't remove a real echo — clean signal has to come from the room — but it should detect it, distrust it, and say so, and it should be able to stand the map up on the survey when the raw measurements can't be trusted. Worth doing; I can deliver the detect-and-flag parts as tested patches.
You corrected the room for me last round. Two of your answers changed the diagnosis — flagged below — and that is exactly what this loop is for.
You drew the goal: point the phone at A1, and A1 shows up in the right place and stays there as you turn and orbit. The image on the screen is built as a chain — where the phone is, then where the anchors are, then the direction to each, then which way you're looking, then where that lands on the glass. Each link has to be right before the next one means anything. Two links are broken, and that order is exactly why the fixes are sequenced the way they are.
Capture 4 was the clean re-test, and it half-confirmed the theory: the variable echo is gone, a fixed stretch remains. That splits the way forward cleanly — I fix the map and the heading in code; you only touch the room again if we decide to chase the stretch to its physical source.
What the re-test actually showed, against the precise, falsifiable prediction I made last round:
Predicted: A3's two links drop from +0.59 / +0.67 m to near zero and their long tails disappear. Actual: the long tails disappeared (0.70→0.11, 0.54→0.15 m) — the echo half was real and your re-aim killed it — but the offsets stayed (+0.57 / +0.75 m). So the map still won't lock.
That's the useful half of "if they don't drop, I'm partly wrong": a purely jittery echo would have cleared completely. A steady offset that survives a clean line of sight is a fixed path-length or antenna effect — which is why the answer is now pin to the survey, not chase the room further. The optional A/B above is the only thing that tells us which of the two it physically is.
One honest limit: I can prove from your data that these ranges are corrupted and that no calibration can fix them — but I can't un-corrupt them from here. Clean measurements have to come from the room. That's the only reason this needs a device, and it's a confirmation step, not a diagnosis gap.