Texas Hotel Management · RevPAR Pro
What each persona reads every morning
Owner / GM / DOS morning-screen specification · Jul 17, 2026 · multi-agent research, adversarially verified
RPP Morning Personas: Final Spec
Grounded in RPP Supabase verification 2026-07-16/17 and the board decision memo 2026-07-16 (4-0). No alert queues, no push duplication of /ops, no fake data states.
1. The shared spine (build once)
- Money band. Last-night Occ / ADR / RevPAR / room revenue per property with the explicit business date, plus MTD vs LY and vs prorated budget (budget_entries acct 4100 ROOMS DIVISION). Renders on all three tabs. Availability: partial (night_audit_entries covers 5 of 15: HOURP, HOUZN, HOUUS, CLLSB, CLLAL).
- Pickup diff engine. Today's booking_pace report_date minus prior snapshots (1-day and 7-day windows). Snapshot history verified back to 2026-02-22; diffs are real. Covers 3 hotels (HOURP, HOUZN, HOUUS).
- Rate x pace cross-join. rate_snapshots (own hotel verified present in scans) joined to OTB occupancy per check_in_date. Real scan horizon is ~9 days out today; spec all rate widgets to that window until scan depth extends.
- Freshness chrome. Thin strip under the money band: per-feed hours-since-data vs the existing guards (night_audit_freshness_alerts, 8h scan guard); stale rows dimmed with their real business date. A rendering rule, not a ranked question, except on the GM tab where the GM is the actor who fixes report scheduling. If the strip is red and /ops was silent, flag the watchdog mismatch to the agent team.
- Honesty rules, enforced everywhere. "No feed configured" rows pinned below fed rows, never blank or zero. "No LY history" state distinct from "no feed" (LY daily history: HOUZN from 2023-07, HOURP 2023-12, HOUUS 2024-01; CLLSB 2026-01; CLLAL July 2026 only). LY comparisons use matched-days sums, never naive MTD. Missing audit nights render an explicit "N nights missing from MTD" badge (CLLAL: 11 of 15 July days). Budget proration is same-day-of-week aware, not calendar-day. Never render group_not_sold (parser gap reads 0 as "no group risk"), any segment split (unparsed), or a fake STLY pace line.
- Degraded layout defined. CLLSB/CLLAL GMs get flash + MTD/budget only; pace and rate modules show the honest no-feed state.
2. Personas
Owner (Ace)
- What did the whole portfolio do last night? One rollup row (rooms revenue, RevPAR, vs LY) explicitly labeled "fed hotels only, 5 of 15" above the band. Comparison: vs same DOW last week and matched-days LY. Red: read row detail below. Partial; feed rollout unlocks the true total.
- What did each building do, and where is MTD vs LY? The 15-row money band sorted worst MTD-vs-LY first, dark rows pinned bottom, refi markers on HOURP/HOUUS, CLLAL partial-month badge. LY delta renders only where history exists. Red: call that GM this morning; sustained red on a refi hotel gets pre-empted in the lender narrative. Partial (5 of 15).
- Are we making budget on rooms this month? Row-level chip: MTD actual vs same-DOW prorated budget, $ gap and %. No month-end projection until it is DOW-defensible. Red: direct the DOS to shift tactics today; the gap dollar carries to the weekly GM call (weekly surface). Partial (budgets all 15, actuals 5).
- What did we pick up, and which forward dates are broken? Exceptions-only view for 3 pace-fed hotels: soft dates inside 14 days, negative pickup, near sell-outs; tonight pinned; full 14-row table one click deep. Comparison: today vs yesterday snapshot. Red: same-morning rate/inventory call. Partial (3 of 15).
- Are rates positioned right where it matters? Two highlighted states only: above compset band while pace-soft, below band while pace-full. No rate-only wall for non-pace hotels. Red: same-morning reprice; repeat offenders get a DOS rate-strategy session. Partial (cross-join live for 3 hotels, ~9-day horizon).
GM (Michael, Sam, Kareem; audit-only variant for CLLSB/CLLAL)
- How did we do last night? Hero row with stamped business date; HOUUS shows "awaiting last night's audit" before ~9am, never silently the prior night; one-tap "flag this night" (admin fix path). Comparison: same-DOW last week, trailing 4-week, daily budget pace; LY omitted honestly. Red: check pace and rates, ask the desk what happened. Live (fed hotels).
- What's on the books, and which nights need action before noon? 7-row forward strip, expand to 14; today row pinned with arrivals count and a heavy/normal/light badge vs the DOW norm; soft nights flagged vs same-DOW budget pace. Red: open/close discounts, call the DOS on the flagged night, flex housekeeping before the 9am huddle. Partial (3 hotels; departures/turns is a named parser ask).
- Am I at sellout or oversell risk tonight or this weekend? Flag any stay_date with occupancy_pct >= 98% or > 100%; derivable now from booking_pace. Red: stop-sell, walk plan and walk-hotel call, rate ceiling. Live (3 hotels).
- Where am I priced vs compset, who moved overnight, and is a channel undercutting me? Per check_in_date: own rate, median, rank, per-peer overnight deltas, OTB occ inline; parity flag where the scan captures channel rates. Red: submit the BAR override or call the cluster/brand revenue desk (not free repricing); parity break becomes a same-morning extranet case. Live (~9-day horizon).
- Am I still making the month? MTD vs same-DOW prorated budget (budget_entries acct 4100, the verified source), gross-rooms denominator labeled, missing-nights badge. No month-end projection until it is DOW-defensible (same rule as the Owner view). Red: brief the DOS with the specific gap dollar, tighten discretionary spend, escalate only past what rate/sales can close. Partial (5 fed hotels).
- Can I trust these numbers? Freshness strip; amber prompts the GM to re-send the PMS scheduled report (Jul 18 inventory runs through GM outreach). Live.
DOS
- What did we pick up since yesterday, on which nights? Per-property net rooms/revenue next 30 days plus per-stay-date diff (1-day and 7-day). No STLY pace line. Red: flat pickup on a near need date jumps to item 3; strong pickup on compression lifts rate or tightens. Partial (3 hotels).
- Which nights in 30/60/90 are broken? Heat-striped calendar (booking_pace stay dates verified through 2026-10-14, ~90 days forward, so the full window is supported on pace; the RATE overlay stops at the ~9-day scan depth); need flag when occ trails same-weekday norm at equal lead time and pickup is flat; budget-implied occ shipped as a labeled estimate. Pinned today row: arrivals, tonight OTB and rate spread, rooms left to sell and OOO (night_audit_entries.rooms_left_to_sell / out_of_order_rooms, live), last night's no-shows (night_audit_entries.no_show_rooms, live; verified against Jul 15 rows). 60/90 flags take sales levers only (no rate data past ~9 days). Red: top 1-3 need dates each get an assigned lever; a flag with no lever is the failure mode. Partial.
- Is our public rate wrong, and who moved overnight? Own rate vs compset median/min/max and rank, per-peer overnight deltas (populate prior_rate/rate_delta_pct), OTB joined. Honest ~9-day window, not 14-30. Red: same-day rate recommendation to the GM; dark hotel in scan means curate google_hotel_name. Live, portfolio-wide compsets.
- Which nights are peers selling out while we have rooms? is_sold_out per peer per night, live for all 25 scanned hotels; a sold-out peer drags the median down exactly when rates should rise. Red: lift rate or restrict on compressed nights. Live; the strongest fully-live signal.
- How did we do last night and MTD? Shared money band with no-LY-history states. Red: MTD behind shifts the week toward base business (LNR/negotiated push) plus a rate review with the GM. Partial.
3. Explicitly not on the morning screen
- STR MPI/ARI/RGI: monthly compset surface; auto-returns when 10+ hotels have current-month compset_metrics (today: 2 of 15, latest 2026-03). Upload enforcement stays in Walton's watchdog and /ops.
- Group block wash: parser backlog (group_not_sold); weekly PMS block review meanwhile; widget spec kept in the drawer for re-promotion.
- Negotiated account production: weekly sales meeting once segment parsing ships; INNRLY never a source of record.
- Labor vs occupancy: needs a timeclock/payroll ingest; monthly P&L (with HOUZN 35.5% QBO-vs-PMS trust flags) meanwhile.
- Guest reviews: gated on hotel_review_records verification; brand push channels cover overnight recovery today.
- Cash/deposit recon and audit exceptions: parser extension plus bank feed backlog; weekly bank-rec workflow meanwhile.
- Pipeline incident diagnosis: /ops push brief owns it. SIFT quarterly: TaxIntel section.
4. Build order
Phase 1, ships on today's data: rate position + overnight movers + peer-sellout compression (all 25 scanned hotels); pickup diff engine; forward strips with sellout flags; money band for 5 fed hotels with all honesty states; freshness chrome; DOS tonight-inventory row. Pre-build checks: own-rate coverage per check_in_date across all compsets, LY matched-days logic, DOW proration.
Phase 2, feed rollout (Jul 18 PMS inventory, ~0.5-1 day per property): money band and budget chips grow toward 15; portfolio topline approaches true total.
Phase 3, parser work on existing feeds: group_not_sold fix (re-promotes DOS block widget), segment split, departures/turns, audit exception lines, rate scan depth past 9 days, prior_rate/rate_delta_pct population.
Phase 4, new feeds: timeclock/payroll (unlocks daily labor, jumps to GM top-3), bank deposit feed, review platform pull (verify hotel_review_records first), curated events line, STR uploads to the 10-hotel trigger.
5. Corrections applied after the adversarial pass (verified against the database, 2026-07-17)
- Budget source unified on budget_entries acct 4100 (ROOMS DIVISION, confirmed in budget_chart_of_accounts). GM budget tracking covers the 5 audit-fed hotels, not 3.
- "Projected landing" removed from the GM view; the no-projection-until-DOW-defensible rule wins everywhere.
- The critic flagged DOS no-shows and rooms-left as parser asks; the live schema disproves that: night_audit_entries carries no_show_rooms, out_of_order_rooms, and rooms_left_to_sell (nonzero values verified on Jul 15 rows). They stay in Phase 1.
- booking_pace forward horizon verified to 2026-10-14 (~90 days), so the DOS 30/60/90 calendar is real; only the rate overlay is limited to the ~9-day scan depth.
- Stated plainly per the critic's persona test: GMs at the 10 unfed hotels have no daily reason to open the page until their feed lands in the Jul 18 rollout; their variant begins as rate tools plus the honest no-feed state.
Method. 14-agent workflow, Jul 17 2026: per persona, one industry-practice researcher (web: morning-report conventions, GM huddle practice, daily revenue-meeting and pickup rituals, M3/HotStats/Duetto/INNRLY-class daily screens), one THM grounding agent (board memo Jul 16, INNRLY module inventory in data-alignment-map.md, live RPP Supabase), a synthesizer, and an adversarial verifier (cadence / data honesty / action-if-red / /ops duplication). Composite then challenged by a completeness critic; its four material findings were checked against the production database and applied (section 5). Data coverage facts as of Jul 16-17 2026: night audit 5 of 15 hotels, forward pace 3 of 15 (stay dates through 2026-10-14), rate scans 25 hotels (~9-day depth), budgets acct 4100 all keyed properties, STR compset metrics 2 of 15 (latest 2026-03). Type per the RPP standard: Inter + JetBrains Mono. Woz for THM.