Skip to content

ios: three small fixes from field test run 1 (#25, #26, #31) - #34

Merged
SamGu-NRX merged 5 commits into
t3/ios-mvffrom
t3/run1-quick-fixes
Sep 26, 2026
Merged

SamGu-NRX merged 5 commits into
t3/ios-mvffrom
t3/run1-quick-fixes

Conversation

@AidenJohnston

Copy link
Copy Markdown
Collaborator

Three small fixes for issues found in field test run 1 (PR #23). This is based on t3/ios-mvf (PR #10), so it merges into that branch, not main. @SamGu-NRX it's your branch, so merging is your call.

What changes

  • Marking prompt says "Tap the ac unit" #25 "Tap the ac unit". New ScanCopy.noun(kind) keeps "AC" in capitals. It's used in the marking prompt and in the Mark, Add and Remove VoiceOver labels. VoiceOver also gets feet and inches spelled out (Distance.spoken) in the result's measurement lines and the 3D view's summary. The on-screen text doesn't change.
  • Upload screen sits on "Sending measurements, 99%" and skips "Check clearances" #31 stuck on "Sending measurements, 99%". The upload delegate now reports 1 once the whole body is sent, so the screen moves to "Check clearances" while the server works out the spot. Before this, it held 0.99 until the answer came back.
  • "Slow down" shows while standing still to mark something #26 "Slow down" while standing still. The walk screen hides only the "Slow down" prompt while the "What do you see?" tray is open. Turning the phone to aim reads as moving to the capture gate. Tracking problems still show.

Not in this PR

#24, #28 and #29 all come from the same guidance and coverage logic and need a design call, so they're left for you. #27 needs a team decision. #30 needs more field runs.

Testing

Not built locally: this was written on Windows, without Xcode. The iOS CI job compiles the app and runs the HouseScanKit and UI tests. The changed code is all in the app target, which has UI tests but no unit tests. So CI checks that it compiles and that the existing flows still pass. The new behaviour itself still needs checking on a phone:

  • mark an AC unit;
  • open the mark tray while turning the phone;
  • watch the upload steps.

GitHub only closes linked issues when a PR merges into main, so close #25, #26 and #31 by hand when this lands.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Sep 26, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 0ff9ed0d-5cb3-46d7-8f2e-55eb644001ed

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

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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.

AidenJohnston and others added 2 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>
@github-actions github-actions Bot added the size:M 30-99 effective changed lines. label Sep 26, 2026
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>
@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.

@SamGu-NRX

Copy link
Copy Markdown
Owner

The current head e760327 fails the iOS build before tests run. Xcode 26.6 reports failed to produce diagnostic for expression at ios/HouseScan/UI/Copy/ScanCopy.swift:370 on spoken ? Distance.spoken : Distance.feetAndInches (CI log). Please replace that conditional function reference with a compiler-friendly form and rerun the build. I reviewed the six changed files and found no other established correctness defect. The new AC VoiceOver copy, tray-open slow-down behavior and upload stage transition still need behavior checks; the existing UI tests do not exercise those combinations. CodeRabbit skipped this non-default-base PR, so its green check is not a review.

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>
@SamGu-NRX

Copy link
Copy Markdown
Owner

Follow-up on my build finding: 57a3ae1 replaces the conditional function reference, and the current-head iOS check passed, including HouseScanKit tests, app build and Simulator whole-flow UI test. The specific AC VoiceOver, tray-open slow-down and body-sent transitions still need their stated phone checks; the existing UI flow does not exercise those combinations.

@SamGu-NRX SamGu-NRX left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

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

I read the behaviour against the code at 57a3ae1. All three do what the description says. It merges cleanly with the current t3/ios-mvf head (75dea41, checked with git merge-tree).

  • #31, upload stuck at 99%. didSendBodyData reports 1 once totalBytesSent reaches the expected size. ScanEngine then moves .uploading to .analyzing, so "Check clearances" lights up while the server works. The progress callback only acts while the state is still .uploading, so a late delegate call can't pull a finished result back to .analyzing. A body of unknown size (totalBytesExpectedToSend ≤ 0) still sends no progress, and the existing .analyzing assignment after submit returns covers that case.
  • #26, "Slow down" while standing still. It's hidden only while the mark tray is open, and the card's tone follows the same filtered value. Once a kind is picked, the tray closes and the marking prompt takes over, since instruction puts state.marking ahead of coaching. So the whole run 1 case is covered: tray open, then marking. Tracking problems and the other coaching cases still show. The capture gate still refuses photos while the phone turns. That's fine, since nobody walks with the tray open.
  • #25, "Tap the ac unit". ScanCopy.noun covers every place the head lowercases a feature name: the marking prompt and the Mark, Add and Remove labels. Distance.spoken already exists, so the VoiceOver strings compile, and removing the duplicate feetAndInches from ResultScene3D is safe.

One thing for the phone check: the "Sending measurements" step now completes the moment the body is sent. On a fast connection it may flash past, so watch that the step list still reads in order.

AidenJohnston added a commit that referenced this pull request Sep 26, 2026
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>
@SamGu-NRX
SamGu-NRX merged commit feb35a0 into t3/ios-mvf Sep 26, 2026
3 checks passed
@SamGu-NRX

Copy link
Copy Markdown
Owner

Review: no open findings at 72144a7. I rechecked the six-file PR diff after the base merge. The compiler issue from e760327 is fixed, and the current-head iOS check passed. CodeRabbit skipped this non-default-base PR; this is the independent read-only code-review gate, not a claim that the three specific behaviors have been checked on a phone. A new code push needs another review.

@SamGu-NRX

Copy link
Copy Markdown
Owner

Merged into t3/ios-mvf as feb35a0 (merge commit, your commits kept). make ios builds at feb35a0; CI on that head is running. #25, #26 and #31 stay open for your phone retest.

SamGu-NRX pushed a commit that referenced this pull request Oct 15, 2026
* Add the capture ingest API on the volume backend.

Provisional WS-00 contracts stay in this branch until those PRs merge. Multipart returns 501. Terraform modules are validated with terraform test and are not applied.

* Expose the Modal app as app so modal deploy can find it.

The dev deploy only attaches the hss-dev-api secret. The GCP secret waits until that project exists.

* Serialize capture create and delete, and keep late uploads on the packet hash.

Create holds a lock and writes the capture before the idempotency key. Delete takes the same per-capture lock as register and finalize. A file registered after accept must match the packet sha256 and size.

* Keep orchestrator status, persist dict state, and close the ingest gaps.

Finalize no longer writes processing over a status the orchestrator already stored, manifest rechecks omit nulls, and ModalDictState keeps capture records in the dict. Upload tokens are checked before the body, reviewer rights come from a role claim, device results omit verdicts, and delete removes capture prefixes.

* common: WS-01 additive

Lock LocalFsStorage index updates so parallel promotion can save the volume index.

* Restrict review HTML to reviewers and bind the real services module.

A device GET /review is 403, so the hidden reject stays off the owner page.
The finalize hook test follows the services object import returns.

* Keep path_invalid for dot segments after the storage-id merge.

RelPath now rejects those paths before the route. The ones the route would
refuse still return path_invalid, and amendment and still ids match the new
patterns. Tests that build the app set dev vision settings so the prod default
does not raise.

* Expect schema when RelPath rejects a dot segment.

PR 47's path pattern fails those values before the route. The tests now
expect that schema error. packet.json still returns path_invalid.

* Choose replay file meta from the file role.

mini-arkit stills reuse keyframe images. Matching stills first sent still
meta on a keyframe and finalize never started.

* Claim each ModalDictState event sequence under one lock.

Eight writers were reading and rewriting the same event list, so sequence
numbers collided and events disappeared. Each event is now its own key.

* Accept every demo request as the device principal demo.

HSS_AUTH_MODE=none skips the bearer. Hidden-reject masking stays on /result, and /review is reachable. Static tokens and JWT remain unused.

---------

Co-authored-by: hss-cloud-agent <hss-cloud-agent@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:M 30-99 effective changed lines.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants