Every page in the app, read twice: once as an agent, once as a vendor. The question on each was whether the words on the screen describe what that person is actually there to do. Most of the app already holds one vocabulary. Where it slipped, it was in the older dialogs and forms, in the pages that never asked which side of the marketplace was looking at them, and in one word for the trade side that the app had already stopped using everywhere else. Fixed in the same pass, then walked again in a real browser as both accounts.
The two sides now read as two products built from one vocabulary, not one product with the other side bolted on.
This is the rule the pass was checked against. It is Michael's, from the two renames on
5 September, and it is now what the whole app says. The code keeps its own names (provider,
listing, /create-service, /my-listings) and nothing in this
pass renamed a column, hook, route or component.
| The thing | The word | Where it holds |
|---|---|---|
| Someone who represents property | agent | Sign-up, every "posted by" line, the counterpart on any job you take. The poster is always the agent. |
| Someone in a trade | vendor | Nav (Vendors), sign-up, Hire a vendor, the profile subtitle, the admin console, the landing and waitlist. |
| Work an agent posts for another agent | opportunity | Find opportunities, My opportunities, the wizard title Post an opportunity, its button and toast. |
| Work an agent posts for a vendor | job | Hire a vendor, Post job / Send job, the vendor's Find work and My jobs. |
| The unit of work, generically | job | Every count, rail figure and empty state. "Listing" is never used for a posted job. |
| The button that posts agent work | Get coverage | Header, dashboard door, Posted jobs empty state, How it works. The bar's tab is Post, the first word of the page it opens. |
| What an agent's posts are called together | Posted jobs | The nav item and the page. It holds both opportunities and vendor jobs. |
| Saying yes to a priced job | apply | Apply, Apply now, Apply for this job, Application submitted, Awaiting a decision. |
| Saying yes to a job priced by the work | quote | Send a quote, Priced by quote, By quote. Only quote-first trades ever see it. |
| Naming a different price on a priced job | your price | Name your price, Your price is with the agent, Asks $110, asking from $95. |
| Signing in and out | sign in, sign out | Login page, sidebar footer, toasts. Logout is gone. |
Read as a pair. Every row is one place; the two columns are the words an agent and a vendor read there. Where a cell says "same", the page does not need to know who is looking.
| Place | Agent | Vendor |
|---|---|---|
| Menu | Home · Find opportunities · My opportunities · Posted jobs · Vendors · Leads · Referrals · Calendar · Wallet | Home · Find work · My jobs · Calendar · Wallet |
| Header button | Get coverage | None. The dashboard carries Find work instead. |
| Phone bar | Home · Find · Post · Vendors · Calendar | Home · Find · My jobs · Calendar · Wallet |
| Home rail | Next up · Nearby to earn · Waiting on you · Earned (spent as detail) | Next up · Booked · Awaiting a decision · Earned |
| Home sections | Waiting on you · Your next few days · Earn nearby · Recent activity | Your next few days · Open work · Recent activity |
| Home, nothing booked | "A job you take, or someone you book for a job you posted, lands here" | "When an agent books you, the job lands here" (was "accepts one of your quotes", wrong for a cleaner) |
| Board | Find opportunities · "Open jobs near you that another agent can take" · scopes Agent work / Vendor work | Find work · "Jobs in your trade, inside your service radius" · scopes Your trade / Vendor work |
| Your work | My opportunities · "Work you're doing for other agents… Jobs you posted are under Posted jobs" | My jobs · "The jobs you've been booked for, the applications and quotes still waiting on an answer, and the work you've finished" |
| Calendar subtitle | "Every job you are booked on, and the ones you posted for somebody else" | "Every job you are booked on, by day" |
| Calendar month figure | "$520 in pay · $45 to pay" (was "Pay to be quoted" for an agent who only posts) | "$375 in pay" |
| Wallet subtitle | Paid for covering, paid for coverage, sent to bank | What your jobs have paid, and what has gone to your bank |
| Profile subtitle | "How other agents and vendors see you before they book" | "How agents see you before they book you" |
| Edit profile | Full name · Professional title · ZIP code · Bio | Full name · Business name · ZIP code · Service radius · Turnaround · Trade license # · Typical rate · About your work |
| Settings, banking | Payout setup and the card form | Payout setup only. A vendor never pays here. |
| Settings, FAQ | How do I post work? How do I get paid? Cancelling: edit the job under Posted jobs | How do I find work? How do I get paid? Cancelling: contact the agent from the job |
| How it works | Post · Pick · Book and pay · Mark complete | Payouts · Trade and radius · Apply or quote · The agent pays · Get paid |
| 404 | Back to home · Find opportunities | Back to home · Find work |
| Booked job dialog | Counterpart is Covering agent or Vendor on a job you posted, Agent on a job you took | Counterpart is Agent. Contact agent. |
A second walk at 390 and 320 wide with touch input, as both accounts, every bottom tab and every item in the menu sheet. The bar and the sheet were already current: each label is the page's own name or its first word, the sheet is the complete role-scoped map, and the search box says "Search opportunities" for an agent and "Search work" for a vendor.
| Surface | Agent | Vendor |
|---|---|---|
| Bottom bar | Home · Find · Post (amber pill) · Vendors · Calendar | Home · Find · My jobs (amber pill) · Calendar · Wallet |
| Active tab | Lights on Find, Post, Vendors, Calendar and My jobs; nothing lights on a page the bar does not carry, which is correct. | |
| Menu sheet | Home · Find opportunities · My opportunities · Posted jobs · Vendors · Leads · Referrals · Calendar · Wallet · Admin · How it works · Settings · Sign out | Home · Find work · My jobs · Calendar · Wallet · How it works · Settings · Sign out |
| Header | Menu, wordmark, bell, theme. Get coverage is hidden below 640 because the bar's Post tab is the same door. | Menu, wordmark, bell, theme. |
| Fit at 320 | Every page reads 320 wide except My opportunities, which ran to 376: three tabs with counts, "Awaiting a decision" the widest. Fixed: the strip scrolls inside its own width, and below 640 the tab reads "Awaiting" (the rail beside it spells it out). All three tabs sit inside 320 now. | |
One naming question is left open on purpose. The bar says Post, the rule being the first word of the page it opens (Post an opportunity); every other button into that wizard says Get coverage. Both follow a stated rule, and they disagree. If the bar should match the header, "Coverage" is the one-word form that fits five tabs at 320; that is Michael's call.
App.tsx and the nav filter in AppSidebar.tsx were the source of truth for who reaches what./demo, so no live data was touched. As Dana: home, My opportunities, Posted jobs, the applications dialog, Calendar, Settings FAQ and banking, Profile, the 404. Switched to Mira in the demo banner: home, My jobs, Calendar, Wallet, Settings banking and FAQ, How it works, Profile, Edit profile, Find work, and the apply dialog from the dashboard. Then both accounts again at 390 and 320 wide with touch taps: every bottom tab, every menu-sheet item, and the layout width read on each page. The full page text was read out of the DOM on every stop, not just screenshotted.~/tour-dash, uncommitted, ready for npm run build and the wrangler deploy once they have been looked at.