בס״ד

Hook Street Capital — Systems Architecture

docs/ARCHITECTURE.md · last changed (pre-VM history) · rendered from GitHub master

Hook Street Capital — Systems Architecture

Last updated: 2026-05-12 session 33 · Locked at the cross-workbook handoff. Living doc — overwrite when scope changes.

Purpose: Single doctrine page. What lives where. Who owns what surface. How the pieces talk.

The two-workbook split (locked 2026-05-12)

Surface Workbook Scope Owner Migration target
Financial OS Monthly Obligations.xlsx (31 tabs) Canonical financial-truth source. Debt, obligations, cashflow, STR signals, Wife_View, Sources_&_Provenance. Sam-only by default. Sam Google Sheets (new), bound Apps Script (new)
Operating OS HookStreet_Operating_OS_v1.xlsx (12 tabs; recommended rename Hookstreet_Operations.xlsx) Forward-looking operating map. STR + Mildred + Hookstreet Services + briefings + action queue + calendar + people. Mildred reads CALENDAR_RAW + PEOPLE. Sam Google Sheets (new), same Apps Script project as Financial OS

Rule: the two workbooks stay separate. Cross-references go through Apps Script reads, not formula links. Financial truth NEVER bleeds into Operating OS. Operating data NEVER bleeds into Financial OS.

The single Apps Script project (v3, post-migration)

ONE script project, bound to the new Financial OS Sheet, contains BOTH:

Rule on rename collisions:
- Different scopes → different names (sendOpsDigest vs sendFinancialDigest)
- Same scope → one wins, drop the other (syncCalendar replaces v1's refreshCalendarSummary_; if Financial needs a calendar summary, build a derived view on top of CALENDAR_RAW)

Dropped from migration: ~68 of 118 v1 functions are utility/migration cruft. Don't carry forward. List in outputs/2026-05-12_00-10_audit_monthly-obligations-v1-vs-excel.html § Apps Script.

Sheet structure conventions (v3)

Tables for every Apps-Script-addressable range. Obligations[Balance] survives migration; B2:B44 does not.

Workbook Table count Tables
Financial OS 9 Provenance, ActionList, Obligations, AmazonOrders, Installments, SavingsGoals, TripsTable, ArchiveLog, SnowballPlan
Operating OS 7 tbl_CalendarRaw, tbl_ActionTracker, tbl_WaitingOn, tbl_MeetingPrep, tbl_Projects, tbl_People, tbl_StaleArchive

DASHBOARD tab in Operating OS is NOT a Table — has 5 sections (rows 4/12/19/34/48). Address by absolute range or named range only.

Purge before migration:
- All _xlfn.* named ranges (Excel-internal fallbacks; resolve to #REF! in Sheets)
- All v3_* orphan named ranges (broken refs from prior migration attempts)

Uniform format spec: title row A1 merged #2C3E50 white bold 14pt; subtitle row A2 merged #F4F1EA italic #5D6D7E 11pt; table-header row #34495E white bold; table style TableStyleMedium2 banded rows.

Tab color → audience → sharing mechanism

Color Audience Mechanism Notes
Grey Sam-only No share Default for sensitive data
Yellow Wife (Chanie) Separate Sheet + IMPORTRANGE Privacy fails closed, not open. Wife_View NEVER lives in same Sheet.
Blue Mildred Separate Sheet + IMPORTRANGE OR Protected Range STR ops + Hookstreet Services + reimbursements only. NEVER family finances.
Green All (visible to anyone Sam shares the Sheet with) Standard share Use sparingly
Purple Meta / system Internal Usage_Guide, Cross_Workbook_Briefing, Claude logs

Cross-system data flow (v3, post-migration)

[v1 Sheet 1L_rxCSOnc...]   ← retire after 30-day parallel-shadow
        ↓
[Financial OS — new Sheet] ← canonical financial truth
        ↓ (read-only via Apps Script)
[Operating OS — new Sheet] ← reads cashflow signals + debt KPIs
        ↓ (sendOpsDigest 7 AM)
[Sam's inbox] ← morning ops digest
        +
[Financial OS sendFinancialDigest 7 AM] → Sam's inbox

[Wife's separate Sheet] ← IMPORTRANGE from Financial OS Wife_View tab
        ↓
[Chanie's view] ← 5 calm KPIs, no debt detail

[Mildred's separate Sheet] (future) ← IMPORTRANGE from Operating OS subset
        ↓
[Mildred's view] ← STR vendor queue + reimbursements + her direct asks

The migration roadmap — COMPRESSED to THIS WEEK (locked 2026-05-12 session 34 PM)

Sam ask 5/12 PM voice: "No way it's gonna take six weeks. I'll be done like in a bit this week."

Original 6-7 week plan collapsed to Wed 5/13 → Tue 5/20 (8 days). Trade-off: 5-day verification window instead of 30. Higher cutover risk; Sam owns the trade-off explicitly.

Day Phase What lands Owner
Wed 5/13 Phase 0 + Phase 1 start Workbook lock (fix Chanie income to $30K+/mo · fix Jewish calendar dates · ack 6th zero-bal card). New Google Sheet "Hook Street Financial OS v3" + "Hook Street Operating OS v3". Port first 15 tabs. Sam answers Q5 / Q8 · Claude builds
Thu 5/14 Phase 1 complete All 37 + 13 tabs ported. Named Tables (9 + 7). Tab colors. Sharing_Map → Protected Ranges. Wife_View as separate Sheet w/ IMPORTRANGE. Claude · Sam spot-checks 3 KPIs
Fri 5/15 Phase 2 — Apps Script v3 Single bound project. ~50 v1 functions ported · 4 Operating OS functions integrated · renames (sendFinancialDigest / sendOpsDigest / syncCalendar replaces refreshCalendarSummary_) Claude · Sam authorizes OAuth scopes once
Sat 5/16 Phase 3 — Verification (compressed) New triggers fire to sam+v3@hookstreetcapital.com. Diff against v1 output. Fix any drift same day. Auto · Sam glances at alias
Sun 5/17 Phase 3 cont. 5th day verification. Lock all triggers. Final diff. Auto
Mon 5/18 Phase 4 — Cutover Disable v1 BOS triggers (clasp 1_cgriwCQ). Switch v3 to-line from sam+v3@sam@. First Morning Brief fires automatic 9:55 AM (matches Sam's "by next Monday" deadline). Claude executes · Sam confirms
Tue 5/19 Phase 4 cont. + Mildred sync 10:38 AM Mildred walkthrough of Operating OS v3 + STR_Brief. She starts using v3 immediately. Sam + Mildred
Wed-Fri 5/20-22 Phase 5 — Decommission Archive v1 Sheet (rename ARCHIVED — Monthly Obligations v1 — 2026-05, revoke editor access, leave read-only). Delete v2 BOS triggers (clasp 1ROnmAAhtTYE). Final share audit. Claude · Sam confirms

Total Sam-time: ~3 hrs across the week (Q5 answer · OAuth click · 3 spot checks · Mildred sync).
Total Claude-time: ~14 hrs (compressed from 18-20).
Acceptance test for cutover: 5 days of clean verification with zero KPI drift on the alias address. (Was: 30 days — Sam compressed.)

Code locations

Surface Local path GitHub Clasp script ID
Financial OS v1 (production until cutover) HookStreet-Business-OS/sheets/src/Code.js zee78900/hookstreet-bos-sheets 1_cgriwCQ...
Financial OS v2 (orphan, will retire) HookStreet-Business-OS/sheets-v2/ not in git 1ROnmAAhtTYE...
Financial OS v3 (TARGET, not yet built) TBD TBD TBD (single project bound to new Sheet)
Operating OS v1 inside HookStreet_Operating_OS_v1.xlsx APPS_SCRIPT tab not in git yet not yet bound
Operating OS v3 TBD TBD folded into Financial OS v3 single project
MIS production MIS/MIS-v1-script/ zee78900/MIS 1yBMztL4...
MIS sandbox MIS/src/ zee78900/MIS 1r9vWL1Ds...
CM Invoice (Mom's tool) CM_Invoice_System/ zee78900/CM_Invoice_System 1t4DzAQQ...
PWA endpoint archive/2026-05-12_tilde-folder/~hookstreet-workspace/pwa-api-script/ (private workspace repo) (separate clasp)

Sources

Source trail · docs/ARCHITECTURE.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