Turn messy remodeling intake into a reviewable client/project record — or keep it blocked until a person settles the evidence.
Canonical workflow: messy intake → extraction → normalized record → validation → missing/conflicting data → clarification/review → approved client/project record.
Maturity: fixture-backed + internally tested + browser-verified. No live inbox or paid model was called.
./scripts/bootstrap
./scripts/demo # http://127.0.0.1:3453
./scripts/verifyProof: proof/report.md
Web form + follow-up email + site worksheet PDF arrive for the same household → fixture extractor maps each source to fields with confidence and evidence spans → deterministic merge flags budget/scope conflicts and a missing phone, and drops a hallucinated HOA contact → reviewer compares source text with the normalized row, chooses a winner or asks for clarification → only human approval writes an authoritative job file.
Not a document management system, CRM, project-management suite, OCR product, or generic RAG app. It is the intake spine for Redwood Remodeling, a residential remodeling shop.
| Kind | Examples |
|---|---|
| Authoritative facts | Normalized fields only after human approval |
| Model inference | Fixture extraction with confidence + evidence; extra keys rejected |
| Deterministic policy | Required fields, ZIP, dates, budget-as-number, contradiction rules |
| Human decisions | Approve, reject field, choose contradiction winner, request clarification |
Critical ambiguity (budget, contact, scope) cannot silently become the job file.
Redwood Remodeling, an independent residential remodeler in Mill Valley. Kitchen and bath bids currently live as a web form, a follow-up email, and a handwritten-style site worksheet that the office re-types by hand.
Event log: data/store.json after a demo run. Domain: lib/domain/. Packets and goldens: lib/fixtures.ts. Generated PDFs: fixtures/pdfs/ after bootstrap.
