feat(auto-scorer): allow proceeding past aiming without calibration#714
Merged
Conversation
Unsupported setups (different angle/board) never resolve the 4 calibration markers, so the aim-confirm button stayed disabled and those configs — the ones we most want training data from — could never contribute frames. Keep the aim button always clickable: calibrated → "Done aiming" (unchanged); uncalibrated → "Continue without auto-scoring" after a one-time note. Without a homography no darts auto-emit, so the player scores by hand and each manual entry captures a labelled frame via the existing captureManualEntry path (#537), still gated on the data-collection opt-in. Every capture is stamped `uncalibrated` (derived once in _recordFor from frame.hasCalibration) so the probe can single out these frames. New AutoScorerUncalibratedNoticeSeen provider persists the one-time note ack. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Notice no longer claims throws are saved unconditionally: capture writes
gate on dataCollectionEnabledProvider, so the text is now conditional
("if data collection is on") — honest for opted-out users.
- Aim hint no longer contradicts the button: with 4 cals present the button
is enabled "Done aiming", so the calibrated-but-not-stable hint is now an
advisory "tap Done aiming when steady" instead of "Hold steady…" (restores
hint↔button agreement, #411).
- Refresh the stale AutoScorerYoloAimView doc comment (button is always
clickable now, not gated on stable calibration).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Context
Today the camera auto-scorer can only collect training frames once calibration succeeds — the model finds all 4 calibration markers. Users with an unsupported configuration (different mounting angle, different board/target) can never get past the aim step: the confirm button is disabled until the 4 cals are detected and held steady. Those are exactly the configs we most want data from, yet they produce nothing.
Change
captureManualEntry([Feature]: capture the frame on manual segment entry in auto-scoring #537, wired into every board page, gated only ondataCollectionEnabledProvider). Without a homography nothing auto-emits, so the player scores manually and each manual entry saves a labelled frame — the data path for unsupported configs.uncalibratedflag on the capture sidecar, derived once in_recordForas!frame.hasCalibration, so every capture path is stamped and the probe can single out unsupported-config frames. Backward-compatible (defaults false; legacy sidecars read false).AutoScorerUncalibratedNoticeSeenprovider persists the one-time note acknowledgement (mirrorsAutoScorerSetupTipsSeen).Trade-off
The label/fast-path now discriminates on
calibrated(4 cals present) instead ofready(4 cals stable for 3 frames), dropping the aim-time stability wait for the green path. Low-stakes: per #687 the running preview re-derives the transform live every frame; the "Hold steady…" hint still nudges users to wait.Tests
CaptureRecordJSON round-trip + key-contract + legacy-default foruncalibrated.uncalibrated: true; full cals →false.flutter analyze --no-fatal-infosclean.Verification (device — uncalibrated path is mobile-only)
Build debug APK, enable data collection, point at an unsupported setup so cals never resolve → button reads "Continue without auto-scoring", one-time note appears, lands in the running preview ("needs calibration" chip). Enter darts manually → sidecars written with
"uncalibrated": trueand the segment incorrected_darts. Re-entering uncalibrated should NOT re-show the note. Regression: a normal calibrated setup still auto-scores and writes"uncalibrated": false.🤖 Generated with Claude Code