Skip to content

Ship beta to main: the app, server and experiments as submitted - #179

Merged
AidenJohnston merged 595 commits into
mainfrom
beta
Sep 27, 2026
Merged

AidenJohnston merged 595 commits into
mainfrom
beta

Conversation

@AidenJohnston

Copy link
Copy Markdown
Collaborator

Brings main up to what ships: everything on beta (the TestFlight branch) lands on main.

  • 595 commits from beta (449 non-merge: the iOS capture app, the server, experiments, docs, CI).
  • main's own 2 commits (MIT license, live-site link) stay; the merge has no conflicts.

Merge with "Create a merge commit", not squash or rebase, so every commit keeps its author and date on main.

After this lands, the follow-ups are #22, #134 and the conflict-resolved versions of #18 and #90, each of which merges cleanly on top.

Known state: testPracticeMeterFromReplay is red on beta (Sam's practice-meter work on t3/ios-mvf, not yet ported). It doesn't block TestFlight.

🤖 Generated with Claude Code

SamGu-NRX and others added 30 commits September 26, 2026 16:18
- Ground entries stop 0.002 ft short of each corner as the server computes
  it from the written walls, not the phone's corner, so rounding can't let
  one cross and bring back the exterior sector.
- Each sighting records whether depth confirmed it; when depth shows a row
  hidden, the unconfirmed ones go. Rebuilds replay kept cameras in capture
  order (segment, then frame time).
- While the ground is a guess, a seen wall height also needs foot rows down
  to the guess less its error, so a guess too high can't hide the real foot.
  The strip's covered cells are unchanged.
- The pending overhead view keeps the walked-path segment it was captured in.
- The rounding-allowance comments say exactly what they absorb and allow.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The marking prompt and the mark and remove labels lowercased the feature name, so they read
"Tap the ac unit" and "Mark ac unit". ScanCopy.noun keeps "AC" in capitals.

The result's measurement lines and the 3D view's summary now give VoiceOver feet and inches
spelled out (Distance.spoken), since it reads "ft" and "in" as letters. The on-screen text is
unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The upload delegate held progress at 0.99 until the server answered, and the server works
out the spot inside that request. So the screen sat on "Sending measurements, 99%" for the
whole analysis and "Check clearances" never lit up. Report 1 once every byte of the body
is sent.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
In field test run 1 "Slow down" showed twice while the tester stood still with "What do you
see?" open: turning the phone to aim reads as moving to the capture gate. Hide that one
prompt while the tray is open; tracking problems still show.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The ternary between two static methods made the compiler fail with "failed to produce
diagnostic for expression" on CI.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
"Measured 3 ft. The rule is 20 ft" read the cable run's maximum as a
minimum. The server sends each check's comparison (at_least / at_most);
the result row now carries it and the measurement line reads "The rule
is at least 3 ft" or "at most 20 ft". A check without a comparison keeps
the bare distance.

The wording lives in the app (ScanCopy), not HouseScanKit, so the check
is a UI-test assertion on the demo result's window row; the kit already
tests decoding `comparison` (PlacementResultTests).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…eter first

Device run 1 set both ends within 4 in of the meter: "Can't get there" put an end at
the unbroken covered reach, which was 0 because nothing had asked for the ground in
front of the meter. The scan then left out the 19 ft the walk had photographed.

- "Can't get there" while the walk asks to walk a side, and a new "Wall ends here"
  during the walk, put that side's end at the phone's place along the wall chain,
  kept within the stretch walked on that side (HouseScanKit WalkedEnd). With the
  phone across the meter, or its place lost, the end goes as far as the walk went
  on that side instead of to the meter.
- The walk's first request is the ground in front of the meter. The end prompt
  follows the walked distance, not unbroken coverage (B-06). An aim task keeps its
  stretch while the lag window's middle drifts under its half-width.
- The wall strip shows where an end would land (a dashed line, the stretch past it
  dimmed, and a line when that cuts off part of the walk), and says the ends in its
  VoiceOver value. The end prompt shows the reticle it marks at.
- Past an unexplored end with nothing between the ends in view, photos are refused
  and the card says "You're past the end of the wall".
- -autopilotCantGetThere replays run 1 on the synthetic wall;
  testCantGetThereEndsWhereThePhoneIs checks the ends and the exported scene.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The window-row assertion read "at least 3 ft" from the VoiceOver value.
The B-16 fix (#34) spells lengths out there ("3 feet"), so the test
would fail once both land. It now checks "The rule is at least 3".

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The first real-phone run's wall already had a battery, and the scene
couldn't say so. `battery` is now an object type, held to
clearances.battery_ft (3 ft; Base's help page and IRC 2021 R328),
measured in plan like the AC clearance under the strict rule. The cable
detours over it on its route, as over a box, since it stands flush
against the wall. The check appears when the scene marks a battery (or
the rules make its reach larger than the AC clearance's); otherwise it
would repeat the AC check's coverage, so every earlier answer is
unchanged apart from the rules hash.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…go to review (#35)

- A server band request whose span reaches past a marked end has no capture request
  (GapPlanner.reachesPastEnd): the coverage map records nothing past an end, so its bar
  stayed at 0 % and "I can't get there" was the only way out. Ground past a limit end is
  still recorded, so a ground request there stays capturable. It goes to review, like a
  request beyond capture.
- A past_end request that ends without its end marked again no longer leaves that side
  without an end. Skipped, the end it cleared comes back with its kind and mark time. Met,
  the end moves on to the far edge of the ground the request showed, still unexplored
  (GapPlanner.endAfterPastEnd), so the next past_end request asks for the 2 m after it
  instead of the ground at the meter.
- ServerGapTests: aBandRequestPastAMarkedEndIsNotACaptureRequest,
  aMetPastEndRequestMovesItsEndOn.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Build 3.1 reached a spot and the AR view for the first time, but the spot
overlaps the meter's working space and the wall export ran from 7 ft 6 in
left of the meter to 6 in right. The scan was lost, so this comes from the
recording and the code at ad91620. Findings are filed as #38 to #45 and as
comments on #24 to #29, #31 and #35.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Cells seen before an end was set stay in the coverage map, and the lagging-band and
see-behind tasks read them: after "Can't get there" put the right end 6 in from the meter
on device run 2, the walk kept asking to tilt up around 7 ft right and to tilt down at 5 ft
3 in right. Past an end nothing is observed (coveredFraction) or skipped (markSkipped), so
the task could never fill and "Can't get there" didn't clear it. laggingBand,
hiddenNearCamera and the see-behind check now count only cells between the ends.

GuidancePlannerTests.noCameraTaskPastAMarkedEnd.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Field test run 2's working-space line read "Measured 1 ft 3 in. The rule
is 0 in" for a spot 1 ft 3 in inside the meter's working space: the
server's measured_ft was -1.25 and Distance.feetAndInches drops the sign.
A measurement below zero now reads "Overlaps by 1 ft 3 in", and a
minimum of 0 reads "The rule is no overlap". Less than half an inch of
overlap still reads "Measured 0 in".

The app target has no unit-test bundle (adding one means regenerating
the project with XcodeGen), so the check is a screen state:
-uiDemoOverlap puts run 2's line in the sample result, and
result-overlap asserts the row's VoiceOver value and runs the
accessibility audit on it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
vendoredCopiesMatchServer compares the kit's copy with origin/t3/server,
which gained the `battery` object type at 074bf1d (#27). Every iOS run
from then on fails in HouseScanKit (run 36275541111 on this PR). The
copy is byte for byte from 074bf1d, and its recorded hash and the
provenance follow; the other two vendored files are unchanged there.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The object types gain battery (issue #27). The drift test compares with
the server branch's head, so every iOS run failed until this copy moved.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Two bugs from the review of 3c7b83a:

- "Wall ends here" during a tilt or step-back request offered the first
  side without an end, left first. After walking right with the left end
  unmarked, it ended the LEFT side at its farthest walked point, far from
  the phone, while its hint says "where you're standing". It now ends the
  side of the meter the phone is on (WalkedEnd.side, the same s along the
  chain WalkedEnd.end uses), falling back to the old choice when the
  phone's place is lost, it stands at the meter, or its side is already
  ended. The strip's dashed line and VoiceOver value follow, since both
  read the same EndPreview.
- Ending both sides at the meter without walking still gave a wall of no
  length. finishWalk now refuses ends closer together than
  WallFrame.minWallLength (0.79 m, one Base Core battery's width), clears
  them so the walk goes on, and the card says the ends were too close.

WalkedEndTests covers both: the side choice with the phone right of the
meter and the left end open, and ends at the meter being too close.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
After the check's answer asks for several views, "I can't get there"
on one of them used to stop the loop: the next upload showed the
result, so "2 more views to finish" delivered only one view.

Now it skips only the current view: the next answer raises the next
item it lists, and the result shows once none is left. Each item is
raised at most once per pass (GapPlanner.nextServerRequest); a
past-end item is known by its side, since raising it clears the end
and it comes back with a different request. A new "Show my result"
button on the follow-up request stops early, and the skip button's
VoiceOver hint says where it leads.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…s past (#35)

aRequestSpanIsReadInTheServersFeet asked for ground 0.02 ft past an unexplored end to show
it isn't met. Past the end it now has no capture request, so the test checks that, and
reads the shortfall from a request planned without the end.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The server added the `battery` object type (issue #27) after this branch's last CI run,
and vendoredCopiesMatchServer fails on every t3/ios-mvf run until the copy is refreshed.
One enum value and its description; the app doesn't export batteries yet.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ios: three small fixes from field test run 1 (#25, #26, #31)
…uests

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	ios/HouseScanKit/Tests/HouseScanKitTests/JSONSchemaValidatorTests.swift
…-fixes

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	ios/HouseScan/UI/Copy/ScanCopy.swift
#	ios/HouseScanKit/Tests/HouseScanKitTests/JSONSchemaValidatorTests.swift
A ray nearly parallel to the wall met its line hundreds of meters away, so
"Wall ends here" could put an end there and the strip's preview drew a
tape that long. A hit farther along the wall from the camera than the
coverage map's sighting distance is now refused.

An object marked past an end that came before a corner named the wall
round that corner, which the export leaves out of walls[]. It now names
the nearest written wall, whose line the server continues past its end.

Found by the caretaker's review of 75dea41.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	ios/HouseScan/UI/Screens/WallWalkScreen.swift
AidenJohnston and others added 17 commits September 27, 2026 06:18
…he floor (#163)

An AC unit stands on the ground in front of the wall, so a ray aimed at it
meets the ground first and the wall's plane under the floor. The #140 check
refused those taps. ObjectTap.place now falls back to the ground hit for an
object that stands on the ground, when the wall hit is below the ground or
there is none, with the fence tap's 8 m out bound and the wall-end reach
check on the ground hit. Doors, windows and gas meters keep the wall-only
rule.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…Can't-get-there flow asks for

The synthetic replay saw the wall only to 6.5 ft: its walk looks 20 degrees
down, and its three tilt-up views share one position, so the 7 ft row never
got a second. The server's wall request (out_ft 6.500001) could not settle.

- make-synthetic-replay.swift appends 20 frames (k00042-k00061) after the
  existing 41, which keep their numbers and bytes: a walk along the wall 22
  degrees up, 0.5 m apart. Both fixtures regenerated; additions only. The
  project lists the new files among those kept out of the UI test bundle.
- A wall request above the walk's band plays the tilt-up run, as an overhead
  request does (GapPlan.asksAboveTheWalk); the autopilot lets the whole run
  play before it ends the walk.
- The held-back window is planned over the walk's frames, and for the
  Can't-get-there flow against the ends that flow sets (EndPolicy.walked), so
  its gap is one that flow asks for. testCantGetThereEndsWhereThePhoneIs sometimes
  never reached the gap screen.
- Tests: the first 41 frames still see 6.5 ft; all 61 see 7.5 ft over the
  request's span and settle it; the Can't-get-there held-back gap lies inside
  its ends.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 4461f13)
A detected vertical plane standing roughly parallel in front of the wall
(FarSurface) now marks where the open space ends. With LiDAR depth, a
reading nearer than a sample counts as the end of the space, not as
something in front of the wall, when the sample lies past that surface
or what the reading met is that surface. Such rows are neither seen nor
hidden, so the walk no longer asks to look past a corridor's far wall.
Anything nearer the wall than the surface still hides.

The engine measures the surface from ARKit's planes whenever they, the
wall or the stretch seen change, on phones with and without LiDAR.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
A server walk-out needs the walk to pass its clearance plus the wall's
position error. In a space narrower than that, the line lies behind the
far wall or fence and no walk can meet it; on build 7.1 the card sat at
0 % while the homeowner walked against the far wall.

GapPlanner.walkOutBlock now finds where the line lies past the detected
far surface less the room a homeowner takes behind the phone. The card
then says the space ends about X out and that "I can't get there" is the
answer, the dotted line behind the wall goes, and the skip is logged
with the reason. While a walk-out is up the card also gives the phone's
distance out and the distance that counts there, rounded to 3 in; the
reply and the guidance log use the request without that reading, so it
doesn't relock the reply on every step.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Without LiDAR, a narrow space's far wall or fence reached the server only
as the walked path less its position error, which could never show the
facing gap. Where the walk came within a homeowner's depth of a surface
ARKit's planes found facing the wall, the space is known clear up to it,
so the scene now carries that surface as a `facing` entry with its error
written out: the wall's position error plus a detected plane's default.
The server then checks the real space, as it does the mesh's facing.

Only when the mesh measured no facing gap: the mesh sees the gap itself
and anything standing in it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The log message is an escaping autoclosure, which can't capture the inout request.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ized one

Greptile noted the deflate attempt allocated a second buffer almost as large as each entry. The encoder now streams through 64 KiB, so the only added memory is the compressed output, and stops once that output stops being a saving. The write() and byte-identical doc comments say what they now mean, and the deflate tests are behind the same canImport(Compression) as the code.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…a guessed ground (#163)

Most AC taps now land on the ground, so the bracket centred on the tap sat
half under the floor. It now stands on the ground under the tap.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Only the build 7.1 packet shows the planes; the build 5.1 one showed the far wall in the mesh.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit ee8cdcc)
ios: land an AC tap on the ground when its ray meets the wall under the floor
ios: bring the t3/ios-mvf UI test flake fixes to beta (reply-capsule contrast, audit the walk once the autopilot holds it, the held-back gap the Can't-get-there flow asks for).
…#164)"

This reverts commit 64b9719.

Held back for the demo. Replayed on the build 7.1 geometry, the far
surface could be the corridor wall's own detected plane, where the chain
piece runs about 11 degrees off it, and the export then sent a facing gap
of under 3 ft that would fail the corridor's spots. It can come back once
the own-plane rejection is proven on field data, and once it no longer
reports a surface the walk went well past.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…164)

Replayed on the build 7.1 corridor, FarSurface picked the corridor
wall's own detected plane: the chain's piece runs about 11 degrees off
it, so the plane passed the 0.5 m minimum two thirds of the way along
and read as a far surface under 3 ft out. A candidate plane now has to
stand at least minOut in front of every piece its outline's ends lie
along, at both ends; a straight plane clear of a piece at both ends is
clear of it everywhere. An end round a corner is held to no piece, so a
corridor's far wall ending at the corridor's mouth still counts. The
plane the meter's wall was refit to can be left out by id.

Tests: a wall's own plane 10 degrees off a chained piece, crossing 0.5 m
inside the requested span, is never chosen while the corridor's far wall
is; a 7.6 m far wall 11 degrees off at 1.8 to 2.2 m counts and a 0.75 m
plane doesn't. Also notes on the #160 path that a large flat obstacle
can qualify, leaving what's behind it unseen rather than hidden.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ARKit refines its planes about ten times a second, so the headline's
distance could move or come and go, re-arming the reply's lock each
time. The engine now keeps where the space ends for the request once
the card has shown it, and leaves out the plane the meter's wall was
refit to when it measures the far surface. The walk-out and skip logs
write their distances to the centimetre.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…164)

Round-2 review of #168: holding each outline end to whichever piece's
stretch it lay along still let the build 7.1 corridor wall's own plane
through. Its near end ran past the corner, so it was judged against the
meter's wall, 0.515 m in front of it. The chain's end pieces also run to
infinity, which rejected a fence whose end lay along a side piece.

Each end is now held to the piece nearest it in plan among those within
maxAngle of parallel to the plane, measured against that piece's whole
line, and the plane is rejected if either end is within minOut of it or
behind it. Pieces turned further from the plane are ignored, as they are
when a cell meets it, so a corridor's far wall is never held to the wall
across its mouth.

Tests: an own plane running 0.52 m past a convex corner is rejected; a
fence parallel to the meter's wall that runs up to a side wall is kept.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ios: treat a corridor's far wall or a side yard's fence as where the space ends
@codemetrics-ai

Copy link
Copy Markdown

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.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex usage limits have been reached for code reviews. Please check with the admins of this repo to increase the limits by adding credits.
Repo admins can enable using credits for code reviews in their settings.

@github-actions github-actions Bot added the size:XXL 1,000+ effective changed lines. label Sep 27, 2026
@coderabbitai

coderabbitai Bot commented Sep 27, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 742 files, which is 642 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 3ebde92e-ef17-43b8-ae10-fc47087df30a

📥 Commits

Reviewing files that changed from the base of the PR and between 830c460 and ed1c3af.

⛔ Files ignored due to path filters (154)
  • experiments/device-field-test/setup-plan.png is excluded by !**/*.png
  • experiments/evals/models/uv.lock is excluded by !**/*.lock
  • experiments/evals/uv.lock is excluded by !**/*.lock
  • experiments/measure-lab/MeasureLab.xcodeproj/project.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • experiments/measure-lab/MeasureLab/Assets.xcassets/AppIcon.appiconset/AppIcon.png is excluded by !**/*.png
  • experiments/meter-closeup/manifest.csv is excluded by !**/*.csv
  • experiments/meter-closeup/results/clean_per_image.csv is excluded by !**/*.csv
  • experiments/meter-closeup/results/locate_per_image.csv is excluded by !**/*.csv
  • experiments/meter-closeup/results/locate_per_image_dev.csv is excluded by !**/*.csv
  • experiments/meter-closeup/results/sweep_rows.csv is excluded by !**/*.csv
  • experiments/meter-closeup/uv.lock is excluded by !**/*.lock
  • experiments/panel-label/screened.csv is excluded by !**/*.csv
  • experiments/panel-label/uv.lock is excluded by !**/*.lock
  • experiments/scoring/fixtures/measure-lab/synthetic-session-01.zip is excluded by !**/*.zip
  • experiments/scoring/uv.lock is excluded by !**/*.lock
  • ios/HouseScan/Assets.xcassets/AppIcon.appiconset/AppIcon.png is excluded by !**/*.png
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00001.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00002.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00003.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00004.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00005.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00006.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00007.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00008.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00009.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00010.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00011.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00012.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00013.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00014.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00015.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00016.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00017.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00018.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00019.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00020.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00021.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00022.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00023.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00024.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00025.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00026.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00027.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00028.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00029.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00030.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00031.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00032.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00033.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00034.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00035.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00036.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00037.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00038.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00039.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00040.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00041.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00042.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00043.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00044.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00045.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00046.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00047.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00048.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00049.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00050.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00051.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00052.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00053.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00054.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00055.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00056.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00057.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00058.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00059.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00060.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00061.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00001.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00002.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00003.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00004.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00005.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00006.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00007.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00008.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00009.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00010.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00011.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00012.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00013.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00014.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00015.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00016.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00017.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00018.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00019.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00020.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00021.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00022.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00023.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00024.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00025.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00026.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00027.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00028.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00029.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00030.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00031.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00032.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00033.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00034.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00035.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00036.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00037.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00038.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00039.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00040.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00041.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00042.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00043.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00044.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00045.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00046.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00047.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00048.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00049.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00050.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00051.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00052.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00053.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00054.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00055.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00056.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00057.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00058.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00059.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00060.jpg is excluded by !**/*.jpg
  • ios/HouseScanUITests/Fixtures/synthetic-wall/keyframes/k00061.jpg is excluded by !**/*.jpg
  • packet/fixtures/synthetic/photos/p00001.jpg is excluded by !**/*.jpg
  • packet/fixtures/synthetic/photos/p00002.jpg is excluded by !**/*.jpg
  • packet/fixtures/synthetic/photos/p00003.jpg is excluded by !**/*.jpg
  • packet/fixtures/synthetic/streams/accelerometer.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/barometer.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/device_motion.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/gyroscope.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/heading.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/location.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/magnetometer.csv is excluded by !**/*.csv
  • packet/fixtures/synthetic/streams/trajectory.csv is excluded by !**/*.csv
  • packet/uv.lock is excluded by !**/*.lock
  • server/uv.lock is excluded by !**/*.lock
  • verification/fixtures/a11y-audit/A11yAudit.xcodeproj/project.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • verification/fixtures/state-probe/StateProbe.xcodeproj/project.xcworkspace/contents.xcworkspacedata is excluded by !**/*.xcworkspace/contents.xcworkspacedata
  • verification/uv.lock is excluded by !**/*.lock
📒 Files selected for processing (742)
  • .github/labels.json
  • .github/workflows/evals.yml
  • .github/workflows/ios.yml
  • .github/workflows/measure-lab.yml
  • .github/workflows/meter-closeup.yml
  • .github/workflows/panel-label.yml
  • .github/workflows/scoring.yml
  • .github/workflows/testflight.yml
  • .github/workflows/verification.yml
  • CONTRIBUTING.md
  • Makefile
  • experiments/device-field-test/README.md
  • experiments/device-field-test/RUNBOOK.md
  • experiments/device-field-test/coverage_replay.py
  • experiments/device-field-test/setup-plan.html
  • experiments/evals/Makefile
  • experiments/evals/README.md
  • experiments/evals/coverage_driver/.gitignore
  • experiments/evals/coverage_driver/Package.swift
  • experiments/evals/coverage_driver/Sources/coverage-driver/main.swift
  • experiments/evals/evals/__init__.py
  • experiments/evals/evals/advio.py
  • experiments/evals/evals/ar_poses.py
  • experiments/evals/evals/camera.py
  • experiments/evals/evals/check_replay.py
  • experiments/evals/evals/coverage.py
  • experiments/evals/evals/coverage_options.py
  • experiments/evals/evals/datasets.py
  • experiments/evals/evals/drift.py
  • experiments/evals/evals/eth3d.py
  • experiments/evals/evals/field.py
  • experiments/evals/evals/field_dryrun.py
  • experiments/evals/evals/frames.py
  • experiments/evals/evals/geometry.py
  • experiments/evals/evals/map3d.py
  • experiments/evals/evals/modern_arkit.py
  • experiments/evals/evals/pairs.py
  • experiments/evals/evals/paths.py
  • experiments/evals/evals/pose_priors.py
  • experiments/evals/evals/recon.py
  • experiments/evals/evals/replay.py
  • experiments/evals/evals/triangulate.py
  • experiments/evals/field/FIELD_SHEET.md
  • experiments/evals/field/map.template.json
  • experiments/evals/field/rules.json
  • experiments/evals/field/survey.template.json
  • experiments/evals/map3d_driver/.gitignore
  • experiments/evals/map3d_driver/Package.swift
  • experiments/evals/map3d_driver/Sources/map3d-driver/main.swift
  • experiments/evals/models/README.md
  • experiments/evals/models/__init__.py
  • experiments/evals/models/common.py
  • experiments/evals/models/da3metric.py
  • experiments/evals/models/map_anything.py
  • experiments/evals/models/moge2.py
  • experiments/evals/models/pyproject.toml
  • experiments/evals/models/run.py
  • experiments/evals/models/run_groups.py
  • experiments/evals/models/smoke_advio.py
  • experiments/evals/models/tests/test_common.py
  • experiments/evals/pyproject.toml
  • experiments/evals/results/advio_drift.json
  • experiments/evals/results/advio_drift.md
  • experiments/evals/results/coverage.json
  • experiments/evals/results/coverage.md
  • experiments/evals/results/coverage_options.json
  • experiments/evals/results/coverage_options.md
  • experiments/evals/results/eth3d_recon.json
  • experiments/evals/results/eth3d_recon.md
  • experiments/evals/results/eth3d_visibility_sensitivity.md
  • experiments/evals/results/field-replay/field_report.md
  • experiments/evals/results/frames.json
  • experiments/evals/results/frames.md
  • experiments/evals/results/map3d.json
  • experiments/evals/results/map3d.md
  • experiments/evals/results/modern_arkit.json
  • experiments/evals/results/modern_arkit.md
  • experiments/evals/results/pose_priors.json
  • experiments/evals/results/pose_priors.md
  • experiments/evals/tests/test_camera_geometry.py
  • experiments/evals/tests/test_coverage.py
  • experiments/evals/tests/test_drift.py
  • experiments/evals/tests/test_field.py
  • experiments/evals/tests/test_fixed_sets.py
  • experiments/evals/tests/test_modern_arkit.py
  • experiments/evals/tests/test_pairs.py
  • experiments/evals/tests/test_pose_priors.py
  • experiments/evals/tests/test_triangulate.py
  • experiments/measure-lab/.gitignore
  • experiments/measure-lab/Config/Info.plist
  • experiments/measure-lab/Config/Local.xcconfig.example
  • experiments/measure-lab/Config/Shared.xcconfig
  • experiments/measure-lab/Geometry/Package.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Camera.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/FrameResetGate.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/KeyframeRouter.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/KeyframeSelector.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Length.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Measurements.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/PortraitFillMapping.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Triangulation.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Vector.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Wall.swift
  • experiments/measure-lab/Geometry/Sources/MeasureGeometry/Warnings.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/CameraTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/FrameResetGateTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/KeyframeRouterTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/KeyframeSelectorTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/LengthTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/MeasurementTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/PortraitFillMappingTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/Support.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/TriangulationTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/VectorTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/WallTests.swift
  • experiments/measure-lab/Geometry/Tests/MeasureGeometryTests/WarningsTests.swift
  • experiments/measure-lab/Makefile
  • experiments/measure-lab/MeasureLab.xcodeproj/project.pbxproj
  • experiments/measure-lab/MeasureLab.xcodeproj/xcshareddata/xcschemes/MeasureLab.xcscheme
  • experiments/measure-lab/MeasureLab/AR/ARContainerView.swift
  • experiments/measure-lab/MeasureLab/AR/ARConversions.swift
  • experiments/measure-lab/MeasureLab/AR/CaptureController.swift
  • experiments/measure-lab/MeasureLab/AR/FrameSnapshot.swift
  • experiments/measure-lab/MeasureLab/AR/KeyframeRecorder.swift
  • experiments/measure-lab/MeasureLab/AR/SessionDelegate.swift
  • experiments/measure-lab/MeasureLab/AR/TrackingState.swift
  • experiments/measure-lab/MeasureLab/Assets.xcassets/AppIcon.appiconset/Contents.json
  • experiments/measure-lab/MeasureLab/Assets.xcassets/Contents.json
  • experiments/measure-lab/MeasureLab/MeasureLabApp.swift
  • experiments/measure-lab/MeasureLab/Session/LabSession.swift
  • experiments/measure-lab/MeasureLab/Session/SessionManifest.swift
  • experiments/measure-lab/MeasureLab/Session/SessionStore.swift
  • experiments/measure-lab/MeasureLab/Session/TapInput.swift
  • experiments/measure-lab/MeasureLab/Session/Tool.swift
  • experiments/measure-lab/MeasureLab/UI/ControlPanel.swift
  • experiments/measure-lab/MeasureLab/UI/FailureView.swift
  • experiments/measure-lab/MeasureLab/UI/Format.swift
  • experiments/measure-lab/MeasureLab/UI/FrozenFrameView.swift
  • experiments/measure-lab/MeasureLab/UI/MeasureScreen.swift
  • experiments/measure-lab/MeasureLab/UI/MeasureSheet.swift
  • experiments/measure-lab/MeasureLab/UI/ResultCard.swift
  • experiments/measure-lab/MeasureLab/UI/Reticle.swift
  • experiments/measure-lab/MeasureLab/UI/RootView.swift
  • experiments/measure-lab/MeasureLab/UI/SessionSheet.swift
  • experiments/measure-lab/MeasureLab/UI/StatusPanel.swift
  • experiments/measure-lab/MeasureLab/UI/Theme.swift
  • experiments/measure-lab/README.md
  • experiments/measure-lab/Tools/make-app-icon.swift
  • experiments/measure-lab/project.yml
  • experiments/meter-closeup/.gitignore
  • experiments/meter-closeup/Makefile
  • experiments/meter-closeup/README.md
  • experiments/meter-closeup/identifier_digests.txt
  • experiments/meter-closeup/meterocr/Package.swift
  • experiments/meter-closeup/meterocr/Sources/meterocr/main.swift
  • experiments/meter-closeup/pyproject.toml
  • experiments/meter-closeup/results/clean.md
  • experiments/meter-closeup/results/locate.md
  • experiments/meter-closeup/results/locate_dev.md
  • experiments/meter-closeup/results/sweep.md
  • experiments/meter-closeup/src/meter_eval/__init__.py
  • experiments/meter-closeup/src/meter_eval/analyze.py
  • experiments/meter-closeup/src/meter_eval/clean.py
  • experiments/meter-closeup/src/meter_eval/commons.py
  • experiments/meter-closeup/src/meter_eval/degrade.py
  • experiments/meter-closeup/src/meter_eval/fieldtest.py
  • experiments/meter-closeup/src/meter_eval/labels.py
  • experiments/meter-closeup/src/meter_eval/leakcheck.py
  • experiments/meter-closeup/src/meter_eval/locate.py
  • experiments/meter-closeup/src/meter_eval/match.py
  • experiments/meter-closeup/src/meter_eval/ocr.py
  • experiments/meter-closeup/src/meter_eval/paths.py
  • experiments/meter-closeup/src/meter_eval/quality.py
  • experiments/meter-closeup/src/meter_eval/retake.py
  • experiments/meter-closeup/src/meter_eval/review.py
  • experiments/meter-closeup/src/meter_eval/stats.py
  • experiments/meter-closeup/src/meter_eval/sweep.py
  • experiments/meter-closeup/tests/conftest.py
  • experiments/meter-closeup/tests/test_degrade.py
  • experiments/meter-closeup/tests/test_leakcheck.py
  • experiments/meter-closeup/tests/test_locate.py
  • experiments/meter-closeup/tests/test_metrics.py
  • experiments/meter-closeup/tests/test_retake.py
  • experiments/panel-label/.gitignore
  • experiments/panel-label/README.md
  • experiments/panel-label/meterocr/Package.swift
  • experiments/panel-label/meterocr/Sources/meterocr/main.swift
  • experiments/panel-label/pyproject.toml
  • experiments/panel-label/src/panel_eval/__init__.py
  • experiments/panel-label/src/panel_eval/paths.py
  • experiments/panel-label/src/panel_eval/screen.py
  • experiments/panel-label/src/panel_eval/sources.py
  • experiments/panel-label/tests/test_panel.py
  • experiments/scoring/.python-version
  • experiments/scoring/README.md
  • experiments/scoring/fixtures/measure-lab/map.json
  • experiments/scoring/fixtures/measure-lab/synthetic-session-01/session.json
  • experiments/scoring/fixtures/results/ar-taps.json
  • experiments/scoring/fixtures/results/mesh-scaled.json
  • experiments/scoring/fixtures/results/photo-depth.json
  • experiments/scoring/fixtures/rules.json
  • experiments/scoring/fixtures/truth/synthetic-01.json
  • experiments/scoring/pyproject.toml
  • experiments/scoring/src/scoring/__init__.py
  • experiments/scoring/src/scoring/cli.py
  • experiments/scoring/src/scoring/inputs.py
  • experiments/scoring/src/scoring/measure_lab.py
  • experiments/scoring/src/scoring/metrics.py
  • experiments/scoring/src/scoring/report.py
  • experiments/scoring/tests/helpers.py
  • experiments/scoring/tests/test_fixtures.py
  • experiments/scoring/tests/test_inputs.py
  • experiments/scoring/tests/test_measure_lab.py
  • experiments/scoring/tests/test_metrics.py
  • ios/.gitignore
  • ios/Config/Info.plist
  • ios/Config/Shared.xcconfig
  • ios/HouseScan.xcodeproj/project.pbxproj
  • ios/HouseScan.xcodeproj/xcshareddata/xcschemes/HouseScan.xcscheme
  • ios/HouseScan/ARCaptureView.swift
  • ios/HouseScan/Assets.xcassets/AccentColor.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/AppIcon.appiconset/Contents.json
  • ios/HouseScan/Assets.xcassets/Canvas.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Caution.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Chalk.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Contents.json
  • ios/HouseScan/Assets.xcassets/CoverageCovered.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/CoverageHidden.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/CoverageSeen.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/CoverageSkipped.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/CoverageUnseen.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Danger.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Ink.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Muted.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Signal.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/SignalText.colorset/Contents.json
  • ios/HouseScan/Assets.xcassets/Surface.colorset/Contents.json
  • ios/HouseScan/CaptureScreen.swift
  • ios/HouseScan/CaptureSessionModel.swift
  • ios/HouseScan/Contract/ResultPresentation+Reading.swift
  • ios/HouseScan/Contract/ScanContract.swift
  • ios/HouseScan/HouseScanApp.swift
  • ios/HouseScan/Runtime/AppRuntime.swift
  • ios/HouseScan/Runtime/Autopilot.swift
  • ios/HouseScan/Runtime/CaptureRecorder.swift
  • ios/HouseScan/Runtime/GuidanceLog.swift
  • ios/HouseScan/Runtime/KeyframeStore.swift
  • ios/HouseScan/Runtime/LaunchOptions.swift
  • ios/HouseScan/Runtime/LiveCapture.swift
  • ios/HouseScan/Runtime/LiveDotsFeed.swift
  • ios/HouseScan/Runtime/MeterNumberReading.swift
  • ios/HouseScan/Runtime/MeterReader/VisionMeterNumberReader.swift
  • ios/HouseScan/Runtime/Practice/DeveloperSettings.swift
  • ios/HouseScan/Runtime/Practice/SampleMeterArt.swift
  • ios/HouseScan/Runtime/ReplayPlayer.swift
  • ios/HouseScan/Runtime/ResultClient.swift
  • ios/HouseScan/Runtime/SampleResult.json
  • ios/HouseScan/Runtime/ScanEngine+Actions.swift
  • ios/HouseScan/Runtime/ScanEngine+Confirm.swift
  • ios/HouseScan/Runtime/ScanEngine+Ends.swift
  • ios/HouseScan/Runtime/ScanEngine+Export.swift
  • ios/HouseScan/Runtime/ScanEngine+GuidanceLog.swift
  • ios/HouseScan/Runtime/ScanEngine+Packet.swift
  • ios/HouseScan/Runtime/ScanEngine+Practice.swift
  • ios/HouseScan/Runtime/ScanEngine+Stamp.swift
  • ios/HouseScan/Runtime/ScanEngine.swift
  • ios/HouseScan/Runtime/ScanViewState+AimProgress.swift
  • ios/HouseScan/Runtime/SourceFrame.swift
  • ios/HouseScan/SessionDelegate.swift
  • ios/HouseScan/UI/Camera/CameraBackdrop.swift
  • ios/HouseScan/UI/Camera/CameraOverlays.swift
  • ios/HouseScan/UI/Camera/FogMarks.swift
  • ios/HouseScan/UI/Camera/FogOverlay.swift
  • ios/HouseScan/UI/Camera/LiveFog/LiveFogRenderer.swift
  • ios/HouseScan/UI/Camera/LiveFog/LiveFogScene.swift
  • ios/HouseScan/UI/Camera/LiveFog/LiveFogShaders.swift
  • ios/HouseScan/UI/Camera/LiveFog/LiveFogView.swift
  • ios/HouseScan/UI/Camera/WallMarksOverlay.swift
  • ios/HouseScan/UI/Camera/WallProjection.swift
  • ios/HouseScan/UI/Camera/WallTape.swift
  • ios/HouseScan/UI/Camera/WayfindingOverlay.swift
  • ios/HouseScan/UI/Components/AnswerButton.swift
  • ios/HouseScan/UI/Components/Buttons.swift
  • ios/HouseScan/UI/Components/CameraChrome.swift
  • ios/HouseScan/UI/Components/CenteredScroll.swift
  • ios/HouseScan/UI/Components/GroundQuestion.swift
  • ios/HouseScan/UI/Components/InstructionCard.swift
  • ios/HouseScan/UI/Components/OverheadAnswers.swift
  • ios/HouseScan/UI/Components/PhotoCounter.swift
  • ios/HouseScan/UI/Components/SavedMeterPhoto.swift
  • ios/HouseScan/UI/Components/Scrim.swift
  • ios/HouseScan/UI/Components/ShareScanButton.swift
  • ios/HouseScan/UI/Components/TapRipple.swift
  • ios/HouseScan/UI/Copy/Distance.swift
  • ios/HouseScan/UI/Copy/ScanCopy.swift
  • ios/HouseScan/UI/Copy/SpotCheckCopy.swift
  • ios/HouseScan/UI/Practice/DeveloperOptions.swift
  • ios/HouseScan/UI/Practice/PracticeMeterOverlay.swift
  • ios/HouseScan/UI/Preview/DemoEngine.swift
  • ios/HouseScan/UI/Preview/DemoScene.swift
  • ios/HouseScan/UI/Preview/UIDemo.swift
  • ios/HouseScan/UI/Result/ResultScene3D.swift
  • ios/HouseScan/UI/ScanRootView.swift
  • ios/HouseScan/UI/Screens/FindMeterScreen.swift
  • ios/HouseScan/UI/Screens/GapRequestScreen.swift
  • ios/HouseScan/UI/Screens/MarkFeaturesScreen.swift
  • ios/HouseScan/UI/Screens/MeterCloseUpScreen.swift
  • ios/HouseScan/UI/Screens/OnboardingScreen.swift
  • ios/HouseScan/UI/Screens/ResultARScreen.swift
  • ios/HouseScan/UI/Screens/ResultScreen.swift
  • ios/HouseScan/UI/Screens/SpotConfirmScreen.swift
  • ios/HouseScan/UI/Screens/UnsupportedScreen.swift
  • ios/HouseScan/UI/Screens/UploadingScreen.swift
  • ios/HouseScan/UI/Screens/WallWalkScreen.swift
  • ios/HouseScan/UI/Theme/Theme.swift
  • ios/HouseScanKit/Package.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Capture/AutoCapture.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Capture/CaptureSourceState.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Capture/CloseUpCredit.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Capture/CloseUpGate.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Capture/FrameQuality.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Capture/StillCatalog.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Confirm/SpotConfirmation.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Coverage/CoverageMap.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Coverage/FarSurface.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Depth/DepthImage.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/Camera.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/GroundPlaneChoice.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/MeterAnchorTracking.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/MeterTap.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/ObjectTap.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/QuadHomography.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/WallFrame.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Geometry/WallPlaneEvidence.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Guidance/AimHint.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Guidance/CoachingDebouncer.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Guidance/GapPlanner.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Guidance/GuidancePlanner.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Guidance/WalkRefusals.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Guidance/WalkedEnd.swift
  • ios/HouseScanKit/Sources/HouseScanKit/HouseScanKit.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Mesh/MeshProbe.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Mesh/TriangleMesh.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Meter/MeterBrand.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Meter/MeterNumberRanking.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Meter/MeterPhotoChecks.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Overlay/SurfaceDots.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/MeterFrame.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketDepthFrames.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketFiles.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketManifest.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketMarks.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketPlane.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketSharpness.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketStreams.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Packet/PacketWriter.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Practice/PracticeMeter.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Replay/ReplayPlanning.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Replay/ReplaySession.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/GroundPatches.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/PlacementResult.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ResultCardActions.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ResultMarkLayout.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ResultOverlayPolicy.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ResultReading.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ScanFolderCleanup.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ScanStamp.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/SceneExport.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ServerErrorDefaults.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Scene/ZipWriter.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Upload/UploadFailureKind.swift
  • ios/HouseScanKit/Sources/HouseScanKit/Upload/UploadPacing.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/AimHintTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/AnchoredMarksTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/AutoCaptureTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/CloseUpCoverageTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/CloseUpGateTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/CoachingDebouncerTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/CornerTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/CoverageDepthTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/CoverageMapTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/DepthTestSupport.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/FacingTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/FarSurfaceTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/FieldRunReplayTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/FrameQualityTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/GapPlannerTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/GeometryTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/GroundDepthTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/GroundPatchTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/GroundPlaneTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/GuidancePlannerTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/JSONSchemaValidator.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/JSONSchemaValidatorTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/KeptScansTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/MeshProbeTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/MeterBrandTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/MeterNumberRankingTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/MeterPhotoChecksTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/MeterTapTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/NoUnseenClaimsTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ObjectTapTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/OverheadTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/PacketFileTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/PacketFrameTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/PacketWriterTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/PlacementResultTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/PracticeMeterTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/RealReplayTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ReplayPlanningTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ReplaySessionTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ResultCardActionsTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ResultMarkLayoutTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ResultOverlayPolicyTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ResultReadingTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/SceneExportTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/Schemas/example-scene.json
  • ios/HouseScanKit/Tests/HouseScanKitTests/Schemas/manifest.schema.json
  • ios/HouseScanKit/Tests/HouseScanKitTests/Schemas/result.schema.json
  • ios/HouseScanKit/Tests/HouseScanKitTests/Schemas/scene.schema.json
  • ios/HouseScanKit/Tests/HouseScanKitTests/Schemas/server-answer-synthetic-wall.json
  • ios/HouseScanKit/Tests/HouseScanKitTests/ServerGapTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ServerRequestSettlementTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/SpatialSourceTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/SpotConfirmationTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/StillCatalogTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/SurfaceDotsTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/TestSupport.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/UploadFailureKindTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/UploadPacingTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/UpperWallFixtureTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/VersionTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/WalkRefusalsTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/WalkedEndTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/WalkingHeightTests.swift
  • ios/HouseScanKit/Tests/HouseScanKitTests/ZipWriterTests.swift
  • ios/HouseScanUITests/AccessibilityAudit.swift
  • ios/HouseScanUITests/Fixtures/results/no-clean-spot.json
  • ios/HouseScanUITests/Fixtures/results/pass.json
  • ios/HouseScanUITests/Fixtures/results/reject-nearest.json
  • ios/HouseScanUITests/Fixtures/results/unsure-view.json
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00001.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00001.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00002.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00002.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00003.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00003.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00004.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00004.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00005.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00005.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00006.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00006.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00007.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00007.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00008.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00008.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00009.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00009.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00010.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00010.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00011.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00011.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00012.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00012.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00013.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00013.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00014.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00014.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00015.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00015.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00016.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00016.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00017.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00017.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00018.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00018.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00019.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00019.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00020.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00020.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00021.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00021.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00022.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00022.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00023.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00023.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00024.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00024.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00025.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00025.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00026.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00026.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00027.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00027.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00028.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00028.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00029.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00029.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00030.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00030.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00031.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00031.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00032.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00032.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00033.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00033.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00034.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00034.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00035.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00035.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00036.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00036.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00037.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00037.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00038.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00038.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00039.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00039.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00040.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00040.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00041.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00041.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00042.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00042.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00043.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00043.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00044.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00044.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00045.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00045.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00046.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00046.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00047.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00047.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00048.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00048.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00049.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00049.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00050.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00050.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00051.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00051.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00052.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00052.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00053.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00053.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00054.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00054.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00055.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00055.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00056.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00056.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00057.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00057.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00058.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00058.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00059.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00059.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00060.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00060.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00061.confidence.u8
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/keyframes/k00061.depth.f32
  • ios/HouseScanUITests/Fixtures/synthetic-wall-lidar/session.json
  • ios/HouseScanUITests/Fixtures/synthetic-wall/session.json
  • ios/HouseScanUITests/FullFlowUITests.swift
  • ios/HouseScanUITests/PracticeMeterUITests.swift
  • ios/HouseScanUITests/ScreenStatesUITests.swift
  • ios/HouseScanUITests/SourceRestartUITests.swift
  • ios/README.md
  • ios/Tools/check-app-scene.sh
  • ios/Tools/make-app-icon.swift
  • ios/Tools/make-synthetic-replay.swift
  • ios/project.yml
  • packet/.gitattributes
  • packet/.python-version
  • packet/README.md
  • packet/fixtures/synthetic/depth/p00001.conf.u8
  • packet/fixtures/synthetic/depth/p00001.f32
  • packet/fixtures/synthetic/depth/p00002.conf.u8
  • packet/fixtures/synthetic/depth/p00002.f32
  • packet/fixtures/synthetic/depth/p00003.conf.u8
  • packet/fixtures/synthetic/depth/p00003.f32
  • packet/fixtures/synthetic/depth_frames/d00001.conf.u8
  • packet/fixtures/synthetic/depth_frames/d00001.f32
  • packet/fixtures/synthetic/depth_frames/d00002.f32
  • packet/fixtures/synthetic/depth_frames/d00002.sigma.f32
  • packet/fixtures/synthetic/lidar/mesh.ply
  • packet/fixtures/synthetic/manifest.json
  • packet/fixtures/synthetic/scene.json
  • packet/manifest.schema.json
  • packet/packet/__init__.py
  • packet/packet/__main__.py
  • packet/packet/files.py
  • packet/packet/samples/__init__.py
  • packet/packet/samples/advio.py
  • packet/packet/samples/app_export.py
  • packet/packet/samples/eth3d.py
  • packet/packet/samples/synthetic.py
  • packet/packet/validate.py
  • packet/packet/write.py
  • packet/pyproject.toml
  • packet/tests/test_checks.py
  • packet/tests/test_packet.py
  • server/.gitignore
  • server/.vercelignore
  • server/README.md
  • server/api.py
  • server/examples/README.md
  • server/examples/pass-clear-side-wall.json
  • server/examples/reject-garage-in-the-way.json
  • server/examples/review-corner-not-walked.json
  • server/examples/smoke.py
  • server/pyproject.toml
  • server/rules.py
  • server/rules.yaml
  • server/scene.py
  • server/schemas/result.schema.json
  • server/schemas/scene.schema.json
  • server/siteplan.py
  • server/solver.py
  • server/tests/conftest.py
  • server/tests/fixtures/example-scene.json
  • server/tests/helpers.py
  • server/tests/test_api.py
  • server/tests/test_capture_contract.py
  • server/tests/test_coderabbit_review.py
  • server/tests/test_drift.py
  • server/tests/test_existing_battery.py
  • server/tests/test_field_run_2.py
  • server/tests/test_golden_public.py
  • server/tests/test_hardening.py
  • server/tests/test_policy_and_auth.py
  • server/tests/test_properties.py
  • server/tests/test_review_regressions.py
  • server/tests/test_s4_round.py
  • server/tests/test_schemas.py
  • server/tests/test_siteplan.py
  • server/tests/test_smoke_script.py
  • server/tests/test_wall_height.py
  • server/tests/test_wall_source.py
  • verification/Makefile
  • verification/README.md
  • verification/SCOREBOARD.md
  • verification/e2e/cases/README.md
  • verification/e2e/cases/c5-no-coverage.json
  • verification/e2e/cases/d-gas-drift.json
  • verification/e2e/cases/d-reach-drift-left.json
  • verification/e2e/cases/d-reach-drift-right.json
  • verification/e2e/cases/g01-unseen-beyond-garage.json
  • verification/e2e/cases/g03-negative-s-near-edge.json
  • verification/e2e/cases/g05-inside-corner-gas.json
  • verification/e2e/cases/g06-regulator-footprint.json
  • verification/e2e/cases/g07-headroom-fail.json
  • verification/e2e/cases/g07-headroom-margin.json
  • verification/e2e/cases/g07-headroom-partial-span.json
  • verification/e2e/cases/g07-headroom-pass.json
  • verification/e2e/cases/g07-headroom-unobserved.json
  • verification/e2e/cases/g08a-garage-blocks-route.json
  • verification/e2e/cases/g08b-missing-wall-blocks-route.json
  • verification/e2e/cases/g09-reach-14.json
  • verification/e2e/cases/g09-reach-15.json
  • verification/e2e/cases/g09-reach-16.json
  • verification/e2e/cases/g09-reach-20.json
  • verification/e2e/cases/g09-reach-20p2-pm03.json
  • verification/e2e/cases/g09-reach-20p4-pm03.json
  • verification/e2e/cases/g09-reach-21.json
  • verification/e2e/cases/g09-vertical-run.json
  • verification/e2e/cases/g10-derived-compound-error.json
  • verification/e2e/cases/g10-e03-fail.json
  • verification/e2e/cases/g10-e03-lower-edge.json
  • verification/e2e/cases/g10-e03-pass.json
  • verification/e2e/cases/g10-e03-upper-edge.json
  • verification/e2e/cases/g10-e05-fail.json
  • verification/e2e/cases/g10-e05-lower-edge.json
  • verification/e2e/cases/g10-e05-pass.json
  • verification/e2e/cases/g10-e05-upper-edge.json
  • verification/e2e/cases/g10-e15-fail.json
  • verification/e2e/cases/g10-e15-lower-edge.json
  • verification/e2e/cases/g10-e15-pass.json
  • verification/e2e/cases/g10-e15-upper-edge.json
  • verification/e2e/cases/g11a-unexplored-corner.json
  • verification/e2e/cases/g11b-both-ends-real-all-fail.json
  • verification/e2e/cases/g11c-unobserved-ground.json
  • verification/e2e/cases/g12a-subgrid-start.json
  • verification/e2e/cases/g12b-exact-fit-last-start.json
  • verification/e2e/cases/g13a-unsure-never-outranks-pass.json
  • verification/e2e/cases/g13b-unsure-alone.json
  • verification/e2e/cases/generate.py
  • verification/fixtures/a11y-audit/A11yAudit.xcodeproj/project.pbxproj
  • verification/fixtures/a11y-audit/A11yAudit.xcodeproj/xcshareddata/xcschemes/AccessibilityAudit.xcscheme
  • verification/fixtures/a11y-audit/AccessibilityAudit/AccessibilityAuditTests.swift
  • verification/fixtures/a11y-audit/AuditHost/AuditHostApp.swift
  • verification/fixtures/a11y-audit/project.yml
  • verification/fixtures/state-probe/StateProbe.xcodeproj/project.pbxproj
  • verification/fixtures/state-probe/StateProbe/StateProbeApp.swift
  • verification/fixtures/state-probe/project.yml
  • verification/hsverify/__init__.py
  • verification/hsverify/a11yaudit.py
  • verification/hsverify/e2e.py
  • verification/hsverify/gitref.py
  • verification/hsverify/memory.py
  • verification/hsverify/replaycheck.py
  • verification/hsverify/report.py
  • verification/hsverify/resultcheck.py
  • verification/hsverify/scoreboard.py
  • verification/hsverify/simrun.py
  • verification/hsverify/statelog.py
  • verification/product/README.md
  • verification/product/bug-triage.md
  • verification/product/foundations/coverage-and-guidance.md
  • verification/product/foundations/flow.md
  • verification/product/glossary.md
  • verification/product/screens/find-meter.md
  • verification/product/screens/gap-request.md
  • verification/product/screens/mark-features.md
  • verification/product/screens/meter-close-up.md
  • verification/product/screens/onboarding.md
  • verification/product/screens/result.md
  • verification/product/screens/uploading.md
  • verification/product/screens/wall-walk.md
  • verification/product/verification.md
  • verification/pyproject.toml
  • verification/scenes/eth3d-facade/README.md
  • verification/scenes/eth3d-facade/annotations.json
  • verification/scenes/eth3d-facade/build_scene.py
  • verification/scenes/eth3d-facade/case.json
  • verification/scoreboard/.gitignore
  • verification/scoreboard/metrics.yaml
  • verification/scoreboard/scoreboard.json
  • verification/tests/test_a11yaudit.py
  • verification/tests/test_e2e.py
  • verification/tests/test_gitref.py
  • verification/tests/test_memory.py
  • verification/tests/test_replaycheck.py
  • verification/tests/test_resultcheck.py
  • verification/tests/test_scoreboard.py
  • verification/tests/test_simrun.py
  • verification/tests/test_statelog.py
  • verification/ux/checklist.md
  • verification/ux/friction.md
  • verification/ux/review.md

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 2/5

[High risk] Adds CI workflows and build configuration for experiments and iOS.

The PR should not merge until the known-red iOS check, fork-PR workflow failure, and packet-validator crash are addressed.

Fix All in Claude CodeFindings

  1. P1 Known-red test blocks iOS CI ▶
  2. P1 Fork pull requests fail checks ▶
  3. P1 Malformed mesh crashes validation ▶
Fix with agent prompt
### Issue 1
.github/workflows/ios.yml:155-164
The job runs all of `HouseScanUITests` and skips only the accessibility audit. That includes `testPracticeMeterFromReplay`, which the PR description identifies as red on beta. As submitted, an iOS change cannot get a green CI run until that test is fixed or excluded.

### Issue 2
.github/workflows/meter-closeup.yml:43-45
When a fork pull request changes the meter-closeup experiment, this job runs without access to the repository's `METER_HMAC_KEY` secret. The leak check then looks for a local key that is not provisioned on the runner and raises `FileNotFoundError`, so the check fails regardless of the contributor's changes.

### Issue 3
packet/packet/validate.py:370
A packet can have a valid manifest and a matching mesh hash while its PLY header contains `element vertex abc`. That line passes the header-shape check, but `int(parts[2])` raises an uncaught `ValueError`. Instead of listing the invalid mesh in its report, `packet validate` crashes.

---

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

The PR brings the beta iOS capture app, placement server, packet tooling, experiments, and their CI workflows to main.

  • Adds the capture-to-placement flow and supporting verification suites.
  • Adds CI coverage, though the iOS suite includes a known-red test and the meter-closeup check cannot pass on fork PRs.
  • Adds packet validation with an uncaught malformed-mesh case.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
  App[iOS capture app] -->|scene.json| API[Placement API]
  API --> Solver[Rules and placement solver]
  Solver -->|result| App
  App -->|shared scan.zip| Packet[Packet validator]
Loading

Reviews (1) · Last reviewed commit: "Merge pull request #168 from SamGu-NRX/t..."

Comment thread .github/workflows/ios.yml
Comment on lines +155 to +164
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 test

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Known-red test blocks iOS CI

The job runs all of HouseScanUITests and skips only the accessibility audit. That includes testPracticeMeterFromReplay, which the PR description identifies as red on beta. As submitted, an iOS change cannot get a green CI run until that test is fixed or excluded.

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

Comment:
**Known-red test blocks iOS CI**

The job runs all of `HouseScanUITests` and skips only the accessibility audit. That includes `testPracticeMeterFromReplay`, which the PR description identifies as red on beta. As submitted, an iOS change cannot get a green CI run until that test is fixed or excluded.

---

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

Fix in Claude Code Fix in Codex

Comment on lines +43 to +45
- run: uv run python -m meter_eval.leakcheck
env:
METER_HMAC_KEY: ${{ secrets.METER_HMAC_KEY }}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Fork pull requests fail checks

When a fork pull request changes the meter-closeup experiment, this job runs without access to the repository's METER_HMAC_KEY secret. The leak check then looks for a local key that is not provisioned on the runner and raises FileNotFoundError, so the check fails regardless of the contributor's changes.

Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/meter-closeup.yml
Line: 43-45

Comment:
**Fork pull requests fail checks**

When a fork pull request changes the meter-closeup experiment, this job runs without access to the repository's `METER_HMAC_KEY` secret. The leak check then looks for a local key that is not provisioned on the runner and raises `FileNotFoundError`, so the check fails regardless of the contributor's changes.

---

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

Fix in Claude Code Fix in Codex

Comment thread packet/packet/validate.py
parts = got.split()
if len(parts) != 3 or parts[0] != "element" or parts[1] not in ("vertex", "face"):
return [f"lidar.mesh: expected an element line, got {got!r}"]
counts[parts[1]] = int(parts[2])

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Malformed mesh crashes validation

A packet can have a valid manifest and a matching mesh hash while its PLY header contains element vertex abc. That line passes the header-shape check, but int(parts[2]) raises an uncaught ValueError. Instead of listing the invalid mesh in its report, packet validate crashes.

Prompt To Fix With AI
This is a comment left during a code review.
Path: packet/packet/validate.py
Line: 370

Comment:
**Malformed mesh crashes validation**

A packet can have a valid manifest and a matching mesh hash while its PLY header contains `element vertex abc`. That line passes the header-shape check, but `int(parts[2])` raises an uncaught `ValueError`. Instead of listing the invalid mesh in its report, `packet validate` crashes.

---

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

Fix in Claude Code Fix in Codex

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

Labels

size:XXL 1,000+ effective changed lines.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants