Settings layout fix#153
Conversation
Two stdlib tools in Tools/linux-capture that turn a WHOOP data export into leverage for the un-decoded deep-record layouts tracked in ryanbr#103: - hci_extract.py: parse a phone Bluetooth HCI capture (iOS .pklg / Android btsnoop) of the official app, reassemble L2CAP/ATT, and emit the CRC-valid WHOOP frames as the project's capture.json. Only WHOOP streams reach the output. - correlate_ground_truth.py: known-plaintext field search. Cross-reference capture records against the official per-night values in a WHOOP CSV export (reusing the Swift importer's localized header aliases) to locate each biometric's byte offset + encoding. Distribution-overlap scoring (recall + precision) rejects constants and coincidences. Prints offsets only, so the output is safe to post on ryanbr#103 while health data stays local. Docs: new README sections + a ground-truth-correlation note in WHOOP5_DEEP_DATA.md. 25 new stdlib tests; full suite 129 green. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ReadinessChecklistCard.lead expects LocalizedStringKey?, but fitnessReadyLead() returns an already-resolved String. The mismatch broke the NOOPiOS build; wrap it explicitly. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… pickers The six segmented pickers in the Units and Appearance cards used .fixedSize(), pinning them to their ideal width. Inside FormRow's label+control HStack that pushed the column past the screen width, so ScreenScaffold's centering shifted the whole Settings column ~37pt left — clipping the header's first letter and the cards' left/right margins (the overflow the ryanbr#43 note in this file already warns about). Remove the .fixedSize() calls so the pickers size to the row. To keep the two three-option pickers from truncating once they size down, shorten their long first labels to "Auto": Temperature's "Match" and the theme's "System" (AppearanceMode.system, shared with the onboarding pill). Add "Auto" translations to both string catalogs. Also fixes the profile-photo blurb: interpolating the nested-localized Platform.deviceNounPhrase broke its wrapping and read "diese iPhone" in German; use Platform.deviceNoun with "this" in the sentence so it wraps and reads "diesem iPhone". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
# Conflicts: # Strand/Screens/HealthView.swift
|
Ready to merge — Bug: The whole Settings content column was shifted ~37pt left off-screen (header's first letter and card margins clipped). Root cause: Six segmented Fix: Removed the Also fixed the profile-photo blurb, which read "Nur auf diese iPhone gespeichert" in German (bad grammar) because interpolating the nested-localized Since this branch was cut before 8.5.1/8.5.2: merged Also added missing translations for "HRV window" (→ "HRV-Fenster") and the option labels, which had no German/other localizations at all before this. |
|
Also matches an external report — #161. PR is up: digitalerdude#9 |
…e-checker
The single-line nested-optional-coalescing form (gx ?? 0) * (gx ?? 0) + ...
occasionally blew the Swift type-checker's time budget in CI ("unable to
type-check this expression in reasonable time"), failing the WhoopProtocol
test job on unrelated PRs. A compiler perf cliff, not a real ambiguity;
naming the intermediate values fixes it without changing behavior.
app-build.yml's matrix build job ran both legs on macos-15, whose default Xcode doesn't ship the iOS 26 SDK (RootTabView.swift's Liquid Glass glassEffect(), landed 2026-07-07) — "value of type 'Self' has no member 'glassEffect'". Currently red on every open PR and on main itself. fork-testing-build.yml and fork-release.yml already split their NOOPiOS legs onto macos-26 for the same reason; this brings app-build.yml's PR gate into line. macos-15 stays correct for the macOS/Strand leg, which doesn't touch iOS-26-only APIs.
CI: pin the NOOPiOS build leg to macos-26 for the iOS 26 SDK
…e-checker
The single-line nested-optional-coalescing form (gx ?? 0) * (gx ?? 0) + ...
occasionally blew the Swift type-checker's time budget in CI ("unable to
type-check this expression in reasonable time"), failing the WhoopProtocol
test job on unrelated PRs. A compiler perf cliff, not a real ambiguity;
naming the intermediate values fixes it without changing behavior.
WhoopProtocol test: break up gravity-magnitude expression for the type-checker
# Conflicts: # Strand/Screens/SettingsView.swift
What this PR does
Type of change
How it was tested
Checklist
swift testinPackages/<name>)android/(./gradlew testFullDebugUnitTest)StrandDesigntokens — no hardcoded colors, fonts, or spacingdocs/CONTRIBUTING.mdStrand.xcodeproj/) or any secrets/keystoresRelated issues