RPP Deal Pipeline: Handoff Readiness Assessment

Generated 2026-07-16 · Sources: revparpro repo (main @ 9352439), prod Supabase (edkqocoospynebgorwro, live queries today), vault notes (RPP Deal Pipeline project note 2026-07-11, internal-launch specs 2026-04-01)
Verdict: Zabir already has access. The problem is not access, it is that the underwriting engine lives outside the app.

zabir@texashotelmgt.com exists in prod with role owner and signed in today, 2026-07-16 (prod auth.users + profiles query, 2026-07-16). His role already shows the full Acquisitions & Market nav group. What he gets is a solid read-and-triage surface: browse the kanban, open any deal, move stages, pass deals, add a deal, edit asking price, write a thesis, drop broker documents.

What he cannot do is the thing the pipeline is actually for: originate an underwriting. The model is an Excel workbook in Drive, built by a bespoke Python script that Claude writes per deal, and the two bridges between the UI and that workbook are launchd workers on your Mac Mini. If you and Claude stop, the pipeline freezes at "viewer mode" for everyone else.

Recommended order: fix his profile today (10 min), add job-status visibility so his UI edits are trustworthy (1 session), then generalize model creation so a dropped T-12 + STR builds the workbook without a hand-written script (the real unlock, 1-2 weeks). Access-control hardening can wait until you invite anyone below partner level.

1. What the Deal Pipeline is today

Nav group "Acquisitions & Market" (src/lib/nav-config.ts:108-117): Deal Pipeline (/app/deals kanban), Hotel Intelligence, Deal Staging, Tax Intel. Off-nav deal routes: deal detail (9 tabs), compare, and the mobile Deal Walk mode (src/App.tsx:67, 86-88). Visible only to roles owner, managing_partner, and analyst (nav-config.ts:124-137); every other role, including the JWT default staff, sees none of it.

The app deliberately never computes model math (comment at src/components/deal/DealAssumptionsTab.tsx:21-28). The calculator is the V5 underwriting workbook in Drive; scripts/sync-model.mjs is the one-way bridge from workbook to Supabase, and everything financial in the UI is a display of that sync.

2. Capability matrix: what Zabir can do vs what still needs you + Claude

ActionIn-app todayWhere / why
Browse pipeline, open deals, compare, Deal WalkYesDeals.tsx, DealDetail.tsx (9 tabs), DealCompare.tsx, DealWalk.tsx
Move deal stage, pass with reasonYesuseUpdateDealStage (src/hooks/useHotelIntel.ts:729)
Add a deal (manual or file-drop with identity resolution)YesAddDealModal.tsxuseCreateDealReference (useHotelIntel.ts:763)
Edit asking price, thesis, recommendation; walk observationsYesInline edit shipped and committed (DealDetail.tsx:82-100; vault note 2026-07-11); Decision tab (DealDetail.tsx:870-944)
Staging triage: add lead, dismiss, promote to dealYesDealStaging.tsx, usePromoteDealStaging (useHotelIntel.ts:862)
Upload broker docs (T-12, STAR, OM)Queues onlyInserts deal_intake_jobs; nothing happens unless deal-intake-worker.mjs is running on the Mac Mini (launchd, 60s poll)
Edit underwriting assumptions (deal dials)Queues onlyInserts deal_model_edit_jobs; applied by model-edit-worker.mjs on the Mac Mini against the Drive workbook
Create / populate the underwriting modelNoHand-written per-deal scripts: ~/agents-runtime/scripts/fill_h150_model.py, fill_h155, fill_h156, fill_h158, fill_h129_h133, etc. Claude reads seller P&Ls, STR PDFs, HCAD, then writes the script
Enter or correct financials (T-12, CapEx, STR monthly)Nodeal_annual_financials, deal_capex_years, deal_str_monthly have no UI write path; written only by sync-model.mjs / ingest-deal-star.mjs
See whether a queued edit or upload actually processedNoNo job-status surface; failed or stalled jobs queue silently

All paths verified in the repo today by a full code sweep; write paths cross-checked against Supabase RLS policies (live pg_policies query, 2026-07-16).

3. How a deal actually gets underwritten today

Ace + Claude session
Pull seller P&Ls, STR reports, HCAD, broker emails from Drive/Box. Claude writes a per-deal fill_hXXX_model.py against the V5 template.
Excel workbook in Drive
The actual calculator. All model math lives here, never in the app (DealAssumptionsTab.tsx:21-28).
scripts/sync-model.mjs (run by hand or by workers)
Mac Mini launchd workers
deal-intake-worker.mjs (classifies uploads, files to Drive, triggers sync) and model-edit-worker.mjs (applies UI assumption edits to the workbook, re-syncs). Single point of failure, needs Mac Mini awake + Drive creds + repo .env.
↓ writes deal_references.model_*, deal_annual_financials, … ↓
RPP Deal Pipeline UI
What Zabir sees. Reads the synced numbers; his edits to assumptions/docs go back up the chain as queued jobs.
Requires Ace + Claude Requires the Mac Mini to be alive Self-serve in the app

4. The five gaps, ranked by how hard they block Zabir

1
Model origination is a Claude session, not a product feature. Every new deal needs a hand-written Python script to fill the workbook (8 such scripts exist in ~/agents-runtime/scripts/ today). Zabir can add a deal shell and drop files, but no model appears without you.
2
His UI edits are inert if the Mac Mini workers are down, and he cannot tell. Assumption edits and doc uploads just queue rows. No status indicator, no failure alert, no cloud fallback. This will read to him as "the app is broken."
3
No way to type in financials. If a synced revenue number is wrong or a T-12 arrives as an unparseable scan, only a script can fix the tables. He has zero recourse in-app.
4
Access control is cosmetic. Routes are not role-guarded and deal-table RLS is tenant-only, not role-based (016_deal_references.sql:36-43: FOR ALL USING tenant_id = tenant_id(), granted to all authenticated users). The AccessMatrix settings page (AccessMatrix.tsx) is display-only. Irrelevant for Zabir as a partner; a real blocker before inviting analysts or GMs anywhere near deals.
5
Profile housekeeping. His profile has 0 assigned properties (prod query today). Deal tables are tenant-scoped so deals still show, but property-scoped pages (dashboard, compsets, flash) will be empty or wrong for him. Also decide: keep him owner or move to managing_partner per the access spec (22-user-access-controls.md seeds him as managing_partner); both see the full deal nav.

5. Next steps: recommended sequence

PhaseWorkEffortWhat it unlocks for Zabir
0 · Today Set his assigned_properties (all 15 or the DFW set) and confirm role. Give him a 30-minute walkthrough plus a one-page guide: what each tab means, which numbers are editable, that assumption edits take a few minutes to apply. 10 min + walkthrough Full read/triage use immediately: stage moves, passes, theses, walk mode, staging triage.
1 · This week Job-status visibility: show queued/processing/done/failed on the Assumptions tab and intake dropzone (both tables already have status columns), plus a worker-heartbeat alert when either launchd job goes quiet. 1 session His edits and uploads become trustworthy. Kills the "is it broken?" support loop, which is the #1 cause of tools getting abandoned by a second user.
2 · 1-2 weeks Generalize model origination: extend the intake worker so a classified T-12 + STR on a new deal auto-builds the workbook from the V5 template (build_uw_model_template.py generalized), with a review step instead of a bespoke script. Stopgap alongside: a simple in-app financials entry form for when parsing fails. Then move both workers off the Mac Mini to a hosted runner (or supervised cloud cron) so the chain survives your machine. The big lift Zabir can originate a deal end to end: drop broker package, get a draft model, turn the dials, read the proforma. You and Claude become reviewers, not the assembly line.
3 · Before wider invites Real enforcement: role-guard the deal routes, add role-based RLS write policies so analyst is actually read-only, wire or delete the dead visibleTo metadata in nav-config. 1-2 sessions Safe to invite Junaid, Aadil, or an analyst without them being able to silently rewrite the pipeline.

My honest take on scope: Phases 0-1 make Zabir a productive second set of eyes this week for near-zero cost. Phase 2 is the only thing that makes the pipeline genuinely usable "besides you," and it is worth doing before polishing anything else in the deal surface. Phase 3 is not a Zabir problem at all; do not let it jump the queue.