Repository navigation
An AC is one tap, modelled as a 1 ft square, so the battery was placed under the AC stand-in #72
Copy link
Copy link
Open
Labels
bugSomething is broken or behaving incorrectly.Something is broken or behaving incorrectly.size:L100-499 effective changed lines.100-499 effective changed lines.
Description
An AC unit is marked with one tap and exported as a 1 ft square around it, so a long unit becomes a point at one corner, and the battery was placed under the rest of the AC stand-in.
Seen in. Device field test of TestFlight build 4.1 (beta at 45017ba), iPhone 14 without LiDAR, iOS 26.6.2. Run 2 (indoor mock wall, a folding table as the AC stand-in), video 3:46–3:48 (the tap) and 4:34 (the result). Report: run 2, A41-2015-02.
What happens.
- "Tap the AC unit": the reticle sat on the folding table's near-left corner. The table stands in the corner and runs from there to the right wall, about 13–19.5 ft right of the meter.
scene.jsonobjectac:span_ft13.11–14.10, a footprint of about 0.98 ft × 0.98 ft, 0.5–1.7 ft out from the wall.- Result: spot 17.10 → 19.68 ft right, exactly 3 ft 0 in past the AC square (the AC rule's minimum). That stretch is under the right half of the table, the thing the tester called the AC unit. It needs 17 ft of cable.
- Run 1 tapped the same table in its middle and got an AC at 16.7–17.7 ft. Where the one tap lands decides where the whole unit is.
Why the spot went to the far end (server re-run: 784 candidates, 0 pass, 654 unsure, 130 fail):
_rank_unsureranks candidates whose best estimate breaks a rule below all others (solver.py#L1191-L1213).- Starts from 2.4 to ~10.3 ft are within 3 ft of the window on the estimate; starts from ~7.5 to 17.1 ft are within 3 ft of the AC square.
- The only start whose estimates all clear is 17.1 ft, just past the AC square.
- So the single-tap AC and the unmarkable existing battery (No way to mark an existing battery or other box on the wall #27) drive the whole answer.
Cause.
- The app marks gas meters and AC units with one tap and gives them a nominal 0.3 m width (
ScanEngine+Actions.swift#L282-L285). - The export writes a 0.3 m × 0.3 m footprint, described in code as "a hypothesis for a typical residential gas meter or regulator, not a measured size" (
SceneExport.swift#L320-L325,#L421-L434). An AC condenser is about 3 ft wide, and the same size is used for both. - The server treats that footprint as measured, with only the normal tap error.
Fix direction.
- App: mark an AC (and other boxy equipment) with two taps, left and right edges, as for windows. At least use a realistic default footprint for an AC (about 3 ft) centred on the tap, and say so on screen.
- App: add "Another battery / other equipment" as a mark kind (No way to mark an existing battery or other box on the wall #27).
- Server: until footprints are measured, treat a single-point object as having a size error of at least half a typical unit.
Related. #27, A41-2015-02. Run 3's AC condenser was in view for 8 s but never offered for marking (A41-2055-11).
Screen recordings are in the comment below.
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugSomething is broken or behaving incorrectly.Something is broken or behaving incorrectly.size:L100-499 effective changed lines.100-499 effective changed lines.
Activity
AidenJohnston commentedon Sep 27, 2026
Screen recordings from the build 4.1 field test (TestFlight 4.1, iPhone 14 without LiDAR). Click a link to play.
Times are in each run's recording. Full analyses: PR #60.
AidenJohnston commentedon Sep 27, 2026
Needs a decision: footprints for things marked on the wall, the AC unit (#72) and an existing battery or box (#27, PR #52)
Both issues come down to one question: how big is an object when the app only taps points and intersects them with the wall plane? The server uses any footprint it is sent as given (
server/scene.py, the"footprint" in objbranch). It also skips the unexplored-end clipping that footprintless objects get. So a nominal footprint counts as if it were measured.AC unit (#72). Today the AC gets one tap, intersected with the wall plane (
markFeaturePoint), and is exported as a 0.3 m (about 1 ft) square along the wall, centred on the tap (SceneExport.pointObjectHalfWidth/pointObjectDepth). That size is a hypothesis sized for a gas meter. So where the tap lands decides where the whole unit is. In build 4.1 run 2 the tap landed on the stand-in's near corner, so the scene held a square at about 13–14 ft while the stand-in ran to about 19.5 ft. The spot then went 3 ft past the square, which put it under the stand-in.acmark goes from one point to two. The packet manifest schema'spointsdescription currently says one point for an AC unit.A condenser also stands out from the wall. So AC taps have the same off-axis projection error as the battery below, and whatever #52 settles for front-face taps should apply to the AC too.
Existing battery or box (#27, PR #52). The corner taps land on the unit's front face, which can be up to about 22 in off the wall, but they are intersected with the wall plane. When the phone is off to one side, the span shifts away from it (both reviews on #52 work through examples). The 22 in depth is nominal, not measured.
plus_minus_ftthat covers it. Intersect each tap ray with both the wall plane and the plane at that depth, and take the union (conservative for units up to that depth).elec_boxis shallow, so the wall-plane hit is close enough for it under any option.Recommendation: (a) for the battery in #52; (c) for the AC, meaning the one-tap default footprint now and two taps once #52 lands.
Not covered by either. In run 3 an AC condenser beside the meter filled the frame for about 8 s but was never marked ("Anything else near your meter?" said "Nothing marked yet"). A "mark nearby equipment" nudge on the mark screen needs its own item, either in the AC follow-up or as a new issue.
What unblocks it:
acmark.Order after the decision: finish #52 (fixes #27), then the AC change on top of it (fixes #72).
🤖 Generated with Claude Code
AidenJohnston commentedon Sep 27, 2026
Team decision (2026-09-27): option (b) now (one tap, assumed about 3 × 3 ft), in PR #131; two-tap AC later.
🤖 Generated with Claude Code
Return finalize 202 before promotion and start_run. (#72)