Repository navigation
ios: review follow-ups for the build 4.1 fixes on beta - #132
Conversation
… on a missing line Review of #119 (Part of #73), from the fix run's unfinished diff: - The correction lines are .notice, so `log collect` and Console without "Include Info Messages" both show them, and they carry the capture clock (t) and the phone's distance from the meter, to line them up with the packet and the video. - One line when the frames stop carrying the meter's anchor, and one when they carry it again (MeterAnchorPresence). - A summary on every phase change once the meter is anchored, with zero corrections too, and always on sending the scan and opening the AR result: corrections since anchored, frames with and without the anchor, the latest frame's sighting. Test: AnchoredMarksTests.anchorPresenceReportsOnlyChanges. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…y is out of view Review of #100 (Part of #41, #67): "on screen" both confirmed the AR scene and kept it, so on a LiDAR phone turning to the meter brought the Canvas back over RealityKit's copy: a second, unoccluded cable and tint a few centimetres off. Seeing the battery in view is now only needed to take over; after that the AR scene keeps the result while it is anchored and enabled, and hands it back when either is lost. Tests: confirmedThenOutOfViewButHeldStaysOnRealityKit, heldButNeverDrawnKeepsTheCanvas. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Review of #109 (Part of #75): the card clipped the stretch to the marked ends and rounded each end to the nearest foot. A server request is met only over its whole span, and ground past a limit end is asked for (#47), so a 4 to 33 ft request with a limit end at 20 ft read "from 4 ft to 20 ft", and 2.4 to 7.4 ft read "from 2 ft to 7 ft": showing what the card said left the bar short. The stretch is now named in full, the near end rounded down and the far end up. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@AidenJohnston Bounded independent review at d5c403d found no actionable source issue. The full-span/outward-rounding change resolves my #109 range-copy finding in this branch. Both changed ScanCopy.gap callers match the new interface. Fresh read-only review traced held/drawn ownership through tracking loss and the result view, plus anchor presence/correction logging and resets. Validation remains incomplete: current-head iOS is skipped, the body still contains RESULT_PLACEHOLDER, and the named local script excludes the every-state accessibility audit. Actual LiDAR rendering/occlusion, persisted device logs and the full ground request beyond an end remain unverified. The range transformation also lacks an isolated regression; please cover positive, negative and meter-crossing spans when adding test coverage. No new run requested and no hold on the existing f35 candidate. |
|
Note Review skipped Codemetrics is installed on this repository, but it hasn't been added to your team yet. To enable AI code reviews for this repo, go to your dashboard and add house-scanning-master to your team's repositories. |
AidenJohnston
left a comment
There was a problem hiding this comment.
Adversarial review of #132 at d5c403d (base beta 5bc81fb, which is also the merge base). I read the diff and the changed files on the branch, origin/beta, and the review threads on #100, #102, #104, #108, #109, #119 and #120.
Must fix
None.
Should fix
-
ios/HouseScan/Runtime/ScanEngine.swift:414and:1453, withResultOverlayPolicy.swift:34: a tracking blip or a model rebuild still brings the double draw back while the phone points at the meter. The latch holds only whileheldstays true without a break. Two things in the engine makeheldfalse for at least one 100 ms poll:- Any tracking change away from
.normalcallssetResultVisible(false), soisEnabledInHierarchyis false. - A rebuild when the wall moved more than 5 cm (
showResultInCamera(rising: false)) callsremoveResult()and then adds a newAnchorEntity, which may not be anchored on the next poll.
Either one resets
usesRealityKit, and taking over again requiresdrawn, which means the battery's middle must be on screen.- Scenario: RealityKit is confirmed on a LiDAR phone. The homeowner swings the phone quickly to the meter, and ARKit reports
.limited(.excessiveMotion)for about 200 ms. Alternatively, ARKit corrects the meter anchor by more than 5 cm as they walk back. When tracking returns, RealityKit is enabled again, but the policy is back on the Canvas. With the spot off screen, the second, unoccluded cable and tint return near the meter, which is the #100 S1 case. They stay until the battery is back in view for 0.5 s. - The new tests cover only an unbroken
held. - Suggested fix: keep a "confirmed once this AR session" flag in the policy. After a loss of
held, take over again onceheldhas been true forconfirmationseconds, withoutonScreen. #67 isn't at risk, because non-LiDAR phones never reach this path. Also add a test for "confirmed, held drops for one poll, held returns off screen".
- Any tracking change away from
-
The table's "#100 S2: Already fixed (chevron lane 260/300 pt)" claim is wrong. The finding is still open on beta (
ios/HouseScan/UI/Screens/ResultARScreen.swift:128-129, unchanged here). The lane moved where the chevron is drawn. The decision whether to draw it still uses the whole view inset by 24 pt:view.contains(point)returns nil when the spot is on screen.- Scenario: at the demo wall the presenter holds the phone up toward the meter, and the battery's spot projects under the bottom 300 pt of buttons or the top 260 pt card. No chevron shows, and the battery is behind the chrome.
- Fix: test visibility against
lane(or the sameCGRect(x: 36, y: 150, …)the walk uses) instead ofview. Until then, change the table row to "Not fixed, deferred".
-
This PR's GitHub run can't pass the merge gate as things stand.
- The body says the Mac mini
ci-local.shrun skips the every-state accessibility audit. - The full iOS run on beta's own head (
5bc81fb, run 36302099002) fails that audit atScreenStatesUITests.swift:503:wallWalk-aim: Contrast failed … id 'aim.legend'.aim.legendcame from 9704867, #117's aim-ring change, not from anything here. - Expect the queued PR run 36304559523 to fail the same way. Say so in the Verification section, and link the fix or the owner's waiver rather than reporting "passes CI".
- The same run shows
gapRequest-followUp-AX5passing on beta, so #109 M1 really is fixed.
- The body says the Mac mini
Notes
- What this PR fixes (check 1).
-
#100 S1: fixed for the reported case, turning to the meter without a tracking break.
heldgates keeping RealityKit but never taking over (heldButNeverDrawnKeepsTheCanvas), and thehelddefault offalsekeeps other callers on the old behaviour. The Canvas still appears whenever RealityKit hasn't been confirmed, so the #67 fallback still works. The chevron (SpotDirection) doesn't depend onresultInCamera, so it still shows while RealityKit holds the result. -
#119 M1, M2, S1: all three are addressed. The lines are now
.notice. Anchor present/missing/other-anchor lines are written on change only. A summary is written on every phase change once the meter is anchored, and always on.uploadingand.resultAR.tand the distance from the meter are on each line. -
#109 S3, S4: fixed.
Distance.rangenames the full span and rounds outward, and I checked the arithmetic by hand:Request Card text 2.4…7.4 ft 2–8 ft right −7.4…−2.4 ft 2–8 ft left −2.6…1.2 ft 3 ft left to 2 ft right 4.27…6.89 ft (demo) 4–7 ft 0…x ft "from your meter" With outward rounding,
(0, 0)"around your meter" can no longer be reached in practice. That is harmless. -
The only other
ScanCopy.gapcaller isScanEngine+GuidanceLog.swift:42, which is updated.
-
- Beta claims I spot-checked (check 2), all confirmed on
origin/beta.- #120 M1: 8487a02 is an ancestor.
laggingBand'snearestRunsplits runs at deferred cells (GuidancePlanner.swift:389-401). - #102 M1 / #104 M1 (second review):
coachingHidesReplyis exhaustive with the #104 cases and has nodefault(WallWalkScreen.swift:287-291). - #102 S1:
.transaction(value: instruction)is atInstructionCard.swift:79. - #104 M2:
asksToWalkis used inisAiming(ScanEngine.swift:740) and tested. - #104 M3:
GapRequestScreen.swift:130-135uses the ride-along andcoachingReplacesTask. - #104 M1 (first review):
withCoachingkeepstask.detail(ScanCopy.swift:173-176). - #109 M1: the AX-size layout is there, and the AX5 audit passed in run 36302099002.
- The only wrong claim is #100 S2 (Should fix 2).
- #120 M1: 8487a02 is an ancestor.
- Deferred items against the 5-minute judge demo (check 3). None has to block this PR.
- The one I would not leave to chance before the TestFlight is #108 S2 (
MeterTap.swift:125).refitaccepts a.wallplane of any size, once. An early 0.3 m fragment 11° off turns the whole wall, and the spot and clearances turn with it. - #108 S1 (
GroundPlaneChoice.swift:108) depends on the site: it only matters if the demo wall has two ground levels. - Both need one device run at the actual demo wall, checking the
refitand ground-choice log lines, before the build is used for the demo. A minimum plane extent inrefitwould be a cheap guard. - #120 S2 (overhead never asked on the walk) costs one extra server "Tilt up here" loop per scan, which is time in a 5-minute demo but not a failure.
- #109 S2 and #109's demo-sample note don't affect a live-phone demo.
reviewSampleisDemoEngine-only.
- The one I would not leave to chance before the TestFlight is #108 S2 (
- Regressions in the new code (check 4).
- Logging: there's no per-frame spam.
noteMeterAnchorruns on every delivered frame but logs only on a change. Pose-only and sampled frames buildmeterAnchorthe same way (LiveCapture.swift:441), so they can't alternate. Expect 2 or 3 lines at anchoring (a queued frame with the old id, then missing, then present), plus one per phase change. logAnchorCorrectionis now a persisted.noticeon every applied correction, pose-only frames included. If a non-LiDAR anchor jitters by more than 2 cm, that becomes one persisted line per pose frame. That's acceptable for a diagnostic, but it's worth a one-line rate cap if device logs show it.- No private data is logged: only floats, ints, the phase and fixed strings.
tis the ARFrame uptime clock. LiveCapture.swift:173computesinSessionbutheld(:186) doesn't use it. AddinginSession &&toheldcosts nothing and guards against anAnchorEntitythat staysisAnchoredafter ARKit drops the meter anchor.
- Logging: there's no per-frame spam.
- Public-repo rules (check 5). The diff, the three commit messages and the PR body contain no names, addresses, meter numbers,
private/content, internal thresholds or media. The numbers in comments (2.4…7.4 ft, 4–33 ft) are synthetic or come from public issues. - Overlap. t3/41-ac-review, t3/41-ends-corner and t3/41-walk-exit each still contain the two
ScanCopy.gap(gap, ends:)calls, but they are beta's own lines, unchanged on those branches. They merge cleanly after this PR, and only a newly added caller would break the build.
Verdict: ready-with-notes
🤖 Generated with Claude Code
|
Note Review skipped Codemetrics is installed on this repository, but it hasn't been added to your team yet. To enable AI code reviews for this repo, go to your dashboard and add house-scanning-master to your team's repositories. |
Health is 13e5d93. The mini-arkit replay finished in 168.0 s with run id run_06cd631bae08c30f. Stubs stay on. Co-authored-by: hss-cloud-agent <hss-cloud-agent@users.noreply.github.com>
What changed
Nine build 4.1 fix PRs were merged onto
beta, some before their review fixes were applied. I checked every Must-fix and Should-fix item from their reviews and the owner's follow-up comments against the currentbetacode (5bc81fb), including the "repair for beta testing" merges. Three things were missing. This PR fixes them:.notice, so they are kept on the device and show in Console without "Include Info Messages". Each line carries the capture clocktand the phone's distance from the meter. A line is also written when frames stop carrying the meter's anchor and when they carry it again. Every phase change after the meter is anchored writes a summary, even with zero corrections: the correction count, frames with and without the anchor, and the latest frame's sighting. Sending the scan and opening the AR result always write one. The code comes from the salvaged diff of the cut-off fix run, reviewed hunk by hunk. It applied cleanly.ResultOverlayPolicy.updatetakes a newheldflag (anchored and enabled, whether or not in view). Seeing the battery on screen is needed only for the AR scene to take over. After that the AR scene keeps the result until the anchor or the model is lost. Before, turning to the meter brought the Canvas back over RealityKit's copy, adding a second, unoccluded cable and tint a few centimetres off.ScanCopy.gaploses itsends:parameter, and both callers are updated.Review items against beta
coachingHidesReplyconflict with f14947e.transaction(value: instruction)on the stackedgeMargin,axisBias)needsSecondPositioncompares stored sightings across an anchor correctionScanCopy.withCoaching).slowDown.slowDown,.turnSlowly,.holdSteady)coachingHidesReplymissing the new casesasksToWalk)card.labelreadsGapRequestScreengapRequest-followUp-AX5contrast.existscheck should check that the control can be tappedscrollUntilHittableincontrols).infolines aren't kept, so "no line" can't be trustedwallWalk-endQuestionLeavesOutat AX5largestTextStatesdefault:in theonWalkTaskswitchTotals: 6 fixed here, 17 already fixed on beta, 13 open when this merged (12 deferred, plus #100 S2, which this table first marked already fixed and #137 fixes). Items that only asked for a rebase or a PR body edit on the original branches don't apply once the branch is on beta, so they aren't counted.
All nine PRs were reviewed, #120 included (its review was of 6ea58d5). Only the fix commit that landed on beta, 8487a02, had no adversarial pass after it. I reviewed it:
I found nothing new.
Why
Each of these makes a device run look wrong or leaves the next test unable to answer its question:
Verification
ci-local.sh t3/41-review-followups followups, which mirrors.github/workflows/ios.ymlwithout the accessibility audit): PASS on d5c403d. That covers the xcodegen drift check,swift testHouseScanKit with warnings as errors, the device build, and the UI tests: 23 run, 1 skipped (the optional recording), 0 failures.ci-local.sh. The one screen whose words change here is a server gap request, and the demo request's text is unchanged.ResultOverlayPolicyTests.confirmedThenOutOfViewButHeldStaysOnRealityKitandheldButNeverDrawnKeepsTheCanvas, andAnchoredMarksTests.anchorPresenceReportsOnlyChanges.Distance.rangeis in the app target, which has no unit-test target, so there is no unit regression for the rounding or the clipping. The existinggapRequest-groundOutUI expectation ("From 4 ft to 7 ft right of your meter.", for 4.27–6.89 ft) still holds under outward rounding.Needs a device:
AR result drawn bylog lines.meter anchor in frames:andmeter anchor at <phase> -> <phase>lines, andmeter anchor corrected at t=lines if ARKit corrected the map.Risk
ScanEngine.swift:go(),ingest, both resets,setMeterAnchorandwatchResultInCamera. t3/41-walk-exit also works inScanEngine, but these edits add lines only and are away fromcannotAccessAreaand the walk's end.GapRequestScreen.swiftandScanCopy.gap: one line each. A branch that still passesends:toScanCopy.gapwon't compile until it drops the argument..noticeline on every phase change and on each anchor present/missing change. That is low volume, but a flickering anchor would write a line per change.Part of #41. Part of #67. Part of #73. Part of #75.
Checklist
🤖 Generated with Claude Code