Mockup - Select - Plan - Build
Blocking a sender, without ever losing the evidence
What it is: the screens for marking a lead as spam so it stops reaching Slack, stops reaching your inbox, stops sending the submitter an automated receipt, and moves out of the working leads list. Every block is made by you, over a field you choose, and every block can be undone.
The real morning this is for
At 10:10 on 15 August you get a Slack ping: a rate card request from Robertham, 90 studies a month. At 10:11 another, 457 studies. At 10:13 two more. Four different email addresses, four unparseable phone numbers, and the same one-line question in Italian, Georgian, Welsh and Irish. It is the same bot that hit you on 10 and 12 August as AR-Q-16 and AR-Q-21, cost you two follow-up emails, and sat in the CRM as a multi-hundred-study prospect.
You open the lead. You want two things: make this stop, and be sure you have not just told the system to ignore a real hospital. The four addresses rotate, so blocking the address catches one of four. Organization is the field that stays still.
The backend is already built and tested, so these choices are only about the screens
Rules match on email, email domain, organization, contact name, phone (digits only, so +86 577 838 695 and 86577838695 are one rule) or message text. A blocked submission still gets the normal thank-you page and is still written down, so the bot learns nothing and you keep the evidence.
Three safety rails are server-side, not screen-side, so no design here can lose them: a rule cannot be empty or under three characters, a rule matching more than 25 stored leads is refused unless you confirm it deliberately, and INTAKE_BLOCKLIST_ENABLED=false turns every rule off at once. Leads already converted into CRM pipeline are never swept.
After you pick
What happens next
Your picks get built 1:1, translated to the project's oklch tokens with every pixel value preserved, and verified with Playwright screenshots at 1440x900 against these frames. The backend is already merged behind the picks, so the only work left is the Angular component and its service methods.
Nothing is committed until you say so. The six Robertham leads are cleared with one command through the same code path the button uses, so they carry a real rule and a real reason rather than a migration's guess.