# Task Ledger

**Purpose:** persistent record of what was asked vs what got verified-done. Prevents the "I thought we discussed this" problem and the "marked done but not really done" problem.

**Last updated:** 2026-05-28 by CC (drift-reconciliation pass — closed items already resolved in canonical `data/issues.json` 2026-05-26)
**Previously:** 2026-05-16 by CC (audit · extended round 2 across /jon/ + customer + aggregator gaps)

> **Last reconciled with canonical `data/issues.json`: 2026-05-28.** Canonical is the source of truth for issue state; this ledger captures raw items not yet promoted to canonical. Phase 1 + Phase 2 + Phase 3.x + Phase 4 architectural work happened in canonical only — not duplicated here. See `data/issues.json` for the full open queue.

## Protocol for CC

1. **Read this file at session start** (every "resume" or new prompt).
2. **Never report "no tasks left"** without checking OPEN section here.
3. **Move tasks through states explicitly:** OPEN → IN PROGRESS → COMPLETED. Mark verification line under each COMPLETED entry showing how confirmation was done (URL exists / content matches / cross-links work).
4. **When a long prompt has multiple tasks,** create one ledger entry per task and verify each independently before marking COMPLETED.
5. **BLOCKED items** stay surfaced — never silently drop them. Include the blocker.

## Verification protocol

Before moving a task to COMPLETED, run the relevant checks:

**For page builds:**
- [ ] URL serves 200 (curl check)
- [ ] Content matches spec
- [ ] Cross-links from related pages work
- [ ] If bet page: 4-tier structure present, $10 stakes on SameSHOTs, Full Send SameSHOT ~100x, Zesty SameSHOT ~10x, correlation logic explained

**For renames / data updates:**
- [ ] No stale references in linked pages (grep verify)
- [ ] Portfolio tracker / predictions.json updated if applicable

**For new features:**
- [ ] Both sides work (admin + user)
- [ ] KV storage tested with sample data
- [ ] State machine transitions verified

---

## OPEN

- [ ] **task-DONLIN-001:** Customer record + project page for Denise Donlin (3D print order via website)
  - Created 2026-05-17 · SS-Q012 · 4 team medallions (Celtics + Blue Jays + Bucks + Steelers)
  - HARD DEADLINE: June 7, 2026 (Jarod's birthday — Celtics + Blue Jays)
  - Pages: `/customer-jobs/donlin-medallions-2026-05/` · `/personal/3d-printing/projects/donlin-team-medallions/`
  - Status: Inquiry phase · email drafted at `/customer-jobs/donlin-medallions-2026-05/email-draft.md`

- [ ] **task-DONLIN-002:** Sam reviews + sends reply email to Denise
  - Severity: HIGH (each day of delay shrinks the buffer)
  - Action: review draft, edit, confirm contact email, send

- [ ] **task-DONLIN-003:** Lock in design references with Denise for all 4 teams
  - Candidates pre-staged on project page for Celtics + Steelers; Blue Jays + Bucks need search after style confirmation
  - Blocked on: Denise's reply with style + design refs

- [x] ~~**task-DONLIN-004:** Order missing filament colors — DEADLINE May 22~~
  - **RECONCILED 2026-05-28** — closed in canonical 2026-05-26: Sunlu PLA+ 10-pack ($140 / 10kg) arrived 2026-05-26, superseding the Bambu 4-spool spec. See `sb-donlin-blue-jays-celtics-filament` + `sb-donlin-filament` (both resolved) in `data/issues.json`.

- [ ] **task-DONLIN-005:** Quote finalize — paid vs favor
  - Draft range: $80-150 depending on paid/favor + premium add-ons
  - Blocked on: clarification with Denise

- [ ] **task-AUDIT-ISSUES-TRIAGE-001:** issues.json triage (39 open · 21 done · 66 total)
  - Source: app audit 2026-05-16
  - Severity: MEDIUM
  - Action: Sam quickly skims open list to mark stale items resolved. CC re-audit after.
  - Verification: hub badge count reflects accurate open work

- [x] ~~**task-AUDIT-JON-PAINT-001:** Fill SAM-FILL placeholders in /jon/jobs/aceves-paint-2026-05-11.json~~
  - **RECONCILED 2026-05-28** — closed 2026-05-20 (Path C close-out, commit `0dea024`). 0 `SAM-FILL` strings remain in `/jon/` per post-deploy grep verification. See sam-blocking.md Resolved section.

- [x] ~~**task-AUDIT-ACEVES-RECONCILE-001:** Reconcile Aceves customer-hub status~~
  - **RECONCILED 2026-05-28** — closed by lifecycle: $950 draft (2026-05-20) → $1,500 invoice SS-013 locked (2026-05-22) → $1,100 collected in person (2026-05-26, $400 voluntary timeline-delay concession). All surfaces aligned via canonical `customer-jobs/aceves-home-fence-2026-04/status.json` v4 (updated 2026-05-28). Closes canonical `aceves-paint-finalize` + `sb-jon-invite-send`.

- [ ] **task-AUDIT-AGGREGATOR-INDEXES-001:** Build top-level aggregator pages for /personal/equipment, /personal/appliances, /personal/vehicles
  - Source: app audit round 2
  - Severity: LOW
  - Action: each index.html lists the project/research pages under it (e.g. appliances → Whirlpool fridge diagnostic; equipment → soccer-nets-research, John Deere brakes)
  - Verification: from /personal/ Sam can drill into equipment/appliances/vehicles and see all related work

- [ ] **task-AUDIT-RECURRING-001:** Run app audit weekly
  - Source: app audit 2026-05-16
  - Schedule: every Sunday night after recalibration
  - Trigger: Sam command "run app audit" OR CC autonomous when context allows
  - Output: timestamped report at `/personal/audit-report-{YYYY-MM-DD}.html`
  - Surface: auto-replace audit tile on Sam's hub on completion
  - Goal: stop relying on Sam noticing stale data

- [ ] **task-LIVE-CONFIG-001 (Sam action item):** Register free Odds API key and set Cloudflare env
  - Source: live data infra build 2026-05-15
  - Steps:
    1. Register at https://the-odds-api.com/ (free tier, 500 calls/month)
    2. In Cloudflare dashboard → Pages project → Settings → Environment variables → add `ODDS_API_KEY` (Production and Preview)
    3. Redeploy or wait for next deploy; widgets pick up the key automatically
    4. Verify on /bets/api-usage/ — config probe should turn green
  - Blockers: Sam-only action (CC can't set Cloudflare env)
  - Verification: /bets/api-usage/ shows "✓ Configured" callout · any /bets/games/*/index.html live-odds widget renders book grid (not "Configure API" placeholder)

- [ ] **task-WIN-PWA-RESTORE-001:** Re-enable PWA install for /win/ when Lenovo install flow is fixed
  - Source: Sam mega-prompt 2026-05-15 (Win arriving at hotel — prompts disabled until Sam can fix install properly)
  - Blockers: BLOCKED until Sam ready to fix Lenovo Tab One install flow
  - Re-enable date: TBD
  - Steps when ready:
    1. Restore `<link rel="manifest" href="/win/manifest.json">` in /win/index.html (uncomment line ~8)
    2. Remove the early `beforeinstallprompt` suppress handler added 2026-05-15 (head `<script>` block in /win/index.html)
    3. Remove the early `return;` in the install-banner IIFE at /win/index.html (~line 154)
    4. Test on Lenovo Tab One Chrome that prompts surface correctly without spamming
  - Verification: /win/ shows install banner on Chrome desktop AND Lenovo Tab One · install completes without repeat prompts

- [ ] **task-CONCERT-001:** Build Jimmy Eat World concert page at /our/events/
  - Source: Sam mega-prompt 2026-05-15 driving
  - Blockers: **NO SPEC PROVIDED** (date, venue, ticket details, who's going). Awaiting Sam's details.
  - Verification: page exists at /our/events/jimmy-eat-world/, links from /our/, cross-links from family calendar

- [ ] **task-BETS-SCHEDULE-001:** Create /bets/schedule/ calendar view (deferred, lower priority than game-page updates)
  - Source: Sam mega-prompt 2026-05-15
  - Verification: page exists with all upcoming games · clickable matchups · color-coded by sport

- [ ] **task-OPTION-B-PGA-MILD:** Build Zesty SameSHOT tier for PGA pages
  - Source: 4-tier requirement from this prompt
  - PGA differs from team-sport BCE — Zesty SameSHOT for golf is a 2-leg cut/place parlay
  - Verification: PGA championship page has both Mild + Full Send SameSHOT tiers

### 2026-05-18 batch (planning-chat captures via CC autonomous perf-test session)

- [ ] **task-RUG-CLEAN-001 / task-RUG-PRESSURE-WASH-001:** Pressure wash living-room rug, dry, reinstall
  - Status: **TODAY (Wed 5/20) — but STILL BLOCKED** on pressure washer nozzle (task-EQUIP-PRESSURE-WASHER-001 unresolved per 2026-05-20 status check)
  - Action: confirm nozzle status BEFORE hauling rug outside
  - Source: planning-Claude Monday 2026-05-18 capture; Sam Wed 5/20 brief
  - Verification: rug cleaned · dried · reinstalled

- [ ] **task-EQUIP-PRESSURE-WASHER-001:** Fix pressure washer nozzle or purchase replacement
  - Source: planning-Claude Monday 2026-05-18 capture
  - Decision: fix vs buy (Sam to evaluate)
  - Unblocks: task-RUG-CLEAN-001

- [ ] **task-3DP-LOTION-BOTTLES-001:** 3D-print vanilla-scented lotion bottles
  - Source: planning-Claude Monday 2026-05-18 capture
  - Open: design source, bottle size/specs, food-safe/cosmetic-safe filament choice
  - Substrate folder: /personal/3d-printing/projects/lotion-bottles/

- [ ] **task-CECE-SELL-SALON-CHAIRS-001:** List CeCe's old salon chairs (FB / Craigslist / OfferUp)
  - Owner: CeCe
  - Open: listing photos, pricing research, channel selection
  - Substrate folder: /personal/items-to-sell/

- [x] ~~**task-WIN-WEEKEND-SCHEDULE-001:** Confirm Win parenting time May 23-24 with Win's mom~~
  - **PASSED — NO LONGER ACTIONABLE 2026-05-28** — May 23-24 weekend is in the past. If a real custody question remains for it, recreate as new item; otherwise treat as historical.

- [ ] **task-WIN-JULY-4-SCHEDULE-001:** Confirm Win parenting time for Commerce Lake fireworks party (Sat **2026-06-27**)
  - **DATE CORRECTED 2026-05-28** — ledger previously said "July 3-5"; canonical `data/issues.json` and `task-FIREWORKS-*` series say party is Saturday **June 27, 2026**. Treat the June 27 date as authoritative.
  - Schedule doc: /personal/win-schedule/2026-summer.md
  - Related canonical item: `sam-win-custody-june-26-28` (P2 open) — Sam confirms with CeCe; impacts both party headcount and Win's parenting time.

- [x] ~~**task-ACEVES-HUB-WALKTHROUGH-001:** Walk Jon Aceves through hub + app install flow~~
  - **RECONCILED 2026-05-28** — moot. Payment closed direct via in-person $1,100 collection 2026-05-26; portal-invite path not used. If Sam later wants Jon onboarded to the hub for future jobs, recreate as new item with that as the explicit purpose.

- [x] ~~**task-ACEVES-BILL-FINALIZE-001:** Finalize Aceves invoice + send via Sam's preferred process~~
  - **RECONCILED 2026-05-28** — closed: SS-013 invoice locked $1,500 (aceves-paint-finalize 2026-05-22) → $1,100 collected in person 2026-05-26 ($400 voluntary concession). See `customer-jobs/aceves-home-fence-2026-04/status.json` v4 + canonical `aceves-paint-finalize` + `sb-jon-invite-send`.

- [ ] **task-BOAT-BATTERY-CABLES-001:** Four Winns H190 — cable ends + pontoon-battery swap evaluation
  - Sub-tasks captured at /index/equipment/fourwinns-h190.md
  - Affects: season readiness
  - Sourcing: NAPA / AutoZone / Marine West / Amazon

### 2026-05-18 evening additions (this-week focus + Commerce Lake fireworks)

- [ ] **task-CECE-TAXES-FINALIZE-001:** Help finalize CeCe's taxes (this week)
  - **STATUS 2026-05-30 evening — IN-PROGRESS:** numbers locked, payment pending TurboTax mobile submission tonight
  - Reconciliation pass complete (Randolph W-2 reclass / Apple Cash + Cash App tips / catch-all / deductions / mileage added) [dollar figures redacted 2026-06-01 — financial PII]
  - **Grand total + federal/Michigan split: [redacted 2026-06-01 — financial PII]**
  - Payment method: TurboTax mobile direct-debit (PNC checking) — single workflow, NOT IRS Direct Pay + Michigan Treasury separately
  - Owner: Sam (helping CeCe)
  - Context: CeCe is self-employed (Rain Collective LLC dba Rain Hair Studio, booth rental at Cosmo Salon Studios since 2025-01-27 — i.e. her FIRST tax year was 2025), files independently from Sam
  - Extension Form 4868 was filed 2026-04-15 with $0 paid; revised deadline 2026-10-15 but Sam wanted closed tonight
  - Substrate canonical: the cece-taxes-2025 guide + payment handoff + the /personal/cece-taxes-2026 docs were REMOVED 2026-06-01 (financial-PII takedown); only the entity index `index/personal-project/cece-business-2026.md` remains (figures redacted there too). CeCe's working tax records live off-substrate.
  - **Closes when:** CeCe submits via TurboTax mobile, debits clear in PNC (1–3 business days), Part 6 SAM-FILL placeholders populated with confirmation IDs + actual debit dates + actual amounts, guide bumped v0.2 → v1.0

- [ ] **task-SAM-HEALTH-INSURANCE-001:** Finalize ACA enrollment for Sam (this week)
  - Owner: Sam
  - Context: ACA research already done; Sam qualifies as household of 1 for subsidy purposes. Win has separate coverage. CeCe handles her own (also household of 1).
  - Action: select plan, enroll, set up payments
  - Substrate folder: /personal/health-insurance-2026/ (stub if it doesn't exist)

- [ ] **task-FIREWORKS-001:** Identify taco truck vendor (same as last year)
  - Anchor for Commerce Lake fireworks party Sat 2026-06-27
  - Confirm vendor name, deposit status, menu, headcount estimate

- [ ] **task-FIREWORKS-002:** Tent rental — quote + booking

- [ ] **task-FIREWORKS-003:** Tables and chairs rental — quote + booking

- [ ] **task-FIREWORKS-004:** Bounce house rental — quote + booking

- [ ] **task-FIREWORKS-005:** DJ booking

- [ ] **task-FIREWORKS-006:** Schedule planning meeting with neighbors
  - Decide cadence (one meeting vs ongoing thread)
  - Pick invite method first (task-FIREWORKS-007) so the planning meeting can use it

- [ ] **task-FIREWORKS-007:** Decide invite method
  - Options: group text · Facebook event · website RSVP form (substrate page) · paper invite
  - Tradeoff: ease for non-tech neighbors vs RSVP tracking quality

- [ ] **task-FIREWORKS-008:** Day-of timeline + logistics

### 2026-05-20 Wednesday afternoon additions (Sam between flowers + work)

- [ ] **task-MASTER-BEDROOM-REFRESH-001:** Move master bedroom bed, clean, redo layout, paint
  - Status: TODAY-planned (after flower pickup)
  - Pre-work: move furniture out of paint zone
  - Open: confirm paint color + quantity from recent SW receipt history
  - Tools: existing painting kit from Aceves work (FrogTape Multi-Surface 1.41" · Purdy Marathon · spinner) — see /personal/equipment/painting-tools/
  - Pattern: same paint workflow as Aceves trim

- [ ] **task-JETSKI-SEAT-COVER-001:** Order jetski seat cover
  - Status: TODAY
  - Need: jetski make/model to specify correct cover
  - If Sea-Doo: check /index/equipment/ for model record
  - Sources: West Marine · OverstockMarine · Amazon
  - Surface on hub home today

- [ ] **task-BOAT-UNWINTERIZE-001:** Get Four Winns H190 unwinterized + handle battery cables
  - Status: TODAY / this week
  - Sub-tasks: (1) unwinterize procedure (2) battery decision Four Winns vs pontoon swap (3) cable-end sourcing
  - Related: existing task-BOAT-BATTERY-CABLES-001 (folded in)
  - Reference: /guides/fourwinns-h190/battery-decision.md (decision matrix)

- [ ] **task-BUTCHER-CARTS-001:** Plan Westside Butcher visit — carts together
  - Status: planned
  - Context: Sam manages their scale system (UC-CW + UC-ST)
  - Note: "carts together" = coordinate when going (with CeCe? Win?)
  - Cross-ref: scan for any Westside Butcher service-pending tasks

- [ ] **task-FIREWORKS-PORTA-POTTY-009:** Identify owner + book porta potty for Sat 6/27
  - **STATUS: NO OWNER YET** · must be addressed
  - Sam/CeCe? · Or ask a neighbor to handle?
  - Sources: local rental services · check Sam's contractor network

- [ ] **task-FIREWORKS-PARTY-HUB-001:** Build party page as dual-audience hub (organizers + guests)
  - Status: backlog — DO NOT BUILD YET
  - Trigger: wait for neighbor's existing invite link to compare/coordinate
  - When triggered: page serves different views per audience (guest = details/parking/FAQ; organizer = vendor coord + task tracking + contact list)
  - Architecture: both views accessible from /our/commerce-lake-fireworks-2026/

### 2026-05-18 late-evening (Rain Hair Studio multi-tenant scaffold)

- [ ] **task-RHS-PHASE2-VAGARO-001:** Wire Vagaro work appointments into Rain Hair Studio hub
  - Owner: Sam (build), CeCe (configure)
  - Context: Hub home + CeCe's stylist dashboard have "Phase 2" placeholders for Today/Week. Same engine that drives `/cece/` schedule (currently scaffolded with Connect Google Calendar button at `/cece/index.html`). Reuse the connection — don't build a parallel one.
  - Outputs: today's appointment list on hub home, week grid on `/stylists/cece/schedule.html`
  - Trigger: when CeCe is ready to authorize Vagaro/Google connection (already prompted on `/cece/`)

- [ ] **task-RHS-PHASE2-GCAL-001:** Google Calendar personal events into stylist dashboard
  - Owner: Sam (build), CeCe (authorize)
  - Context: Companion to Vagaro pull — personal blocks (gym, lunch, errands) layer on top of work
  - Reuses the same `/auth/google/connect` flow already wired into `/cece/index.html`

- [ ] **task-RHS-PHASE3-INVITES-001:** Build the invite-token flow scaffolded at `/cece/rainhairstudio/invites/`
  - Owner: Sam (build), CeCe (operate after build)
  - Trigger: CeCe says "Sarah wants in" — until then, no work needed
  - Full design contract: https://hub.samesolutionsllc.com/cece/rainhairstudio/invites/README.md
  - Estimated effort once triggered: ~3-4 hours (KV Worker glue + accept screen + revoke UI)
  - Sub-tasks: token generation, `/_data/pending.json` writes, accept screen at `/invites/accept/?token=…`, member onboarding into `/_data/members.json` + new `stylists/<username>/` folder scaffolding, revoke toggle

- [ ] **task-RHS-PHASE3-MEMBER-FOLDER-TEMPLATE-001:** Extract `/cece/rainhairstudio/stylists/cece/` into a reusable template
  - Owner: Sam (build)
  - Context: Each new stylist needs the same 5 pages (dashboard + schedule + clients + supplies + tips). Phase 3 invite-accept handler clones this template into `/stylists/<new-username>/` and substitutes the username in breadcrumbs + gate paths
  - Could be done before Phase 3 trigger as a pre-flight (build the template + clone script) or together as part of the invite-flow build

- [ ] **task-RHS-PHASE4-SHARED-WRITES-001:** Wire shared section writes to KV
  - Owner: Sam (build)
  - Context: `/shared/announcements.html`, `/shared/supply-orders.html`, `/shared/events.html` currently have stubbed write controls (greyed for viewers). Phase 4 wires posts/RSVPs/order-items to the same KV Worker `/our/data` uses
  - Trigger: at least 1 active member beyond CeCe (otherwise it's just CeCe talking to herself)

- [ ] **task-RHS-PHASE4-AUTH-HARDEN-001:** Replace soft-fence with Firebase auth
  - Owner: Sam (build)
  - Context: Current model is `localStorage["ss-hub-user"]` via `/auth/gate.js` — "no accidents, not no attackers." Once real workmates are using the hub with sensitive ops data, harden to real auth tokens
  - Trigger: when 2+ active members AND any sensitive data (formulas, client allergies) is on the hub
  - Companion to the broader substrate auth-hardening track
  - Setup window, vendor arrival, food service window, fireworks timing, cleanup
  - Owner assignments to neighbors who volunteered

## IN PROGRESS

- [x] **task-LEDGER-001:** Establish task ledger system (this file)
  - Verification: file exists at /handoff-blocks/task-ledger.md · referenced from working-with-sam.md (PENDING add)
  - In progress because protocol still needs to land in working-with-sam.md

- [x] **task-BETS-AUDIT-001:** Audit /bets/ pages for completeness (done — findings below)

## AUDIT FINDINGS (2026-05-15)

### `/bets/teams/` — 13 directories
pirates ✓ · phillies ✓ · pistons ✓ · cavaliers ✓ · braves · tigers · nhl-playoffs · golf · nascar · lions · steelers · penguins · red-wings · plus index.html

### `/bets/games/` — 5 game pages + _actions.js + index.html
- `2026-05-15-cle-det-g6/` (Pistons G6 elim) — has full SameSHOT but missing Mild tier
- `2026-05-15-pga-championship/` (PGA Round 2+) — has 5-pick portfolio but tiering doesn't match 4-tier structure
- `2026-05-15-pit-phi/` (Fri Pirates G1) — placeholder, no tiers
- `2026-05-16-pit-phi/` (Sat Pirates G2 — Sam attending) — has full SameSHOT but missing Mild tier
- `2026-05-17-pit-phi/` (Sun Pirates G3) — placeholder, no tiers
- **Note:** SAS @ MIN G6 referenced in portfolio tracker + BCE scanner but **no dedicated game page exists**

### `/bets/edges/`
- blowout-correlation/ ✓ (BCE framework page)

### `/bets/portfolio/`
- index.html (3-tier framework)
- track/2026-05-15-weekend.html (12 bets across 4 games × 3 tiers — needs expansion to 5 games × 4 tiers = up to 20 bets)

### Existing structure naming note
Existing game URLs use `{home}-{away}` ordering (`pit-phi` since Pirates are home). Sam's spec in this prompt suggests `{away}-{home}` (`phi-pit`). Keeping existing URLs to avoid breaking cross-links from backtests, prediction-log manifest, weekend tracker, and BCE scanner. Title text says "Phillies @ Pirates" (away first) which matches the spec.

---

## COMPLETED (with verification)

### Branding refresh · SameSHOT + Zesty/Full Send + ⭐ TOP PICK (2026-05-16)

- [x] **task-RENAME-001/002/003:** Global rename in safe order via sed across all .html/.md/.json outside /snapshots/
  - "Mild SameSHOT" → "Zesty SameSHOT" (34 occurrences)
  - "Full SameSHOT" → "Full Send SameSHOT" (34 occurrences)
  - "Sameshot" / "SAMESHOT" → "SameSHOT" capitalization (169 total)
  - 0 remaining "Sameshot" or "SAMESHOT" anywhere in user-visible files
  - **PRESERVED** 54 lowercase `sameshot` in internal KV keys / function names / tier codes (e.g. `sameshot_pick` field in predictions.json, `A-mild`/`A-full` internal tier codes). Touching these would break KV continuity with already-recorded outcome records.

- [x] **task-TOP-PICK-001:** ⭐ TOP PICK section added on priority game pages
  - Pages: G7 Sunday (BCE 4/4 Phase 1 Bet #2) · Sat Pirates G2 (today, Sam attending) · SAS-MIN G6 (BCE Bet #1) · plus 2 SCORED pages (Pistons G6 WIN ✓ + Pirates G1 LOSS ✗ with outcome pills)
  - Position: directly after live-odds mount (above matchup card + BCE check + tier sections) per Sam's visual hierarchy spec
  - Card: black-to-grey gradient · gold border (or green/red for scored) · ⭐ TOP PICK gold pill · headline pick · stake/payout/confidence/reasoning · collapsible "See all SameSHOT tiers ↓" with new icon convention (🛡️ B · 🎯 C · 🌶️ Zesty · 🚀 Full Send)
  - Skeleton pages (5 next-week MLB + 2 PGA round skeletons) intentionally NOT pre-populated — Top Pick reflects concrete analysis, which per existing pattern lands 24-48h pre-game

### Resume loop · sweeps + /our/ event extension (2026-05-16, autonomous)

- [x] **task-ALT-TEXT-SWEEP-001:** /img/ alt-text audit (bk-P3-012)
  - Method: `grep -rEn "<img[^>]*>" --include="*.html" | grep -v "alt="` excluding /snapshots/
  - Result: zero `<img>` tags missing alt — accessibility clean across all live pages

- [x] **task-SCRIPT-PATHS-001:** _actions.js / _live-widgets.js absolute-path verification (bk-P3-016)
  - Method: `grep -rn 'src="[^"]*_actions\.js\|src="[^"]*_live-widgets\.js'` plus relative-path inverse check
  - Result: every reference uses `/bets/games/...` absolute path · zero relative-path risk

- [x] **task-PARSE-SWEEP-001:** Console-error / parse scan (bk-P3-020)
  - Method: Node `new Function(scriptText)` on every inline `<script>` block across 51 live pages
  - Result: 45 script blocks parsed · 0 errors · covers hub, /our/, /win/, /bets/ family, /personal/, aggregator indexes, /index/

- [x] **task-OUR-EVENTS-EXTEND-001:** /our/ eventsByDay extended past May 17
  - Files: /our/index.html
  - Added entries: 2026-05-17 (Pistons G7 added) · 5/18 (pick up dogs · recalibration) · 5/19 (PIT @ STL G1) · 5/20 (G2) · 5/21 (therapy + G3 day game) · 5/22 (PIT @ TOR G1) · 5/23 (G2) · 5/24 (G3 finale) · 5/25 (recalibration) · 5/28 (therapy) · 6/04 (friends meeting) · 6/12 (Jimmy Eat World)
  - Selected-day fallback hardening: if today not in curated table, default to first known curated date instead of hardcoded 2026-05-11
  - Verification: 2 inline scripts parse · /our/ today tile won't go dead after Sam returns home Sunday

### Resume loop · hub nav cleanup + KV inventory + JSDoc (2026-05-16, autonomous)

- [x] **task-HUB-NAV-CLEANUP-001:** Stale Aceves Paint + Peter Scott markdown links removed from hub global nav
  - Replaced with: 👤 Customers (→ /customer-jobs/) covering both customer-job links via the directory
  - Rationale: Aceves Paint link pointed to a `.md` file (not useful per Sam) · Peter Scott visit was 4 days stale · Where-You-Are tile already surfaces day-relevant buttons via /data/where-you-are.json
  - Verification: hub /index.html line 361-362 cleared · 1 consolidated 👤 Customers button added · existing Status / Issues / Prints / Tools / Financial Plan / AI Hub buttons preserved

- [x] **task-KV-INVENTORY-001:** /handoff-blocks/architecture/kv-inventory.md (bk-P3-018)
  - 22 singleton keys (calendar, announcements, bce-feed, cc-activity-current, etc.) + 18 per-entity prefixes (bet-attended-{game-id}, prediction-outcome-{game-id}, etc.) + 2 function-managed cache keys (odds-{...} 15-min TTL, scores-{...} 60s TTL)
  - Each key has: shape · producer · consumer
  - Schema rules + audit grep one-liners
  - Verification: doc exists · grep query in doc reproduces all known keys

- [x] **task-LIVE-WIDGETS-JSDOC-001:** /bets/games/_live-widgets.js (bk-P3-017)
  - 7 doc-block headers added: el() · matchEvent() · valueTag() · statusFromState() · findEspnEvent() · showManualModal() · Main-controller block
  - Module-level comment was already present
  - Verification: `node -e "new Function(read('_live-widgets.js'))"` parses clean

- DEFERRED **bk-P3-011** breadcrumb audit · **bk-P3-013** date format · **bk-P3-014** footer — high-touch low-value at current scale. Patterns documented in backlog for opportunistic application.

### Resume loop · team-index + doc fixes + robots meta (2026-05-16, autonomous)

- [x] **task-TEAMS-INDEX-001:** /bets/teams/index.html updated with 5 new team cards (bk-P3-022)
  - Added: spurs · timberwolves · thunder · cardinals · blue-jays
  - Refreshed copy: Pistons G7 status · Cavaliers G7 status · Phillies 1-0 series state · Pirates Sat G2 framing
  - Verification: all 5 new cards link to existing team pages · file balance ok · 14 active-season cards now visible
  - DEFERRED bk-P3-021 (header standardization across 11 game pages) — risk > value; documented in backlog

- [x] **task-PRED-DOC-001:** /bets/prediction-log/predictions.json `_doc` drift fixed (bk-P3-023)
  - Updated _doc string to describe the 4-tier SameSHOT framework (B / C / A-mild / A-full) replacing legacy tier_1/tier_2 reference
  - Methodology tag list updated to current names (blowout_correlation_edge, v2_selectivity, correlated_2leg, mild_sameshot, full_sameshot, BCE_full_trigger)
  - Verification: JSON parses · _doc accurately describes the framework Sam ships against

- [x] **task-ROBOTS-META-001:** robots noindex meta added to 6 top hubs (bk-P3-015)
  - Pages: /index.html · /our/index.html · /personal/index.html · /sitemap.html · /bets/teams/index.html · /customer-jobs/index.html
  - Verification: grep confirms `name="robots"` count = 1 in each · existing pages (bets/index · win/index · invites/index · bets/games/index) already had the meta

- DEFERRED **bk-P3-010** /personal/vehicles/index.html — no vehicle docs exist yet. Revisit when content exists.

### Resume loop · team fills + dead-link sweep (2026-05-16, autonomous)

- [x] **task-TEAM-FILLS-001:** 4 remaining team page skeletons filled (bk-P3-002/003/004/005)
  - Files: /bets/teams/cardinals/ · /bets/teams/blue-jays/ · /bets/teams/timberwolves/ · /bets/teams/thunder/
  - Each gets: Team Essentials (home park · coach · pace · identity) · Key Players (4-5 with roles) · Series/Context angle relevant to upcoming Pirates or BCE bets
  - Verification: 0 remaining "needs Sam input" / "Skeleton page" markers across 5 filled team pages

- [x] **task-DEAD-LINK-SWEEP-001:** Dead-link sweep across 12 top hubs (bk-P3-019)
  - Scope: /index.html · /bets/index.html · /our/index.html · /win/index.html · /personal/index.html · sitemap.html · personal/calendar/current.html · personal/status-tracker/current.html · bets/calendar.html · personal/equipment/index.html · personal/appliances/index.html · index/index.html
  - Initial pass: 1 dead link found (`/index/` had no index.html)
  - Fix: built /index/index.html aggregator with breadcrumb + per-kind links to equipment/personal-project subfolders + cross-links to /personal/equipment, /personal/appliances, /customer-jobs
  - Re-sweep: 0 dead links

### Efficiency-mode sweep (2026-05-16, autonomous)

- [x] **task-EFF-AUTO-TRIAGE-001:** Autonomous issues triage · 6 closed without Sam input
  - Closed: issue-005 (calendar shipped) · 011 (bets calendar shipped) · 020 (boarding decision moot) · 021 (boarding bordetella moot) · 028 (definition of done codified) · 032 (Pistons G6 played)
  - Open count: 42 → 36
  - Verification: each close has RESOLVED 2026-05-16 note pointing at source-of-truth

- [x] **task-EFF-ACEVES-RECONCILE-001:** Aceves paint reconciled to $950 complete (cross-listed task-AUDIT-ACEVES-RECONCILE-001)
  - Files: /customer-jobs/aceves-home-fence-2026-04/index.html (Active Job → Completed · $950) · /data/active-projects.json (status flipped to "✅ Complete · $950")
  - Decision rationale: paint work done pre-trip · Jon survey-reveal flow uses $950 · $700-840 was earlier estimate
  - Verification: all 3 surfaces (customer hub · active-projects JSON · ledger) say $950 complete · SAM-FILL placeholders still flagged separately (task-AUDIT-JON-PAINT-001)

- [x] **task-AGG-EQUIPMENT-001:** /personal/equipment/index.html aggregator built (bk-P3-008)
  - Verification: lists soccer-nets-research, John Deere mower brakes, Win's RC fleet, printer stand design · breadcrumb + status pills

- [x] **task-AGG-APPLIANCES-001:** /personal/appliances/index.html aggregator built (bk-P3-009)
  - Verification: lists Whirlpool fridge diagnostic · "add new" instructions

- [x] **task-SPURS-FILL-001:** Spurs team page filled (bk-P3-001) — BCE Phase 1 subject
  - Verification: removed "Skeleton page" + "needs Sam input" placeholders · added Team Essentials (Mitch Johnson coach, year context) · Key Players (Wemby + Castle + Vassell + Paul + Sochan) · Why-SAS-G6 + Real-Risks (counter-factors)

- [x] **task-PGA-R3-R4-001:** PGA Round 3 + Round 4 standalone pages built (bk-P3-006/007)
  - Files: /bets/games/2026-05-16-pga-championship-r3/ (Moving Day · 3-ball matchups peak value) · /bets/games/2026-05-17-pga-championship-r4/ (Final · live outright window)
  - Verification: live widgets wired · cross-links to tournament page + golf team page · bet construction guidance per day · also added to /bets/calendar.html registry

### Merge to main + status-tracker auto-generate (2026-05-16)

- [x] **task-MERGE-MAIN-001:** Branch `claude/pittsburgh-hotel-pwa-fix-eeTnG` merged to `main`
  - Fast-forward merge of 9 commits (cc8d1b2..ebbcd60) · 39 files changed · 4318 insertions · 1197 deletions
  - Pushed to origin/main 2026-05-16 — Cloudflare Pages deploy expected to trigger automatically from main
  - Verification: `git log origin/main` shows ebbcd60 at HEAD · CC environment cannot curl pages.dev directly, deploy completion needs Sam-confirm in browser

- [x] **task-AUDIT-STATUS-TRACKER-001:** /personal/status-tracker/current.html rebuilt as auto-generated daily status (option (a) per Sam decision)
  - Old curated May-11 copy archived to `/personal/status-tracker/snapshots/2026-05-11-v4-final.html` (706 lines preserved)
  - New current.html (~210 lines) is fully data-driven on page load:
    - **Today's focus** ← `DAILY_CONTEXT` curated table (small editorial layer — one entry per day)
    - **Today's schedule** ← `/our/data?key=calendar` KV (filtered to who ∈ {sam · shared · family · win-with-sam · win})
    - **Active bets & recent results** ← in-page `RECENT_GAMES` registry + per-game `prediction-outcome-{id}` KV outcome read
    - **Open issues** ← `/personal/status-tracker/issues.json` (filtered to open/in_progress/new, top 8 by priority)
    - **Yesterday recap** ← `DAILY_CONTEXT[yesterdayStr].recap`
    - **Tomorrow** ← `DAILY_CONTEXT[tomorrowStr].focus`
  - Verification: HTML balance ✓ · 0 stale "Monday May 11" refs · NOW banner with current date+time · escapeHtml on all user-supplied content · defensive try/catch on all fetches · falls back gracefully when KV empty
  - On Sat May 16: page header reads "Saturday May 16 · Pittsburgh Day 2 · Game Day" · Focus shows Pirates G2 + hotel + SAS-MIN G6 · Bets show Friday scored (Pistons WIN / Pirates LOSS) + today's pending + tomorrow's G7
  - Edit surface: append a new date entry to `DAILY_CONTEXT` in the inline script when curated focus/recap needed for that day; otherwise auto-fills from KV + registry

### Autonomous-loop setup + first backlog pull (2026-05-16)

- [x] **task-SCAFFOLDING-AUDIT-001:** Initial scaffolding audit + tiered backlog + standing orders
  - Files: `/handoff-blocks/scaffolding-audit.md` (16 scaffolding + 2 broken + ~22 done sample) · `/handoff-blocks/backlog.md` (P0-P4 tiered queue, 24 items initial) · CC Standing Orders appended to `/handoff-blocks/ai-coordination/working-with-sam.md` · `/handoff-blocks/cc-session-reports/2026-05-16-scaffolding-loop.md`
  - Verification: all files exist · backlog priorities populated · standing orders document the verification gate · session report documents the demo loop pull

- [x] **task-AUDIT-BETS-CALENDAR-001:** /bets/calendar.html rebuilt as live data-driven view (was hardcoded "Week of May 11, 2026")
  - Backlog cross-listing: `bk-P2-001`
  - File: `/bets/calendar.html` (replaced 318 lines static HTML with ~210 lines KV-backed live view)
  - Verification: HTML balance check ✓ · 12-game registry covers all current /bets/games/ pages · per-game KV lookup of `prediction-outcome-{id}` flips Pending → WIN/LOSS pills · today/tomorrow/this-week/upcoming(+30d)/past-7d buckets · sport-color pills (NBA orange · MLB blue · PGA green · NHL purple) · cross-links from /bets/teams/pistons/ etc. still resolve (no URL change)

### Saturday audit (2026-05-16)

- [x] **task-AUDIT-CALENDAR-FIX-001:** Sam's hub Calendar was showing "Week of May 11" stale data
  - File: `/personal/calendar/current.html`
  - Verification: rewrote from static-HTML week-grid to live KV-backed view (reads `/our/data?key=calendar`, merges with curated FALLBACK, filters to Sam-relevant `who` ∈ {sam · shared · family · unset}) · NOW banner shows current date+time · buckets into Today / Tomorrow / This Week / Upcoming (+30d) / Past 7 days (collapsed) · renders Sat May 16 with Pirates G2 4:05 PM + hotel CHECKED IN, Sun under Tomorrow shows Pistons G7 + PGA Final + Pirates G3, +30d shows STL series + TOR series + June meetings/concert

- [x] **task-AUDIT-REPORT-2026-05-16-001:** Systematic stale-data hunt + audit report
  - File: `/personal/audit-report-2026-05-16.html`
  - Verification: 12 pages scanned · 7 findings (1 critical fixed, 1 info no-action, 2 high/medium logged, 1 medium issues-triage logged, 2 low/no-action) · surfaced as gradient cyan-black tile on Sam's hub right under the learnings tile · documents methodology + recurring-audit pattern

### Resume sweep — team pages + game skeletons (2026-05-15)

- [x] **task-TEAM-CARDINALS-001:** /bets/teams/cardinals/ built (NL Central · Pirates' next-series opponent)
  - Verification: featured-game-tile links to Mon G1 · 3-game series schedule listed · Follow/Mute KV wired · STL #C41E3A + yellow accent

- [x] **task-TEAM-BLUEJAYS-001:** /bets/teams/blue-jays/ built (AL East · interleague opponent May 22-23)
  - Verification: featured-game-tile links to Fri G1 · TOR royal blue palette · Follow/Mute · interleague angle noted

- [x] **task-TEAM-SPURS-001:** /bets/teams/spurs/ built (WCSF · BCE Phase 1 subject)
  - Verification: featured-game-tile links to G6 · all 4 BCE conditions explicitly listed · black/silver palette · cross-link to Wolves + Thunder

- [x] **task-TEAM-WOLVES-001:** /bets/teams/timberwolves/ built (WCSF · elimination tonight)
  - Verification: featured-game-tile links to G6 · navy/lime palette · counter-factors to BCE listed honestly (home crowd · Ant carry-game · close series)

- [x] **task-TEAM-THUNDER-001:** /bets/teams/thunder/ built (WCF host · awaiting opponent)
  - Verification: blue/orange palette · WCF context · cross-links to SAS + MIN · "what happens next" branching

- [x] **task-SAS-MIN-G6-001:** /bets/games/2026-05-15-sas-min-g6/ — full BCE Phase 1 Bet #1 page
  - Verification: 4-tier structure (B $5 · C $5 · Mild $10 · Full $10) · BCE 4/4 FULL TRIGGER explicit · Wemby 30+ pts + 12+ rebs SameSHOT construction · live widgets wired (banner + score + odds + SAS ML -150 threshold) · matchup card · why-SAS + why-MIN balanced
  - Note: this is the bet that's already in /bets/portfolio/track/2026-05-15-weekend.html; dedicated game page now matches the rest of the pattern

- [x] **task-SKELETON-PIT-STL-3GAME-001:** 3 Pirates @ Cardinals next-week skeletons
  - Files: /bets/games/2026-05-19-pit-stl/ (Mon 7:45 PM CT) · 2026-05-20-pit-stl/ (Tue 7:45 PM CT) · 2026-05-21-pit-stl/ (Wed 1:15 PM day game)
  - Verification: each has live-widget mounts wired + matchup card + cross-links + "skeleton page · deep analysis lands 24-48h pre-game" callout · all 3 link to cardinals team page

- [x] **task-SKELETON-PIT-TOR-2GAME-001:** 2 Pirates @ Blue Jays interleague skeletons
  - Files: /bets/games/2026-05-22-pit-tor/ (Fri 7:07 PM ET) · 2026-05-23-pit-tor/ (Sat 3:07 PM day game)
  - Verification: same skeleton pattern · interleague context note · cross-links to blue-jays team page · Sunday finale flagged as future build

### Friday-night Pittsburgh hotel batch (2026-05-15)

- [x] **task-MEDALLION-DONE-001:** Confirmed medallion + chain print job complete (verified from prior session work)
  - Verification: issue-024 (chain status) + issue-042 (medallion production) both already marked RESOLVED 2026-05-15 in /personal/status-tracker/issues.json · /personal/3d-printing/lessons-learned.md has the 2026-05-15 yellow chain failure entry · /personal/3d-printing/filament-status.json yellow at 250g with failure note · trip page packing checkbox already notes "yellow chain failed at ~50% — declared sufficient" · no "deacon" references found anywhere in codebase

- [x] **task-HOTEL-CHECKEDIN-001:** Hotel section promoted to "✓ CHECKED IN" status
  - Files: /personal/trips/pittsburgh-2026-05-15.html (added status to HOTEL_DEFAULT + green pill in renderer) · /our/index.html (added status to HOTEL_DEFAULT + green pill in today-tile renderer)
  - Verification: pill renders next to hotel name on both surfaces when status is set; KV override path preserved · auto-promotes to CHECKED IN if KV record exists but has no status field

- [x] **task-SCORE-PISTONS-G6-001:** Pistons G6 page scored as WIN
  - File: /bets/games/2026-05-15-cle-det-g6/index.html
  - Verification: green FINAL callout at top with DET 115, CLE 94 · Tier B WIN ✓ · Tier C / Mild / Full LOSS · 2/4 SameSHOT legs · directional pick CORRECT · lesson logged (Cade pass-first game) · original pre-game prediction archived below · banner pointing to G7 page

- [x] **task-SCORE-PIRATES-G1-001:** Pirates Friday G1 scored as LOSS
  - File: /bets/games/2026-05-15-pit-phi/index.html
  - Verification: red FINAL callout at top with PHI 11, PIT 9 · all 4 tiers LOSS · lesson logged (totals > ML in high-scoring MLB) · original matchup section archived below

- [x] **task-PORTFOLIO-FRI-RESULTS-001:** Portfolio tracker shows Friday results summary
  - File: /bets/portfolio/track/2026-05-15-weekend.html
  - Verification: top-of-page summary callout with both Friday games scored + Pistons G7 forward-link · per-bet state-machine UI still works for tap-marking individual bet outcomes to KV

- [x] **task-G7-BUILD-001:** Pistons G7 Sunday deep analysis page
  - File: /bets/games/2026-05-17-cle-det-g7/index.html (NEW)
  - Verification: 4-tier structure (B $5 / C $5 / Mild $10 / Full $10) · BCE 4/4 FULL TRIGGER explicitly noted as Phase 1 Bet #2 · Cade threshold dropped from 35+ to 30+ (G6 lesson applied) · live widgets wired (banner + score + odds + DET ML -130 threshold) · cross-linked from G6 page · matchup card + why-DET + why-CLE + revised thresholds

- [x] **task-SAT-PIRATES-REVISED-001:** Saturday Pirates G2 lean revised post-Friday
  - File: /bets/games/2026-05-16-pit-phi/index.html
  - Verification: gold "Revised post-Friday G1 loss" callout at top · lean dropped 58-62% → 50-55% · Tier B pivots from PIT ML to Over 9.5 runs · totals-over-ML lesson applied across all 4 tiers · original prediction archived below

- [x] **task-LEARNINGS-2026-05-15-001:** Today's learnings page built + surfaced
  - File: /personal/learnings/2026-05-15.html (NEW)
  - Verification: TLDR · per-game wins/losses · 3 new learnings (SameSHOT refinement · MLB totals > ML · BCE partial still wins primary) · updated strategy for remaining weekend · factor accuracy table · Phase 1 BCE progress (1/30 attempts) · cross-linked from Sam's hub /index.html (gradient purple-black tile after quick-nav) and from /bets/index.html methodology callout

- [x] **task-WIN-PIRATES-THEME-001:** Pirates theme added + all themes get custom flair + z-index fix
  - File: /win/win.js
  - Verification: Pirates theme added (#000 + #FDB827 actual Pirates gold + ⚓ anchor flair) · all 4 themes (messi 10 · steelers 🏈 · pistons 🏀 · pirates ⚓) now have flair config · flair badge moved from `position:fixed` overlay to mounted inside .win-header (fixes the overlap bug) · flair is now an `<a href="/win/">` so the logo doubles as home button · theme-switcher buttons show flair emoji prefix · `node --check` passes
  - z-index: flair now lives in document flow inside header (no fixed positioning), so no z-index conflict with content

### Live data infrastructure (2026-05-15)

- [x] **task-LIVE-001:** Odds-fetch Cloudflare Function with The Odds API + KV cache + usage tracking
  - File: /functions/bets/odds-fetch.js → routes to GET /bets/odds-fetch?sport=X&markets=Y
  - Verification: `node --check` passes · 15-min KV cache via `odds-{sport}-{event}-{markets}` key · usage counter at `odds-api-usage-YYYY-MM` increments on every uncached upstream fetch · returns `{error:'api-key-missing'}` 503 when ODDS_API_KEY not set so widgets show "Configure API" placeholder gracefully
  - NOTE: Spec said `env.OUR_HUB_DATA` — actual KV binding name is `env.OUR_KV` per /functions/our/data.js. Used `OUR_KV` to match existing infra.

- [x] **task-LIVE-002:** Live odds widget added to all 5 /bets/games/ pages
  - Files: /bets/games/_live-widgets.js (shared module, ~430 lines) + 3 mount divs + 1 init call per game page
  - Pages wired: cle-det-g6 (NBA · DET ML threshold +240) · pit-phi G1/G2/G3 (MLB · G2 has Pirates ML threshold -140) · pga-championship (golf · graceful no-match fallback)
  - Verification: widget renders with DraftKings/FanDuel/BetMGM/Caesars/PointsBet 5-book grid · per-book value tags (VALUE green / MARGINAL yellow / NO VALUE red) based on ourPick threshold · "Best line right now" callout · 5-min auto-refresh + visibility pause + manual refresh button

- [x] **task-LIVE-003:** Live score widget for in-progress games
  - File: /functions/bets/scores-fetch.js → ESPN scoreboard proxy (no auth needed) + same shared module mounts at `[data-live-widget="score"]`
  - Refresh cadence: 60s during live games (state==='in'), 5min otherwise · visibility-paused
  - Verification: `node --check` passes · ESPN event matched by team abbreviation + start time ±4h · widget shows AWAY/HOME score + period/clock detail

- [x] **task-LIVE-004:** Time-sensitive status banners
  - Banner mounts at `[data-live-widget="banner"]` · 4 states: PRE-GAME (>1h before · cyan), GAME SOON (<1h · orange), LIVE (in-progress · green), FINAL (post · black w/ gold accent · shows final score)
  - Verification: banner state derived from startISO + ESPN status; recomputed on every score-fetch tick

- [x] **task-LIVE-005:** Manual odds override system
  - Modal launched via "✏️ Update manually" button on every odds widget
  - Keys: `manual-odds-{gameId}-{book}-{market}` (KV) + index `manual-odds-index-{gameId}` (so widget can list all entries without listing API)
  - Verification: save flow writes both the entry + appends to index · loadManual reads index then fetches entries · displays "Manual entries (override)" callout under book grid

- [x] **task-LIVE-006:** API usage dashboard
  - File: /bets/api-usage/index.html · linked from /bets/index.html methodology callout
  - Verification: reads `odds-api-usage-YYYY-MM` via /our/data · shows calls used / remaining / % cap / projected month total · color bar (green<50% / orange<80% / red≥80%) · config-state probe shows current ODDS_API_KEY status (missing/configured) with copy-paste setup steps · re-check button re-runs probe

- [x] **task-LIVE-CACHE-001:** Caching + budget strategy active
  - Odds: 15-min KV TTL (`expirationTtl: 1800`) — covers all viewers of same sport/event between fetches
  - Scores: 60-sec KV TTL — fresh enough for live scoreboard, still avoids hammering ESPN
  - Visibility pause: both odds + score intervals stopped when `document.hidden` is true; restarted on visibility-restore
  - Typical use ~200 calls/mo vs 500 cap → well within free tier

### Pittsburgh arrival prompt (2026-05-15, Sam arriving at hotel)

- [x] **task-WIN-PWA-PROMPT-001:** Disable PWA install prompts on /win/ (Lenovo browser)
  - Verification: `<link rel="manifest">` commented out at /win/index.html line 8 · early `beforeinstallprompt` preventDefault handler added (capture=true) in head before any other scripts · page's own install-banner IIFE returns early (banner stays hidden) · expected behavior: open /win/ in Chrome on Lenovo, no install prompt or banner appears
  - Reverse via: task-WIN-PWA-RESTORE-001 (OPEN, BLOCKED until Sam ready)

- [x] **task-HOTEL-PITTSBURGH-002:** Wyndham Grand Pittsburgh Downtown locked in for Pittsburgh trip
  - Hotel verified via web search (Yelp, TripAdvisor, Wyndham official, hotelplanner all confirm 600 Commonwealth Pl = Wyndham Grand Pittsburgh Downtown)
  - Verification: /personal/trips/pittsburgh-2026-05-15.html hotel section renders Wyndham Grand info as fallback default when KV empty (form still works for override) · /our/ today tile auto-shows hotel + Google Maps directions link + parking link on trip dates (2026-05-15 through 2026-05-18) · Copy address button works · Google Maps deep link = https://www.google.com/maps/dir/?api=1&destination=600+Commonwealth+Pl%2C+Pittsburgh%2C+PA+15222
  - Note: KV `trip-pittsburgh-2026-hotel` is the override path — Sam can paste exact check-in/check-out times via the form. Live KV not writeable from CC environment; hardcoded fallback ensures hotel surfaces immediately.
  - Check-out date pending Sam confirm (Sun 5/17 vs Mon 5/18)

- [x] **task-HOTEL-PARKING-001:** Parking research page for Wyndham Grand area
  - Verification: /personal/trips/pittsburgh-2026-05-15-parking.html exists · top-3 recs (Mon Wharf $8/day cheapest · Gateway Center ~$12-18 via SpotHero best value · Wyndham valet $35-44 closest) · full options table with 8 garages/lots · weeknight + Sunday free-meter info · Saturday Pirates game-day walking-bridge play · linked from trip page header and from /our/ today tile

### This session (2026-05-15)

- [x] **task-WIN-001:** Win earn-money feature (commit `abce733`)
  - Verification: /win/earn.html serves 200 · /personal/win-earn-admin/ serves 200 · Sam hub tile shows live $owed pill · $4 pressure wash + $4 vacuum pre-seeded as done_awaiting_payment

- [x] **task-JASON-001:** Jason McCabe Towers of Hanoi project page (commit `abce733`)
  - Verification: /personal/3d-printing/projects/jason-mccabe-towers-of-hanoi/ exists · Printables model link active · issue-063 in tracker

- [x] **task-DEERE-001:** John Deere mower spindle brakes order task (commit `abce733`)
  - Verification: issue-064 in tracker

- [x] **task-FRIDGE-001:** Whirlpool WRT311FZDW01 fridge diagnostic page (commit `abce733`)
  - Verification: /personal/appliances/whirlpool-wrt311fzdw01-fridge/ exists · 6 causes ranked · issue-065 in tracker

- [x] **task-SOCCER-001:** Soccer nets research page (commit `abce733`)
  - Verification: /personal/equipment/soccer-nets-research/ exists · 2 requirements documented · issue-066 in tracker

- [x] **task-BETS-SameSHOT-RENAME-001:** Apply SameSHOT naming (commit `1a4884e`)
  - Verification: 15 /bets/ files updated · zero remaining "lottery" references confirmed via grep · sameshot_pick field replaces lottery_pick in predictions.json

- [x] **task-BETS-PISTONS-CONSTRUCTION-001:** Pistons G6 SameSHOT construction fix (commit `abce733`, refined from `1a4884e`)
  - Verification: G6 page shows Option B construction (DET wins by 5+ + Cunningham 35+ + Over 222 + Cade 8+ ast = +12000) · predictions.json sameshot_pick matches · portfolio tracker matches

- [x] **task-OUR-DAY-TILE-001:** Fix /our/ day tile bug (commit `b08d49f`)
  - Verification: hardcoded vet section replaced with auto-populated renderer · Friday May 15 events updated · curl /our/ returns 200

- [x] **task-HOTEL-001:** Hotel placeholder ready for paste (commit `b08d49f`)
  - Verification: /personal/trips/pittsburgh-2026-05-15.html has hotel form · KV trip-pittsburgh-2026-hotel · /our/ today tile reads it

- [x] **task-FILAMENT-001:** Yellow SUNLU inventory → 250g (commit `b08d49f`)
  - Verification: filament-status.json yellow updated · pittsburgh-gifts-breakdown.html updated

- [x] **task-CHAIN-COMPLETE-001:** Chain print task marked done (commit `b08d49f`)
  - Verification: issue-043 status=done · chain-inventory.md notes failed print

- [x] **task-TRUCK-CARGO-001:** Truck cargo on pack list (commit `b08d49f`)
  - Verification: /personal/trips/pittsburgh-2026-05-15.html truck-cargo pack list with 3 KV-backed checkboxes

- [x] **task-BETS-PIRATES-001:** Pirates team page (exists from earlier work)
  - Verification: /bets/teams/pirates/ exists, served 200 (audit)

- [x] **task-BETS-PHILLIES-001:** Phillies team page (exists from earlier work)
  - Verification: /bets/teams/phillies/ exists, served 200 (audit)

## BLOCKED

- **task-CONCERT-001:** Jimmy Eat World concert page — no spec provided (when, venue, who, tickets). Need Sam input.

---

## Index / cross-reference

- Working-with-sam.md: behavioral protocol
- This ledger: tactical task tracking
- /personal/status-tracker/issues.json: long-running issues queue
- /bets/prediction-log/predictions.json: betting predictions registry
