CIRCA is an Alexa+ add-on that checks a contractor's quote before you pay. It tells you what is established and what still needs checking, writes a fair request for a second opinion, compares two quotes line by line, and holds the scope you agreed to. It reports on documents, never on people, and it raises no false alarms: 0 of 24 ordinary repairs flagged.

A roofer knocks, names $6,500, asks for $3,000 today and warns that water could get in tonight. The homeowner has one number and no way to check it. I audit for a living, and the first rule of an audit finding is that two numbers are not comparable until their scopes match. CIRCA applies that rule at the door.

Two Echo Show cards from CIRCA Two Echo Show cards: the checklist after the first quote, and the comparison after the second.

Why it matters

  • Homeowners decide at the door. A roofer knocks, names a price, asks for a deposit today and warns that water could get in tonight. The customer has one number and no way to check it.
  • A second opinion has to start fresh. It is only independent if the assessor has not seen the first price and diagnosis.
  • Price gaps mislead. Two quotes for "the roof" often price different work, so the difference says nothing until the scopes line up.
  • Disputes come later. Three weeks in, the crew asks for more money, and nobody wrote down what was agreed.

CIRCA covers all four, in one conversation with Alexa.

What it does

From offer to change orders One record, from the first offer to the last change order.

  • A checklist before you decide. Eighteen deterministic checks run on the offer, sixteen of them citing published FTC or AARP consumer guidance. Every check reports CLEAR, VERIFY, ATTENTION or NOT_APPLICABLE, and every check is shown.
  • A clean second opinion. CIRCA writes the assessment request itself, removes the first contractor's price, name, urgency claim and diagnosis, and shows the customer what it removed and why.
  • A line-by-line comparison. CIRCA splits the gap between two quotes into work only one quote proposes, the same work at a different price, and money neither quote accounts for.
  • A baseline for the whole job. The accepted scope is stored, and every later change is measured against it.

The moment that matters: CIRCA says "not yet"

The first quote is $6,500 as a single price. The independent assessment is $1,850, itemised. A naive tool would call the $4,650 difference an overcharge. CIRCA does not: a single price cannot be compared line by line, so it asks for the same quote with a price on each line.

The contractor sends it, and the same call, on the same code, now answers:

Where the $4,650 goes $4,030 is work only the first quote proposes. $420 is the same work at a different price. $200 sits on one line CIRCA could not classify, "Seal penetrations": that is the line to ask about.

CIRCA's advice produced the document that made the answer possible. Of 14 labelled quote pairs in the evaluation corpus, 6 need line items before they can be compared, and CIRCA identifies all 6 with no false positives.

How it works

  • A taxonomy of home-repair work. Quote text is normalised into work units: 103 components across five trades and 861 lexical forms, with subsumption, so "full roof replacement" is understood to contain the eight shingles the other quote prices.
  • Structure first. Two itemisation thresholds and three comparison thresholds decide what a comparison can support. Five named reasons cover quotes that need more detail, each with its own remedy, so the customer always knows the next document to ask for.
  • Facts, not judgements. ATTENTION needs a positively recorded condition, which is why ordinary repairs raise no alarms. Thirteen language patterns that would turn a finding into a judgement of a person are blocked in code; every rule statement and every spoken sentence passes that check.
  • One answer for every surface. MCP, the CLI and the Alexa+ host read the same payload: the sentence to speak and the rows to draw. A voice-only device gets the complete result.
  • Contractor documents are contained. A contractor's text enters through one function as untrustedText. Where a model reads it, it sits inside a nonce-delimited envelope, and the model's proposed structure is filtered: every line and every amount must appear in the document, and the work units are re-derived by the deterministic parser.

Results

Measured results Every figure comes from a command in the repository: pnpm eval, pnpm bench, pnpm demo.

tests 121, plus a clean typecheck, on every push pnpm verify, GitHub Actions
protocol negotiated 2025-11-25, by a real SDK client on a real socket tests/mcp-conformance.test.ts
false alarms on 24 ordinary repairs 0 % pnpm eval
ATTENTION precision / recall 100 % / 100 % "
quote pairs needing line items, 6 of 14 100 % recall, 100 % precision "
verdict / alignment accuracy 100 % / 100 % "
prompt-injection containment failures 0 of 16 attacks, 0 control false positives "
second-opinion requests leaking the first quote 0 across 48 scenarios "
held-out estimates: priced lines read / mapped to their work 94.6 % / 73.1 % of 24, labelled before they were read pnpm eval --holdout
slowest tool at p95 6.2 ms against the 500 ms Alexa+ budget, 360 calls over the wire pnpm bench
demo 14 real MCP tool calls, 48 ms pnpm demo
DynamoDB GetItem, real table p50 102 ms, p95 104 ms docs/AWS.md
Bedrock voice rephrasing, openai.gpt-oss-120b 3 of 3 accepted by the guard, 3.1 to 4.3 s pnpm check
uploaded quote, real S3 bucket, over MCP same $4,030 / $420 / $200 answer; add_quote 137 ms; another user's key refused pnpm upload:check

Transfer to unseen documents. A held-out set of 24 estimates, labelled against a frozen engine and committed before it read them, covers estimate-software columns, an insurance supplement, handwritten tickets, UK and Australian quotes, emails, text messages and good/better/best tiers. CIRCA reads 94.6 % of priced lines and maps 73.1 % of them to the work they propose. Money on work outside the taxonomy (23 %) is carried as unclassified, so a comparison never attributes it. docs/EVAL.md lists every case by name.

Built for Alexa+

  • A self-hosted MCP server on protocol 2025-11-25 over Streamable HTTP, with sixteen tools.
  • Six MCP Apps views for the Echo Show, and a spoken answer that carries the complete result on a voice-only device.
  • OAuth 2.1 account linking, matched to the Alexa+ account-linking page, which sends resource on authorization and token exchange but not on refresh.
  • An Alexa+ host built on the MCP SDK's own client, so the whole add-on can be driven in a browser.

Try it: https://circa-o9ty.onrender.com (the host sleeps when idle, so the first load takes about a minute)

Built With

Share this project:

Updates

Submission history