| Fix first: a trust hole |
| 1 | Anyone can review anyone. "Leave review" shows on every other profile and the database only checks the reviewer is signed in. The dialog also toasts success before the save and a second toast follows from the page. Show the button only when a completed, unreviewed job exists between the two, require the appointment on the row, mark job-linked reviews "Verified job", and let the reviewee reply.Profile.tsx:281 · ReviewDialog.tsx:50-59 · schema.sql:229-233 | Both | M | — |
| Money and payment |
| 2 | Returning from Stripe shows nothing. Read payment=success and payment=cancelled, toast the result, ring the row, poll until the appointment exists.MyListings.tsx:530-571 · ApplicationsDialog.tsx:209 | Agent | S | A |
| 3 | Signing off takes two hops and lands on instructions. Pay now and It didn't happen on the dashboard card and in the appointment dialog.Index.tsx:726 · AppointmentDetailsDialog.tsx:555-566 | Agent | S | A |
| 4 | Payout timing copy is wrong in six places. One sentence everywhere, and the real release time on booked rows.auto-release.ts:23 · MyOpportunities.tsx:324 · PayoutSetup.tsx:123 · OpportunityRow.tsx:158 · OnboardingDeck.tsx:105 · MyWallet.tsx:205 | Contractor | S | F |
| 5 | Wallet mixes held and available money. Available, Pending with job count, Next deposit from Stripe. Pending out of Earned.MyWallet.tsx:35-47, 169-184 | Contractor | S | F |
| 6 | Agent cost disagrees after a counter. Band and headline use the posted price, the row uses the charged one; the dashboard and calendar use the posted one; one total is unformatted. One helper that reads the payment row.MyListings.tsx:413-423, 755, 847, 877 · Index.tsx:471-480 · Calendar.tsx:155, 173 | Agent | S | F |
| 7 | Agent wallet can go negative. Card charges are summed as outflows. Leave them out, add "Held for booked jobs", link each line to its job.MyWallet.tsx:37, 170-178, 334-359 · statements.ts:13-17 | Agent | S | F |
| 8 | Cancellation policy contradicts the Withdraw button. Settings tells contractors to ask the agent; the dialog offers self-withdraw with the $20 rule. Rewrite the settings copy to match.Settings.tsx:354-363 · AppointmentDetailsDialog.tsx:373-378 | Contractor | S | — |
| 9 | Unbookable applicant can be auto-selected first. Sort payable applicants first, chip the row "Can't be booked yet", add a quick reply asking them to finish payouts.ApplicationsDialog.tsx:262-273, 317, 353 | Agent | S | E |
| 10 | Contractor can apply with payouts off and isn't told. Banner in the apply dialog with setup in place; repeat in the toast.useApplications.ts:59-72 · FindOpportunities.tsx:464-493 | Contractor | S | E |
| 11 | "Verified" without payouts, then the nudge disappears. Persistent banner and a dot on Wallet whenever payouts are off, independent of verification. Hide MLS and eKey from the vendor checklist.onboarding.ts:76-108 · Index.tsx:575 · MyWallet.tsx:120 | Contractor | S | — |
| Unfilled posts |
| 12 | Past-dated open posts never expire and read "it's tomorrow". Label Date passed, offer Repost with a new date, move to Done as Expired.MyListings.tsx:768-786 | Agent | S | B |
| 13 | Dashboard never shows the agent's own unfilled posts. New Needs-you kind "Nobody yet" inside 48h with Raise the pay and Send to agents.Index.tsx:176-186, 678-739 | Agent | M | B |
| 14 | Calendar hides unbooked posts and has no actions. Dashed marks for Nobody yet, Post a job for this day on empty days, count completed only against past jobs.Calendar.tsx:97-104, 278-282, 328-331 | Agent | M | B |
| 15 | Needs-you count is wrong and items are dropped. Each kind slices to four and the heading counts the slices. Count the totals, add "+2 more in Posted jobs".Index.tsx:679-728 · NeedsYou.tsx:54-56 | Agent | S | B |
| 16 | No repost or duplicate. Post again on Done, cancelled and expired rows, prefilled with everything except the date. Direction G in the post-a-job report.MyListings.tsx:798-831 · CreateService.tsx:137-151 | Agent | M | H |
| Messages and notifications |
| 17 | Applicant threads missing from Messages and the unread badge. An Applicants group, counted in the badge, each opening the dialog on that person.Messages.tsx:50, 93 · useJobThread.ts:219-222 · ApplicationsDialog.tsx:338-341 | Agent | M | C |
| 18 | Phone tab bar has no badges, Posted jobs is buried. Count on More and on the rows in the sheet; consider giving the Find slot to Posted jobs for agents who post more than they take.mobile-nav.ts:31-37 · BottomNavigation.tsx:61-71 · AppSidebar.tsx:168-175 | Agent | S | C |
| 19 | Notifications: no grouping, no limit, no undo, odd fallback. Group by job and type, load fifty, undo for five seconds, unknown types fall back to home not the wallet. Count on the bell, Jobs / Money / Messages tabs.useNotifications.ts:31-35 · notifications.ts:23-24 · NotificationsPopover.tsx:55-57 | Both | M | C |
| 20 | Two composers, two send rules, lost drafts. Enter sends and Shift+Enter breaks in both; drafts kept per applicant; booking threads open scrolled to the newest message.ApplicationThread.tsx:84, 185-190 · JobThread.tsx:30-45, 121-123 | Both | S | — |
| 21 | No control over applicant and message email, no urgent text. Instant or daily digest for applicants and messages; opt-in SMS when someone applies to a job inside 24h.EmailPreferenceSwitches.tsx:19-40 · Settings.tsx:195-207 | Agent | M | — |
| 22 | No alerts for new jobs in my trade. "New jobs near me" preference, instant or morning digest, with a minimum pay. "Alert me about jobs like this" on the board.notification-templates.js · account.ts:107 | Contractor | L | D |
| The board and applying |
| 23 | Board filters reset, no date or pay filter. Chips in the URL and local storage; When and Min pay chips.FindOpportunities.tsx:108-136 | Contractor | S | D |
| 24 | Beyond-radius jobs can't be opened, widening doesn't stick. Rows open the preview; "Make 25 mi my default".NoOpportunitiesNearby.tsx:78-111 | Contractor | S | D |
| 25 | Applying is four clicks and the last screen has no facts. Summary strip in the apply dialog, autofocus Apply, keep the preview under it.OpportunityRow.tsx:107-171 · OpportunityPreviewDialog.tsx:146 · ApplyDialog.tsx:95 | Contractor | S | E |
| 26 | After applying, no next step. Name the agent, say how you'll hear, link to My jobs.FindOpportunities.tsx:477-484 · MyOpportunities.tsx:257-262 | Contractor | S | E |
| 27 | Clashes never shown, double-booking possible. Reuse the dashboard overlap check in the row and the dialog; after booking, flag pending applications in the same slot with one-tap withdraw.Index.tsx:883 · OpportunityRow.tsx:68-76 · useApplications.ts:209-229 | Contractor | M | E |
| 28 | No availability setting. Hours and blackout dates on the profile, a "Fits my availability" board filter, "Available then" on applicants.AvailabilityPicker.tsx · EditProfileDialog.tsx | Contractor | L | — |
| 29 | Can't judge the agent or the competition. "Usually decides in ~3h", "Books 80% of posts", and "N applied" on rows and previews.OpportunityRow.tsx:125-140 · OpportunityPreviewDialog.tsx:296-325 | Contractor | M | — |
| 30 | No keyword search on a phone. Search icon in the sheet header that sets ?q=.AppHeader.tsx:63 · FindOpportunities.tsx:751-754 | Contractor | S | — |
| 31 | One trade per contractor. Primary plus up to three more, and the board returns all of them.Signup.tsx:351-370 · account.ts:23-24 | Contractor | M | — |
| 32 | Shared job link loses the job through sign-in and offers a waitlist. Carry next= through login and signup; replace the waitlist button with Create a vendor account.Job.tsx:132-138 · Login.tsx:172 · Signup.tsx:176 | Contractor | S | — |
| Things that vanish |
| 33 | Declined or withdrawn applications vanish. "Not this time" rows in Done for thirty days with the reason.MyOpportunities.tsx:94, 149, 162 | Contractor | S | G |
| 34 | Past-dated applications stay "waiting" and inflate expected pay. Label, exclude, one-tap Clear.MyOpportunities.tsx:421-458, 484-487 | Contractor | S | G |
| 35 | Going quiet has no action. Message and Withdraw on the row.MyOpportunities.tsx:437-438 | Contractor | S | G |
| 36 | Invite Decline doesn't decline. Call declineInvite directly, with undo.MyOpportunities.tsx:413 | Contractor | S | G |
| 37 | Countering back starts blank, no way to say no. Prefill the previous ask, show both numbers, add Pass.CounterPriceDialog.tsx:41-79 · MyOpportunities.tsx:909-916 | Contractor | S | G |
| 38 | Cancelling an unbooked post leaves applicants hanging. "Tell the N applicants" checkbox, on by default.MyListings.tsx:1006-1016 | Agent | S | G |
| 39 | Manual "Filled" lands in the wrong band. Replace with "Covered outside Tour Dash", which moves to Done and rejects applicants.EditListingDialog.tsx:457-464 · MyListings.tsx:390-392 | Agent | S | G |
| 40 | Property hub rows don't open, delete has no confirm. Link rows to the job, undo toast on delete.Property.tsx:262-290, 383 | Agent | S | — |
| Forms |
| 41 | Validation is toast-only, one field at a time. Mark every missing field inline; "3 things left" footer with links.CreateService.tsx:248-336, 888-896 · SchemaForm.tsx:60-105 · HireProvider.tsx:191-214 | Agent | S | H |
| 42 | The post form remembers nothing. Last audience, last price per type, typical near you, draft in session storage.CreateService.tsx:126, 169 · create-service-schema.ts:159-178 | Agent | M | H |
| 43 | "Hire again" forgets the person. The chip should carry the provider, like the ?provider= deep link does.HireProvider.tsx:103-105, 185-189, 564 | Agent | S | H |
| 44 | Hire flow on a phone: action at the bottom of the page. Sticky bar with the summary and the primary action below xl.HireProvider.tsx:796 | Agent | S | H |
| 45 | Vendor form can't take photos. Reuse the uploader from the showing form.HireProvider.tsx:297 · CreateService.tsx:852-884 | Agent | S | H |
| 46 | Posted jobs has no search or sort, Done grows forever. Search box, type filter, last ten Done rows with Show older.MyListings.tsx:798-831, 884-890 | Agent | S | — |
| 47 | No share link on an open public post. Copy link, or the share sheet on a phone.MyListings.tsx:789-792 · Job.tsx:40-53 | Agent | S | H |
| 48 | No review prompt after a job. Leave a review on Done rows for fourteen days, and in the Job complete toast.MyListings.tsx:458-465, 820 | Agent | S | H |
| 49 | Signup gaps. Generic "fill in all fields", the licence agreement isn't linked, the typical rate doesn't say before or after the fee.Signup.tsx:121, 464-471, 549-552 | Contractor | S | — |
| 50 | Onboarding ends at the dashboard, not the work. Vendor's last card becomes "See N jobs near you", with a text-me toggle and a radius check. The deck only runs on mobile.OnboardingDeck.tsx:214, 386-460 | Contractor | S | D |
| 51 | Dead component. OpportunityCard is imported only for its type and never rendered. Move the type and delete it.OpportunityCard.tsx · OpportunityRow.tsx:14 | — | S | — |