Skip to content

Corner flow: no "the wall just ends" answer, the refusals loop, and a surface behind the end post was accepted as the next wall #70

Open

Description

@AidenJohnston

The corner flow at a wall end has no answer for "the wall just ends", the "Mark next wall" refusals loop with no way back, and a surface behind the end post was accepted as the next wall.

Seen in. Device field test of TestFlight build 4.1 (beta at 45017ba), iPhone 14 without LiDAR, iOS 26.6.2. Run 1 (indoor mock wall), video 1:14–1:46, 2:02–2:22 and 2:47–2:55. Report: run 1, A41-1-06. Run 2 didn't hit it because the tester chose "Something blocks it" at both ends.

What happens.

  • Left end, 1:14: "What's at the left end? / This tells the installer whether the wall keeps going", with two answers: "It turns a corner" and "Something blocks it". The mock wall is free-standing, so neither fits. The tester tapped "It turns a corner" (1:17).
  • 26 s of refusals followed, cycling "Walk round the corner, then aim at the next wall", "No wall under the circle / Step closer and aim at the next wall", "You're past the end of the wall / Photos here aren't kept" and "That wall doesn't meet this one at the corner". Tester: "No wall under the circle, you're past the end of the wall. What? … I don't understand what it wants".
  • At 1:43.8 "Mark next wall" was accepted while the phone aimed at a plywood face behind the end post. The strip reopened on the left.
  • At 2:02 the same question came back. "It turns a corner" again, 16 s more refusals, then "Can't get there" at 2:20. The left end was left unexplored at 1 ft 0 in left.
  • Right end, 2:47: the same again, ending in "Can't get there" at 2:55 (unexplored at 20 ft 3 in right).
  • The accepted corner didn't survive into scene.json: one wall, both ends unexplored.

Cause.

  • The end question offers only two answers (WallWalkScreen.swift#L172-L193). "Something blocks it" (hint: "A fence, gate, or your neighbor's yard") doesn't read as "it ends". Real garden walls, fences and bump-outs end too.
  • Once "It turns a corner" is chosen, the only way out of the next-wall step is "Can't get there", which reads as something else (ScanEngine+Actions.swift#L373-L376). There is no Back.
  • Past-end coaching isn't suppressed during the next-wall step (ScanEngine.swift#L528-L551, #L577). "You're past the end of the wall" fights "Walk round the corner": walking round the corner is going past the end.
  • maxCornerFromEnd is 3 m, described in code as a guess (CoverageMap.swift#L1120-L1141). That is loose enough to accept an unrelated surface near the end.

Fix direction.

  • Add a third answer, "The wall ends here", that sets a limit end.
  • Add "Back" on the next-wall step, returning to the end question.
  • Suppress the past-end coaching while nextWallSide != nil.
  • Tighten the corner bound, or require the new wall's line to pass within about 1 m of the marked end.

Related. A41-1-06; A41-1-11 follows from it (see "A closer spot may exist on the left" shows after the left end was reached, or when the spot is already on the left). #29 (end prompt).

Screen recordings are in the comment below.

Activity

  1. added
    bugSomething is broken or behaving incorrectly.
    size:M30-99 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

    Corner flow: the refusal loop, a way back, and which surface counts as the next wall

    The missing "the wall just ends" answer is fixable now and is being added separately as a third button. It maps to the existing limit end kind (the same path as "Something blocks it", answerWallEnd(turnsCorner: false)), with no engine or contract change. Three parts need a decision.

    1. The refusal loop. After "It turns a corner", the end stays unexplored. Walking round the corner then puts the phone past that end, so CoverageMap.unexploredEndPassed fires, photos there are refused, and the walk shows the .pastWallEnd coaching card, "You're past the end of the wall. Walk back toward your meter". Coaching replaces the "Walk round the corner" instruction, and "Can't get there" is hidden while any coaching shows.

    • A. While the next wall is being looked for (nextWallSide set), don't raise the past-end card on that side, and keep photos there. Once the corner is accepted, turnCorner replays kept cameras against the new wall, so they count; if the step is abandoned they add no coverage. Ideally the suppression lives in HouseScanKit (an ignoring: side on unexploredEndPassed) so it is unit-testable. (Recommended.)
    • B. Keep the card, but leave "Can't get there" visible under it. Smaller, but the card still contradicts the instruction.

    2. A way back. The next-wall step has no Back; the only exit is "Can't get there", which reads as something else.

    • A. Add "Back", which clears the pending next wall and asks the end question again. Needs one new app action (cancelNextWall on the actions protocol, the engine and the preview engine) plus a secondary button in the next-wall controls. (Recommended.)
    • B. No new control; rely on "Can't get there".

    3. Which surface is accepted as the next wall. Today a vertical surface (detected or estimated plane) is accepted if it isn't nearly parallel to the wall, the tapped point lies beyond where the two lines meet, and that meeting point is within 3 m of the marked end (CoverageMap.maxCornerFromEnd, which the code calls a guess, not measured). A surface behind the end post passed.

    • A. Tighten the bound (~1 m) and/or require the tapped point itself to be within ~1–1.5 m of the corner. Risks refusing real corners where the end was marked early.
    • B. Require a detected plane, not an estimated one. Risks refusing everything at night on phones without LiDAR.
    • C. Keep the bound, but show the accepted corner and ask "Is this the next wall?" before going on, and log the distance from the end. (Recommended until there is data.)

    What unblocks it: a pick for parts 1 and 2 (both app-only; part 1 touches the walk coaching that another open fix also changes, so it lands after that one). For part 3, device logs of how far real corners sit from where the end was marked; option C would collect them. Replays can't mark a next wall (no live raycast), so the end-to-end corner flow needs a device test either way.

    🤖 Generated with Claude Code

  4. AidenJohnston commented on Sep 27, 2026

    @AidenJohnston
    CollaboratorAuthor

    Team decision (2026-09-27): 1A (no past-end card while the next wall is looked for), 2A (Back on the next-wall step) and 3C (keep the 3 m bound, confirm 'Is this the next wall?' and log the distance), in PR #136.

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:M30-99 effective changed lines.

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions