UNSOURCED in its own description and it appears; get it
quoted, remove the marker, and it leaves. A hand-kept list of things to verify goes
stale exactly like the numbers it describes.
First because it gates the rest of the page. Nothing below can be answered with your own parts until it is done.
| Question | Why it blocks | Who |
|---|---|---|
| Who is allowed to see saved estimates? |
/estimates is open to anyone who finds the URL and holds
customer names, project numbers and quoted prices. Until this is
closed, real parts cannot go through the tool — which means the calibration
data in section 2 cannot start accumulating.
Cheapest fix is an nginx IP allow-list on /estimates and /admin/. No login system to build.
|
IT + you |
| One instance, or a separate training one? | A training instance keeps practice quotes out of the production database — same codebase, different data directory. On a single instance, every trainee's number becomes calibration data. | You |
These cannot be answered in a sitting. They accumulate in real time or not at all.
| Question | Why it decays | Who |
|---|---|---|
| What did these parts actually quote for? |
The only measurement that says whether the tool is right overall.
Because errors in the model can cancel each other out, no single rate below
can be validated on its own — only a finished estimate against a real quote.
There are currently zero real recorded actuals. A quote received last
month and not written down is gone.
The fields — price, supplier, tooling — are already built and waiting on every saved estimate. |
You / buyers |
| Which revision was quoted? | Recording an actual today overwrites yesterday's. If a part is re-estimated after a design change and compared against a quote for the previous revision, the resulting "error" is the design moving, not the model being wrong — and it biases the whole corpus one way. Needed before the corpus is built, not after. | Us — to build |
Ranking is by cost, so every recommendation inherits these. Ordered by how far each moves a landed price — measured with the Rate Sensitivity sweep, not guessed.
| Rate | Now | The problem |
|---|---|---|
| Machining — complex rate | $120/hr | Quote this one first. Any part needing more than 3 setups is priced at it, and real parts mostly need 8–13 — so it touches nearly everything while the base rate barely does. Moves landed cost +7.6% per 10%: ranked #1 of every constant in the tool. |
| Machining — base rate | $85/hr |
Above the entire published 3-axis band of $35–75. But it moves landed cost
only +0.6% per 10% — ranked #10, so it matters far less than it looks.
A rate above its band, on a model that under-counts time, is the signature of two errors cancelling. Do not correct it alone. |
| Injection molding — press rates above ~300 t | $125/hr at 1000 t |
The $0.6–1.2 per tonne rule of thumb implies $600–1,200/hr. The two agree at
100 t and diverge 5–10× by 1000 t.
Do not "fix" this from the rule — extrapolated, it implies $2,400/hr at 2000 t, which is not what large presses quote. |
| Sheet metal — bend time | 15 s | Corrected from 30 s against 503 real parts. Now the first number to check, because bend count is measured exactly and no longer absorbs an error here. |
Before writing a quoted number straight into the tables: correcting one rate without its underlying geometric driver can make the finished estimate worse. That has already happened here — a bend count reading 4 on a part with 16 real bends, against a bend time roughly 2× too high; fixing only the count flipped a part to the wrong process. Check the finished estimate against a real quote, not the constant against a published range.
Each prices something real that used to be counted as zero, so each is an improvement on nothing. None has been checked with a supplier.
| Constant | Value | What it is, and what to ask |
|---|---|---|
| tool_life_prototype im_tooling_constants |
10000 | Tool life in SHOTS for the prototype aluminium mold tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (aluminium 5k-100k) UNSOURCED - verify against your toolmaker |
| tool_life_production im_tooling_constants |
500000 | Tool life in SHOTS for the P20 steel production mold tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (P20 250k-1M) UNSOURCED - verify against your toolmaker |
| tool_life_hardened im_tooling_constants |
1000000 | Tool life in SHOTS for the hardened steel mold tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (H13/S7 1M+) UNSOURCED - verify against your toolmaker |
| hole_time_sec_base machining_constants |
6.0 | Fixed seconds per drill cycle for rapid/approach/retract/clear — dominates on small shallow holes UNSOURCED — verify against your shop |
| hole_feed_mm_per_sec machining_constants |
2.5 | Drilling feed through material (mm/s) blended across materials UNSOURCED — verify against your shop |
| accuracy turning_constants |
0.25 | ± price range shown around the point estimate. Turning is a simpler cost model than milling — one axis, one or two operations — but its rates are brand new and unverified, so the band is held at milling's 0.25 rather than tightened UNSOURCED - narrow this only once a turned part has been quoted against a real shop |
| turning_rate_vs_milling turning_constants |
2.0 | The per-material turning rates in turning_materials.csv were set at this multiple of the same alloy's milling removal rate. A lathe takes a continuous cut on a rigid, rotating workpiece and removes material substantially faster than an end mill, but the exact figure is an assumption, and it is the single biggest unanchored number in the turning model UNSOURCED - ask a turning shop what they hog 6061 at, and tune the material rows rather than this constant |
| cutting_time_buffer turning_constants |
1.10 | Multiplier on roughing time covering rapids, approach and retract between passes. Lower than milling's 1.15 because a lathe repositions far less — the tool stays engaged along the profile UNSOURCED - verify against your shop |
| bar_oversize_in turning_constants |
0.125 | Extra diameter bought over the finished OD. Bar stock comes in fixed sizes and arrives with mill tolerance and scale that has to be cleaned up on the first pass UNSOURCED - verify against your stockist |
| tube_bore_undersize_in turning_constants |
0.125 | How much SMALLER the bought tube's bore is than the finished bore. The mirror of bar_oversize_in on the inside: tube arrives with mill tolerance and scale on the ID too, and a bore machined to size needs material to take out. Without this the model buys tube whose ID is already the finished size, which leaves nothing to cut and prices the boring pass at zero UNSOURCED - verify against your stockist |
| finish_passes turning_constants |
1.0 | How many finishing passes the profile gets at the finish feed rate UNSOURCED - verify against your shop |
| soft_jaw_adder turning_constants |
150.0 | Per-lot cost of turning a set of soft jaws to hold a part that cannot run in a collet — a large OD, a thin ring, or a second-op grip on a finished surface UNSOURCED - verify against your shop |
| second_op_setup_minutes turning_constants |
20.0 | Extra setup minutes when the part has to come off the lathe for off-axis features — a second operation on a mill. Charged per lot like any other setup UNSOURCED - verify against your shop |
| tool_life_prototype thermoforming_tooling_constants |
5000 | Tool life in SHOTS for the wood or epoxy prototype tool tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (1k-10k) UNSOURCED - verify against your toolmaker |
| tool_life_production thermoforming_tooling_constants |
250000 | Tool life in SHOTS for the cast or machined aluminium tool tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (100k+; vacuum forming loads a tool far less than injection does) UNSOURCED - verify against your toolmaker |
| trim_time_production_sec thermoforming_process_constants |
10.0 | Automated in-line trim-press time per shot - production tooling. Stays FLAT on purpose: a dedicated trim die cuts the whole outline and every hole in one press stroke, so unlike router trimming it barely depends on trim path length UNSOURCED - verify against your shop |
| trim_time_prototype_sec thermoforming_process_constants |
15.0 | Manual/router trim HANDLING per part - prototype tooling (no dedicated trim die). Load, fixture and unload only: the cutting itself is now path-driven (trim_router_mm_per_sec below). Was 45.0 as a flat whole-trim figure, which charged a 200mm tray and a 1200mm panel the same UNSOURCED - verify against your shop |
| trim_router_mm_per_sec thermoforming_process_constants |
25.0 | Router feed rate when trimming a formed part without a dedicated die - prototype tooling only. Trim path length is measured from the model's parting-line loop, which on a formed part IS the trim line UNSOURCED - verify against your shop |
| trim_router_hole_sec thermoforming_process_constants |
8.0 | Added router seconds per hole or cutout - prototype tooling only (plunge, circle, retract). A production trim die punches holes in the same stroke as the outline, so this does not apply there UNSOURCED - verify against your shop |
| cut_overhead_sec sheetmetal_process_constants |
8.0 | Fixed per-part laser overhead - sheet positioning and rapid moves between features. Piercing was bundled in here at 15.0s until 2026-09-15 as one flat figure regardless of hole count; it is now counted per pierce below and this was reduced accordingly. Raising it without lowering pierce time would double-count UNSOURCED - verify against your shop |
| pierce_time_sec_base sheetmetal_process_constants |
0.8 | Laser pierce time per hole - the plunge that starts each closed contour before cutting begins. Cut length already includes hole perimeters (the flat pattern derives it from surface area) so this is the pierce ONLY not the cutting UNSOURCED - verify against your shop |
| pierce_sec_per_mm sheetmetal_process_constants |
0.35 | Additional pierce seconds per mm of gauge - a 6mm plate pierces far slower than 0.6mm sheet. Same shape as machining's hole_feed_mm_per_sec UNSOURCED - verify against your shop |
| post_processing_min_per_part additive_process_constants |
8.0 | Depowder / support removal / cleanup minutes per part UNSOURCED - verify against your shop. This is ~28% of the price of a small SLS part here, and a published worked example (25 cm3 PA12, 50-part batch) implies nearer 3 minutes rather than 8. Left at 8 for want of a second source, so it is deliberately generous - the first additive number to check. |
| tool_life_prototype investment_tooling_constants |
5000 | Tool life in SHOTS for the prototype wax die tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (1k-10k wax patterns) UNSOURCED - verify against your toolmaker |
| tool_life_production investment_tooling_constants |
100000 | Tool life in SHOTS for the aluminium wax injection die tier. Program shots are annual volume x program years divided by cavities; a program needing more shots than one tool lasts must buy another -- a $100k mold on a 1.5M-shot program at 500k life is $300k of tooling and not $100k. Published ranges are wide (50k-100k+) UNSOURCED - verify against your toolmaker |
| turn_max_swing_mm process_capability |
500 | CNC turning — largest diameter a typical lathe can swing over the bed UNSOURCED - verify against your shop's machine list |
| turn_finish_ra_um process_capability |
0.8 | CNC turning — best as-turned surface roughness Ra in micrometres without a secondary operation. Finer than milling: a continuous cut on a rotating part leaves a better surface than an interrupted one UNSOURCED - verify |
| tf_undercut_max_frac process_capability |
0.02 | Thermoforming - undercut share a single-sided tool can tolerate. It cannot form real undercuts AT ALL, so this is a noise allowance, not a design allowance. Was 0.10, which let a water pump housing through at 0.074 and recommended thermoforming for it as the CHEAPEST option, with no caveat. Measured across the fixtures: parts that genuinely form read ZERO (thermoformed_tray 0.0000, bucket 0.0000) and the noisiest non-forming part read 0.0077, against the housing's 0.0740. 0.02 sits an order of magnitude below the housing and 2.6x above the worst observed noise UNSOURCED - rests on ONE confirmed thermoformed part, same caveat as tf_draw_ratio_min |
| im_heat_set_insert im_secondary_ops |
0.08 / 0.25 / 45 | Heat-set insert (brass), installed. Cost is the insert, minutes are the install. Per INSERT UNSOURCED - verify against your shop |
| im_heat_stake im_secondary_ops |
0.00 / 0.15 / 260 | Heat or ultrasonic staking - a molded boss melted over to capture a second component. Per STAKE UNSOURCED - verify against your shop |
| im_ultrasonic_weld im_secondary_ops |
0.0 / 0.2 / 350 | Ultrasonic weld joint. Per JOINT. Setup is the horn and nest UNSOURCED - verify against your shop |
| im_pad_print im_secondary_ops |
0.02 / 0.15 / 180 | Pad printing, ONE color. A two-color mark is two of these. Per COLOR UNSOURCED - verify against your shop |
| im_paint_mask im_secondary_ops |
0.55 / 0.35 / 220 | Painted surface, including masking. Per PART UNSOURCED - verify against your shop |
| im_degate_hand im_secondary_ops |
0.0 / 0.18 / 0 | Hand degating and sprue dressing where the tool does not self-degate. Per PART UNSOURCED - verify against your shop |
| im_assembly im_secondary_ops |
0.0 / 0.45 / 70 | Assembling a second component (snap, screw, gasket). Per OPERATION, excludes the part being fitted UNSOURCED - verify against your shop |
| mach_deburr machining_secondary_ops |
0.01 / 0.4 / 0 | Hand deburr and edge break. Per PART UNSOURCED - verify against your shop |
| mach_anodize machining_secondary_ops |
0.45 / 0.1 / 95 | Anodize. Cost is the plater's line charge, minutes are racking. Per PART UNSOURCED - verify against your supplier |
| mach_plating machining_secondary_ops |
0.55 / 0.1 / 110 | Zinc or nickel plating. Per PART UNSOURCED - verify against your shop |
| mach_passivate machining_secondary_ops |
0.22 / 0.08 / 85 | Passivation for stainless. Per PART UNSOURCED - verify against your shop |
| mach_heat_treat machining_secondary_ops |
0.2 / 0.05 / 140 | Heat treat. Per PART, usually batched, so setup dominates at low volume UNSOURCED - verify against your shop |
| mach_bead_blast machining_secondary_ops |
0.05 / 0.25 / 40 | Bead blast or media finish. Per PART UNSOURCED - verify against your shop |
| mach_inspection machining_secondary_ops |
0.0 / 1.2 / 160 | First-article or CMM inspection. Per PART inspected, not per lot UNSOURCED - verify against your shop |
| turn_deburr turning_secondary_ops |
0.0 / 1.5 / 0 | Deburr and break sharp edges after turning. Per PART UNSOURCED - verify against your shop |
| turn_thread_single_point turning_secondary_ops |
0.0 / 2.5 / 0 | Single-point threading on the lathe. Per PART UNSOURCED - verify against your shop |
| turn_knurl turning_secondary_ops |
0.0 / 1.2 / 0 | Knurl a gripping surface. Per PART UNSOURCED - verify against your shop |
| turn_cross_hole turning_secondary_ops |
0.0 / 1.0 / 120 | Off-axis hole drilled in a second operation on a mill. Per PART, and the setup is what actually costs UNSOURCED - verify against your shop |
| turn_grind_od turning_secondary_ops |
0.0 / 4.0 / 180 | Cylindrical grind the OD to a tolerance turning cannot hold. Per PART UNSOURCED - verify against your shop |
| turn_anodize turning_secondary_ops |
0.65 / 0.1 / 65 | Anodize. Per PART, batched UNSOURCED - verify against your shop |
| turn_passivate turning_secondary_ops |
0.45 / 0.1 / 55 | Passivate stainless after machining. Per PART, batched UNSOURCED - verify against your shop |
| turn_heat_treat turning_secondary_ops |
1.20 / 0.1 / 140 | Heat treat and temper. Per PART, batched UNSOURCED - verify against your shop |
| dc_deburr_tumble diecasting_secondary_ops |
0.03 / 0.3 / 80 | Deburr and tumble. Media is the consumable, minutes are the handling share. Per PART UNSOURCED - verify against your shop |
| dc_machined_feature diecasting_secondary_ops |
0.05 / 0.45 / 120 | Machined feature after casting - a drilled and tapped hole, a faced datum. Per FEATURE UNSOURCED - verify against your shop |
| dc_shot_blast diecasting_secondary_ops |
0.04 / 0.2 / 70 | Shot blast to clean the as-cast surface. Per PART UNSOURCED - verify against your shop |
| dc_impregnate diecasting_secondary_ops |
0.12 / 0.1 / 150 | Vacuum impregnation to seal porosity. Usually only for pressure-tight castings. Per PART UNSOURCED - verify against your shop |
| dc_chromate diecasting_secondary_ops |
0.18 / 0.1 / 95 | Chromate or conversion coating. Per PART UNSOURCED - verify against your shop |
| dc_powder_coat diecasting_secondary_ops |
0.7 / 0.2 / 130 | Powder coat or paint. Per PART UNSOURCED - verify against your shop |
| dc_leak_test diecasting_secondary_ops |
0.02 / 0.5 / 240 | Pressure or leak test. Per PART tested UNSOURCED - verify against your shop |
| dc_trim_hand diecasting_secondary_ops |
0.0 / 0.35 / 0 | Hand trim of flash where there is no trim die. Per PART UNSOURCED - verify against your shop |
| tf_drilled_hole thermoforming_secondary_ops |
0.0 / 0.18 / 55 | Hole drilled after forming, BEYOND the router trim path. Per HOLE. Router trimming is already priced by trim_router_hole_sec - use this only for holes the trim step does not cut, or it double-counts UNSOURCED - verify against your shop |
| tf_edge_finish thermoforming_secondary_ops |
0.02 / 0.3 / 45 | Sanding or flame-polishing the trimmed edge. Per PART UNSOURCED - verify against your shop |
| tf_decorate thermoforming_secondary_ops |
0.06 / 0.1 / 120 | Applied label or printed mark. Per PART UNSOURCED - verify against your shop |
| tf_bonded_insert thermoforming_secondary_ops |
0.09 / 0.3 / 90 | Bonded or ultrasonically staked insert. Per INSERT UNSOURCED - verify against your shop |
| tf_joining thermoforming_secondary_ops |
0.15 / 0.55 / 180 | Bonding or welding two formed parts. Per JOINT UNSOURCED - verify against your shop |
| tf_die_cut thermoforming_secondary_ops |
0.01 / 0.12 / 260 | Die-cut detail added after forming. Per FEATURE UNSOURCED - verify against your shop |
| sm_pem_insert sheetmetal_secondary_ops |
0.11 / 0.12 / 40 | Pressed insert - PEM-style nut or standoff. Per INSERT UNSOURCED - verify against your shop |
| sm_weld_joint sheetmetal_secondary_ops |
0.02 / 0.55 / 90 | Welded joint. Per JOINT, not per part UNSOURCED - verify against your shop |
| sm_deburr sheetmetal_secondary_ops |
0.01 / 0.35 / 0 | Deburr and edge break. Per PART UNSOURCED - verify against your shop |
| sm_tapping sheetmetal_secondary_ops |
0.02 / 0.2 / 50 | Tapped hole. Per HOLE UNSOURCED - verify against your shop |
| sm_powder_coat sheetmetal_secondary_ops |
0.85 / 0.15 / 110 | Powder coat. Cost is the coater's charge, minutes are hanging and handling. Per PART UNSOURCED - verify against your supplier |
| sm_plating sheetmetal_secondary_ops |
0.4 / 0.12 / 100 | Zinc plating or chromate. Per PART UNSOURCED - verify against your shop |
| sm_silkscreen sheetmetal_secondary_ops |
0.07 / 0.12 / 140 | Silk screen or applied label. Per PART UNSOURCED - verify against your shop |
| sm_hardware_assy sheetmetal_secondary_ops |
0.0 / 0.4 / 60 | Fitting hardware that is not pressed - screws, standoffs, gaskets. Per OPERATION UNSOURCED - verify against your shop |
| am_support_removal additive_secondary_ops |
0.0 / 0.5 / 0 | Support removal and cleanup. Heavily geometry-dependent, this is a flat allowance. Per PART UNSOURCED - verify against your shop |
| am_bead_blast additive_secondary_ops |
0.04 / 0.2 / 35 | Bead blast to an even matte finish. Per PART UNSOURCED - verify against your shop |
| am_sanding additive_secondary_ops |
0.03 / 1.1 / 0 | Hand sanding toward a paintable surface. Per PART UNSOURCED - verify against your shop |
| am_vapor_smooth additive_secondary_ops |
0.3 / 0.15 / 180 | Vapor smoothing. Per PART, batched UNSOURCED - verify against your shop |
| am_dye additive_secondary_ops |
0.25 / 0.12 / 90 | Dyeing. Per PART, batched UNSOURCED - verify against your shop |
| am_paint additive_secondary_ops |
0.9 / 0.8 / 200 | Priming and painting. Per PART UNSOURCED - verify against your shop |
| am_heat_set_insert additive_secondary_ops |
0.08 / 0.3 / 45 | Heat-set insert into a printed part. Per INSERT UNSOURCED - verify against your shop |
| am_machined_feature additive_secondary_ops |
0.04 / 0.55 / 120 | Machined feature added after printing, where printed tolerance will not hold. Per FEATURE UNSOURCED - verify against your shop |
| ic_gate_removal investment_secondary_ops |
0.02 / 0.55 / 0 | Gate removal and grinding the witness flat. Per PART UNSOURCED - verify against your shop |
| ic_shot_blast investment_secondary_ops |
0.05 / 0.2 / 70 | Shot blast to clean the shell residue. Per PART UNSOURCED - verify against your shop |
| ic_heat_treat investment_secondary_ops |
0.25 / 0.05 / 160 | Heat treat. Per PART, batched UNSOURCED - verify against your shop |
| ic_straighten investment_secondary_ops |
0.0 / 0.6 / 50 | Straightening after heat treat. Per PART UNSOURCED - verify against your shop |
| ic_machined_feature investment_secondary_ops |
0.06 / 0.5 / 130 | Machined feature after casting. Per FEATURE UNSOURCED - verify against your shop |
| ic_passivate investment_secondary_ops |
0.22 / 0.08 / 85 | Passivation. Per PART UNSOURCED - verify against your shop |
| ic_penetrant investment_secondary_ops |
0.08 / 0.45 / 120 | Dye-penetrant inspection. Per PART inspected UNSOURCED - verify against your shop |
| ic_xray investment_secondary_ops |
0.0 / 0.8 / 420 | X-ray or radiographic inspection. Per PART inspected - usually a sample, not every part UNSOURCED - verify against your shop |
Set honestly against the one part available. One part can tell you a limit is not obviously wrong; it cannot tell you it is in the right place.
| Question | Where it stands | What would settle it |
|---|---|---|
| When is a part too shallow to thermoform? | Minimum area draw ratio 1.8 — set between the deepest molded part measured (1.6) and the one confirmed thermoformed part (2.1). | A shallow thermoformed part: a blister, lid or clamshell. If one reads below 1.8, the tool is currently rejecting work it should be quoting. |
| When does a thermoformed wall thin too far? | Two limits nobody chose against each other: the estimator warns at draw ratio 2.0, the screen rejects at 2.5. The one confirmed thermoformed part sits at 2.07 — it passes the screen, then warns about itself. | A second thermoformed part, then pick one definition and keep it. |
| Do turned parts and die castings price correctly? | Neither has a real fixture in the test set. Every other process does. | One turned part and one die casting, ideally with a known quote. |
| Decision | What hangs on it |
|---|---|
| On a multi-body model, which body is screened? | The estimator panels make you pick a body. The process screen does not — it silently uses the first one, while pairing it with the whole model's volume and surface area. A process can be ruled out on a body you never picked. Either screen the whole assembly, or make the picker ask first, the way the panels already do. |
| Should there be a "lite" estimate? | A ballpark from fewer inputs. Worth doing only if it shares one engine with the detailed estimate and differs by a wider uncertainty band rather than a different number — otherwise the tool has two answers for one part and no way to say which is right. |
| How wide should the accuracy band be? | A fixed ±25% on machining today, from your own figure. A band that widens when the tool had to assume more would be honest; right now it reads the same whether every input was measured or defaulted. |
Sections 1–3 change what this tool is worth. Sections 4–7 are the detail underneath them.