Recover high-intent HVAC inbound before slow response, tribal routing, or a missed SLA burns the job.
Canonical workflow: inbound lead → validation → bounded classification → policy-safe acknowledgment → routing → SLA → escalation or human resolution.
Maturity: fixture-backed + internally tested + browser-verified. No live SMS provider or paid model was called.
./scripts/bootstrap
./scripts/demo # http://127.0.0.1:3451
./scripts/verifyProof: proof/report.md
After-hours web form (“furnace is out”) → fixture/model classification inside a closed HVAC schema → one policy-safe acknowledgment and after-hours dispatch queue → no invented ETA, no second text on replay, SLA breach escalates to the owner → dispatcher or owner records the human outcome.
Not a CRM, marketing suite, outbound dialer, or call-center platform. It is the response spine for inbound HVAC demand.
| Kind | Examples |
|---|---|
| Authoritative facts | Phone, message text, timestamps in the event log |
| Deterministic policy | Validation, ack templates, queues, SLA minutes |
| Model inference | Category + confidence; rejected if schema-invalid |
| Human decisions | Discard, resolve, reclassify, forced route |
Ambiguity, spam, missing contact, route conflict, and invalid model output fail safe to waiting_human.
Northline Heating & Air, an independent residential HVAC shop. After-hours emergency and quote requests currently die in a shared inbox.
Event log: data/store.json after a demo run. Domain: lib/domain/. Evaluation goldens: lib/fixtures.ts.
