This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady
What I Built
ScopeSloth answers the client message you dread: the one that says "looks great, just a few small things" and then lists five.
You paste what you agreed (scope, rate, revision rounds) and the client's latest message. An agent lists every separate request. A second agent searches your agreement for each one and cites the line that covers it. Then plain code, not the model, decides the money: hours times the rate in your agreement, and whether a design tweak uses up one of your included revision rounds. A third agent drafts a calm reply: what is covered, what is an add-on and its exact price, and one question for anything unclear.
Who it is for: freelancers who have a written scope and still end up doing extra work for free, because arguing about it feels worse than doing it. The lazy move here is not to skip the work. It is to not have the argument.
Demo
Live: https://scopesloth.sellerkit.workers.dev
Click Load a sample (a made-up bakery website and a made-up client message), then Sort the requests. A run took 4 to 10 seconds in my tests.
The header photo and logo tweaks are revisions, so they are free and use one of the two included rounds. The ordering page, Instagram feed and PDF menu are not in the agreement, so they get a price.
The reply only contains amounts the code computed. If the model invents $400, the draft goes back with the exact problem.
Code
https://gitlab.com/globalmatchhub/scopesloth (MIT)
How I Built It
Stack: a Mastra workflow on Cloudflare Workers, calling open-weight models on Workers AI.
-
Models:
gpt-oss-20b(Apache 2.0) is the default, reasoning effort low.Llama 4 Scout 17Bis the second choice and the backup writer. -
Workflow:
createWorkflow(...).then(listRequests).then(checkScope).then(writeReply). -
One tool: the checker agent has
search_scope. It takes several queries at once and returns numbered agreement lines (S3). A cited line only counts ifsearch_scopereally returned it in this run. A request marked "in scope" with no valid citation becomes "unclear". -
Small models answer in lines, not JSON.
#2 extra - | new | 3 | not in the listis parsed by code, with a fallback when parsing fails. -
The rules are plain JavaScript (
src/scope.js, 16 tests, no model):- rate and revision rounds are read from the agreement text (
$60/hour,2 rounds of revisions) - hours from the model are clamped to halves between 0.5 and 40, so one wild guess cannot become a huge line item
- price = hours x rate, always computed in code
- a change to delivered work uses a revision round, and becomes billable only when the rounds run out
- the reply may only contain amounts the code computed, and must price every extra item
- no dashes, placeholders or phrases like "as per our contract" or "unfortunately"
- rate and revision rounds are read from the agreement text (
What broke on the way
I ran the sample on the deployed Worker and read what came back.
| Problem | What I changed |
|---|---|
| "Move the logo a bit to the left" was priced as $30 extra work. It is a design tweak, and two revision rounds were included. | Code decides "change vs new" from the request's words and overrides the model. A tweak is free while rounds remain, and billed once they are used up (tested both ways). |
| The model labelled "add an Instagram feed" as a change to delivered work | The same override: build words (add, feed, payment, PDF) force "new" |
| One run answered for only some of the requests, so the rest showed "unclear" | The missing numbers are asked again, once |
| A request the agreement says nothing about came back "unclear" | Silence in the agreement means extra work. Code turns it into extra if no line was cited and no line is close |
| Draft replies came with a non-breaking hyphen in "add-on" |
undash normalises it |
Honest numbers
- 16 tests for the plain-code rules, run with
node --test. - Deployed runs: 4 to 10 seconds, with two slow outliers (32 s and 53 s) when Workers AI queued my request.
- About $0.0004 to $0.0008 per run at Workers AI list prices (3 model calls, around 1,500 tokens in, 350 out).
- The same sample did not give the same answer every time. In 3 of my last runs the extra-work total was $780, $420 and, once, nothing priced because the model called three requests "unclear" and the reply asked questions instead. The hour estimates are the model's guess, so the page tells you to adjust them. The money rules and the revision rule did not vary.
Why Does Open Innovation Matter?
A client's message and a signed agreement are private. With an open-weight model on Workers AI the text is used for one request and not stored by my app, and anyone can read the code, run the same model on their own machine or swap it. The part that matters most is that the open pieces are swappable: the writing step has a backup, so if gpt-oss-20b returns an empty draft, Llama 4 Scout writes it instead, which is one line of config (that path did not trigger in my sample runs). A run costs a fraction of a cent, so a freelancer can use it on every message and never think about a subscription.
My Agent Session
Not embedded. The code and the table of what broke are above.
The Lazy Payoff
For the sample message, the by-hand version is reading the agreement again, deciding per request, estimating hours, doing the arithmetic, and writing a reply that is firm without sounding cold. ScopeSloth does that in under ten seconds, and the part that is most tempting to fudge, the arithmetic, is not left to a model. I have not measured this with real clients this week, so I am not going to claim a time saving beyond the sample.
Prize Categories
-
Best Use of Mastra: a three-step Mastra workflow with a Mastra tool (
search_scope) and Mastra agents on open-weight models.
Code and English text were produced by an AI coding agent (Claude Code) working under my direction. I chose the topic, reviewed the results and published the post.


Top comments (0)