Skip to content

build: include available experiment suites in root checks (#90, conflicts resolved) - #181

Merged
AidenJohnston merged 598 commits into
mainfrom
t3/check-experiments-on-main
Sep 27, 2026
Merged

AidenJohnston merged 598 commits into
mainfrom
t3/check-experiments-on-main

Conversation

@AidenJohnston

Copy link
Copy Markdown
Collaborator

Sam's #90 (make check also runs the experiment suites a branch has), with its conflicts against beta resolved so it merges on top of #179.

Tested on the Mac mini from this branch: bash tests/makefile.sh passes every case, and make -n check lists the suites above.

Merge after #179, with "Create a merge commit". Until #179 lands, the diff also shows beta's commits.

🤖 Generated with Claude Code

AidenJohnston and others added 30 commits September 26, 2026 16:29
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
…n did not see' (#45)

Co-authored-by: Cursor <cursoragent@cursor.com>
The AR result was a SwiftUI Canvas over the camera, so nothing could occlude it. On the live camera it is now RealityKit content on the meter's anchor, with scene-mesh occlusion on LiDAR phones and people occlusion where supported, both on only while the AR screen is up. Replays keep the Canvas overlay.

Co-authored-by: Cursor <cursoragent@cursor.com>
- #44: among UNSURE spots, one whose best estimate is past a rule (a
  spot overlapping the meter's working space, UNSURE only because the
  meter's error is large) now ranks after every spot whose estimates
  all clear, whatever its cable run. The strict rule is unchanged.
- #45: "N checks depend on areas the scan did not see" counts only the
  unseen checks, and names the rest: "and 1 needs a person to judge".
- #42: an object with no footprint past an unexplored end is not put on
  the wall's straight extension, which may not exist; one across the
  end keeps its part on the scanned wall. Answers list set-aside marks
  in objects_not_used (result schema, additive).

Moved spots in the suite and on real scenes all had a best estimate past
a rule (gas at 2.96 ft of 3, openings at 0 to 2.5 ft); no decision
changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
SamGu-NRX and others added 23 commits September 27, 2026 05:43
Its capsule was 14% white, composited over the camera behind the card, and
CI's accessibility audit measured its contrast as nearly passing on the
LiDAR replay. It is now the same colour as a solid (#2D333F), so chalk text
on it is about 11:1 whatever is behind the card.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit 397b6d6)
The full-flow tests audited the walk the moment it appeared, while the
autopilot was still marking features, setting the ends and tilting up over
a playing replay. Each audit pass caught a different crossfade; a copy
fading out has no identifier, so transient issues from two passes matched
on a label or on the "no element" key and failed as one lasting issue
(runs 36304552823, 36305050676, 36307476187).

The app now leaves <phase>.held in the gate folder while it waits for the
test to finish with a screen, and the walk is audited once that file
appears, on the settled "Done with this wall" state. Every state the walk
passes through is still audited frozen by ScreenStatesUITests.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
(cherry picked from commit ad942d8)
Port the DeveloperOptions change from Aiden's 786bcf2. The 4482 Simulator audit failed when Practice text was replaced by an icon. Keep the existing beta test isolation and Details/scrolling restart fixes.

Source reviewed by the permissions Astra caretaker and Codex. Swift parsing and exact owner-file comparison pass; app build and Dynamic Type runtime acceptance remain pending.
…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
…on-main

# Conflicts:
#	CONTRIBUTING.md
#	Makefile
@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 746 files, which is 646 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: 2e1f7ae6-dd11-4e6c-acc7-f57a20df095d

📥 Commits

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

⛔ 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 (746)
  • .github/labels.json
  • .github/workflows/evals.yml
  • .github/workflows/ios.yml
  • .github/workflows/makefile.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
  • AGENTS.md
  • CONTRIBUTING.md
  • Makefile
  • README.md
  • 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
  • tests/makefile.sh
  • 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.

@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.

@greptile-apps

greptile-apps Bot commented Sep 27, 2026 •

Copy link
Copy Markdown

RetriggerConfidence Score: 4/5

[High risk] Adds CI workflows and build infrastructure for experiment suites.

This PR should not merge until the meter sweep propagates shard failures; the local-to-CI check gaps should also be addressed.

Fix All in Claude CodeFindings

  1. P1 Sweep failures go unnoticed ▶
  2. P2 Meter lockfile check omitted ▶
  3. P2 Measure Lab drift check omitted ▶
Fix with agent prompt
### Issue 1
experiments/meter-closeup/Makefile:31-33
If either background shard fails, the unqualified `wait` can still report success, so `make sweep` may finish with missing rows. `make q2` analyzes the rows it finds without checking that the sweep is complete, which can produce misleading retake thresholds.

```suggestion
	uv run python -m meter_eval.sweep --shard 0 --shards 2 & first=$$!; \
	uv run python -m meter_eval.sweep --shard 1 --shards 2 & second=$$!; \
	wait "$$first"; first_status=$$?; \
	wait "$$second"; second_status=$$?; \
	test "$$first_status" -eq 0 && test "$$second_status" -eq 0
```

### Issue 2
Makefile:84-86
The root `meter-closeup` target delegates to a check that runs lint and tests but skips CI’s `uv sync --locked`. If the lockfile is stale, the local `uv run` commands can update it and let `make check` pass even though the meter-closeup CI workflow rejects the lockfile. This makes the root check less reliable as a local CI check.

```suggestion
meter-closeup:
	$(call require,$(METER_CLOSEUP),#16)
	cd experiments/meter-closeup && uv sync --locked
	$(MAKE) -C experiments/meter-closeup check
```

### Issue 3
Makefile:68-70
The new root target runs Measure Lab’s tests and build, but not the workflow’s check that regenerates the Xcode project and detects drift. A stale committed `MeasureLab.xcodeproj` can therefore pass `make check` while Measure Lab CI fails, reducing the value of the root check as a local CI check.

---

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

The PR adds branch-aware experiment dispatch to the root checks alongside the broader beta content, including experiment suites and CI workflows.

  • Root dispatch covers available scoring, Measure Lab, evals and meter-closeup suites while skipping absent recon.
  • The meter sweep can silently finish after a shard failure; two delegated local checks also omit gates present in their CI workflows.
Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[make check] --> B[server, web, iOS]
  A --> C{Suite marker exists?}
  C -->|yes| D[Experiment target]
  C -->|no| E[Skip suite]
  D --> F[Scoring / Measure Lab / Evals / Recon / Meter close-up]
Loading

Reviews (1) · Last reviewed commit: "Merge remote-tracking branch 'origin/mai..."

Comment on lines +31 to +33
uv run python -m meter_eval.sweep --shard 0 --shards 2 & \
uv run python -m meter_eval.sweep --shard 1 --shards 2 & \
wait

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 Sweep failures go unnoticed If either background shard fails, the unqualified wait can still report success, so make sweep may finish with missing rows. make q2 analyzes the rows it finds without checking that the sweep is complete, which can produce misleading retake thresholds.

Suggested change
uv run python -m meter_eval.sweep --shard 0 --shards 2 & \
uv run python -m meter_eval.sweep --shard 1 --shards 2 & \
wait
uv run python -m meter_eval.sweep --shard 0 --shards 2 & first=$$!; \
uv run python -m meter_eval.sweep --shard 1 --shards 2 & second=$$!; \
wait "$$first"; first_status=$$?; \
wait "$$second"; second_status=$$?; \
test "$$first_status" -eq 0 && test "$$second_status" -eq 0
Prompt To Fix With AI
This is a comment left during a code review.
Path: experiments/meter-closeup/Makefile
Line: 31-33

Comment:
**Sweep failures go unnoticed** If either background shard fails, the unqualified `wait` can still report success, so `make sweep` may finish with missing rows. `make q2` analyzes the rows it finds without checking that the sweep is complete, which can produce misleading retake thresholds.

```suggestion
	uv run python -m meter_eval.sweep --shard 0 --shards 2 & first=$$!; \
	uv run python -m meter_eval.sweep --shard 1 --shards 2 & second=$$!; \
	wait "$$first"; first_status=$$?; \
	wait "$$second"; second_status=$$?; \
	test "$$first_status" -eq 0 && test "$$second_status" -eq 0
```

---

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 Makefile
Comment on lines +84 to +86
meter-closeup:
$(call require,$(METER_CLOSEUP),#16)
$(MAKE) -C experiments/meter-closeup check

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 Meter lockfile check omitted The root meter-closeup target delegates to a check that runs lint and tests but skips CI’s uv sync --locked. If the lockfile is stale, the local uv run commands can update it and let make check pass even though the meter-closeup CI workflow rejects the lockfile. This makes the root check less reliable as a local CI check.

Suggested change
meter-closeup:
$(call require,$(METER_CLOSEUP),#16)
$(MAKE) -C experiments/meter-closeup check
meter-closeup:
$(call require,$(METER_CLOSEUP),#16)
cd experiments/meter-closeup && uv sync --locked
$(MAKE) -C experiments/meter-closeup check
Prompt To Fix With AI
This is a comment left during a code review.
Path: Makefile
Line: 84-86

Comment:
**Meter lockfile check omitted** The root `meter-closeup` target delegates to a check that runs lint and tests but skips CI’s `uv sync --locked`. If the lockfile is stale, the local `uv run` commands can update it and let `make check` pass even though the meter-closeup CI workflow rejects the lockfile. This makes the root check less reliable as a local CI check.

```suggestion
meter-closeup:
	$(call require,$(METER_CLOSEUP),#16)
	cd experiments/meter-closeup && uv sync --locked
	$(MAKE) -C experiments/meter-closeup check
```

---

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 Makefile
Comment on lines +68 to +70
measure-lab:
$(call require,$(MEASURE_LAB),#7)
$(MAKE) -C experiments/measure-lab check

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 Measure Lab drift check omitted The new root target runs Measure Lab’s tests and build, but not the workflow’s check that regenerates the Xcode project and detects drift. A stale committed MeasureLab.xcodeproj can therefore pass make check while Measure Lab CI fails, reducing the value of the root check as a local CI check.

Prompt To Fix With AI
This is a comment left during a code review.
Path: Makefile
Line: 68-70

Comment:
**Measure Lab drift check omitted** The new root target runs Measure Lab’s tests and build, but not the workflow’s check that regenerates the Xcode project and detects drift. A stale committed `MeasureLab.xcodeproj` can therefore pass `make check` while Measure Lab CI fails, reducing the value of the root check as a local CI check.

---

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

@AidenJohnston
AidenJohnston merged commit 0a60e22 into main Sep 27, 2026
15 checks passed
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