~/writing/scoping-with-claude ai delivery 8 min read
Jonatan Reiners Solutions Architect :: Premier AWS Partner
~/writing / scoping-with-claude
#ai-delivery 2026 — 04 — 02 8 min read

I scoped a fixed-price migration with Claude in the loop

Field notes: what it got right, where it padded the estimate by 1.4×, and the one prompt that fixed the number.

Most “AI for consulting” writing is speculation. This isn’t — it’s a log of one fixed-price migration estimate I built with Claude in the loop, including the part where it confidently handed me a number that was 1.4× too high.

What it got right

The structure, immediately. Given the discovery notes, it produced a defensible wave plan, surfaced three dependency risks I’d have found eventually, and drafted the assumptions register in the format I actually use. That’s a genuine hour saved on the parts that are mechanical, not the parts that are judgement.

Where it padded — 1.4×

Then it priced it. Every line item got a generic contingency — a flat buffer stapled to effort whether the line was risky or routine. Stack a blanket buffer on forty lines and it compounds: the bottom line came in at 1.4× a realistic number. Handed to a deal team unexamined, that estimate loses the deal or kills the margin. Neither is the model’s fault — it did exactly what an unconstrained “be safe” instruction implies.

The model doesn’t pad because it’s cautious. It pads because you didn’t make it justify the caution.

The prompt that fixed it

One instruction changed the output from unusable to sharp: separate effort from risk, and make every buffer name the risk it’s paying for.

prompt // estimate discipline
Split each line into effort (days at the blended rate) and risk buffer as separate figures. A line may only carry a buffer if you name the specific risk it covers and the trigger that would consume it. Lines with no named risk carry zero buffer. Show the two columns separately; do not fold them together.

With that constraint, the contingency collapsed onto the four lines that genuinely earned it — the undocumented apps, the data migration, the cutover window, the one integration nobody owned. The blanket buffer vanished. The total landed within 5% of where I’d have put it by hand, and — more useful — every euro of buffer now had a sentence explaining itself to the client.

The actual lesson

Claude didn’t replace the estimating judgement; it made the judgement explicit faster. The value wasn’t the first draft — it was that a one-line constraint turned a vague “be safe” into a buffer I could defend line by line. That’s the whole game in fixed-price work, and it’s exactly the discipline I’d argue for with or without a model in the loop.