Skip to content

steps: the Today tile asks for phone-step days when the missing half is strap motion (both platforms) #1816

Closed

Description

@ryanbr

The problem

The Steps tile's caption says "Need N more days where your phone also counted steps" whenever the
calibration coefficient is zero — including when the strap has banked no motion at all, where
phone-step days cannot help.

// Strand/Screens/TodayView.swift:4198
private var stepsCalibrationCaption: String? {
    guard profile.stepsCalibrationCoefficient <= 0, profile.stepsManualCoefficient <= 0 else { return nil }
    let status = StepsEstimateEngine.CalibrationStatus.needsMoreDays(
        have: profile.stepsCalibrationSampleDays,
        need: StepsEstimateEngine.minCalibrationDays)
    return status.headline
}

Nothing there consults motion. The Kotlin twin has the same shape —
TodayScreen.stepsCalibrationPrompt (TodayScreen.kt:3732).

Why it misleads

A step estimate is motion * coefficient (StepsEstimateEngine.estimate returns nil below
minMotionForFit), and a calibration point is the ratio steps / motion. Both halves are
required.
With the motion half missing, neither the estimate nor the fit moves however many days
the phone counts — and setting the coefficient by hand doesn't help either, because the thing being
multiplied is what's absent.

So the caption names the one input the user can supply and stays silent about the one they
actually need. A field report asked exactly this: "If I manually enter my Apple Health step data
tomorrow, will NOOP start counting and calibrating my steps afterward?"
The answer is no, and the
caption is why they thought otherwise.

Already fixed on the settings sheet, not here

#1815 fixes the same misdirection on Calibrate your steps, where the no-motion banner already
explains the real blocker and the countdown was competing with it. That fix was two lines because the
sheet already loads a motion sample.

Today has no motion signal to gate on. Fixing it means threading one into both platforms' Today
screens and choosing between a persisted "strap has banked motion" flag and a per-render query — a
design decision rather than a guard, which is why it is filed instead of folded into #1815.

Worth noting

The Today tile is the surface where someone actually notices steps are missing; the settings sheet is
where they go afterwards. So this is the more important of the two, and the cheaper one shipped first
only because it was cheap.

🤖 Generated with Claude Code

Activity

  1. ryanbr commented on Sep 9, 2026

    @ryanbr
    OwnerAuthor

    Landed in 5d3fb38eb, both platforms as the title asked: the Today tile now names the half that is actually missing, so a strap that has banked no motion says so instead of asking for phone-step days that would not help.

    Shipped in testing build 447 onward.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions