HANDOFF — Home Portal Rebuild (+ separate HSS-site rebuild)
Created: 2026-07-02 · By: deep-dive session (read-only analysis)
Grounded in: outputs/2026-07-02_home-portal-deep-dive.html (tile-by-tile verdicts) · outputs/2026-07-02_home-twin-engine-mockup.html (the visual target) · docs/PORTAL_RETHINK_SPEC.md (Sam's 7/2 walkthrough)
Two independent rebuilds live below. They do not share code and should be separate Fable sessions.
1. Home portal rebuild — the ops.hookstreetservices.com surfaces (home.html + linked pages).
2. HSS marketing-site rebuild — the public hookstreetservices.com site. Different repo, different audience, different session.Paste the prompt block verbatim into a fresh session. Each is self-contained.
✅ RUNS ON THE VM (verified 2026-07-02): the VM (zee-ops-1) has all 7 repos cloned (workspace,
MIS, HSS site, Calculator, Eden, CM Invoice, lawn co-op, BOS sheets), push verified, notify secrets set.
Both prompts work as-is on the VM. FIRST LINE of every VM session:git pullin the repo you're
about to edit — clones don't refresh themselves (the workspace:cd ~/hookstreet-workspace && git pull;
HSS:cd ~/hookstreet-workspace/HookStreetServices-SiteOR its own clone,git pull).~/operator.sh
already pulls the workspace on attach; the OTHER repos you pull yourself.
SESSION 1 — Home portal rebuild
Paste this:
You are rebuilding Sam's private ops portal (ops.hookstreetservices.com), the dark
"command" home base he lives in from his phone. This is the "make it all properly right"
build. It is a PRESENTATION rethink on top of feeds that already work — do NOT rebuild the
backend.
BEFORE WRITING ANY CODE, READ (in order):
1. outputs/2026-07-02_home-portal-deep-dive.html — tile-by-tile: what each does, what it
fetches (verified live), and the KEEP/FIX/RETHINK verdict. This is your spec.
2. outputs/2026-07-02_home-twin-engine-mockup.html — the visual target (right column IS
the goal: one move + today's goal + rest-of-day + 3 truth-tiles + one search bar).
3. docs/PORTAL_RETHINK_SPEC.md — Sam's own words from his 7/2 walkthrough.
4. outputs/home.html (1,206 lines) — the live page. Study loadCash / loadLoops / loadMIS /
loadCalendar and the Next-Move ranker before touching them.
5. outputs/hs-core.js + hs-theme.css — the shared engine (API base, HS.inbox, HS.calendar,
HS.classify, palette tokens). Reuse it; do not fork it.
6. .claude/.../memory/feedback_per_surface_personality_intentional.md — the anti-flatten rule.
7. docs/CONNECTIONS.md — every live feed + its ops-api endpoint.
LIVE ENDPOINTS (all verified answering 2026-07-02, base https://ops-api.sam-0f0.workers.dev,
read key OPS_READ_TOKEN in ops-api/.secrets.json, send as header x-ops-key):
/plaid/balances · /inbox (QUEUE_JSON,GLIST,GROCERY,BOUGHT,DONE,DEFER,PROOF,ACTION)
/mis/brief · /mis/quotes · /mis/peek?sym= · /hospitable/reservations?days=
/calendar?scope=business and ?scope=family (no-scope 401s — always pass a scope)
/bos/cashflow
BUILD ORDER (one clean pass each, commit+push after each so Sam sees each land):
1. HONESTY FIXES (cheap, do first — they restore trust in the numbers):
- Markets tile: peek returns day_pct (the %) AND day_change (dollars). Current code reads
q.day_change_pct||q.day_change and prints the DOLLAR value as a percent. Read day_pct.
- Markets tile: stop hardcoding ?sym=NVDA. Show Sam's real top holding by weight (from
/mis/brief) or the market. Add VIX + gold + the index — the cockpit already shows VIX
via /mis/brief d.regime.vix; reuse it. Define "verdict" inline (ADD/STARTER/WATCH/TRIM).
- Cash tile: rename "Manual obligations" → "Mortgages & loans (not in Plaid)"; split
monthly-payment rows from balance rows; date-stamp + stale-flag Affirm (Apr 28); ADD
Chase (genuinely absent from the 9 Plaid institutions — hand-enter with an "as of" date
or wire a re-link). Keep the ⚠-on-incomplete-total honesty behavior.
- Open-loops: label every count with its scope on the tile ("228 backlog · 92 are P0/P1 ·
N forced today"). The confusion is unlabeled scopes, not wrong math.
2. AUTO-INDEX GENERATOR (loop 38-K6): a script that walks outputs/, reads real file mtimes,
sorts newest-first, and auto-expires NEW after N days. Regenerate everything.html from it
and drive the home "NEW" strip off it. This kills the hand-maintained staleness class
(everything.html contradictions, the frozen "just shipped" strip) permanently.
3. HOME RETHINK (the core ask): re-front home.html to the mockup's right column —
lead with (a) today's goal, (b) the ONE move (the Next-Move ranker already exists — promote
it to the top and widen it), (c) a live "rest of my day" strip (calendar + dated queue),
(d) three truth-tiles (Money / Markets / STR). Demote the 20-tile launcher into ONE
collapsed "everything else — search or open" drawer. Keep the stat strip's "one loader,
many displays" pattern.
4. CASHFLOW (his favorite surface — real design pass): blend INCOME into cashflow.html
(currently outflow-only), owner-tag every inflow (Sam / wife / children), show NET (in−out)
at each tilt window. Income refs: memory user_chanie_income_30k_monthly (~$19.7K/mo).
5. OBLIGATIONS: consolidate to ONE source first — the PWA reads the v1 sheet via a legacy
Apps Script endpoint with an embedded key; cashflow reads v3 via /bos/cashflow. Pick v3,
retire the embedded-key legacy path. Then rethink the top-pill (7/14/30/month/raw) into a
"what's due / this month / everything" story, and add a per-row "Still paying this?" control
that messages Sam / Chanie / both via the bot (the file already POSTs to /mis/notify for
"Ping Zee" — extend that rail) and writes the answer back to the sheet.
6. STR (str.html): add "Currently in-house" (reservation span contains today), "Last 7 days",
and merge per-property OPEN MAINTENANCE from the queue (cards tagged 9312/9332). Label every
reservation check-in / checkout / in-house. Also wire week.html to the live /calendar feed
(it's 100% static today) or fold "the week" into today.html's coming-up and retire it.
GUARDRAILS (hard):
- DO NOT FLATTEN per-surface personality. Sam's home = dark command palette (keep it). Chanie's
pages = warm; the kids' kiosk = touching. Unify the SYSTEM (tokens, honest numbers, no dead
links), never the voice. Litmus: if a change makes Chanie's or the kids' page look like Sam's
cockpit, STOP.
- BRIEFINGS STAY FORCED-LIGHT. App surfaces (home, cockpit, cashflow, kiosk) may be dark. Any
briefing/recap/audit you generate uses outputs/_BRIEFING_TEMPLATE.html (light body, dark
header band only). Never inline a near-black --bg into a briefing.
- MIS ENGINE IS OFF-LIMITS. Reporting/read-only surfaces only. Do not deploy or touch the MIS
scoring engine (the freeze fix window is separate). /mis/brief + /mis/quotes reads are fine.
- DATA HONESTY: a dead feed shows "—", never a stale number. Every figure carries its "as of"
age. A broken bank feed gets named on the tile, not silently summed. (This is already Sam's
rule in the code — preserve it.)
- Reuse hs-core.js / hs-theme.css. One engine, scoped doors. Don't duplicate loaders.
- COMMIT + PUSH after each numbered step (rebase first — a VM + parallel sessions also push).
- DEPLOY (changed 2026-07-02 — the portal moved OFF Netlify onto Cloudflare Pages; the old
Netlify GitHub Action was silently broken, missing creds). To publish the portal, run:
cd ops-api && CLOUDFLARE_API_TOKEN=$(cat .cf-token) npx wrangler pages deploy ../outputs \
--project-name=hookstreet-ops --branch=main --commit-dirty=true
Live at hookstreet-ops.pages.dev; ops.hookstreetservices.com is being repointed to it (custom
domain pending a DNS flip — see the URGENT queue card + docs/HOW_IT_ALL_LIVES.md). If the DNS
isn't flipped yet, verify on the pages.dev URL. (TODO also on the board: update
.github/workflows/deploy-outputs.yml to push to CF Pages so this is automatic on commit.)
SUCCESS TEST (Sam on his phone, in daylight):
- Opens home → the FIRST thing he sees is today's goal + the one move. No scrolling to find it.
- Every number is either live-correct or explicitly stale-flagged — nothing reads as fact that
isn't. NVDA is gone from the markets tile; the % matches reality; VIX + gold + his real top
holding show.
- Cash shows Chase (or flags it missing); "manual obligations" is renamed and split.
- Open-loops counts are labeled so 228 vs 92 makes sense at a glance.
- The 20 launchers are one tap away behind one search bar, not the homepage.
- Cashflow shows money IN and OUT with owner tags; obligations has a working "still paying?"
prompt on one real row; STR shows who's in-house right now.
- Chanie's page and the kids' kiosk still look like themselves — nothing flattened.
SESSION 2 — HSS marketing-site rebuild (SEPARATE)
This is the public site (hookstreetservices.com), not the private portal. Different repo,
different audience (prospects, not Sam). Run it as its own session — do not bundle with Session 1.
Paste this:
You are rebuilding Hook Street Services' public marketing site (hookstreetservices.com) — the
front door for Sam's consulting revenue. This is a public, prospect-facing site; treat it as an
editorial design job, NOT an internal tool.
⚠ REPO NOTE: the HSS site is a SEPARATE nested git repo at `HookStreetServices-Site/`
(remote: zee78900/hookstreetservices-site) — it is NOT part of the workspace repo. You can READ
its files from the workspace, but to COMMIT/PUSH you MUST work inside it: `cd HookStreetServices-Site`
then git add/commit/push there. Do NOT commit HSS changes to hookstreet-workspace.
DEPLOY (verified 2026-07-02): this site publishes via **Netlify** (project `fascinating-vacherin-fd0cb3`,
domain hookstreetservices.com, "Deploys from GitHub") — Netlify's own git integration auto-deploys on
push to the hookstreetservices-site repo. NOT GitHub Pages (older docs said Pages — wrong). So: push to
the hookstreetservices-site repo → Netlify auto-publishes. Confirm in the Netlify dashboard if unsure.
BEFORE WRITING ANY CODE, READ:
1. HookStreetServices-Site/SERVICES_CONCEPT.md — the offer architecture.
2. HookStreetServices-Site/index.html — the current live site.
3. The "6 invisible offers" — the sellable capabilities buried in Sam's work that the site
doesn't surface. Cross-reference these skills/memories for the real substance:
- underwriting-method (real-estate underwriting — the HSC model)
- operations-systems-build (Eden-style ops turnaround / fractional COO)
- resource-monetization + project_operator_cockpit_offer (the 90-min Bottleneck Review
front door — "the diagnosis IS the sale")
- passover-program-ops (licensable Yom Tov / villa hospitality playbook)
- str-ops-davenport (STR operations as a service)
- reference_services_method_artifacts + docs/services/DEAL_INTAKE_TEMPLATE.md
4. It's already hosted on Netlify (see the REPO NOTE above) — do NOT move the host; just push
to the hookstreetservices-site repo and Netlify auto-publishes.
THE JOB:
- Surface the 6 offers as clear, sellable services with the Bottleneck Review as the single
front door (one 90-minute paid diagnosis that leads to every engagement).
- Editorial treatment: this is a pitch, not a dashboard. Distinct visual identity, real
copy from Sam's actual method (no lorem, no generic consulting-template look).
- Keep the existing Deal Snapshot product page (hookstreetservices.com/deal-snapshot.html) and
the villa content; integrate them into the offer story.
GUARDRAILS:
- PUBLIC repo — no personal/client/financial context, no private names, no internal links.
- Different visual identity from the private portal — do NOT reuse the dark command palette;
this audience is prospects, not Sam.
- Commit + push each pass; confirm the deploy target (GitHub Pages) before publishing.
SUCCESS TEST:
- A cold prospect lands and understands, in one scroll: what Sam does, which of the 6 things
fits them, and how to buy the first step (the Bottleneck Review). One clear CTA per offer.
Why two sessions, not one
- Different repos (private
hookstreet-workspace/outputsvs publichookstreetservices-site). - Different audiences (Sam-operating vs prospect-selling) → opposite design languages.
- Different risk (private ops data + live feeds vs public marketing copy).
- Bundling them invites palette bleed (the exact "don't flatten" failure the per-surface memory warns about) and a public-repo privacy slip.
Related: outputs/2026-07-02_home-portal-deep-dive.html · outputs/2026-07-02_home-twin-engine-mockup.html · docs/PORTAL_RETHINK_SPEC.md · docs/CONNECTIONS.md · memory feedback_per_surface_personality_intentional.