How the work gets done

Audit Responder

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

7 min readUpdated Aug 6, 2026

Status: LIVE. The Audit Responder drafts the response to a CBP audit inquiry (CF-28 Request for Information / CF-29 Notice of Action), grounded in two things: the entry record (line items, HTS classifications, screening results, duty, and the documents on file) and a retrieved corpus of the governing law. Every assertion ties back to a source, and every legal citation resolves to a retrieved authority — the agent does not invent statutes or ruling numbers.

Two speeds, one surface:

  • Quick draft — an instant, deterministic template. The fast default; no model call.
  • Deep review — the real LLM agent. Reasons over the entry and the retrieved authorities, drafts a filing-grade cover letter, assesses exposure, and proposes executable next actions. Adaptive effort escalates for high-stakes cases (UFLPA / Entity-List / high-value).

The output is always a draft. The licensed broker reviews, edits, and signs it; the agent never submits to CBP itself and never sends a request on the broker's behalf.

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 Aduaria 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
      },
    ],
    // Executable next actions — each is one-click in the UI
    suggestedActions: [
      { kind: 'draft_request' | 'attach_doc' | 'cite_ruling' | 'reclassify' | 'accept_rate_advance' | 'other',
        title: string,               // "Request supplier attestation"
        rationale: string,
        urgency: 'high' | 'medium' | 'low',
        target?: 'supplier' | 'importer' | 'internal',  // who a request goes to
        docType?: string,            // what an attach expects
        citation?: string,           // governing authority for this action
        draftEmail?: { subject: string, body: string },  // a ready-to-review request
      },
    ],
    // Evidence the response depends on that isn't on file yet — the chase list
    missingEvidence: [
      { docType: string, label: string, why: string },
    ],
    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 "Quick draft" (instant template) or "Deep review" (the LLM agent) on an open CF-28/CF-29. A badge marks each draft's provenance.
  • Re-run on demand — broker can re-run with edited inputs (e.g. after attaching a newly-obtained supplier attestation).

How it's grounded

Two kinds of grounding, both supplied to the model at draft time — the law lives in the prompt, not the model's weights, so citations are exact and current and can be updated without retraining.

1. The entry record. The full shipment context — line items, classifications, screening results, duty breakdown, and the documents on file — is passed in and prompt-cached across re-runs (so a re-run after new evidence arrives is materially cheaper than the first). Every factual claim ties back to this record; evidence not on file is flagged as a gap, never asserted.

2. A retrieved knowledge base. Before drafting, the agent retrieves from two corpora and is instructed to cite only from what it is given:

  • Authorities — the governing law, retrieved by inquiry type: the UFLPA rebuttable-presumption / clear-and-convincing standard (19 U.S.C. § 1307, Pub. L. 117-78) and CBP's Operational Guidance, § 1592 penalties, §§ 1508–1509 recordkeeping, § 1484 reasonable care, first-sale valuation (§ 1401a, Nissho Iwai), the GRI, and substantial transformation — plus CROSS/CSMS rulings as they are ingested. The model uses the exact citation strings from the retrieved passages; if the authority it needs was not retrieved, it describes the standard in plain terms rather than inventing a citation.
  • Golden responses — the org's own prior filings the broker accepted (captured automatically when a letter is edited and saved, or a case closes favorably), retrieved as exemplars so the draft matches house terminology and structure. A filing that closed unfavorably is demoted so a losing argument isn't reinforced.

This is retrieval-augmented, not fine-tuned: the corpus can grow and change (new CBP guidance, more accepted filings) without touching the model.

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 the structured output and rejects responses with phantom citations.
  • Does NOT invent statutes or CROSS rulings. The agent is instructed to cite only from the authorities retrieved for the case; the eval harness scores every draft for citation grounding (a fabricated section number or ruling number fails the check) so this is measured, not assumed.
  • Does NOT send anything. It drafts requests to suppliers/importers; the broker reviews and sends from their own email. Aduaria never transmits.
  • 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 Aduaria LLM agent.

Roadmap

Shipped

  • Eval harness — graded fixtures + a deterministic scorer for structure, required terminology, and citation grounding (a fabricated cite fails). Run on demand against the live agent.
  • Outcome feedback loop — closing a case records the outcome; a favorable close captures the filed letter as a golden exemplar, an unfavorable one demotes it, so future drafts learn from what actually worked.

Next

  • 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.
  • Streaming Deep review — stream the letter as it generates (SSE) to mask latency on high-effort cases.
  • CROSS / CSMS ingestion — populate the ruling authority category from real CBP data (the retrieval interface already supports it); move retrieval to embeddings/pgvector as the corpus grows.
  • 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.
Ready to see it live?

Put your own book of entries through Aduaria.