Install
openclaw skills install @voronindenis5/contractor-quote-duelUse when comparing 2-4 contractor bids for the same home project (roof, kitchen, HVAC, floors...) — builds the scope-x-bidder matrix exposing what each quote silently omits, sanity-checks unit prices against ballpark bands (catches both padding and lowball-then-change-order bids), scores deposit/payment-schedule risk (30% deposit norm, pre-completion exposure, insurance/licensing), checks quote documentation completeness per trade, and drafts the scope-gap clarification email per bidder.
openclaw skills install @voronindenis5/contractor-quote-duelThree quotes for "the same" roof project are rarely the same project. One bids 1,900 sq ft of shingles and nothing else; one includes gutters and skylight flashing; one is $4k cheaper because tear-off disposal is a change order waiting to happen. Homeowners compare totals — the single most misleading number in the stack — because building a scope matrix by hand across PDFs is tedious. This skill does the comparison mechanics: scope union, gap exposure, unit-price outliers, payment risk, and the clarification emails that turn apples/oranges into a decision.
Don't use for: new construction custom builds (different economics — cost-plus vs fixed-price needs a contract review, not a comparison matrix); storm-chaser door-knockers (walk away, don't analyze); anything needing a structural engineer's stamp (get the engineer).
matrix — scope union × bidder grid; every "— MISSING" cell is
a scope gap you'd discover as a change order. Plus documentation
completeness per trade (roof quotes without ice/water shield specs,
kitchens without permit responsibility, HVAC without load calc).pricecheck — unit price = price/qty vs ballpark band per trade.
1.6× band high = padding; < 0.5× band low = lowball — the classic change-order bait.
risk — deposit & payment-schedule exposure. Deposit >30%,
nothing written, >60% due before completion, uninsured: LOW/MEDIUM/HIGH.letter — scope-gap clarification email per bidder listing
exactly what competitors included that they didn't, plus the four
questions (payment schedule, timeline, permits, labor warranty).Q='[{"bidder":"Alpha Roofing","total":9500,"deposit_pct":10,"insured":true,
"items":[{"item":"asphalt roof replacement","price":9500,"qty":1900}],
"docs":["tear-off layers and disposal included"]},
{"bidder":"Beta Exteriors","total":14200,"deposit_pct":50,"insured":false,
"items":[{"item":"asphalt roof replacement","price":11800,"qty":1900},
{"item":"gutter replace","price":1200,"qty":80}],"docs":[]}]'
python3 scripts/quote_duel.py --quotes-json "$Q" matrix
python3 scripts/quote_duel.py --quotes-json "$Q" pricecheck
python3 scripts/quote_duel.py --quotes-json "$Q" risk
python3 scripts/quote_duel.py --quotes-json "$Q" letter --bidder "Alpha Roofing" --project "roof replacement"
references/trade-scope-checklists.md — what a complete quote must
contain per trade (roof/kitchen/bath/HVAC/electrical/structural),
allowance traps, contract clauses that survive disputes, and the
lowball-bid pattern catalog.