Skip to content

Insights 6c: personal time estimates (option C) behind INSIGHTS_PUBLIC - #277

Merged
JanMikes merged 4 commits into
mainfrom
insights/phase-6c
Oct 19, 2026
Merged

JanMikes merged 4 commits into
mainfrom
insights/phase-6c

Conversation

@JanMikes

Copy link
Copy Markdown
Member

Insights Phase 6c (docs/features/insights/implementation-plan.md §6.2): personal time estimates, option C, mobile first. Behind INSIGHTS_PUBLIC: with the flag off, non-admins get byte-identical HTML and the same statement counts on every touched surface.

What changes

  • Puzzle page card:

    • "≈ 1h 10min for you", with a certainty bar.
    • The 50 % likely window plus the 80 % range, formatted in one style.
    • What the estimate rests on, how sure it is, and the tier chip (dashed "?" when estimated).
    • Context such as "2nd-hardest 1000-piece puzzle in your collection" ("Likely …" when the tier is estimated).
    • Free players see the "≈ ? for you" lock.
  • Lists (collections, wishlist, unsolved, Puzzle Picker cards, marketplace cards):

    • One line per row: time, tiny certainty bar and chip. It never wraps at 320 px in 6 locales; the chip shrinks to its icon first.
    • Tapping opens one shared sheet per page with the ranges, what the estimate rests on and how sure it is.
    • Marketplace corners show the estimated tier.
  • Which number shows (docs/features/insights/estimates.md). The same puzzle never shows two different times; this is pinned by a parity test against GetPlayerPrediction.

    Situation What shows
    Solved before Personal prediction
    5+ indices Measured
    1-4 indices Statistical shrunk toward brand × pieces, marked estimated
    k = 0 Picture-only, only where ImageEstimateGate::passesFor() passes for that estimate generation
    No pace at all Community median for the piece count (≥ 20 puzzlers)
    Secret puzzles Nothing
  • Rounding: 5 min under an hour, 10 min above, to the minute under 10 min. Never outside the shown window. "≈" in lists.

  • Accessibility: an estimate is never marked by colour alone (dashed outline + "?" + "estimated" in the accessible name). The sheet returns focus to its trigger.

  • Statements with the flag on:

    Surface Change
    Lists +1 statement each, pinned
    Puzzle page 1 + rank instead of 2-4 GetPlayerPrediction statements
    Picker 1 instead of GetPlayerPredictions

    The biggest collection (1,351 puzzles) takes 16-83 ms on the production copy.

No migration.

Reviewed

An independent review found no blockers. All its findings are fixed:

  • Focus return from the sheet.
  • The gate now checks the estimate generation and fails closed for an unevaluated one.
  • The Picker's "vs your best" uses the raw prediction.
  • Byte-identical flag-off output.
  • Selection mode ignores the estimate line.
  • Budgets pinned with the flag on.
  • Czech and Spanish adjective agreement.

All 6 locales are covered: 44 keys, with matching placeholders.

🤖 Generated with Claude Code

JanMikes and others added 4 commits October 19, 2026 07:25
…C - WIP

GetPersonalEstimates (one statement per list), ResolvePersonalEstimates, the puzzle page card, one line per list row
(collections, wishlist, unsolved, Picker, marketplace), the sheet, estimated corners, ShelfPicks::estimates() wired
to the picture estimate where its gate passed, 6 locales, tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… in 6 locales, docs

- GetPersonalEstimates: the listed ids drive the statement, the player's part rides on one row (21 puzzles 3-8 ms,
  a 1,350-puzzle collection 50-83 ms on the production copy)
- the list line's column takes the row's width; chip label dropped by locale-aware container queries (6 locales x
  320-414 px, 41,550 lines, no clipped time)
- docs/features/insights/estimates.md (the one rule of which number shows), flag doc, related docs
- GetPersonalEstimates allow-listed in BlocklistQueryCoverageTest (own data, aggregates only)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- the gate vouches only for the estimate generation its record measured (image_model + version must be among the
  group's estimateModels); derive model changes stay closed until evaluated - tests + image-estimate-gates.md
- Picker "vs your best" from the raw prediction, silent under the shown time's rounding step
- the sheet gives the focus back; selection mode ignores taps on the estimate line
- the 50 % window and the 80 % range shown together share one style (PredictionWindowFormatter::ranges())
- collections "+ predictions" mode skips GetPlayerPredictions while the estimate line shows
- flag-off base.html.twig byte-identical; est-host only on rows with an estimate; card a11y "(estimated)" once
- "Likely the hardest …" on an estimated tier, Czech / Spanish agreement, all 6 locales
- statement budgets pinned with the flag on (puzzle page, Picker, custom collection); TODO.md follow-ups

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JanMikes
JanMikes merged commit 5ffa660 into main Oct 19, 2026
13 checks passed
@JanMikes
JanMikes deleted the insights/phase-6c branch October 19, 2026 06:45
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.

1 participant