How the work gets done

Audit Responder

Assembles the sourced, audit-ready record behind every classification and duty figure.

5 min readUpdated Jul 17, 2026

Status: LIVE — a grounded LLM agent. The Audit Responder assembles the sourced response to a CBP audit inquiry (CF-28 Request for Information / CF-29 Notice of Action), grounded in the entry record plus everything the other agents produced at filing time: HTS classifications + rationales, cited CROSS rulings, screening results, the duty stack, and the documents on file. Every assertion in the draft is tied back to a source it can cite.

The output is always a draft. The licensed broker reviews, edits, and signs it; the agent never submits to CBP itself.

What it does

Given a CF-28 (Request for Information) or CF-29 (Notice of Action) from CBP, the Audit Responder reads everything on file for the referenced entry — line items, HTS classifications + rationales, supporting CROSS rulings, screening results + dismissals, duty breakdown, broker corrections, and all uploaded documents — and produces a structured response package: cover letter, cited evidence list, suggested mitigation, and a reviewable draft for broker sign-off.

Along with the Drawback Advisor, it is one of the few agents in Commers that operates on historical data (entries already cleared and now under CBP scrutiny weeks or months later) rather than in-flight entries. Most agents fire before the broker transmits; this one fires when CBP comes back asking questions.

Brokers otherwise prepare CF-28 responses by hand — usually two to five hours per case, drawing on tribal knowledge of what CBP wants to see. Because the agent already has every artifact from the original entry indexed and grounded, it drafts the sourced response in minutes, leaving the broker to review and sign.

Inputs

{
  // The CBP request itself
  request: {
    type: 'CF-28' | 'CF-29',
    cbpRequestNumber: string,        // e.g. "CF28-2026-0101"
    receivedAt: string,              // ISO date
    dueBy: string,                   // ISO date
    narrative: string,               // raw CF-28 text — what CBP is asking
    cbpPayload?: string,             // original CBP letter or PDF text
  },

  // The shipment under review — fully hydrated
  shipment: {
    id: string,                      // STL-2496 / ENT-…
    importer: { name: string, ein: string },
    supplier: { name: string, country: string },
    portEntry: string,
    invoiceTotalCents: number,
    dutyCents: number,
    flags: string[],
    transmittedAt: string,           // when we filed Form 7501
  },

  // Everything the original entry's agents produced
  lines: LineItem[],                 // with HTS + confidence + rationale
  classifications: ClassificationResult[],
  citedRulings: CrossRuling[],       // CROSS precedents cited at classify time
  screeningResults: ScreeningHit[],  // including any dismissals
  screeningDismissals: ScreeningDismissal[],  // with broker's reason codes
  dutyBreakdown: DutyBreakdown,      // from tariff-intel/compute-duty
  documents: DocumentRef[],          // every invoice/PL/BoL on file

  // Broker context
  broker: { name: string, license: string, title: string },
}

Outputs

{
  responsePackage: {
    coverLetter: string,             // markdown, ~400-800 words
    citedEvidence: [
      {
        documentId: string,
        documentName: string,
        section: string,             // "Invoice line 3", "Packing list pg 2"
        excerpt: string,             // verbatim quote we're relying on
        supportsClaim: string,       // which assertion in the letter
      },
    ],
    suggestedActions: [
      { action: 'attach_doc' | 'request_supplier_attestation' | 'cite_ruling' | 'propose_reclassification' | 'accept_rate_advance',
        rationale: string,
        urgency: 'high' | 'medium' | 'low',
      },
    ],
    exposureAssessment: {
      riskBand: 'low' | 'medium' | 'high',  // likelihood of unfavorable outcome
      rationale: string,
      worstCaseDutyCents: number,    // if reclassified or rate-advanced
      worstCasePenaltyCents: number, // 19 USC 1592 exposure
    },
    confidence: number,              // 0-100, how confident the agent is
  },

}

The agent NEVER submits to CBP. The output is always a draft that the broker reads, edits, and signs before transmission.

When it runs

  • On demand from the audit screen — broker clicks "Prepare response" on an open CF-28/CF-29. Single fire per case.
  • Auto-trigger on case creation (optional, off by default) — when a CF-28 is ingested via email or manual entry, the agent can be configured to prep the package immediately so it's ready when the broker opens the case. Behind an org-level setting because each fire has a cost and brokers may not want it on every case.
  • Re-run on demand — broker can re-run with edited inputs (e.g. after attaching a newly-obtained supplier attestation).

How it's grounded

The agent runs on Anthropic's Claude with prompt caching. The full shipment context — line items, classifications, cited rulings, screening results, duty breakdown, and the documents on file — is large, so it is cached across reruns; that keeps a re-run (e.g. after a new supplier attestation arrives) materially cheaper than the first fire. Every sentence in the draft is grounded in that context and cites the source it relies on: the agent does not free-write claims it can't tie back to a document, a ruling, or a computed duty figure.

Dependencies

  • Document store — the agent needs access to the actual PDFs/images on file for the entry, not just metadata. Today documents are stored via the documents service in customs-clearance.
  • All original-entry agents' outputs, persisted at filing time — classifications, screening results, duty breakdown, line corrections. These already exist as DB rows; the responder just reads them.
  • CROSS rulings DB — for citing additional precedent the original classification may not have used but which now supports the position.

What success looks like

GoalWhat we hold it to
Cut broker time per CF-28/CF-29 responseDraft a sourced response in minutes rather than the hours a manual response takes, so the broker's work is review-and-sign
Broker accepts the draft largely as-isThe first draft should stand on its own with light broker editing
No fabricated citationsEvery cited ruling is validated against the rulings table before the draft is returned; a claimed ruling that doesn't exist is rejected
Don't make outcomes worseAgent-prepared responses should perform at least as well as a broker's own baseline

The CBP favorable-outcome goal is the one that matters long-term but takes many real cases before it can be measured meaningfully. The near-term signals are broker time saved and how much of the draft the broker keeps.

What it does NOT do

  • Does NOT submit responses to CBP. Broker always reviews + signs.
  • Does NOT invent evidence. Every cited document and excerpt must exist in the shipment's document store; Zod validates this at output time and rejects responses with phantom citations.
  • Does NOT invent CROSS rulings. Citation validation against the cross_rulings table — same pattern as the HTS Classifier.
  • Does NOT decide whether to accept a rate advance (CF-29) or fight it. Surfaces the exposure assessment; broker decides.
  • Does NOT predict CBP behavior. The "exposure assessment" is based on the strength of the evidence + the case type, not a model of how specific CBP officers behave.
  • Does NOT handle CF-29 penalty negotiation. That's an attorney conversation, not an agent task. Surfaces the exposure number with a "consult counsel" flag when worstCasePenaltyCents ≥ org-configured threshold.
  • Does NOT loop. One prompt in, one structured object out — same single-purpose pattern as every other Commers LLM agent.

Roadmap

  • Calibrated exposure bands — the exposure assessment's risk bands tighten as real CBP outcomes accumulate, so the low/medium/high call is anchored to observed results rather than evidence strength alone.
  • Auto-trigger on case creation, gated by an org policy toggle — prep the package the moment a CF-28/CF-29 is ingested. Cost rises with case volume, so some orgs will want it and some won't.
  • CBP outcome intake — a structured way to record how each case resolved (favorable / rate advance / penalty, with amounts) so the feedback loop closes and the favorable-outcome signal becomes measurable.
  • Eval harness analogous to the Classifier's: replay past CBP-favorable responses through the agent and measure how much of the draft the broker keeps and whether citations hold.
Ready to see it live?

Put your own book of entries through Commers.