Address in, bill of materials out.
For estimating AWP's jobs, not for producing plans. Type a location and a TA number, get the cones, signs and devices. Quantities drive the labour estimate later.
The last number is the one that matters. Only Arizona TA-33 and TA-30R are
checked against real exports. The other 16 templates are federal figures wearing state
numbers, and every response says so by returning declared fallback.
Cone counts are fitted to two jobs with no held-out test. Signs and devices derive exactly; cones are 44–64% derivable and the rest is a rate. Coverage is breadth, not accuracy.
Watch
Two and a half minutes for both. The first is the tool; the second is the reason it exists.
A job in, a bill of materials out — and the three cone numbers on the answer, only one of which is safe to quote.
One job run in federal, Maryland, Kansas and Nevada. 36 devices becomes 80, cones become drums, and one state returns the federal number unchanged.
1Run it
Three ways in. All of them reach the same engine.
Command line — no key, no network
python3 bom/bom_estimate.py --ta ta-33 --speed 55 --zone-length 2000 \
--jurisdiction maryland --summary
Drop --summary for JSON. --ta, --speed and
--zone-length are the job; everything else has a default that prints in the
assumptions block. Useful extras: --night, --duration-hours and
--road-type freeway, because those are what the device gates read.
HTTP
curl -s -u name:password -X POST https://bom-dev.apps.keryk.ai/estimate \
-H 'Content-Type: application/json' \
-d '{"ta":"ta-33","jurisdiction":"maryland","speed_mph":55,"zone_length_ft":2000}'
Pass address instead of speed_mph and it geocodes, which is the
only path that needs the key. speed_mph overrides the geocoder when you already
know the posted speed.
The page
Same host, root URL. The bill of materials is the page; everything justifying it hides behind one disclosure. Every page and every API call needs a username and password.
Tests
./run-tests.sh
Under a second, stdlib only, nothing touches the network. It runs the engine-gap tests, the spot snapshot, the two Arizona calibrations and the coverage count.
2Read the answer
Four numbers come back for channelizing devices. They are not interchangeable and the difference between them is the honest part of this tool.
- Derived from the standard line_devices
- Pure algebra off the standard. This is the defensible number. Diff against the ta-bom track using this one, never the point estimate.
- Likely on site estimate_low / estimate_high
- Line devices plus the site allowance band — driveways, side streets, the funnels a real job grows. This is the range that prints on the BOM line, not the number above it.
- Point estimate point_estimate
- A rate fitted against two real jobs. Read it as "the fit", never as "the accuracy".
- Load the truck order_quantity
- The high end rounded up to ten. This is what to put on a truck.
- Share that is algebra derivable_share
- Read this first. What fraction of the estimate is algebra rather than allowance. 64% on the Gilbert job, 44% on Chandler.
Governing sheet — read it backwards
The word governing is not the good outcome. It appears only on a
federal run, which means no state ruleset was applied at all. A state run reads
declared fallback: the component list is the federal figure, and only the
numbers — taper, buffer, sign spacing, device type — are that state's. Both are
honest. Neither is a state's own drawing. None has been transcribed yet.
When it will not answer
Two refusals, and they are the product working, not the product failing.
- no speed limit available
- The map lookup came back without a speed. Type the posted speed and run it again. The tool never invents one, because the speed band moves every quantity on the page.
- no jurisdiction available
- The address did not resolve, so nobody's rules can be chosen. Fix the location or pick the state. It will not quietly fall back to federal — federal is a different rulebook, not a safe default.
A third case is not a refusal and is easy to miss: a state with no overlay answers normally, as plain federal, with an orange banner. Do not present that as the state's standard.
Where the speed came from
Every answer now names its speed source on the surface. Best first:
- state DOT / local GIS road-attributes layer
- A published record. Measured.
- the road's own OpenStreetMap speed tag
- A real value someone entered, and it can be years out of date. Measured.
- the national HPMS road inventory
- A published record, Federal-Aid roads only. Measured.
- OSM highway-class default table
- Estimated.
- lookup by highway tag plus urban/rural
- Estimated, and not tuned against production data.
Nothing in this tool reads a posted sign. Every speed is either a record or an assumption. Check it against the sign before you order.
3The jurisdiction layer
This is the part a federal-shaped engine does not have, and the reason the tool is worth keeping. The same job, run in every jurisdiction, on a TA-33 at 55 mph over 2,000 ft.
41 come in above federal, 9 match it exactly, and 7 come in under. The matches are a finding, not a failure — those states genuinely defer, and each one says so in its sources rather than inventing a deviation.
| jurisdiction | devices | vs fed | taper ft | buffer ft | sign A ft | tangent sp | device |
|---|---|---|---|---|---|---|---|
| hawaii | 220 | +184 | 700 | 335 | 1000 | 55 | cone |
| arkansas | 100 | +64 | 660 | 500 | 1000 | 25 | cone_28in |
| new-york | 89 | +53 | 680 | 495 | 500 | 40 | cone |
| florida | 88 | +52 | 660 | 495 | 500 | 50 | cone |
| alabama | 86 | +50 | 660 | 495 | 500 | 50 | drum |
| charlotte | 83 | +47 | 350 | 350 | 350 | 40 | cone |
| maryland | 80 | +44 | 660 | 495 | 800 | 40 | drum |
| mesa | 63 | +27 | 660 | 0 | 500 | 50 | vertical_panel |
| south-carolina | 63 | +27 | 700 | 400 | 500 | 50 | cone |
| iowa | 60 | +24 | 770 | 600 | 1000 | 100 | channelizer_42in |
| kentucky | 60 | +24 | 680 | 495 | 500 | 80 | cone |
| nevada | 58 | +22 | 660 | 495 | 1000 | 55 | cone |
| south-dakota | 58 | +22 | 660 | 495 | 750 | 80 | cone_42 |
| tennessee | 57 | +21 | 780 | 495 | 1000 | 80 | drum |
| kansas | 55 | +19 | 660 | 495 | 500 | 110 | cone |
| georgia | 54 | +18 | 660 | 300 | 500 | 80 | drum |
| louisiana | 54 | +18 | 660 | 495 | 1000 | 80 | drum |
| ohio | 54 | +18 | 660 | 495 | 500 | 80 | cone |
| virginia | 53 | +17 | 660 | 495 | 1000 | 80 | cone |
| washington | 53 | +17 | 680 | 495 | 500 | 80 | drum |
| connecticut | 52 | +16 | 800 | 500 | 1000 | 80 | drum |
| arizona | 48 | +12 | 660 | 0 | 500 | 80 | vertical_panel |
| tempe | 48 | +12 | 660 | 0 | 660 | 80 | vertical_panel |
| west-virginia | 48 | +12 | 660 | 495 | 500 | 100 | cone |
| wisconsin | 48 | +12 | 660 | 495 | 1000 | 100 | drum |
| montana | 47 | +11 | 960 | 495 | 500 | 110 | drum |
| maricopa | 46 | +10 | 660 | 0 | 500 | 80 | vertical_panel |
| pennsylvania | 46 | +10 | 660 | 495 | 350 | 110 | cone |
| illinois | 44 | +8 | 660 | 500 | 1500 | 100 | cone_28in |
| indiana | 42 | +6 | 660 | 495 | 500 | 100 | cone |
| michigan | 42 | +6 | 660 | 329 | 550 | 100 | drum |
| mississippi | 42 | +6 | 660 | 495 | 1000 | 110 | cone |
| massachusetts | 41 | +5 | 660 | 495 | 1000 | 110 | cone |
| nebraska | 40 | +4 | 660 | 495 | 1000 | 110 | drum |
| utah | 39 | +3 | 660 | 495 | 500 | 110 | drum |
| vermont | 39 | +3 | 660 | 495 | 1000 | 110 | cone |
| colorado | 38 | +2 | 660 | 495 | 1000 | 110 | cone |
| minnesota | 38 | +2 | 660 | 495 | 750 | 100 | cone_28in |
| new-jersey | 38 | +2 | 660 | 100 | 500 | 110 | cone |
| oregon | 38 | +2 | 660 | 250 | 500 | 110 | cone_28in |
| rhode-island | 38 | +2 | 660 | 340 | 500 | 110 | cone |
| alaska | 36 | 0 | 660 | 495 | 500 | 110 | drum |
| federal | 36 | — | 660 | 495 | 500 | 110 | cone |
| idaho | 36 | 0 | 660 | 495 | 500 | 110 | cone |
| maine | 36 | 0 | 660 | 495 | 500 | 110 | drum |
| missouri | 36 | 0 | 660 | 495 | 500 | 110 | cone_42 |
| new-hampshire | 36 | 0 | 660 | 495 | 500 | 110 | drum |
| new-mexico | 36 | 0 | 660 | 495 | 500 | 110 | drum |
| north-carolina | 36 | 0 | 660 | 290 | 500 | 110 | drum |
| north-dakota | 36 | 0 | 660 | 495 | 750 | 110 | cone |
| wyoming | 36 | 0 | 660 | 495 | 500 | 110 | cone |
| delaware | 35 | -1 | 660 | 0 | 1000 | 110 | cone |
| oklahoma | 35 | -1 | 660 | 495 | 500 | 100 | cone |
| california | 34 | -2 | 660 | 495 | 500 | 100 | cone_28in |
| gilbert | 34 | -2 | 660 | 0 | 500 | 110 | vertical_panel |
| texas | 34 | -2 | 660 | 295 | 1000 | 110 | cone |
| chandler | 33 | -3 | 660 | 0 | 660 | 110 | vertical_panel |
| phoenix | 33 | -3 | 660 | 0 | 660 | 110 | vertical_panel |
Where a gate fires
Tell the engine a job runs at night and for four days and these states change what you are pricing. The count barely moves; the unit cost does.
- alabama drum
- alaska drum
- arizona vertical_panel
- arkansas cone_28in
- california cone_28in
- chandler vertical_panel
- colorado cone_36in
- connecticut drum
- georgia drum
- gilbert vertical_panel
- illinois drum
- indiana drum
- iowa channelizer_42in
- kansas drum
- kentucky drum
- louisiana drum
- maricopa vertical_panel
- maryland drum
- mesa vertical_panel
- michigan drum
- minnesota cone_42
- missouri cone_42
- montana drum
- nebraska drum
- new-jersey drum
- new-mexico drum
- north-carolina drum
- ohio drum
- oregon cone_28in
- pennsylvania drum
- phoenix vertical_panel
- south-carolina cone_42
- south-dakota cone_42
- tempe vertical_panel
- tennessee drum
- utah drum
- washington drum
- west-virginia drum
- wisconsin drum
- wyoming cone_42
The number to lead with
Maryland more than doubles the federal device count on that job, 80 against 36. Illinois is higher still at 89. Those are the ones to put on a slide.