Review pages: one door, not four

Where a person approves what Clara wants to do, why we ended up with four screens plus Slack, and the proposal to make it one.

Proposed — D1, D2 and D3 decided (Fede, 2026-10-14); D4 pending · 2026-10-12 · sources: PR bodies #2438 #6399 #6654 #11412 #13125 #18046 #18427, ADR-0141, the supervised-mode evidence page, the staff-loop v2 page, public vendor docs

Recommendation: one review page for everyone. A customer reviewer sees their company. PropFlow staff see every company on the same page with a filter. Slack and email keep their buttons, and every link lands on that one page. The admin copy, the email-only page and the Admin chrome a customer saw yesterday all go away.

1. Today 2. How we got here 3. Why four 4. Do staff need their own? 5. What others do 6. Proposal 7. Your decisions

The full proposal

1. Today

WHOWHERE THEY CLICKWHAT IT WRITES Customer operator Customer chosen reviewer Fede / PropFlow staff PM on a phone /reviewqueue: claims, vendors, reminders, held emails /held-messages/<id>one item, from an email link, no list /admin/escalation-holds + Slack cardstaff list, Approve/Reject buttons in Slack /collections/approve/<token>one tap, signed link One hold recordsame decide route,first answer wins
Four screens, one record. The code that decides and sends is already shared; only the doors differ. The renewal list sits on the email-link page, which is why a test reviewer landed in Admin yesterday.
/review/held-messages/<id>/admin/escalation-holds
WhoOperators and admins at a companyChosen reviewers for a module (ADR-0141)PropFlow staff only
List?YesNo, email link onlyYes, all companies
ItemsTenant claims, vendor outreach, rent reminders, renewal corrections, new-lease packages, held prospect emailsOne held text or email, the monthly renewal listHeld team emails, owner reports, renewal lists
SlackPartlyNo (email)Yes, this is the Slack home
PhoneNoCardsNo

2. How we got here

WhenPageWhy, in plain words
Jun 17/reviewCallers claiming a unit needed a PM's yes before account access. First queue. (#2438)
Aug 27One-tap rent reminderA PM on a phone taps once, no password prompt. (#6399)
Aug 30Admin hold page + Slack cardFede: Camellia team emails get "a human in the loop final review… on Slack." The web page was only the link target. (#6654)
Sep 24Held emails inside /reviewHolds had no list, only Slack links. Added as a feed, not a row type, because holds resolve through their own writer. (#11412)
Sep 28Admin hold listSame gap on the staff side. (#13125)
Oct 8/held-messages/<id>Gera overturned the Sep 19 "customers never review" rule. Reviewers needed a door, and /admin is staff-only. (ADR-0141, #18046)
Oct 10Renewal list on that pageMonthly list as a table with renew yes/no and new rent. (#18427)

3. Why four

4. Do PropFlow staff need their own page?

No. Everything the admin page does is a permission, not a page: see every company, act on behalf of a customer in Supervised mode, and the Slack rewrite buttons. On one page, staff get a company filter and the same rows. A separate copy is how the renewal list ended up showing "Admin" and "escalation holds" to a reviewer, and how the two lists drifted (the customer queue got held emails, never renewal lists). One exception stays: life-safety pages and engineering alerts are not reviews and never enter the queue.

5. What others do

Public detail from property-management vendors is thin: AppFolio Realm-X flows "pause for a human", EliseAI, Zuma and Entrata say staff can take over, none shows a second admin screen. The clearer pattern is from AI support agents: Intercom Fin hands off into one Inbox; Salesforce Agentforce parks a draft as "Pending Agent Review" in one queue. Agent frameworks (LangGraph interrupt, OpenAI approvals, Anthropic's checkpoints) all model it as one paused action with one resume. Design writing agrees on five things: gate only what is hard to undo (outside messages, money); one canonical page; Slack and email carry buttons but deep-link to it; an append-only trail of who decided; and an aging number, because a queue approved 95% of the time is a queue to delete.

6. Proposal: one review page

Before
  • 4 pages, 3 auth models
  • Renewal list reachable only by email link
  • Customer sees Admin chrome
  • Staff list and customer list drift
After
  • /review is the page. /review/<id> is the item.
  • Who sees what is a permission: reviewer = their module at their company; operator = their company; staff = all, with a filter
  • Email links, Slack cards, the one-tap link all land there
  • The monthly renewal list is one row that opens the table
  • Old URLs redirect, then get deleted

Four small PRs, each dark: (1) /review/<id> renders the shared held-message view under the merged permission; (2) email links and Slack cards point there; (3) the two old pages become redirects; (4) staff company filter, then delete the old pages. Approvals on a record itself (a work order quote, a turnover charge) stay on the record and also appear as a row while Clara waits. The coding-agent Decisions tab is internal and untouched.

7. Your decisions

Earlier rulings this touches: Sep 19 "customers never review" (overturned Oct 8 by Gera); Sep 28 staff-loop "no review queues"; Oct 1 Supervised mode named and applied to every module.

PropFlow Docs