---
title: Adaptive Calibration & environments
description: Teach ARCNM your shop. Costing environments group your fleet, rates, and historical observations.
---

# Adaptive Calibration and environments

Out of the box, ARCNM prices parts against industry-standard
benchmarks. **With one batch of your own historical observations,
Adaptive Calibration learns your shop** — your machines, your
operators, your overhead, your supplier rates — and stays aligned as
your reality shifts.

Every quote you accept, every realised cost you push back, every
correction your estimators make is fed into the next calibration
cycle. The model gets sharper with use.

This is the defensible difference between a generic quoting engine
and a tenant-specific cortex.

---

## Costing environments

A **costing environment** is a tenant-scoped bundle of:

| Component | Holds |
|---|---|
| Fleet machines | Hourly rate, capacity, axis count, RPM ceiling, capability |
| Labour rates | EUR / hour, per discipline / shift |
| Overhead rates | Variable + fixed, VDI 3258-compatible schema |
| Material catalogue | EUR / kg, density, machinability, supplier SKU |
| Default materials | Per discipline |
| Calibration data | Your observed prices, fed back as targets |

An org can have any number of environments. Typical setup:

- `production` — real machines, real rates, attached to every customer quote.
- `staging` — sandbox prices used by CI / pre-flight.
- `subcontractor_a` — alternate fleet for outsourced work.

Set the env per calculation:

```json
{
  "part_revision_id":      "1f…",
  "costing_environment_id":"env_2a…"
}
```

### Parent environments

Environments support a **parent chain** — override only what differs
from the parent (a night-shift labour rate, for example) and inherit
everything else.

```
production
  └── production-night-shift   (overrides labour rate)
      └── production-night-shift-2025-q4  (overrides electricity cost)
```

The cascade walks the chain until a tier resolves.

---

## Parameter resolution

Every cost coefficient resolves through a strict precedence order.
First match wins. **No silent defaults** — a parameter that can't
resolve raises `parameter_unresolved` on the request rather than
emitting a suspiciously low price.

Resolved values are wrapped with full provenance: every quote is
traceable back to *which source supplied which number*.

```json
{
  "feed_rate_mm_min": {
    "value":      450.0,
    "source":     "environment_calibration",
    "provenance": {
      "env_id":   "env_2a…",
      "samples":  42,
      "interval": [410.0, 490.0]
    }
  }
}
```

Sources, in precedence order:

1. **Manual override** on the environment (operator-set).
2. **Parent override** (inherited via the parent chain).
3. **Environment calibration** (learned from your observations).
4. **Platform default** (industry-standard benchmark).

If you've never calibrated, every parameter resolves at tier 4 — you
still get a defensible quote from published-literature benchmarks.

---

## Calibration

You give ARCNM a batch of **"target prices"** for parts you've already
costed externally (your ERP, an external quote, an internal
cost-engineer estimate), and the environment adapts so the next quote
lands within tolerance. Drive it from the dashboard
(**Environments → Calibration**) or over the API — see
[Teach an environment from your actuals](../recipes/teach-from-actuals.md).

Observations that fall outside a conservative safe band are **logged and
suppressed**, not applied — a value far outside the expected range
almost always signals a data-entry error or a misclassification, not a
real cost shift. The dashboard surfaces what was applied vs suppressed.

### When to recalibrate

- After hardware changes (new machine, new fixture, retired equipment).
- Quarterly, as a hygiene cycle.
- When the drift detector fires (see below).

20-40 observations per discipline is enough to tighten the
environment's intervals materially.

---

## Drift detection

ARCNM watches the live stream of quotes against any realised target
prices you push back. When the model and reality diverge:

- The dashboard surfaces a `Drift` badge on the environment.
- A re-calibration run is recommended.

---

## Conformal intervals

Every resolved parameter carries a conformal-prediction interval. The
interval widens when the evidence is thin and tightens as data
accumulates:

```json
{
  "labour_rate_eur_per_hour": {
    "value":   38.50,
    "interval": [37.10, 39.90]
  }
}
```

The cost itself comes with a quote-level interval (alongside the
`unit_cost` on the calculation result):

```json
{ "unit_cost": 12.84, "currency": "EUR", "interval": [11.95, 13.85] }
```

Use the interval to:

- Show "± €0.95" on a quote PDF.
- Set a quote-buffer for a high-confidence margin.
- Trigger a re-quote when the interval is too wide for the customer.

Where platform + environment evidence both apply, ARCNM reports a
**conservative** interval rather than the tightest one it could. You'd
rather your quote say "± €1.20" than under-promise tightness that
doesn't exist.

---

## See also

- [Concepts → Extraction](./extraction.md) — what feeds the cost model.
- [Concepts → Cost and lot-size](./cost-and-lot-size.md) — where rates land.
- [Concepts → Audit & provenance](./audit-provenance.md) — every source visible.
- [API → Calibration](../api/calibration.md) — every calibration endpoint.
- [Recipe → Teach from your actuals](../recipes/teach-from-actuals.md) — calibrate over the API.
