SESSION 18 CLOSE · TOMORROW PREP

CM validation · MIS validation design · folder relationships · phone triggers · code-from-sheets

Generated: Wed Apr 29 2026 · 12:06 AM EDT · workspace commit pending · CM commit a570aea

1 · CM VALIDATION TOMORROW — exact path (3 steps)

Phase 7.6 already pushed to v2 script + GitHub. 3 bug fixes + sacrificial test mode helpers live.
StepWhat you doExpected outcome
1Open v2 sheet → Ctrl+R to reload (picks up new menu items)3 menus visible: 📋 Invoice · 📒 Catalog · ⚙️ Reports & Setup. Last menu now has 🧪 Seed Test Customers + 🧪 Clear Test Data.
2Menu → ⚙️ Reports & Setup → 🧪 Seed Test Customers (1 click)Adds TEST-001 (TESTONE single-word), TEST-002 (TEST TWO IL), TEST-003 (TEST - THREE NJ) to Customers tab.
3Walk CM_VALIDATION_PLAN.md tests 1-15 against the TEST customers ONLY. Verify expected invoice numbers below.15/15 PASS or list of failures with test # + cell + error.

Expected invoice numbers (so you know what "right" looks like)

Customer picked in A11Expected I10 invoice #Why
TESTONEINV-260429-TE-0011-word name, NY state from Customers tab → no state suffix (NY = home)
TEST TWOINV-260429-TETWIL-0012-word + IL state from VLOOKUP → state appended
TEST - THREEINV-260429-TETHNJ-001Word2="-" → falls back to word3 "THREE" → "TH" + NJ state
GITTY'S BOUTIQUE (real)INV-260429-GIBO-001Unchanged — NY home state, no suffix
BRENDA - CHICAGO (real)INV-260429-BRCHIL-001Word2="-" → fallback to word3 "CHICAGO" → "CH" + IL
After 15/15 pass → Menu → 🧪 Clear Test Data → safe to run real BRENDA/GITTY flow.

2 · MIS VALIDATION DESIGN (parallel to CM)

Same skeleton. Sacrificial test mode = use a fake ticker (e.g., TESTAAA) that doesn't pollute production decisions or the trade log.

Proposed 15-test MIS validation framework

#PhaseTest
1SetupAll 33 expected tabs exist post setupTabs (per Apr 28 audit: KEEP=19, REPAIR=7, RETIRE=4)
2SetupCONTROL tab has all required keys (LAST_REGIME, LAST_VIX, EARNINGS_API_KEY etc.)
3SetupReference_Rules populated with current thresholds
4SchemaTickers!J header matches Code.js — currently DRIFTED ("Current Earnings Date" vs "Next Earnings Date")
5TriggerTrade Action fires once at 2:05 PM (currently 5+ duplicates per Apr 27)
6TriggerPower Hour fires once at 3:00 PM (currently 2-3 duplicates)
7EngineAdd TESTAAA to Tickers tab → trigger Snapshot rebuild → verify row exists in HIST_DAILY_SNAPSHOT
8EngineTESTAAA flows through Momentum_Engine → Action Flag computed (currently broken — composite max ≈45 vs threshold ≥42)
9Engineexecution_playbook generates Trade Conclusion for TESTAAA without leaking BUY LMT for downtrend
10EmailTrade Action email assembles for TESTAAA · direction symbol present (↑/↓) · Today's % @ price visible
11EmailPower Hour email content matches Snapshot tab content (no contradictions)
12EmailOutlook iOS rendering test passes (per feedback_outlook_ios_rendering.md)
13EdgeEmpty earnings calendar → graceful skip (NONE-skip already in v11.0e)
14EdgeHoldings #N/A flag — FILTER chain returns rows or zero, not error
15CleanupRemove TESTAAA → no orphan rows in HIST_DAILY_SNAPSHOT or HIST_TRADE_LOG
Gates: Tests 5-6 require trigger registry inventory FIRST (your screenshots from Apps Script editor → Triggers panel). Tests 7-15 require FSE Session 1 (the INTC end-to-end design doc). Cannot fully run validation until those land.

Action item: when you're ready, I'll write docs/MIS_VALIDATION_PLAN.md with full per-test detail (similar to CM_VALIDATION_PLAN.md). Tonight = framework only.

3 · FROZEN REPOS — relationships, not deletions

Per your decision: keep all 5. Map their connections + likely future merge-points.

Repo / FolderWhat it isLikely future home
lawn-coop-proposal/ (local)HTML proposal site, NO git remoteThese two ARE the same project. Local has no remote → never syncs to GitHub. Recommendation: connect local to GitHub remote so they sync.

cd lawn-coop-proposal && git remote add origin https://github.com/zee78900/north-woodmere-lawn-coop.git
zee78900/north-woodmere-lawn-coop (GitHub PUBLIC)Pushed Mar 27. Same project name.
Lee/ + zee78900/LeeSingle HTML personal-OS prototype for Lee (a person). 49 KB lee-os.html. Sam noted: "may be similar to Command Center."Both are dashboard prototypes. Lee = HTML single-page, Command Center = Next.js+Supabase. They CONVERGE on the same vision: personal/business OS dashboard. Future: command-center could absorb Lee as a template view, or both stay as separate exploration paths under "BOS dashboard family."
command-center/ (nested in BOS) + zee78900/command-centerNext.js 14 + Supabase + Netlify. Architecture: Inputs → Engine → Outputs → DB. Frozen 43 days but never killed.
Calculator/ + zee78900/abnbcalc (PUBLIC)Airbnb STR calculator appDiscrete utility. Doesn't merge into BOS — keep as standalone tool.

The "where do they all link in" answer

Future BOS umbrella architecture (your stated vision):

HookStreet-Business-OS (umbrella)
  ├── sheets/ (BOS-v1 Apps Script — Monthly Obligations engine)        ✅ ACTIVE
  ├── sheets-v2/ (BOS-v2 Apps Script — Monthly Obligations v2 engine)  ✅ ACTIVE (no GitHub yet)
  ├── command-center/ (Next.js dashboard — visual front-end)           🔴 FROZEN
  ├── (future) lee-os.html (alt dashboard template)                    🔴 FROZEN (in zee78900/Lee)
  └── archive/ (xlsx historical OS attempts)                           ℹ STATIC

Outside the umbrella (keep standalone):
  ├── CM_Invoice_System (Mom's wholesale tool)
  ├── MIS (market intelligence)
  ├── eden-gardens-os (active client)
  ├── HookStreetServices-Site (public marketing site)
  ├── hookstreet-voice-intake (intake pipeline)
  ├── hookstreet-skills (Claude Code skills)
  ├── abnbcalc (STR calculator — utility tool)
  └── north-woodmere-lawn-coop (one-off proposal)

4 · HS_SRVC FOLDER — what it is

PathC:\Users\ztrei\OneDrive\2. Hook Street\05. 2026 BH\HS_SRVC\
Contents1 file: HS_SRVC_v1.xlsx (552 KB)
Last modified2026-02-06 (83 days ago — stale)
Likely purposeHook Street Services scoping/ops xlsx. Probably the original scope work that became HookStreetServices-Site/ (the live website at hookstreetservices.com).
RecommendationOpen it tomorrow → if its content is now in HookStreetServices-Site/SERVICES_CONCEPT.md or live on the website, move xlsx to archive/graveyard/. If it has unique scope/pricing/SOP not yet captured, extract → markdown → archive xlsx.

5 · CODE-FROM-SHEETS architecture decision

Apps Script has 2 project types. Each has tradeoffs.

Bound script (lives inside the sheet)Standalone script (lives in Drive separately)
onEdit / onOpen triggers✅ Fire automatically❌ Need installable triggers (extra setup)
UI menus on open✅ Auto-built from onOpen❌ Doesn't apply (no bound sheet)
Cross-sheet ops⚠ Possible via openById but not the strength✅ Native — designed for this
Version control / clasp✅ Works fine✅ Works fine (sometimes cleaner — no scope inheritance)
Code reuse across sheets❌ Need to copy code into each bound sheet✅ One script, multiple sheets via openById
PermissionsInherits sheet's permissionsNeeds explicit OAuth scope per sheet

Recommendation per system

SystemTypeWhy
CM InvoiceKEEP boundonEdit autofills (customer pick → contact info, style pick → price) are CRITICAL UX. onOpen menus must auto-build.
BOS-v1Could move to standaloneAlready does cross-sheet (openById to operatingOS, dailyTracker, captureSS). Bound benefit is small. Standalone would let you connect more sheets without code duplication.
BOS-v2KEEP bound for nowSmaller, self-contained. Move to standalone only if you start reading other sheets.
MISKEEP boundReads its own sheet primarily. onOpen menus matter.
Voice IntakeSTANDALONE (already designed that way)Reads Gmail label, writes to Monthly Obligations sheet via openById. Pure cross-system.
Migration cost: Moving BOS-v1 from bound → standalone is non-trivial: re-create script project, re-install all triggers, re-test 4 cross-sheet reads, ensure OAuth scopes are explicit. Defer until BOS-v1 is otherwise stable. Logged in CURRENT_STATE for future planning, not active work.

6 · PHONE TRIGGERS — 5 patterns ranked

Goal: text/shortcut from phone → certain sheet does certain thing.

#PatternSpeedCostRecommendation
🥇 1iPhone Shortcut → POST to Apps Script Web App URL
Shortcut sends JSON to deployed doPost. Apps Script handles instantly.
InstantFreeBEST for new triggers. No 3rd party. Pure Google. JSON payload = action name + params.
🥈 2iPhone Shortcut → Email with [LABEL] subject → Apps Script onMessage
Shortcut emails to a special label. Script polls label every 5 min, processes new ones.
≤5 minFreeFALLBACK if Web App URL is too exposed. Already partially built (Voice Intake). 5-min latency.
🥉 3Voice memo → Whisper transcribe → Gmail draft → existing Voice Intake≤5 minFree (Whisper local)Already 70% built. Voice-first. hookstreet-voice-intake repo.
4SMS → Twilio webhook → Apps Script doPostInstant$0.0075/SMS + $1/mo numberSkip — adds Twilio cost + Malca-Yenta-style overhead. Pattern 1 better.
5Telegram bot → webhook → Apps Script doPostInstantFreeSkip — kosher concern (Telegram). Pattern 1 covers same ground without that issue.

Recommended Pattern 1 implementation (the "Go" path)

// In any Apps Script project — bound or standalone
function doPost(e) {
  var data = JSON.parse(e.postData.contents);
  var action = data.action;
  var key = data.key;  // shared secret in Settings
  if (key !== getSecret_('PHONE_TRIGGER_KEY')) return ContentService.createTextOutput('FORBIDDEN').setMimeType(ContentService.MimeType.TEXT);

  switch (action) {
    case 'cm_save_invoice':       saveInvoice(); break;
    case 'cm_email_invoice':      emailInvoice(); break;
    case 'mis_send_power_hour':   POWER_HOUR_SEND(); break;
    case 'bos_daily_snapshot':    DAILY_SEND(); break;
    case 'capture_quick_idea':    saveQuickCapture_(data.text); break;
    default: return ContentService.createTextOutput('UNKNOWN_ACTION');
  }
  return ContentService.createTextOutput('OK');
}

iPhone Shortcut spec

Notification on file in outputs/ — that's a different problem. Apps Script doesn't watch local Windows files. Options: (a) OneDrive's iOS app already pushes notifications when files appear in synced folders (set per-folder in OneDrive Settings → Notifications); (b) iOS Shortcut "Watch Folder" automation can fire when iCloud Drive folder changes — but you'd need outputs/ on iCloud, not OneDrive. (a) is simpler.

7 · OUTPUTS FORMAT — recommend HTML default

Per your phone-shortcut goal:

FormatPhone-renders?Desktop grep?Verdict
HTML✅ Safari renders. Files app previews. Mail renders inline.⚠ Tags noise but searchable.DEFAULT for briefings, recaps, status, any user-facing output
MD❌ Renders as raw text in Files app (need a markdown viewer app).✅ Best for grep / git diff.Keep for: technical specs, architecture docs, runbooks SOP files in docs/. NOT for outputs/.
New rule (Phase 7.6 OUTPUT FORMAT update): outputs/ defaults to HTML. .md in outputs/ only when the doc is intended for git diff / grep workflow (audits, indexes). Briefings, status reports, SOPs, action lists, recaps → all HTML.

Retroactive cleanup not needed. Going forward only.

📋 TOMORROW'S PRIORITY ORDER

  1. CM validation (Step 1-3 above) — 30 min
  2. Open HS_SRVC_v1.xlsx → decide archive vs extract
  3. Connect lawn-coop-proposal local → north-woodmere-lawn-coop GitHub (1 command)
  4. Phone trigger Web App — pick which sheet to deploy first (recommend BOS for "send daily snapshot from phone")
  5. If time: screenshot Apps Script trigger panels for MIS, BOS-v1, BOS-v2 → enables trigger cleanup phase
What I'm NOT touching without your go: moving any folder to graveyard · merging repos · trigger deletions · MIS code edits · BOS-v1 hsUnified bug fix · code-from-sheets migration · folder reorg.
SOURCE TRAIL
Local: outputs/2026-04-29_00-06_prep_tomorrow-cm-validation-mis-design-phone-triggers.html
CM commit: a570aea (Phase 7.6 — 3 bug fixes + sacrificial test mode)
Workspace commit: 42f8a4b (pending: this prep doc + CURRENT_STATE updates)
Working dir: C:\Users\ztrei\OneDrive\2. Hook Street\05. 2026 BH
Generated: 2026-04-29 12:06 AM EDT