Skip to content

An AC is one tap, modelled as a 1 ft square, so the battery was placed under the AC stand-in #72

Open

Description

@AidenJohnston

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.json object ac: span_ft 13.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_unsure ranks 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.

Activity

  1. added
    bugSomething is broken or behaving incorrectly.
    size:L100-499 effective changed lines.
    on Sep 27, 2026
  2. AidenJohnston commented on Sep 27, 2026

    @AidenJohnston
    CollaboratorAuthor

    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.

  3. AidenJohnston commented on Sep 27, 2026

    @AidenJohnston
    CollaboratorAuthor

    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 obj branch). 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.

    • (a) Two taps at the unit's left and right edges, like a window, plus a nominal depth. This reuses Mark an existing battery or another box on the wall (#27) #52's two-corner box path. The packet's ac mark goes from one point to two. The packet manifest schema's points description currently says one point for an AC unit.
    • (b) Keep one tap, but give the AC its own default footprint, for example about 3 ft × 3 ft centred on the tap (a hypothesis, not a measurement), and say so on screen. No contract change, but it is still wrong when the tap lands on the unit's edge, as it did in run 2.
    • (c) (b) now, then (a) once Mark an existing battery or another box on the wall (#27) #52 merges.

    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.

    • (a) Keep a nominal depth, stated as an assumption with a plus_minus_ft that 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).
    • (b) Add a third tap on the ground at the unit's front edge to measure its depth. More accurate, but it's one more step, and it only works for floor-standing units.
    • (c) Send no footprint. The server treats the object as a mark on the wall line, with an agreed uncertainty. Note that the wall-line fallback is clipped at unexplored ends and can be set aside.

    elec_box is 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:

    1. A pick of battery option (a), (b) or (c) for Mark an existing battery or another box on the wall (#27) #52, which clears its two open P1 review findings.
    2. Agreement from the packet-format owner (PR packet: point to the server's capture packet 0.4 and propose 0.5 additions #22) on a two-point ac mark.
    3. An agreed nominal AC footprint, documented as a hypothesis.

    Order after the decision: finish #52 (fixes #27), then the AC change on top of it (fixes #72).

    🤖 Generated with Claude Code

  4. AidenJohnston commented on Sep 27, 2026

    @AidenJohnston
    CollaboratorAuthor

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething is broken or behaving incorrectly.size:L100-499 effective changed lines.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions