בס״ד

HANDOFF — Home Portal Rebuild (+ separate HSS-site rebuild)

docs/HANDOFF_HOME_PORTAL_REBUILD.md · last changed 2026-07-02 · rendered from GitHub master

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 pull in the repo you're
about to edit
— clones don't refresh themselves (the workspace: cd ~/hookstreet-workspace && git pull;
HSS: cd ~/hookstreet-workspace/HookStreetServices-Site OR 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

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.

Source trail · docs/HANDOFF_HOME_PORTAL_REBUILD.md @ master · rendered 2026-07-02 7:23 PM EDT by scripts/build-docs.py · the .md in the repo is the truth; this page is the phone-readable view