Audit Responder
Assembles the sourced, audit-ready record behind every classification and duty figure.
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
documentsservice 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
| Goal | What we hold it to |
|---|---|
| Cut broker time per CF-28/CF-29 response | Draft 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-is | The first draft should stand on its own with light broker editing |
| No fabricated citations | Every 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 worse | Agent-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_rulingstable — 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.
Put your own book of entries through Commers.