DevOverlayの診断ダンプに測位パイプラインの判定内訳とGPSの判定結果を追加 - #6990
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KuvCXLRytCryvexood76po
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KuvCXLRytCryvexood76po
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KuvCXLRytCryvexood76po
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Essentials Run ID: 📒 Files selected for processing (13)
Included review availability: 1 review is currently available. Your included PR review attempts over the past 7 days set your current allowance at 2 reviews per hour. 📝 WalkthroughWalkthrough測位パイプラインの統計記録とGPS精度補正を追加しました。診断スナップショットと開発オーバーレイは、測位履歴、棄却件数、到着判定状態、最近接駅までの距離、実効閾値を出力します。 Changes測位診断機能
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Feature Sequence Diagram(s)sequenceDiagram
participant LocationInput
participant handleTrackingLocation
participant locationPipelineStats
participant locationAtom
participant DevOverlay
LocationInput->>handleTrackingLocation: 測位を渡す
handleTrackingLocation->>locationPipelineStats: 入力距離と棄却理由を記録
handleTrackingLocation->>locationAtom: 受理した位置を反映
locationAtom->>locationPipelineStats: 受理・ETA・速度の結果を記録
DevOverlay->>locationPipelineStats: 統計と変位履歴を取得
DevOverlay->>DevOverlay: 最近接駅までの距離と実効閾値を診断情報へ設定
Merge Risk: ⚪ Minimal · up to The added diagnostics use the same location inputs as arrival evaluation, with no actionable merge risk identified. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
うさぎは測位の足あとを数えます Comment |
概要
実機(iOS / 都営大江戸線)で起きた測位の不具合 2 件を、DevOverlay の診断ダンプだけで再現できるようにする。
現状のダンプでは原因を特定できず、駅座標を StationAPI から引き、
useThresholdを手で再実装して初めて再現できた。その手作業を潰すのが目的。src/utils/devDiagnosticsSnapshot.ts自身が「棄却された測位の履歴や測位の出所は持ち出せない。判定箇所に記録を足さないと取れない」と書いていた穴を埋める。測位の判定ロジックは変更していない。 ダンプに載せる値の追加のみ。
変更の種類
変更内容
追加したフィールド(16 件)
configforceNotArrivedOnLowAccuracyconfig節は「同じ測位でもこれが違えば挙動が変わる設定」を持つ節なので、欠落は漏れだったlocationdisplacementHistoryfilteraccuracyOutlierfiltercountsstate(新設)currentStationIdcurrentStationNamearrivedapproachingnearestStationIdnearestStationNamedistanceToNearestStationarrivedThresholdapproachingThresholdcountsは 1 件の測位に対する排他的な結果(accepted/rejectedByAccuracy/rejectedAsDuplicate/rejectedByEta/rejectedBySpeed)で、合計が入力件数と一致する。一致しないと「落ちていない」のか「数え漏らしている」のかが読めなくなるため。とくに
rejectedAsDuplicateには代替がない。handleTrackingLocationの重複排除はlastProcessedAtMsを更新する前に return するので、経過時間からは「OS が呼んでいない」状態と区別が付かない。実装上の判断
smoothingDecisionAtomが判定結果と入力を 1 つの atom に持っているのと同じ理由)。isDevAppや feature flag で分岐させない。 カナリアやフラグでだけ通る経路を測位パイプラインへ作らないため。処理は整数のインクリメントと固定長配列への push のみで、atom を書かないので購読側の再レンダーも起きない。displacementHistoryの記録は精度フィルタより前に置く。 地下で最も知りたい「棄却された生座標がどれだけ飛んでいたか」は、rawLocationAtomが最新 1 件しか持たないためここでしか観測できない。setLocationを直接呼ぶ経路(手動での駅選択・起動時のワンショット取得)は意図的な瞬間移動なので対象外にしている。distanceToNearestStationは到着判定と同じ 0.01m 精度で求める。isPointWithinRadiusの実体はgetDistance(point, center, 0.01) < radiusで、既定の 1m 丸めだと閾値ぎりぎりのときダンプ上だけ大小が逆に見える。リファクタリング(判定への影響なし)
useRefreshStationのプライベート定数MAX_ACCURACY_BONUSと精度ボーナスの式をsrc/utils/accuracyBonus.tsへ抽出し、DevOverlay と共有した。式・定数・ガード条件はいずれも変更なしの純粋な抽出。ダンプへ「精度ボーナス込みの実効到着圏・接近圏」を載せるのに同じ式が要り、DevOverlay 側で組み直すと持ち出した実効閾値が実際の判定と食い違うため。
テスト
npm run lintが通ることnpm testが通ることnpm run typecheckが通ることnpm run lint(771 ファイル・エラーなし)/npm test(289 suites・3165 tests 全件成功)/npm run typecheck(エラーなし)。Claude Fable 5.1 によるローカルレビューを 2 巡実施し、指摘 4 件(すべて minor)を修正済み。内訳は、ダンプの距離精度と到着判定の食い違い、飛び幅の記録位置(精度フィルタで棄却された測位が観測できていなかった)、JSDoc が実際の観測範囲より広かった箇所 2 件。
追加した回帰テストは、修正を戻すと実際に落ちることを確認済み(
distanceToNearestStationの精度:Expected: 288.84 / Received: 289)。実機・シミュレータでの動作確認は未実施。
関連Issue
スクリーンショット(任意)
UI 変更なし:
src/components/DevOverlay.tsxを変更しているが、差分はフック呼び出しの追加とクリップボードへ載せる JSON の項目追加のみで、描画要素(JSX)に差分はない。オーバーレイの見た目は変わらない。🤖 Generated with Claude Code
https://claude.ai/code/session_01KuvCXLRytCryvexood76po
Generated by Claude Code
Summary by CodeRabbit
新機能
改善