Skip to content

Add diagnostics and restore Headwind state - #44

Open
sbroenne wants to merge 4 commits into
mainfrom
sbroenne-about-diagnostics
Open

Add diagnostics and restore Headwind state#44
sbroenne wants to merge 4 commits into
mainfrom
sbroenne-about-diagnostics

Conversation

@sbroenne

Copy link
Copy Markdown
Owner

Summary

  • add a polished About & Diagnostics screen with Bundle-derived app identity, live trainer/proxy state, human-readable FTMS events, service-contract facts, and an explicitly user-initiated local-only diagnostics copy action
  • restore the exact pre-shifting Headwind mode and remembered manual speed, including acknowledged command ordering, reconnect/failure handling, and safe replacement/removal
  • keep the primary Start action in a stable position while trainer readiness changes, including Accessibility Dynamic Type
  • align README, support/privacy/App Store copy, requirements, demo guidance, and DEVELOPMENT hardware evidence with TestFlight 1.0 (11)

Compatibility status

TestFlight 1.0 (11) passes all 17 checks from a fresh macOS RideSim central and works with FulGaz on macOS. RealVelo and MyWhoosh work on Windows. FulGaz on Windows still intermittently discovers Virtual Gears but fails to connect despite the advertised FTMS + CPS, readable + notifiable measurement contract. This change adds diagnostics; it does not claim to fix that FulGaz behavior or alter Bluetooth behavior.

Coverage matrix

Area What is covered
App identity and report Bundle display-name/version/build formatting, missing-value fallbacks, timestamp and concise report contents
Live diagnostics Every trainer readiness state, proxy advertising, subscriber count, controlling-app state, and human-readable FTMS peripheral events
Privacy UUID-shaped value redaction, exclusion of trainer/user identifiers and logs, local-only pasteboard use, and ten-minute clipboard expiry
About UI Navigation from Settings, displayed version/build, Copy Diagnostics action, and copied confirmation
Headwind restoration Every supported mode, every 5% manual speed, remembered speed outside Manual mode, exact command/acknowledgement order, failed starts and stops, disconnect/reconnect, command failures, repeated lifecycles, and device replacement/removal
Readiness geometry Waiting-to-ready button midpoint/height stability at normal and Accessibility Dynamic Type, plus accessible waiting/ready labels

Validation

  • 293 XCTest package tests passed
  • 9 Swift Testing tests passed
  • VirtualGearsCore line coverage: 91.13%
  • all 32 UI tests passed serially on iPhone 17 Pro Simulator
  • generic iOS Simulator build passed
  • strict MkDocs build passed
  • git diff --check passed

Xcode emitted DebuggerLLDB.DebuggerVersionStore.StoreError: no debugger version while launching UI tests, but the warning was non-fatal: all 32 tests executed and passed.

Resolves #1

Stefan Brönner added 4 commits August 16, 2026 15:53
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2c3d711c-cb97-4bfa-a302-2d01fe5d2f1f
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2c3d711c-cb97-4bfa-a302-2d01fe5d2f1f
Keep the startup action fixed in place as trainer readiness changes, and document the physically reproduced build 11 regressions.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2c3d711c-cb97-4bfa-a302-2d01fe5d2f1f
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>

Copilot-Session: 2c3d711c-cb97-4bfa-a302-2d01fe5d2f1f
Copilot AI lite review requested due to automatic review settings August 16, 2026 14:59

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Pull request overview

Adds an About & Diagnostics surface plus restores Wahoo Headwind pre-shifting state, while also hardening startup UI geometry so the primary action doesn’t shift position as trainer readiness changes. The PR also updates repository/user-facing documentation to match TestFlight 1.0 (11) compatibility and support guidance.

Changes:

  • Add an About & Diagnostics screen (live connection state + user-initiated local-only “Copy Diagnostics” report) and supporting core diagnostics models/tests.
  • Restore exact pre-shifting Headwind mode + remembered manual speed across stop/reconnect/failure via new restoration policy + lifecycle tracking.
  • Stabilize startup “waiting” vs “ready” layout geometry (including Accessibility Dynamic Type), with new UI test fixtures and assertions; update README/docs/App Store copy accordingly.

Reviewed changes

Copilot reviewed 19 out of 19 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
VirtualGearsUITests/VirtualGearsUITests.swift Adds UI coverage for primary-action geometry stability and About & Diagnostics navigation/copy behavior
VirtualGearsProduct/VirtualGearsHomeView.swift Releases Headwind control on shifting failure; unifies waiting/ready layout to keep geometry stable
VirtualGearsProduct/VirtualGearsApp.swift Adds screenshot fixtures for Accessibility startup states and wires coordinator into settings
VirtualGearsProduct/SetupView.swift Introduces About & Diagnostics settings destination and copy-to-pasteboard diagnostics UX
VirtualGearsProduct/HeadwindCentralService.swift Implements restoration lifecycle + reconciliation to restore exact pre-shifting Headwind state
Tests/VirtualGearsCoreTests/HeadwindControlPolicyTests.swift Adds restoration/shifting/lifecycle policy tests for Headwind hand-back behavior
Tests/VirtualGearsCoreTests/DiagnosticsTests.swift Adds unit tests for diagnostics identity/state/report formatting + redaction + clipboard policy
Sources/VirtualGearsCore/HeadwindControlPolicy.swift Adds HeadwindState, restoration planning policy, shifting release policy, and lifecycle state machine
Sources/VirtualGearsCore/Diagnostics.swift Adds core diagnostics models, report builder, redaction, and human-readable FTMS event descriptions
README.md Updates compatibility messaging and documents About & Diagnostics + Headwind hand-back behavior
docs/support.md Adds troubleshooting + bug-report guidance for Headwind hand-back and diagnostics report
docs/safety.md Documents Headwind control scope and restoration guarantees as part of safety guidance
docs/requirements.md Updates FulGaz-on-Windows status and documents service-contract validation + Headwind restoration details
docs/PRIVACY.md Updates privacy policy with diagnostics-report behavior and guarantees
docs/index.md Updates overview copy for Headwind restoration and diagnostics surface
docs/how-it-works.md Documents Headwind hand-back semantics as part of shifting lifecycle explanation
docs/DEMO_VIDEO.md Updates App Review demo script text to reflect current Windows FulGaz status
docs/APP_STORE.md Updates App Store copy with diagnostics and Headwind restoration, plus compatibility clarifications
DEVELOPMENT.md Updates test-count text and adds Headwind hand-back hardware evidence + compatibility narrative

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines 447 to +451
]
app.launch()
}

private func assertPrimaryActionKeepsPosition(
Comment on lines +160 to +168
static func redactingIdentifiers(in value: String) -> String {
let pattern =
#"\b[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\b"#
return value.replacingOccurrences(
of: pattern,
with: "[identifier removed]",
options: .regularExpression
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Prove KICKR V5 wheel-circumference control on iPhone

2 participants