Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
312 commits
Select commit Hold shift + click to select a range
5f1c3d2
engine: measure the ground from planes as they arrive
SamGu-NRX Sep 26, 2026
b817b95
engine: a lost world frame resets only a scan still being captured
SamGu-NRX Sep 26, 2026
391460a
engine: a past_end request settles when its end is marked again
SamGu-NRX Sep 26, 2026
c729ccd
engine: fix the review's minor findings
SamGu-NRX Sep 26, 2026
fe0a016
Merge fixes from the fresh review: coverage rows, ground height, relo…
SamGu-NRX Sep 26, 2026
178add4
Runtime: drop the stand-in answerWallEnd now that every conformer has…
SamGu-NRX Sep 26, 2026
beede15
Engine: hold walk instructions for 3 s of screen time, not recording …
SamGu-NRX Sep 26, 2026
cbe0440
UI tests and strip: tolerate transient overlays, keep the strip's mar…
SamGu-NRX Sep 26, 2026
1cc297f
contract: final upload failures, back to review, and the meter-number…
SamGu-NRX Sep 26, 2026
51dceb9
Compile against contract 1cc297f with marked placeholders for the lan…
SamGu-NRX Sep 26, 2026
a39d0a5
Runtime: the interface between the close-up flow and the meter-number…
SamGu-NRX Sep 26, 2026
37eade7
Coverage: rebuild from the kept cameras when the wall frame changes
SamGu-NRX Sep 26, 2026
1e62df1
Upload scene.json only, classify failures, back to review, export sur…
SamGu-NRX Sep 26, 2026
2b279ea
Result decoder: read reason codes, policy sources and crossing effect…
SamGu-NRX Sep 26, 2026
d92a773
Default the placement server from Info.plist
SamGu-NRX Sep 26, 2026
dc6d077
Schemas: re-vendor from origin/t3/server at 739fb6f
SamGu-NRX Sep 26, 2026
d8f220f
Send every capture failure to the failure screen
SamGu-NRX Sep 26, 2026
50a4bcf
Keep only the current scan's folder on the phone
SamGu-NRX Sep 26, 2026
166d249
Coverage: say plainly that occlusion is not modelled
SamGu-NRX Sep 26, 2026
f9a4247
Close-up gate: fail a try for every 4 s without a photo (B-04)
SamGu-NRX Sep 26, 2026
68f7ecc
Onboarding: say that only the wall's measurements are sent and the ph…
SamGu-NRX Sep 26, 2026
8f33866
Unsupported screen: plain words for a stopped camera and an unreadabl…
SamGu-NRX Sep 26, 2026
ad65332
Refused uploads go back to review; the close-up asks which number is …
SamGu-NRX Sep 26, 2026
7891001
Meter number: read the close-up, let the homeowner pick, never auto-fill
SamGu-NRX Sep 26, 2026
992dbb4
Merge round-2 engine lane E1: JSON upload, failure handling, default …
SamGu-NRX Sep 26, 2026
3cd4052
Meter reader: port the close-up eval's ranking and retake checks, rea…
SamGu-NRX Sep 26, 2026
405332b
Capture: encode JPEGs off the AR queue, stream the bundle zip, no inf…
SamGu-NRX Sep 26, 2026
776e6a9
Merge round-2 engine lane E2: coverage rebuild, decoder, schemas, B-0…
SamGu-NRX Sep 26, 2026
97f3674
Merge round-2 lane M: the meter-number reader ported from the close-u…
SamGu-NRX Sep 26, 2026
a2b7b87
Runtime: record which plane the meter tap hit, keep results on screen…
SamGu-NRX Sep 26, 2026
8f6fb05
Merge round-2 UI lane: failure ways on, disclosure, meter-number pick…
SamGu-NRX Sep 26, 2026
07f40dd
Runtime: log camera-session failures
SamGu-NRX Sep 26, 2026
e8bdfb0
HouseScanKit: decide which upload failures are worth retrying, with i…
SamGu-NRX Sep 26, 2026
bb8cf47
Review: "Add something" opens the camera to mark it, then returns to …
SamGu-NRX Sep 26, 2026
b6d8eb9
Accessibility audit (S4 at a39d0a5): darker primary fill, no low-cont…
SamGu-NRX Sep 26, 2026
77a4567
HouseScanKit: split two expressions Swift 6.2 can't type-check in time
SamGu-NRX Sep 26, 2026
f9c14e7
Merge round-2 UI follow-up: add from the review (B-09), audit transit…
SamGu-NRX Sep 26, 2026
7250841
contract: tilt-up step, overhead question, and ground-depth, walk-out…
SamGu-NRX Sep 26, 2026
9fde351
HouseScanKit: re-vendor the server contract from origin/t3/server e0e…
SamGu-NRX Sep 26, 2026
7f9c1e7
Coverage: sample ground depth out to 15 ft and export it per span
SamGu-NRX Sep 26, 2026
e085933
Walk: tilt-up step, overhead question, and copy for the new requests
SamGu-NRX Sep 26, 2026
62d8145
Demo and screen states: tilt-up, overhead question, new request kinds
SamGu-NRX Sep 26, 2026
0f588cd
Autopilot and fixture: tilt up at the end of the walk, answer "open sky"
SamGu-NRX Sep 26, 2026
2e33fc4
Copy: say what walking the walk-out line shows
SamGu-NRX Sep 26, 2026
7307adc
Coverage: export the walked path as facing clearance; walk 2 m out
SamGu-NRX Sep 26, 2026
f1aa0d9
Coverage: overhead reach of a tilt-up view, exported with the height …
SamGu-NRX Sep 26, 2026
0fc7a03
Gap loop: honour the server's ground-depth, facing and overhead requests
SamGu-NRX Sep 26, 2026
711f927
Test: supplying exactly what each server request names settles it
SamGu-NRX Sep 26, 2026
59ead36
Gap loop: an overhead request closes on a new recorded view
SamGu-NRX Sep 26, 2026
f4e3345
Test: too many coverage spans are joined conservatively to fit the sc…
SamGu-NRX Sep 26, 2026
7b019af
Merge round-3 lane P: ground depth, walked-path facing, overhead band…
SamGu-NRX Sep 26, 2026
ba5d29e
Merge round-3 lane G: tilt-up step, overhead question, request copy, …
SamGu-NRX Sep 26, 2026
a753023
Test: the synthetic fixture has 41 frames since its tilt-up frames
SamGu-NRX Sep 26, 2026
6ea5d74
Overhead: the tilt-up step records into the coverage map, shim removed
SamGu-NRX Sep 26, 2026
d472b68
Gap loop: an overhead request asks what is above once a view covers it
SamGu-NRX Sep 26, 2026
04d5381
Gap loop: a server cell request closes only when its whole span is ex…
SamGu-NRX Sep 26, 2026
2420eee
HouseScanKit: a wall chain that follows corners
SamGu-NRX Sep 26, 2026
c8dc29f
Test: the gap overhead question state was pasted into the walk-out entry
SamGu-NRX Sep 26, 2026
867c14c
Gap loop: a request's walking line runs to the far end of its span
SamGu-NRX Sep 26, 2026
ebfb757
App: follow a corner during the walk
SamGu-NRX Sep 26, 2026
b2f6a81
Merge corner walking: the scan follows a corner as the next wall in t…
SamGu-NRX Sep 26, 2026
bee8998
contract: the shareable scan bundle; HouseScanKit: a hook to break th…
SamGu-NRX Sep 26, 2026
d17e3a2
HouseScanKit: keep @discardableResult on recordOverhead
SamGu-NRX Sep 26, 2026
fd43e47
Engine: refuse stale keyframe and close-up work before storage starts
SamGu-NRX Sep 26, 2026
9000c95
UI: Share scan on the result, upload-failed and upload-rejected screens
SamGu-NRX Sep 26, 2026
a114186
README: run on your iPhone
SamGu-NRX Sep 26, 2026
efcbb0a
HouseScanKit: walked path joins only poses kept close in time with no…
SamGu-NRX Sep 26, 2026
075ff68
Engine: credit coverage only for a stored, decodable photo judged on …
SamGu-NRX Sep 26, 2026
5d85138
GapPlanner: meet a reach against the server's out_ft as sent
SamGu-NRX Sep 26, 2026
763a121
Engine: log the first real session's capture decisions; break the wal…
SamGu-NRX Sep 26, 2026
d94f8fb
GapPlanner: meet a reach request over its whole span as exported
SamGu-NRX Sep 26, 2026
7616f86
Engine: ask for a collapsed driveway or fence to be marked again inst…
SamGu-NRX Sep 26, 2026
42f59a3
Engine: offer the packaged scan bundle for "Share scan"
SamGu-NRX Sep 26, 2026
6232752
HouseScanKit: sample ground to 17 ft; a deeper request is beyond capture
SamGu-NRX Sep 26, 2026
9b8e0c5
Engine: place the battery spot by its span_ft on the wall chain
SamGu-NRX Sep 26, 2026
a5de2ab
CoverageMap: report ground past a limit end where both sides were seen
SamGu-NRX Sep 26, 2026
761136c
Autopilot: wait for the stored overhead view before reporting it
SamGu-NRX Sep 26, 2026
640df25
Merge round-4 lane a
SamGu-NRX Sep 26, 2026
9518500
Merge round-4 lane b
SamGu-NRX Sep 26, 2026
0d9f89e
Merge round-4 lane c
SamGu-NRX Sep 26, 2026
9e30fa8
Runtime: pass frame time to coverage and mark limit ends in the map; …
SamGu-NRX Sep 26, 2026
0930b19
contract: hidden cells, depth availability and a see-behind step for …
SamGu-NRX Sep 26, 2026
657ab28
ios: restore the XcodeGen-generated project file
SamGu-NRX Sep 26, 2026
a0b9454
Fixture: synthetic LiDAR replay with a bin in front of the wall
SamGu-NRX Sep 26, 2026
e4a7325
UI: hidden cells, the see-behind step, depth-checked map and the foll…
SamGu-NRX Sep 26, 2026
4a2fd07
UI: say where to look past an obstruction in rough feet, not to the inch
SamGu-NRX Sep 26, 2026
a140ba1
Info.plist: declare no non-exempt encryption for TestFlight
SamGu-NRX Sep 26, 2026
3d5e4c5
Runtime: LiDAR depth and mesh capture, depth-aware coverage, see-behi…
SamGu-NRX Sep 26, 2026
60c7955
UI test: full flow from the LiDAR replay
SamGu-NRX Sep 26, 2026
2365620
UI test: audit a control cut off by the screen's bottom edge once scr…
SamGu-NRX Sep 26, 2026
2743996
HouseScanKit: depth-aware coverage with hidden cells, and a see-behin…
SamGu-NRX Sep 26, 2026
166f8e4
HouseScanKit: facing gap and headroom from the LiDAR mesh, exported a…
SamGu-NRX Sep 26, 2026
ef87115
HouseScanKit: encoders for depth/*.u16, depth/*.conf.u8, depth/index.…
SamGu-NRX Sep 26, 2026
38610e2
Merge round-5 lane l1
SamGu-NRX Sep 26, 2026
340f753
Merge round-5 lane l3
SamGu-NRX Sep 26, 2026
928aae6
Merge round-5 lane l4
SamGu-NRX Sep 26, 2026
e1f6ed7
Merge round-5 lane l2
SamGu-NRX Sep 26, 2026
1b2e49a
Project: keep the UI test fixtures out of the test bundle
SamGu-NRX Sep 26, 2026
95590a0
Runtime: run the LiDAR path on HouseScanKit's API and delete the shim
SamGu-NRX Sep 26, 2026
46ee427
Runtime: hold "One more view to finish" on the upload screen before a…
SamGu-NRX Sep 26, 2026
a41a7e4
HouseScanKit tests: split a slow #expect in CornerTests
SamGu-NRX Sep 26, 2026
482d40f
UI tests: check hidden cells on the LiDAR replay for real
SamGu-NRX Sep 26, 2026
194f2eb
iOS README: autopilot's server requests, replay depth, and the scan b…
SamGu-NRX Sep 26, 2026
5a51b28
HouseScanKit tests: vendor the capture packet schema and validate allOf
SamGu-NRX Sep 26, 2026
676977e
HouseScanKit: meter frame, packet poses and trajectory quaternions
SamGu-NRX Sep 26, 2026
3d15204
HouseScanKit: write capture packet 1.0 folders
SamGu-NRX Sep 26, 2026
8afc305
Runtime: record the capture packet's streams and per-photo metadata
SamGu-NRX Sep 26, 2026
92c53af
Runtime: log every guidance request the homeowner was shown, and how …
SamGu-NRX Sep 26, 2026
7041d0f
Runtime: Share scan exports a capture packet 1.0
SamGu-NRX Sep 26, 2026
51d74ae
Merge the packet writer (package)
SamGu-NRX Sep 26, 2026
f5c5908
Merge packet recording and export (engine)
SamGu-NRX Sep 26, 2026
ff95f1c
Packet merge: delete the shim and the unused round-5 bundle encoders;…
SamGu-NRX Sep 26, 2026
1d29760
UI tests: no live element reads in the audit helper; wait for the AR …
SamGu-NRX Sep 26, 2026
84e0610
ui: "Mark something" steps aside while the walk asks to look past an …
SamGu-NRX Sep 26, 2026
eb5f1c0
HouseScanKit: point comments at docs/00 and docs/04 instead of the de…
SamGu-NRX Sep 26, 2026
67dad93
Vendor the server contract from t3/server 737bf75
SamGu-NRX Sep 26, 2026
c1980b3
Add the ground question to the scan contract
SamGu-NRX Sep 26, 2026
dd44fc3
ui: ask what the ground along the wall is on the feature review
SamGu-NRX Sep 26, 2026
5df7dcc
Vendor the server contract from t3/server 930e8e5
SamGu-NRX Sep 26, 2026
a914856
Merge the ground question UI
SamGu-NRX Sep 26, 2026
d64420a
Wait out a system banner before the full-flow re-audit
SamGu-NRX Sep 26, 2026
abb267e
Export wall sources and ground patches; close-up into coverage; cable…
SamGu-NRX Sep 26, 2026
6e8032f
Merge wall sources, the ground patch, close-up coverage and the cable…
SamGu-NRX Sep 26, 2026
627fa09
Packet: write capture packet 1.1
SamGu-NRX Sep 26, 2026
35ac3f2
Merge the capture packet 1.1 writer
SamGu-NRX Sep 26, 2026
499117e
Report how high up the wall each span was seen
SamGu-NRX Sep 26, 2026
b837544
Merge the wall height seen per span
SamGu-NRX Sep 26, 2026
3a7eeec
Close paths that export coverage, patches or walls nobody saw
SamGu-NRX Sep 26, 2026
4f12c65
Merge the coverage overclaim fixes from review
SamGu-NRX Sep 26, 2026
c7ccb07
fix: keep a finished scan through lost tracking; fix PR #10 review fi…
SamGu-NRX Sep 26, 2026
159a9fe
Merge the runtime fixes from review
SamGu-NRX Sep 26, 2026
e9e405d
CI: fetch the server and packet branches for the drift tests
SamGu-NRX Sep 26, 2026
b7f51ba
Close the remaining unseen-claim paths from the second review
SamGu-NRX Sep 26, 2026
49a676e
Merge the last coverage overclaim fixes from review
SamGu-NRX Sep 26, 2026
f838eb6
fix(ios): say "AC unit" and spell out lengths for VoiceOver (#25)
AidenJohnston Sep 26, 2026
d3d053c
fix(ios): show "Check clearances" once the scan is sent (#31)
AidenJohnston Sep 26, 2026
e760327
fix(ios): no "Slow down" while the mark tray is open (#26)
AidenJohnston Sep 26, 2026
57a3ae1
fix(ios): spell the measurement's length formatter as a function
AidenJohnston Sep 26, 2026
11878ec
Result: say whether a rule's limit is a minimum or a maximum (B-14)
AidenJohnston Sep 26, 2026
3c7b83a
fix: end the wall where the phone is, and ask for the ground by the m…
SamGu-NRX Sep 26, 2026
75dea41
Merge the field-run fix: wall ends where the phone is
SamGu-NRX Sep 26, 2026
72144a7
Merge t3/ios-mvf into t3/run1-quick-fixes
AidenJohnston Sep 26, 2026
97ee40c
Merge t3/ios-mvf into t3/triage-quick-fixes
AidenJohnston Sep 26, 2026
21e21ce
test(ios): check the minimum's wording, not its unit (B-14)
AidenJohnston Sep 26, 2026
3e5446e
ios: past-end requests keep their end, and band requests past an end …
AidenJohnston Sep 26, 2026
067f413
ios: the walk asks only for stretches between the wall's ends (#38)
AidenJohnston Sep 26, 2026
792a900
Result: an overlap reads as one, not as clearance (#40)
AidenJohnston Sep 26, 2026
3b27aaf
test(ios): refresh the vendored scene schema to t3/server 074bf1d
AidenJohnston Sep 26, 2026
6ee2874
Vendor the scene schema from t3/server 074bf1d
SamGu-NRX Sep 26, 2026
ff6645b
fix: end the side the phone is on, and no zero-length walls (#24)
AidenJohnston Sep 26, 2026
c9a4473
ios: plan the 0.02 ft shortfall request without the end it now reache…
AidenJohnston Sep 26, 2026
e3a3fa9
ios: refresh the vendored scene schema to t3/server 074bf1d
AidenJohnston Sep 26, 2026
feb35a0
Merge pull request #34 from SamGu-NRX/t3/run1-quick-fixes
SamGu-NRX Sep 26, 2026
99e914c
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/past-end-req…
AidenJohnston Sep 26, 2026
067cec7
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/triage-quick…
AidenJohnston Sep 26, 2026
5c8c739
Keep wall ends near the phone, and objects on written walls
SamGu-NRX Sep 26, 2026
170d7f2
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/wall-end-guards
AidenJohnston Sep 26, 2026
0e8a559
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/wall-end-guards
AidenJohnston Sep 26, 2026
2d33cea
ios: draw the AR result in the scene so people and objects hide it (#41)
AidenJohnston Sep 26, 2026
d0ff1be
Ask the walk for the wall to 4.5 ft; report and request above it
SamGu-NRX Sep 26, 2026
898cd4e
Merge the walking height: the walk asks for the wall to 4.5 ft
SamGu-NRX Sep 26, 2026
8604928
Vendor the result schema from t3/server 9e42970
SamGu-NRX Sep 26, 2026
f173c8a
ios: the review flags marks lying past a wall end (#42)
AidenJohnston Sep 26, 2026
63d950d
Merge pull request #51 from SamGu-NRX/t3/ar-occlusion
AidenJohnston Sep 26, 2026
cd05d67
Merge pull request #37 from SamGu-NRX/t3/triage-quick-fixes
AidenJohnston Sep 26, 2026
2f193aa
Merge pull request #48 from SamGu-NRX/t3/wall-end-guards
AidenJohnston Sep 26, 2026
d02cc11
Merge pull request #47 from SamGu-NRX/t3/past-end-requests
AidenJohnston Sep 26, 2026
20bf369
ci(ios): cut pull request runs from ~25 min to ~12 min
AidenJohnston Sep 26, 2026
085e0ed
Merge remote-tracking branch 'origin/t3/ios-mvf' into resolve-53
AidenJohnston Sep 26, 2026
2641027
Merge pull request #57 from SamGu-NRX/t3/ios-ci-speed
AidenJohnston Sep 27, 2026
e367161
Merge pull request #53 from SamGu-NRX/t3/marks-past-ends
AidenJohnston Sep 27, 2026
4f1a8c9
CI: fail when a vendored schema can't be compared
SamGu-NRX Sep 27, 2026
3153cca
Merge t3/ios-mvf (#53 and later) into the CI drift fix
SamGu-NRX Sep 27, 2026
fb4c30e
Replace field-run values in a test and the demo with made-up ones
SamGu-NRX Sep 27, 2026
1b41f6d
CI: fetch the contract branches unless the compared files are checked…
SamGu-NRX Sep 27, 2026
de04c3b
Drop the live packet 1.1 schema comparison; t3/packet retired it
SamGu-NRX Sep 27, 2026
9f10fc1
Read the result's answer, clean spot, nearest failure and view links …
SamGu-NRX Sep 27, 2026
37729cc
Fix the #10 caretaker's findings on the anchor, ground, source and sc…
SamGu-NRX Sep 27, 2026
257a6a7
Map the nearest spot, the rules notice and each check's view into the…
SamGu-NRX Sep 27, 2026
e4f8ef4
Lead the result with the answer and fold the full checks under Details
SamGu-NRX Sep 27, 2026
534813b
Swap the upload headline at once instead of crossfading it
SamGu-NRX Sep 27, 2026
c05f1c2
Show the replay and autopilot badge as a quiet pill
SamGu-NRX Sep 27, 2026
9ee7686
Fill the launch screen with the Canvas colour
SamGu-NRX Sep 27, 2026
4b71161
Merge the engine fixes from the #10 review: anchor turn, ground plane…
SamGu-NRX Sep 27, 2026
47dd609
Result model follows corners; Reduce Motion stops moving things; audi…
SamGu-NRX Sep 27, 2026
ee1087e
Merge the UI fixes from the #10 review: corners in the result model, …
SamGu-NRX Sep 27, 2026
f232b9f
Retry uploads the server answered 408 or 429
SamGu-NRX Sep 27, 2026
87dd34a
Merge main (f852207) into t3/ios-mvf
SamGu-NRX Sep 27, 2026
02d74f6
ios: show the meter's brand beside the number candidates
SamGu-NRX Sep 27, 2026
916838f
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/meter-brand
SamGu-NRX Sep 27, 2026
c9a46ac
Give the Details header an explicit button the UI tests can open
SamGu-NRX Sep 27, 2026
74fb280
Show which rules answered and keep the nearest spot at the server's size
SamGu-NRX Sep 27, 2026
0f866a0
Use the system disclosure for Details and keep one filled button
SamGu-NRX Sep 27, 2026
7bc900a
Drive the result screenshots and UI tests from server answer files
SamGu-NRX Sep 27, 2026
b9851e1
Meter close-up: out of focus at 6.68, the eval's current threshold
SamGu-NRX Sep 27, 2026
bc5a1ac
UI tests: read audit elements from one snapshot, never live
SamGu-NRX Sep 27, 2026
659e5ae
ios: 44 pt reject target, and the brand lives only beside its number
SamGu-NRX Sep 27, 2026
0a3a05e
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/meter-brand
SamGu-NRX Sep 27, 2026
00fb017
Show the sample badge as a quiet pill under Replay
SamGu-NRX Sep 27, 2026
3cec36d
Merge t3/ios-mvf (b9851e1) into t3/experience-result
SamGu-NRX Sep 27, 2026
94e87b5
Merge the audit's stable element reads (the #24 test flake)
SamGu-NRX Sep 27, 2026
07be67f
Ask the homeowner to confirm the spot before showing the result
SamGu-NRX Sep 27, 2026
d17296b
Never call a spot with no checks a fit or clean
SamGu-NRX Sep 27, 2026
d3b4820
List under Settles only the checks a view settles
SamGu-NRX Sep 27, 2026
06abc43
Size sweep zones by the nearest spot when there is no spot
SamGu-NRX Sep 27, 2026
db80cfb
Build the sample badge as one Text so it passes the Dynamic Type audit
SamGu-NRX Sep 27, 2026
a8bd17a
Cap Retry-After at a day so the wait message can't overflow
SamGu-NRX Sep 27, 2026
f14947e
Keep "Can't get there" on screen through the capture gate's coaching
SamGu-NRX Sep 27, 2026
acd3d35
Keep the last completed scans across a relaunch, and stamp each scan
SamGu-NRX Sep 27, 2026
9583b12
Regenerate the Xcode project for the result answer fixtures
SamGu-NRX Sep 27, 2026
72c32f8
Merge the spot confirmation: the homeowner checks the chosen spot bef…
SamGu-NRX Sep 27, 2026
8a9ee81
Show the instruction card's reply without a fade
SamGu-NRX Sep 27, 2026
8ea82c0
Merge #89: read the meter's brand from the close-up
SamGu-NRX Sep 27, 2026
577acc4
Merge keeping the last scan across a relaunch, stamped with its revision
SamGu-NRX Sep 27, 2026
47db0cc
Walked path: a step past a corner is clear only as far as it stays in…
SamGu-NRX Sep 27, 2026
d4e008c
UI test: tap only once the element can take the tap
SamGu-NRX Sep 27, 2026
0cf2125
Anchor, ground and source repairs from the #10 caretaker's review of …
SamGu-NRX Sep 27, 2026
ec406c3
Merge the anchor repair round and the corner walked-step fix
SamGu-NRX Sep 27, 2026
397b6d6
Give the instruction card's reply button a solid fill
SamGu-NRX Sep 27, 2026
3040033
UI test: tap elements below the fold again
SamGu-NRX Sep 27, 2026
e426883
Onboarding: say which scans the phone keeps
SamGu-NRX Sep 27, 2026
f47dcb4
Merge #91: the result card
SamGu-NRX Sep 27, 2026
b90fb8e
Split the meter-brand spelling sort into typed steps
SamGu-NRX Sep 27, 2026
8771298
Spot check: confirm only a whole view, bind to the exchange, ask the …
SamGu-NRX Sep 27, 2026
4461f13
Replay: an upper walk that sees the wall above 6.5 ft, and a gap the …
SamGu-NRX Sep 27, 2026
66623cd
Upload: read the mesh with each measuring attempt, and cut live strea…
SamGu-NRX Sep 27, 2026
9b4c57d
Refuse a fence marked across a corner
SamGu-NRX Sep 27, 2026
39066ea
Spot check: ask about the footprint and its front clearance only
SamGu-NRX Sep 27, 2026
1faa79b
Wall map legend wraps instead of overlapping; picker wait allows a st…
SamGu-NRX Sep 27, 2026
e62be65
Stamp the git commit through a build setting, not a build script
SamGu-NRX Sep 27, 2026
a047ea2
Replace scan.zip atomically, and keep a folder whose bundle is mid-re…
SamGu-NRX Sep 27, 2026
414f68d
Break the walked path at the interruption's frame time
SamGu-NRX Sep 27, 2026
5b9c7a3
Merge the engine lane's freeze blockers
SamGu-NRX Sep 27, 2026
29ebe84
Merge the spot check's P1 fixes, the ground at the footprint and the …
SamGu-NRX Sep 27, 2026
9698d34
Export: a guessed ground adds to the server's error, not replaces it
SamGu-NRX Sep 27, 2026
dad709b
Test that ServerErrorDefaults mirrors the server's rules.yaml
SamGu-NRX Sep 27, 2026
c2304e2
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/ios-mvf-r9-ui
SamGu-NRX Sep 27, 2026
f0d7867
Spot check: judge and draw the photo with its anchor-corrected camera
SamGu-NRX Sep 27, 2026
829380e
Settle ground requests on the ground entries the export writes
SamGu-NRX Sep 27, 2026
842cdd0
Merge remote-tracking branch 'origin/t3/ios-mvf' into t3/ios-mvf-r7-e…
SamGu-NRX Sep 27, 2026
77d820b
Merge the spot photo's corrected camera
SamGu-NRX Sep 27, 2026
b1a2444
Instruction card: the reply changes its words at once
SamGu-NRX Sep 27, 2026
680e4b7
Count a scan as completed only by its real scan.zip
SamGu-NRX Sep 27, 2026
4ef41b3
Build every upload from one snapshot of one frame
SamGu-NRX Sep 27, 2026
4f1fb8e
Merge the upload evidence snapshot and the retention fix
SamGu-NRX Sep 27, 2026
6be087d
Merge the UI lane's CI fixes: the map legend, the picker wait, the re…
SamGu-NRX Sep 27, 2026
ee99886
Mark a gas meter and an AC unit by two corners, and send only what th…
SamGu-NRX Sep 27, 2026
d9abb8e
Merge two-corner gas meter and AC marks
SamGu-NRX Sep 27, 2026
734d518
Spot check: keep an accepted answer fresh through the check, the resu…
SamGu-NRX Sep 27, 2026
c820cf1
Merge answer freshness through the spot check, the result and AR
SamGu-NRX Sep 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .github/labels.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
"color": "b60205",
"description": "Not ready to merge. State what must change before it is ready."
},
{
"name": "full-ui",
"color": "5319e7",
"description": "iOS CI also runs the every-state accessibility audit (about 10 more minutes)."
},
{
"name": "size:XS",
"color": "0e8a16",
Expand Down
105 changes: 101 additions & 4 deletions .github/workflows/ios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,55 @@ name: iOS

on:
push:
branches: [main]
branches: [main, t3/ios-mvf]
paths:
- "ios/**"
- "!ios/**/*.md"
- ".github/workflows/ios.yml"
pull_request:
# ready_for_review: drafts are skipped below, so run once a draft is marked ready.
# labeled: adding full-ui reruns the pull request with the accessibility audit.
types: [opened, synchronize, reopened, ready_for_review, labeled]
paths:
- "ios/**"
- "!ios/**/*.md"
- ".github/workflows/ios.yml"
Comment on lines +13 to 17

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Server schema changes skip drift check. The new iOS contract comparison runs only when an iOS non-Markdown file or this workflow changes. A pull request that changes only a server schema will not trigger it, so an incompatible vendored iOS schema can go undetected by this check. Include the server contract paths in the workflow triggers.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/ios.yml
Line: 13-17

Comment:
**Server schema changes skip drift check.** The new iOS contract comparison runs only when an iOS non-Markdown file or this workflow changes. A pull request that changes only a server schema will not trigger it, so an incompatible vendored iOS schema can go undetected by this check. Include the server contract paths in the workflow triggers.

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Fix in Codex Fix in Claude Code

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caretaker check at c820cf1: confirmed, and already true on main. A ready PR that changes only server/schemas/*.schema.json matches none of ios.yml:14-17, and server.yml runs only lint and pytest, so vendoredCopiesMatchServer never runs. Adding server/schemas/** and server/tests/fixtures/example-scene.json to both path lists closes the gap, but it also puts a 45-minute macOS job on every server-schema PR. That cost trade-off belongs to #10's owner, and #10 is frozen, so it is recorded for them rather than changed here. A cheaper alternative is a separate Linux job that only diffs the vendored copies.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That’s a fair resolution. The finding remains valid, but since #10 is frozen, I won’t recommend changing this workflow here. Recording the two concrete options for the owner is sufficient: add the server contract paths and accept the macOS cost, or add a cheaper standalone Linux vendored-schema drift job.

# Runs every test, the audit included, on any branch.
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ios-${{ github.ref }}
# Adding any label other than full-ui gets a group of its own, so it cannot cancel a real run.
group: ios-${{ github.ref }}${{ github.event.action == 'labeled' && github.event.label.name != 'full-ui' && format('-{0}', github.run_id) || '' }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
ios-build:
name: iOS build
# A free account runs 5 macOS jobs at once, shared by every open pull request, so drafts and
# labels other than full-ui don't take a slot.
if: >-
github.event_name != 'pull_request' ||
(!github.event.pull_request.draft &&
(github.event.action != 'labeled' || github.event.label.name == 'full-ui'))
# macos-26 (arm64) is the newest GA macOS image. The xcode-27 image is still a preview.
runs-on: macos-26
timeout-minutes: 30
timeout-minutes: 45
env:
# Newest stable Xcode on macos-26 per images/macos/macos-26-arm64-Readme.md (image 20260907).
DEVELOPER_DIR: /Applications/Xcode_26.6.app/Contents/Developer
# iPhone 17 on iOS 26.5 ships with Xcode 26.6 on macos-26 (images/macos/macos-26-arm64-Readme.md).
SIM_NAME: iPhone 17
SIM_OS: "26.5"
# Homebrew only installs the latest XcodeGen. The release zip gives an exact version,
# and the drift check below needs the same version the committed project was made with.
XCODEGEN_VERSION: 2.46.0
XCODEGEN_SHA256: 4d9e34b62172d645eed6457cac13fc222569974098ef4ee9c3368bedf0196806
# The every-state accessibility audit relaunches the app 65 times (about 10 min). Pull
# requests skip it unless labelled full-ui; pushes and manual runs always include it.
FULL_UI: ${{ github.event_name != 'pull_request' || contains(github.event.pull_request.labels.*.name, 'full-ui') }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
Expand All @@ -45,6 +65,45 @@ jobs:
xcodebuild -version
swift --version

# Booting takes 2 to 3 minutes and needs nothing from the build, so it runs alongside the
# steps below; the UI test step waits for it.
- name: Boot the Simulator in the background
run: |
runtime="com.apple.CoreSimulator.SimRuntime.iOS-${SIM_OS//./-}"
udid="$(xcrun simctl list devices available -j \
| jq -r --arg runtime "$runtime" --arg name "$SIM_NAME" \
'(.devices[$runtime] // [])[] | select(.name == $name) | .udid' | head -n 1)"
if [ -z "$udid" ]; then
echo "::error::No $SIM_NAME on iOS $SIM_OS on this runner image. Pick one from the image readme."
xcrun simctl list devices available
exit 1
fi
echo "SIM_UDID=$udid" >> "$GITHUB_ENV"
nohup xcrun simctl bootstatus "$udid" -b > "$RUNNER_TEMP/simulator-boot.log" 2>&1 &

# The package's drift test compares the vendored server schemas with the server's own copies:
# the checkout's files once that branch merges, else the t3/server branch, which the shallow
# checkout leaves out. One of the two is required:
# a failed fetch fails the run, and HOUSESCAN_REQUIRE_UPSTREAM makes the tests fail rather
# than skip, so CI can't go green without comparing. The checkout counts only when it holds
# every compared file: a folder alone isn't enough (main has a server/ without schemas).
- name: Fetch the server contract
run: |
fetch_unless_present() {
local branch="$1"; shift
local missing=0
for file in "$@"; do [ -f "$file" ] || missing=1; done
if [ "$missing" = 0 ]; then
echo "$* are in the checkout; the drift tests read them."
return
fi
if ! git fetch --no-tags --depth=1 origin "+refs/heads/$branch:refs/remotes/origin/$branch"; then
echo "::error::Neither the checkout nor $branch holds $*, so the vendored copies can't be compared."
exit 1
fi
}
fetch_unless_present t3/server server/schemas/scene.schema.json server/schemas/result.schema.json server/tests/fixtures/example-scene.json

- name: Install XcodeGen
run: |
curl -fsSL -o "$RUNNER_TEMP/xcodegen.zip" \
Expand All @@ -69,7 +128,45 @@ jobs:
exit 1
fi

- name: Test HouseScanKit
# The capture logic is a plain Swift package; its tests run on macOS without a Simulator.
env:
HOUSESCAN_REQUIRE_UPSTREAM: "1"
run: swift test --package-path ios/HouseScanKit -Xswiftc -warnings-as-errors

# CI builds once from clean, so the index Xcode keeps for editing is wasted work.
- name: Build
run: >-
xcodebuild -project ios/HouseScan.xcodeproj -scheme HouseScan -configuration Debug
-destination "generic/platform=iOS" CODE_SIGNING_ALLOWED=NO build
-destination "generic/platform=iOS" CODE_SIGNING_ALLOWED=NO COMPILER_INDEX_STORE_ENABLE=NO
HOUSESCAN_GIT_COMMIT="${GITHUB_SHA::12}" build

- name: Wait for the Simulator
timeout-minutes: 10
run: |
xcrun simctl bootstatus "$SIM_UDID" -b
echo "Booted $SIM_NAME on iOS $SIM_OS ($SIM_UDID)."

- name: UI test the whole flow in the Simulator
# Replays the committed synthetic wall (ios/HouseScanUITests/Fixtures/synthetic-wall) with
# -autopilot and the bundled sample result.
run: |
skip=()
if [ "$FULL_UI" != "true" ]; then
skip=(-skip-testing:HouseScanUITests/ScreenStatesUITests/testEveryStatePassesTheAccessibilityAudit)
echo "::notice::Skipped the every-state accessibility audit (about 10 min). Add the full-ui label to run it on this pull request."
fi
xcodebuild -project ios/HouseScan.xcodeproj -scheme HouseScan -configuration Debug \
-destination "id=$SIM_UDID" \
-resultBundlePath "$RUNNER_TEMP/HouseScanUITests.xcresult" \
-only-testing:HouseScanUITests "${skip[@]}" \
COMPILER_INDEX_STORE_ENABLE=NO HOUSESCAN_GIT_COMMIT="${GITHUB_SHA::12}" test

- name: Keep UI test screenshots
if: always()
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: ui-test-results
path: ${{ runner.temp }}/HouseScanUITests.xcresult
if-no-files-found: ignore
retention-days: 7
4 changes: 3 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,13 @@ The `size:*` label describes the effective diff. It is a review signal, not a me
| --- | --- | --- |
| Server checks | `server/` changes | `make server` |
| Web checks | `web/` changes | `make web` |
| iOS build | `ios/` changes | `make ios` |
| iOS build | `ios/` changes outside Markdown, on non-draft pull requests | `make ios` |
| Sync label definitions | `.github/labels.json` changes on `main` | none |
| Label PR size | a pull request opens or updates | none |
| TestFlight | someone runs it from the Actions tab | none |

The iOS UI tests skip the every-state accessibility audit on pull requests, because it adds about 10 minutes and macOS runners are scarce. Add the `full-ui` label when a pull request changes screens or copy; pushes to `t3/ios-mvf` and `main` always run it.

`make check` runs the three local suites. They need uv, Node 24 with pnpm, and Xcode 26 or newer; each directory's README has details. No check is required by branch rules yet. Don't call one required until the rules require its status.

Keep workflows that run pull-request code away from production credentials and destructive external systems. A green CI run is evidence for the checks it ran, not proof that a capture works on a real house.
Expand Down
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ web:
# CI also regenerates the project and fails on drift; run `make ios-project` for that.
ios:
xcodebuild -project ios/HouseScan.xcodeproj -scheme HouseScan -configuration Debug \
-destination "generic/platform=iOS" CODE_SIGNING_ALLOWED=NO build
-destination "generic/platform=iOS" CODE_SIGNING_ALLOWED=NO \
HOUSESCAN_GIT_COMMIT="$$(git rev-parse --short=12 HEAD 2>/dev/null || echo unknown)" build

# Regenerates ios/HouseScan.xcodeproj from ios/project.yml. Point XCODEGEN at another binary
# if the one on PATH is not $(XCODEGEN_VERSION): make ios-project XCODEGEN=/path/to/xcodegen
Expand Down
4 changes: 4 additions & 0 deletions ios/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,7 @@ xcuserdata/
# Build output when building with -derivedDataPath or into the source tree.
DerivedData/
build/

# SwiftPM build output of the capture package.
HouseScanKit/.build/
HouseScanKit/.swiftpm/
18 changes: 17 additions & 1 deletion ios/Config/Info.plist
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,33 @@
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>HouseScanGitCommit</key>
<string>$(HOUSESCAN_GIT_COMMIT)</string>
<key>HouseScanServerURL</key>
<string>$(HOUSESCAN_SERVER_URL)</string>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
Comment thread
SamGu-NRX marked this conversation as resolved.
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsLocalNetworking</key>
<true/>
Comment thread
SamGu-NRX marked this conversation as resolved.
</dict>
<key>NSCameraUsageDescription</key>
<string>House Scan uses the camera to measure the outside wall around your electric meter.</string>
<key>NSMotionUsageDescription</key>
<string>House Scan records your phone's motion and air pressure during the scan, so it can be measured more accurately. It stays on this phone unless you share the scan.</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
</dict>
<key>UILaunchScreen</key>
<dict/>
<dict>
<key>UIColorName</key>
<string>Canvas</string>
</dict>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>arkit</string>
Expand Down
11 changes: 11 additions & 0 deletions ios/Config/Shared.xcconfig
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,15 @@

BUNDLE_ID_PREFIX = dev.housescanning

// The placement server the app uploads to when no -serverURL launch argument is given; Info.plist
// carries it as HouseScanServerURL. xcconfig reads // as a comment, so $() splits the slashes.
// Set it empty in Local.xcconfig to fall back to the bundled sample result.
HOUSESCAN_SERVER_URL = https:/$()/house-scanning-server.vercel.app

#include? "Local.xcconfig"

// The commit the app was built from, for the scan stamp (HouseScanGitCommit in Info.plist). A
// build setting, not a build script: the TestFlight job refuses scripts in the build while the
// signing key exists. CI and `make ios` pass the real commit (HOUSESCAN_GIT_COMMIT=<sha>); a build
// that doesn't, such as one from Xcode's Run button, says "unknown".
HOUSESCAN_GIT_COMMIT = unknown
Comment on lines +17 to +21

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Medium - TestFlight archives lose the app commit stamp

When a TestFlight or other Release archive is built after this change, the app now reads HouseScanGitCommit only from the HOUSESCAN_GIT_COMMIT build setting (Trigger). Shared.xcconfig defaults that setting to unknown, but the archive workflow never passes an override after the git-stamping build phase was removed (Mechanism). Packaged scans therefore record no exact app commit in scan-stamp.json or the packet manifest, breaking the provenance needed to match a field scan back to the build that produced it (Consequence).

Show fix

Pass HOUSESCAN_GIT_COMMIT into every distribution/archive build path, especially .github/workflows/testflight.yml, or restore an equivalent non-script stamping step before signing. Keep release builds from falling back to unknown once the project no longer rewrites Info.plist during the build.

More info - Reply on this comment to give feedback or ignore the issue.

Comment thread
SamGu-NRX marked this conversation as resolved.
Loading
Loading