| Step | What you do | Expected outcome |
|---|---|---|
| 1 | Open 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. |
| 2 | Menu → ⚙️ 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. |
| 3 | Walk 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. |
| Customer picked in A11 | Expected I10 invoice # | Why |
|---|---|---|
| TESTONE | INV-260429-TE-001 | 1-word name, NY state from Customers tab → no state suffix (NY = home) |
| TEST TWO | INV-260429-TETWIL-001 | 2-word + IL state from VLOOKUP → state appended |
| TEST - THREE | INV-260429-TETHNJ-001 | Word2="-" → falls back to word3 "THREE" → "TH" + NJ state |
| GITTY'S BOUTIQUE (real) | INV-260429-GIBO-001 | Unchanged — NY home state, no suffix |
| BRENDA - CHICAGO (real) | INV-260429-BRCHIL-001 | Word2="-" → fallback to word3 "CHICAGO" → "CH" + IL |
Same skeleton. Sacrificial test mode = use a fake ticker (e.g., TESTAAA) that doesn't pollute production decisions or the trade log.
| # | Phase | Test |
|---|---|---|
| 1 | Setup | All 33 expected tabs exist post setupTabs (per Apr 28 audit: KEEP=19, REPAIR=7, RETIRE=4) |
| 2 | Setup | CONTROL tab has all required keys (LAST_REGIME, LAST_VIX, EARNINGS_API_KEY etc.) |
| 3 | Setup | Reference_Rules populated with current thresholds |
| 4 | Schema | Tickers!J header matches Code.js — currently DRIFTED ("Current Earnings Date" vs "Next Earnings Date") |
| 5 | Trigger | Trade Action fires once at 2:05 PM (currently 5+ duplicates per Apr 27) |
| 6 | Trigger | Power Hour fires once at 3:00 PM (currently 2-3 duplicates) |
| 7 | Engine | Add TESTAAA to Tickers tab → trigger Snapshot rebuild → verify row exists in HIST_DAILY_SNAPSHOT |
| 8 | Engine | TESTAAA flows through Momentum_Engine → Action Flag computed (currently broken — composite max ≈45 vs threshold ≥42) |
| 9 | Engine | execution_playbook generates Trade Conclusion for TESTAAA without leaking BUY LMT for downtrend |
| 10 | Trade Action email assembles for TESTAAA · direction symbol present (↑/↓) · Today's % @ price visible | |
| 11 | Power Hour email content matches Snapshot tab content (no contradictions) | |
| 12 | Outlook iOS rendering test passes (per feedback_outlook_ios_rendering.md) | |
| 13 | Edge | Empty earnings calendar → graceful skip (NONE-skip already in v11.0e) |
| 14 | Edge | Holdings #N/A flag — FILTER chain returns rows or zero, not error |
| 15 | Cleanup | Remove TESTAAA → no orphan rows in HIST_DAILY_SNAPSHOT or HIST_TRADE_LOG |
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.
Per your decision: keep all 5. Map their connections + likely future merge-points.
| Repo / Folder | What it is | Likely future home |
|---|---|---|
lawn-coop-proposal/ (local) | HTML proposal site, NO git remote | ⚠ These 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/Lee | Single 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-center | Next.js 14 + Supabase + Netlify. Architecture: Inputs → Engine → Outputs → DB. Frozen 43 days but never killed. | |
Calculator/ + zee78900/abnbcalc (PUBLIC) | Airbnb STR calculator app | Discrete utility. Doesn't merge into BOS — keep as standalone tool. |
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)
| Path | C:\Users\ztrei\OneDrive\2. Hook Street\05. 2026 BH\HS_SRVC\ |
|---|---|
| Contents | 1 file: HS_SRVC_v1.xlsx (552 KB) |
| Last modified | 2026-02-06 (83 days ago — stale) |
| Likely purpose | Hook Street Services scoping/ops xlsx. Probably the original scope work that became HookStreetServices-Site/ (the live website at hookstreetservices.com). |
| Recommendation | Open 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. |
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 |
| Permissions | Inherits sheet's permissions | Needs explicit OAuth scope per sheet |
| System | Type | Why |
|---|---|---|
| CM Invoice | KEEP bound | onEdit autofills (customer pick → contact info, style pick → price) are CRITICAL UX. onOpen menus must auto-build. |
| BOS-v1 | Could move to standalone | Already does cross-sheet (openById to operatingOS, dailyTracker, captureSS). Bound benefit is small. Standalone would let you connect more sheets without code duplication. |
| BOS-v2 | KEEP bound for now | Smaller, self-contained. Move to standalone only if you start reading other sheets. |
| MIS | KEEP bound | Reads its own sheet primarily. onOpen menus matter. |
| Voice Intake | STANDALONE (already designed that way) | Reads Gmail label, writes to Monthly Obligations sheet via openById. Pure cross-system. |
Goal: text/shortcut from phone → certain sheet does certain thing.
| # | Pattern | Speed | Cost | Recommendation |
|---|---|---|---|---|
| 🥇 1 | iPhone Shortcut → POST to Apps Script Web App URL Shortcut sends JSON to deployed doPost. Apps Script handles instantly. | Instant | Free | BEST for new triggers. No 3rd party. Pure Google. JSON payload = action name + params. |
| 🥈 2 | iPhone Shortcut → Email with [LABEL] subject → Apps Script onMessage Shortcut emails to a special label. Script polls label every 5 min, processes new ones. | ≤5 min | Free | FALLBACK if Web App URL is too exposed. Already partially built (Voice Intake). 5-min latency. |
| 🥉 3 | Voice memo → Whisper transcribe → Gmail draft → existing Voice Intake | ≤5 min | Free (Whisper local) | Already 70% built. Voice-first. hookstreet-voice-intake repo. |
| 4 | SMS → Twilio webhook → Apps Script doPost | Instant | $0.0075/SMS + $1/mo number | Skip — adds Twilio cost + Malca-Yenta-style overhead. Pattern 1 better. |
| 5 | Telegram bot → webhook → Apps Script doPost | Instant | Free | Skip — kosher concern (Telegram). Pattern 1 covers same ground without that issue. |
// 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');
}
https://script.google.com/macros/s/.../exec)Content-Type: application/json{"action":"cm_save_invoice","key":"<your-secret-key>"}Per your phone-shortcut goal:
| Format | Phone-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/. |
.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.outputs/2026-04-29_00-06_prep_tomorrow-cm-validation-mis-design-phone-triggers.htmla570aea (Phase 7.6 — 3 bug fixes + sacrificial test mode)42f8a4b (pending: this prep doc + CURRENT_STATE updates)C:\Users\ztrei\OneDrive\2. Hook Street\05. 2026 BH