STATE: Session 80 — S7 nudge freshness completed; premise corrected report-first

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCNgGSt5qvcLxaeQqa7Zpj
This commit is contained in:
Kev
2026-07-22 12:20:49 -04:00
parent 4f3f433aae
commit 9a91837f63
+57 -1
View File
@@ -1,5 +1,5 @@
# VYNDR — STATE OF THE WORLD
### As of `e311f53` (main, DEPLOYED + fingerprinted live), 2026-07-22. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.**
### As of `4f3f433` (main, DEPLOYED + fingerprinted live), 2026-07-22. This file opens every future session. **Start with the CURRENT STATUS + OPEN ITEMS block below.**
---
@@ -131,6 +131,62 @@ exist locally; harmless, the data restores completely.
`specs/snapshot-retention.md` (Phase 2 report + schema) ·
`specs/audit-data/grade-collapse.md` · `specs/audit-data/gate-simulation.md`.
---
# 🟢 SESSION 80 — S7 PRICED-LINE NUDGE COMPLETED (freshness) (2026-07-22)
## 🔴 REPORT-FIRST corrected the order's premise
Order claimed "S7 is a shell that doesn't update per selection." **Not true**
`pricedForSelection` is a `useMemo([pricedIndex, selectedPlayer, stat])` and
`setSelectedPlayer/setStat` fire on every pick → chips already update per
selection (S79 verification stood). **The real gap was FRESHNESS**: the fetch
depended on `[sport]` ONLY, so `pricedIndex` was fetched once per sport-change,
never refreshed → a page open across a pricing-cron boundary (5 UTC hours)
surfaced hour-stale lines. That was the ONLY defect, and the only thing fixed.
## Fix (display-layer only, one file)
- `refreshPriced()` re-fetches when the held snapshot is older than
**`PRICED_STALE_MS` (30s = the /api/snapshot cache)** at the moment of use —
**on selection change AND on window focus**. Long-open page never shows a
stale line. Sport change clears first (no old-sport flash).
- **Reversible gate:** whole nudge behind `PRICED_NUDGE_ENABLED = true`. False →
empties the surfaced set → S6 link-only fallback. The instant revert lever.
## Stale-tap (unchanged, already safe)
Scan submit re-fetches the live snapshot server-side, so a stale chip tapped →
real triplet (still priced) OR honest empty (rotated away). Never lands on
nothing.
## Phase 4 — every case induced live
| Case | Result |
|---|---|
| (a) priced selection | `Sam Huff hits → [u0.5 @+105]` (exact) |
| (b) change selection | `Tsung Che Cheng hits → [o0.5 @-140]` — updates |
| (c) none / off-slate | `[]` / `[]` |
| (d) tap → triplet | `book +105 · fair +120` — real |
| (e) stale-tap (8.5) | no market → **degrades to empty** |
| (f) freshness | refresh-on-stale + focus wired, fingerprint live in chunk |
## Verdict — S7 FULLY WIRED (not a shell)
Correct per-selection · updates on change · fresh on long-open · tap reaches a
real triplet · stale-tap degrades honestly. **Scan A byte-identical**
(GradeResultCard/PriceTriplet/gradeAdapter/valueState/both scan routes/
pricedLines unchanged). Independently revertible via the flag.
## Method note
Scanner page is auth-gated → data-correctness induced via the exact functions
the `useMemo` runs + the `/api/scan` endpoint the tap hits (the load-bearing
path), not the rendered gated page. Freshness proven by code fingerprint + unit
tests asserting the exact refresh logic.
## Next open (unchanged)
edge_pct/ev_pct mislabel = **already checked S(prev), no genuine mislabel**
one metric-CHOICE flagged (GradeResultCard "EDGE" = stat-gap %, tied to the
deferred ranking decision). · No settled `p_win` yet · 3 key rotations
(PAT stripped locally; Kev must REVOKE on GitHub + rotate internal key + Storage
Box password).
---
# 🟢 SESSION 79 — READ-CARD NO-MARKET EMPTY STATE + PRICED-LINE SURFACER (2026-07-22)