Inspiration
Every freelancer knows the message. "While you're at it, can you also just…" - a friendly ask, wrapped in a smile, that adds a day of work you'll never bill for. It's not one message that hurts. It's the sixth one, in the third channel, by Thursday. A recent look across freelance communities put the tab at $15,000–$25,000 a year, per freelancer, lost to unpaid scope creep - most of it invisible to the person losing it.
But the harder truth showed up in the research: freelancers don't fail to notice scope creep. They notice every time. What they lack is the language to raise it without feeling like the bad guy, and the pattern-sense to know which client is quietly bleeding them. ScopeGuard is built for that gap - not to catch more creep, but to be the calm advocate that hands over the words, keeps a goodwill scoreboard, and helps decide when to bill and when to give.
What it does
ScopeGuard lives in a freelancer's client project channels. After a brief is set (manual, from kickoff chat, or SOW import), Slack Canvas becomes the living scope-of-record - titled Scope Health, with a health score and change log both parties can see. In-channel the bot appears as Scope Health so clients aren't hit with an accusatory product name.
When the client asks for something new, the accusation stays private: ScopeGuard notifies the freelancer alone - never the client. The channel stays clean. The freelancer decides:
- Let it slide - logged as goodwill, quietly tallied in hours and value
- Bill for it - ScopeGuard drafts a professional change order (cost + timeline), posted as the freelancer, not as a bot
- Draft the reply - ScopeGuard writes the client-facing message; you send it as yourself
Payment options (Approve & Pay / demo Simulate payment) go to the client only (ephemeral). The public CO card stays details-only - awaiting approval, no awkward payment theater in the channel.
Zoom out and the moat appears: absorbed hours across every project - the unpaid goodwill almost no tool tracks. In the Keystone demo seed, that scoreboard already reads differently per client: Lumen stressed (~7h absorbed, pending COs, health in the red), Acme mid-project healthy until the live creep, Verde at 100%. Studio view: "Lumen is your heaviest creeper; Verde respects the scope." ScopeGuard doesn't just catch creep - it shows how a whole book of work is really doing.
Try it (judges): open #acme-website → post something clearly out of scope (e.g. newsletter signup or full blog) → check the freelancer's private warning → Let it slide or Bill for it → open the Scope Health canvas → /studio-report in #studio-hq.
How we built it
ScopeGuard is a Slack Bolt (Python) app (Socket Mode for demo; Railway for HTTP), with Supabase as source of truth. Ambient classify + change-order/reply drafting run on Groq · Llama 3.3 70B. Document/chat brief extraction uses Anthropic where needed.
This is a Slack-only agent on purpose. Without today's primitives, it couldn't live ambiently in the client channel:
- Events API - hears the ask the moment it lands
- MCP + Canvas - creates the scope-of-record;
canvases.editkeeps Scope Health honest as asks land - Real-Time Search (RTS) - enriches warnings with channel history ("we touched on this before") so the alert isn't a cold accusation
Between events and the classifier sits a local two-stage gate: structural filter, then MiniLM embeddings. Most chatter never spends an LLM call. One invariant: the gate can only escalate, never issue a verdict - a wrong skip must mean "ignored a non-request," never a missed creep.
The classifier is severity-aware - small asks can accumulate in the goodwill tally instead of interrupting every time.
Challenges we ran into
The hardest problem wasn't detection - it was not being a cop. A tool that pushes a change order for every ask makes the freelancer look greedy. Rebuilding around bill-vs-absorb - with "let it slide" and a goodwill tally - took more design work than any technical piece.
Trust architecture was the second. Silent monitoring is both a Slack policy line and a relationship bomb. Resolution: disclose presence to everyone; keep judgment private to the freelancer. That inversion shaped disclosure copy, retention, Canvas voice, and naming the in-channel bot Scope Health while the product stays ScopeGuard.
The third was Canvas edit concurrency - canvases.edit is one op per call and rejects concurrent edits, so updates are serialized per project with a full-document rebuild as the reliable path.
Accomplishments that we're proud of
- The goodwill scoreboard. Bill-vs-absorb turns detection into advice. Tracking unpaid hours across clients is the differentiator - not another "AI that flags messages."
- Privacy that protects the relationship. Client never sees the accusation; they see a clean CO and a shared Scope Health canvas. Warnings and draft replies stay with the freelancer; payment controls stay with the client.
- Draft and post as you. Change orders and replies go out as the freelancer - ScopeGuard is the advocate behind the curtain, not a third voice in the room.
- The portfolio view. Three seeded personalities (Acme / Lumen / Verde under Keystone) make the pattern obvious in one glance.
- Trust we're not embarrassed by. Presence disclosed, judgment private, retention limited, no model training on channel data.
- Slack-native by necessity. Events + MCP Canvas + RTS aren't decorations - they're why an ambient scope advocate can exist here now.
What we learned
Freelancers already feel scope creep; the tool's real value isn't detection, it's giving a conflict-averse person the confidence and the words to protect their income without feeling like a villain. Optimizing for "catch more" builds anxiety. Optimizing for "calm advocacy + goodwill scoreboard + handing over the words" builds something they can't work without.
Technically: Slack's 2026 platform (MCP + RTS) is a real capability layer - permission-aware, real-time conversational context that wasn't available to third-party builders a year ago. ScopeGuard is one answer to: what quiet, patient agent could live here now that couldn't before?
What's next for ScopeGuard
Shipped: brief from chat/SOW, live classify, bill-vs-absorb, change orders, draft-as-you, Scope Health canvas, studio portfolio. Next:
- Richer kickoff → brief. Multi-doc SOWs so the first canvas is almost always right on confirm.
- Real payment collection. Honest billed / approved / pending today; live Stripe webhooks close the loop to money in the bank.
- Agencies. Same portfolio brain across teammates - who absorbs too much, which clients creep most.
Built With
- async-python
- block-kit
- bolt-python
- events-api
- groq
- llama
- model-context-protocol
- postgresql
- python
- railway
- real-time-search
- sentence-transformers
- slack-api
- slack-bolt
- slack-canvas
- socket-mode
- stripe
- supabase

Log in or sign up for Devpost to join the conversation.