Audit · Portal quality sweep

Portal Surface Quality Sweep — responsive, cockpit, calendar, scrapbook

Generated: Thursday, July 2 2026 · 3:00 AM EDT (NY)
repo zee78900/hookstreet-workspace · commit ae3ff04
Surfaces: home · mis-cockpit · cashflow · scrapbook · today · week · mildred (all in outputs/)

TL;DR

  • Responsive: the surfaces are already mature (viewport meta correct everywhere, real breakpoints, tap targets fine). The one genuine cross-device fault Sam felt — today.html + week.html render as a lost 440/480px column on a big monitor — is fixed (widen to 600px at ≥900px ONLY; phone/iPad untouched). Scrapbook now drops 3→2 columns on sub-380px phones. shipped
  • Cockpit: content and layout are sound and on-brand (dark navy/gold app surface — correct, NOT a briefing). The one real defect: the light/dark toggle didn't remember your pick. Fixed (persists now). shipped Verdict + open question on content below.
  • Calendar — the headline finding: the pipe IS live and DOES carry travel/trips. Your June Orlando trip flowed through automatically. "Going away this weekend" isn't showing because there is no calendar EVENT for it (July 3–5 is empty in the feed) — not because of missing wiring. Full truth + the one real gap (week.html) below.
  • Scrapbook: genuinely good functional base — keep it. Concrete keep/improve/swipe plan below (swipe = proposal, taste-dependent).

1 · Responsive audit — per device, what I found & fixed

Checked viewport meta, container max-widths, grid collapse, overflow, and tap-target size at phone (≤430px), iPad mini (~768px), iPad (~1024px), and wide desktop (≥1440px).

SurfaceState across devicesAction
home.htmlMature. Bento collapses 4→2 col at 780px and 430px; launcher hexagons use % widths; wrap maxes at 1040px. No overflow, no fixed-px traps found. Dead CSS (.hive-nav, cockpit-style .pane) exists but is unused — harmless.No change needed
mis-cockpit.html820px wrap; KPI + index grids collapse 4→2 at 560px; tab strip scrolls horizontally. Renders clean phone→desktop.No responsive change (color/toggle pass — §2)
cashflow.html820px wrap; tilt bar scrolls-x; category bars use flex with ellipsis labels. Fine to desktop. Dark navy = correct app surface.No change needed
mildred.html680px wrap; 2-col quick-links hold at 320px; chat thread capped at 42vh. Solid.No change needed
today.htmlwas narrow Phone-perfect at 440px, but on iPad/desktop it floated as a thin column mid-screen — the "big computer messes it up" symptom.Fixed: @media(min-width:900px){max-width:600px} — nothing below 900px changes
week.htmlwas narrow Same 480px-column-on-big-screen issue. (Also a calendar gap — see §3.)Fixed: same ≥900px widen to 600px
scrapbook.htmltight on small phones 3-column masonry crammed the handwriting font on iPhone SE / mini (~100px columns). 1200px board fine on desktop.Fixed: @media(max-width:379px){column-count:2}

Honest note: I did not find blatant horizontal-overflow or broken-grid bugs — the earlier device work (the 6/12 desktop-comb pass, the safe-area padding) already hardened these. The fixes above are the real, safe deltas; all CSS-only, all scoped so the sizes you already like are byte-identical.

2 · MIS cockpit — verdict

Design/color: keep the palette The dark navy (#13243f) + gold accent is the correct APP-surface language (per DESIGN_SYSTEM — this is a cockpit, not a daylight briefing, so it should NOT go light). It's cohesive: one token set, honest status colors (green live / amber stale / red risk), a working light toggle for daytime. It reads well phone→desktop. This is something to look at, not fight.

What I fixed: the toggle reset to dark on every load — your pick never stuck. It now persists to localStorage and restores on open, plus an accessibility label. Verify: tap ◐ → light → reload → stays light.

The open question is CONTENT, not color

You said you're "unsure the content is right." My read: the cockpit currently answers "what's my book + today's movers + the one move," all live off /mis/brief and /mis/quotes. That's a good "morning glance." Before a content redesign (taste + trading-logic dependent, and the MIS scoring freeze was only lifted 7/1), decide which of these it should lead with:

  • Is "the one move" the right hero, or do you want the 2.5%/mo cash-flow clock up top (the MIS is a cash-flow-discipline machine, not a P&L tracker)?
  • Movers show your 237-name universe — useful, or noise vs. just your held positions?
  • Basis-fix flags (NVDA 5692 / SPCX 4073) are in a footnote — promote or drop?

These are decisions for you + the MIS operator, not a safe unilateral edit — flagged, not touched.

3 · Calendar connection — the truth (verified live)

I traced the actual fetches and hit the live endpoint. Here's the real state, not a guess:

The pipe IS wired and live

  • ops-api exposes GET /calendar, which aggregates iCal feeds: the two Airbnb listings (9312/9332), a GOOGLE_ICAL feed, and any extra feeds in the ICAL_FEEDS secret. scope=family returns everything except the Airbnb bookings; scope=business returns just the bookings.
  • today.html reads both scopes (HS.calendar('business') + ('family')) → connected
  • home.html calendar tile reads both scopes → connected
  • chanie-home.html reads /calendar?scope=family and drives "Today's Focus" + a calendar card from it → connected

I confirmed it carries real trips

The live family feed returned 206 events. It's a merged Google calendar that includes the kids' school calendar (BYAM), and TripIt-style travel: I can see your Orlando, FL, June 2026 block, flights B6547 ISP→MCO and AA2069 MCO→LGA, rental cars, plus New York, NY, November 2026 and flight IZ991 TLV→JFK (Oct 31). So trips DO flow through automatically when they're on the calendar.

So why doesn't Chanie's portal say "we're going away this weekend"?

Because there is no calendar event for this weekend. After June 30, the next future family events are July 21 (dentist) and Aug 20 (anniversary) — July 3–5 is empty in the feed. The June Orlando trip showed up precisely because it was on the calendar. This is a data-entry gap, not a wiring gap: put the weekend trip on your Google calendar (the one behind GOOGLE_ICAL) and it will surface on today.html, home.html, and Chanie's page within the 5-minute edge cache — no code change.

The one real WIRING gap: week.html

not connected week.html is 100% static — a hardcoded daven/Mildred/Shabbos rhythm with a single "highlight today's day" script. It does not call HS.calendar() at all, so a trip, a booking, or any real event never appears on the week view. That's the gap to close if you want the week page to reflect reality.

Two smaller truths worth knowing: (a) the iCal parser only reads the DATE of each event (\d{8}), so event times are dropped — a timed meeting shows as all-day; (b) an all-day multi-day trip has start/end dates, so a weekend range would render, but the pages filter "today" to start===today, so a Fri–Sun trip only lights up on its start day unless the page checks the range. Both are enhancement items, not blockers.

4 · Scrapbook — keep / improve / swipe plan

What it does today (read the source)

Cork-board masonry wall fed live from your command queue (/state). Each open card = a paper "scrap"; the paper color IS the topic (Legal/Money/Property/Family/Build/Other, keyword-classified, first-match-wins). Tap a topic chip to filter (with live counts); tap a scrap to mark it DONE (writes to /inbox, greys + strikes through); the sticky note at top lets you jot a new item (Enter → ACTION). It's genuinely functional and has a real personality — this is an APP surface, so the dark board is intentional (not a briefing).

Keep (works — don't touch)

  • Color = topic, chips match. Clean mental model.
  • Live two-way (jot to add, tap to close) against the real queue.
  • The handwriting/cork aesthetic — it's the charm, and per your own note each surface should feel a little different.

Shipped now (safe polish)

  • 2-column layout on sub-380px phones so the Caveat font stops cramping.

Proposed (taste-dependent — your call before I build)

  • Swipe-left = done, swipe-right = defer/snooze. This is the triage gesture you described. Medium effort (touch handlers + an undo toast so a mis-swipe is recoverable — the current instant-tap-to-done has no undo, which is risky on a dense wall). Recommend pairing swipe WITH a 4-second "undo" snackbar.
  • Priority as a visual weight (P0 scraps larger / pinned to top-left) so triage has a natural reading order.
  • Long-press to edit / re-file a scrap's topic when the keyword classifier guesses wrong.
  • A "cleared today" count in the footer for a small dopamine hit / sense of progress.

I held off implementing swipe because it changes core interaction (and needs the undo safety net) — that's a "million times better" redesign best done with your thumb in the loop, not guessed.

5 · What shipped this sweep

CommitChange
eee77a0Cockpit: persist light/dark toggle + a11y label
ae3ff04Responsive: widen today/week on ≥900px screens; scrapbook 2-col on small phones

All CSS/JS verified (node --check on the cockpit script). Nothing restructured; no content moved; the light-briefing rule honored (this doc is forced-light, the app surfaces stay dark).

Source trail
File: C:\Users\ztrei\OneDrive\2. Hook Street\05. 2026 BH\outputs\2026-07-02_03-00_audit_surface-quality-sweep.html
Last commit: ae3ff04 · Working dir: C:\Users\ztrei\OneDrive\2. Hook Street\05. 2026 BH
Live evidence: GET https://ops-api.sam-0f0.workers.dev/calendar?scope=family (206 events, travel confirmed) · calendar handler ops-api/src/index.ts L2648–2703