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.edit keeps 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
Share this project:

Updates