Install
openclaw skills install @voronindenis5/freelance-scope-shieldUse when a freelance client keeps adding "just one small thing" and the project has quietly doubled — formal scope registry with change-order math (impact hours × blended rate), creep pattern detector (who asks, what type, which requests become disputes), auto-generated polite decline/counter letters, and contract clauses that prevent the next creep.
openclaw skills install @voronindenis5/freelance-scope-shieldScope creep is the #1 margin killer in freelance and consulting work. The pattern is always the same: a "small favor" in week 2, another in week 4, and by delivery the client is receiving 170% of what was priced — at 100% of the price. The freelancer knew it was happening and couldn't object without sounding hostile, because nothing formal existed to point at.
This skill creates the formal thing:
Don't use for: employment disputes (different law), fixed-price catastrophes already in legal territory, or estimating new projects (that's pre-scope — this skill manages an agreed scope).
# 1. Register the agreed scope (the contract's deliverable list)
python3 scripts/scope.py init --project "Acme website" --rate 65 --currency USD
python3 scripts/scope.py deliverable --project . --name "5-page website" \
--hours 40 --included
python3 scripts/scope.py deliverable --project . --name "logo design" \
--hours 0 --excluded --note "explicitly out per contract §2"
# 2. Classify a client request
python3 scripts/scope.py classify --project . \
--request "add a blog section to the site" --title "Blog section" --hours 8
# 3. Price it as a change order (late-project risk multiplier)
python3 scripts/scope.py changeorder --project . --title "Blog section" \
--hours 8 --at-week 6
# 4. Record what actually happened (feeds the pattern detector)
python3 scripts/scope.py record --project . --title "Blog section" \
--hours 8 --status disputed
# 5. See the creep pattern
python3 scripts/scope.py pattern --project .
# 6. Generate the letter (decline / counter / escalate)
python3 scripts/scope.py letter --project . --title "Blog section" \
--mode counter --out letter.md
A request is classified by explicit matching against the registry:
included (the client
already paid; do it, log it against that deliverable's hours)excluded entry or no entry (new work:
change order required before work starts)No AI classification — the registry is explicit, so decisions are checkable by both sides. That's the point: it converts a social confrontation into arithmetic.
price = hours × rate × risk_multiplier(week)
risk_multiplier: week 1-2 → 1.0 (cheap to change early)
week 3-5 → 1.15 (rework + context switch)
week 6+ → 1.3 (schedule compression)
post-delivery → 1.5 (new engagement terms)
The multipliers aren't punishment — they're what the change actually costs: late changes force rework of finished work, break concentration, and compress testing. Publishing this formula in your proposal is the single most effective anti-creep move (see contract clauses).
Three modes, always citing the registry:
Tone rule baked into templates: warm to the person, firm on the scope. The relationship stays human; the boundary stays mechanical.
record. The pattern detector only works on logged
requests. A creep pattern you can't show is a pattern you can't
negotiate with (or a client you can't fire).The 6th "small favor":
scope.py classify --project . --request "add contact form" --hours 3
scope.py changeorder --project . --title "Contact form" --hours 3 --at-week 7
scope.py letter --project . --title "Contact form" --mode counter --out l.md
Engagement retro before renewal:
scope.py pattern --project .
# creep velocity > 15% of contracted hours/week → reprice or decline renewal
Next contract:
scope.py clauses