✍️ Dirk Adams
⌛ 11 min read · 🧩 Spec v1.1
FAT ENGINEERING NOTE — SEAFOOD
SEAFOOD RESEARCH SERIES | COMPANION TO PAPER NO. 5
Service-Case Seafood Capture Schema: Fields, Normalization & Confidence Semantics
Paper No. 5 established that loose seafood at the full-service counter is governed by a USDA AMS placard, not an FDA package label, and that whether any disclosure exists is conditioned on the venue. This note specifies the capture schema that operationalizes that finding inside the FAT App: the exact fields to photograph and extract, how each is normalized, and — most importantly — how confidence is assigned so the App never confirms more than a photo can prove.
Prepared for publication by Farm Animal Transparency with the assistance of AI | June 20, 2026 · revised for v1.1 (whole-fish visual cross-check)
| Design principles |
|---|
| Capture the sign, not the fish. The schema separates what the placard says (confirmable) from what the species actually is (not confirmable from a photo). Species identity carries a dedicated unverified state that no image input can upgrade. A whole-fish visual pass may cross-check the sign (§2a), but it only corroborates or flags a mismatch — it never asserts a species. |
| The venue gate runs first. Establishment type decides whether a missing placard is a compliance finding or a non-event, so it is captured before any disclosure field is scored. |
| One displayed name, captured verbatim. The market name is the most fraud-prone field at the counter; it is stored exactly as shown and only then resolved against the FDA Seafood List. |
| Two facts are legally mandated, one is not. Origin and method-of-production can reach known; species identity cannot — and the schema encodes that asymmetry. |
0. The Gate: Establishment Classification
COOL binds PACA-licensed retailers and exempts fish markets, butcher shops, and food-service establishments.1 The gate sets two derived values used everywhere downstream: disclosure_required (is a COOL placard owed here?) and category_lane (FDA vs. FSIS-Siluriformes vs. shellfish/ICSSL). A processed or value-added item — breaded, marinated, seasoned, or made into crab cakes — is excluded from COOL entirely and is flagged so its missing origin placard is not read as non-compliance.1
| Field | Type / Enum | Source | Effect |
|---|---|---|---|
establishment_type |
covered_retailer · exempt_fishmonger · exempt_butcher · exempt_foodservice · unknown | User select + POI / geo lookup | Sets disclosure_required |
disclosure_required |
boolean (derived) | Derived from above | Gates compliance scoring of Cluster A |
processed_value_added |
boolean | Vision + user confirm | If true → COOL not applicable |
category_lane |
fda · fsis_siluriformes · shellfish_icssl | Derived from market name (§2) | Selects enforcement lane |
1. Cluster A — Mandated Disclosure Fields (COOL)
These are the two facts a covered retailer must post for non-processed fish and shellfish: country of origin and method of production.1 Because they are legally required, a legible capture is the App’s strongest service-case signal and is eligible for known. If disclosure_required is true and the field is absent, it resolves to missing (a compliance datum); if the venue is exempt, it resolves to not_applicable instead.
| Field | Extraction | Normalization | Confidence rule |
|---|---|---|---|
country_of_origin (array — display may be commingled multi-origin) |
Placard / sign OCR | Map “USA / Domestic” → US; parse “Product of X and Y” → list; preserve all listed countries |
known legible · partial ambiguous · missing if required & absent · not_applicable if exempt |
method_of_production |
Placard / sign OCR | “wild” / “wild-caught” → WILD; “farmed” / “farm-raised” / “aquaculture” → FARMED; mixed display → MIXED |
Same ladder as origin |
2. Cluster B — Identity Fields
The market name is captured verbatim, then resolved through the FDA Seafood List, which maps acceptable market names to scientific names.2 Three separate values come out of one sign, at three different confidence levels — and keeping them separate is the core integrity discipline of the schema.
| Field | Meaning | Normalization | Confidence rule |
|---|---|---|---|
market_name_displayed |
Exactly what the placard says | Stored raw; no interpretation | known — we know what the sign reads |
seafood_list_match |
Acceptable name + scientific name; flag if displayed name is non-acceptable or non-specific (e.g., bare “sea bass,” or “red snapper” reserved to Lutjanus campechanus) | Resolve against FDA Seafood List; set is_acceptable_name |
partial — the name maps, but the fish is unverified |
species_identity |
What the animal actually is | Cannot be derived from a photo | unverified — never upgraded without a lab/DNA input |
substitution_risk |
Category-level fraud prior | Band from DNA-study literature (snapper / tuna / sea bass = high)3,4,5 | Advisory only — not a finding |
product_form |
fillet · steak · whole · loin · portion | Vision + user confirm | Supports COOL “processed?” test and record matching |
Lane routing. The resolved name selects category_lane: Siluriformes names (catfish, basa, swai, tra) route to the FSIS establishment-number lane; molluscan shellfish route to the shellfish/ICSSL lane; everything else stays in the FDA lane — the same three-regime split used in Paper No. 4.2
2a. Whole-Fish Visual Cross-Check
Version 1.1 adds a second, independent read of the same frame: an on-device visual pass over the fish itself (Apple Vision on iOS, Google ML Kit on Android), used only to corroborate or flag-mismatch the placard’s market name. It is a coarse, low-confidence classifier — for a whole animal it can often name the broad type (finfish, crab, shrimp, oyster); for a plain fillet it typically returns only “fish.” It is not a species identification and not DNA, and it never upgrades species_identity, which stays unverified. Its sole job is to catch a gross broad-type mismatch — the sign says “crab,” the camera sees a finfish — and to raise the substitution_risk band to high when it conflicts with confidence.
| Cross-check verdict | Meaning |
|---|---|
corroborates |
Whole-fish view is consistent with the sign. |
conflict |
Whole-fish view does not match the sign — possible mislabeling; substitution risk raised to high. |
inconclusive |
Broad type appears to differ, but the camera is not confident enough to call it. |
notWhole |
A fillet, steak, or cut — the visual check cannot apply. |
noFish |
No whole fish detected; point the camera at the whole fish, not a fillet. |
noPlacard |
Visual read only — no market name was read from the sign. |
This preserves the governing rule. The cross-check can only lower trust — flag a conflict, raise the risk band — never raise it to a species claim: a strong salmon-shaped read against a “wild salmon” sign is reported as corroborating, not as confirmation that the fish is Salmo salar. Only a hard key or a lab result can close identity.
3. Cluster C — Context & Hard Keys
Most loose fish offers no hard identifier. The exception is molluscan shellfish: oysters, clams, and mussels in a service display retain dealer/shellstock tags bearing a state-issued certification number that resolves to a firm on FDA’s Interstate Certified Shellfish Shippers List — a genuine Tier 1 direct match available at the counter.2 Context fields add weak but useful signals: a “previously frozen” disclaimer (or its absence on visibly thawed product sold as “fresh”) is an FDA misbranding datum,6 and a price far below the going rate for the named species is a soft substitution flag.
| Field | Type | Source | Role / confidence |
|---|---|---|---|
shellfish_cert_number |
string · nullable | Dealer/shellstock tag OCR | known if resolved against ICSSL → Tier 1 direct |
fsis_establishment_number |
string · nullable | Inspection legend (rare at loose case) | known if present (Siluriformes) |
previously_frozen |
labeled_previously_frozen · presented_fresh · unknown | Placard / observed | FDA misbranding datum6 |
price_per_lb |
number · nullable | Placard OCR | Soft substitution signal only |
capture.media / geo / timestamp |
object | Device | Provenance; never confidence-bearing |
4. Confidence Vocabulary
The schema reuses the FAT App’s disclosure vocabulary (known / partial / missing) and adds two states the service case specifically requires. The whole-fish visual cross-check (§2a) is not itself a confidence state — it is a corroboration signal that can raise substitution_risk, never a source of known.
| State | Definition | Applies to |
|---|---|---|
| known | A legally mandated fact captured legibly from the placard, or a hard key resolved to a record | origin, method, shellfish cert |
| partial | Captured but ambiguous, or a named value that cannot be verified beyond the sign | Seafood List name match |
| unverified | A claim a photo categorically cannot confirm; distinct from partial, and never auto-upgraded | species identity |
| missing | A fact required in this venue but absent — a compliance signal | origin/method at a covered retailer |
| not_applicable | The venue (or a processed item) is exempt, so absence is not a finding | exempt fishmonger / butcher / value-added |
The one rule that protects the model: a service-case record may state “this counter discloses farm-raised, Product of Chile” with confidence, but it may never state “this is Atlantic salmon” as fact. The displayed name is reported as displayed; species stays unverified with a substitution-risk note.
5. Resolution Flow
The captured record resolves to a single tier, which selects the user message and the enforcement lane(s). Resolution stops at the highest tier that fires; lanes are attached to the final record. The whole-fish cross-check runs alongside and can escalate the Tier 3 advisory to a conflict warning, but it never changes the tier itself.
| Step | Test | Outcome |
|---|---|---|
| Gate | Covered retailer? Processed item? | Exempt → not_applicable (capture name + advisory, no compliance finding). Covered → continue. |
| Tier 1 — Direct | Hard key present? (shellfish cert # → ICSSL, or FSIS estab. # for Siluriformes) | Resolved to a record → known direct match. |
| Tier 1 — Disclosure | Origin + method posted? | Legible → both known. Required but absent → COOL compliance flag, disclosure = missing. |
| Tier 2 — Species name | Market name resolves on the FDA Seafood List? | Mapped → partial (name maps, fish unverified). |
| Tier 3 — Advisory | Always, when no higher tier closes identity | species = unverified + substitution-risk note; whole-fish conflict, if any, is surfaced here. |
| Lanes | Attached to final record | AMS COOL · FDA integrity · (NOAA SIMP if imported) |
6. Worked Record
A snapper fillet at a covered supermarket counter — the highest-risk common case — produces a record that confirms the two posted facts, reports the name as displayed, and holds species open with an explicit risk flag. The fillet form means the whole-fish cross-check returns notWhole and does not apply.
// ServiceCaseRecord — snapper at a covered retailer
{
"schema_version": "1.1",
"gate": {
"establishment_type": "covered_retailer",
"disclosure_required": true,
"processed_value_added": false,
"category_lane": "fda"
},
"disclosure": {
"country_of_origin": { "value": ["US"], "confidence": "known" },
"method_of_production": { "value": "WILD", "confidence": "known" }
},
"identity": {
"market_name_displayed": { "raw": "Red Snapper", "confidence": "known" },
"seafood_list_match": {
"acceptable_market_name": "snapper, red",
"scientific_name": "Lutjanus campechanus",
"is_acceptable_name": true,
"confidence": "partial"
},
"species_identity": { "confidence": "unverified" },
"substitution_risk": { "band": "high", "basis": "DNA-study literature" },
"product_form": "fillet",
"visual_cross_check": "notWhole"
},
"hard_keys": { "shellfish_cert_number": null, "fsis_establishment_number": null },
"context": { "previously_frozen": "presented_fresh", "price_per_lb": 9.99 },
"resolution": {
"tier": "tier3_advisory",
"enforcement_lanes": ["ams_cool", "fda_integrity"],
"user_message_key": "svc.snapper.high_risk"
}
}
The low price ($9.99/lb against a market norm for true red snapper) does not change the tier, but it strengthens the Tier 3 advisory: of 120 nationwide “red snapper” samples DNA-tested in the Oceana study, only 7 actually were.3
7. Category 13 Integration & Open Items
This schema is the operational detail inside Category 13 (Enforcement & Compliance) for the service-case lane, mirroring how the brand-search ladder sits inside Category 13 for packaged labels. The disclosure status for origin and method moves on the same missing → partial → known track; the difference is the added unverified species state and the venue gate that precedes scoring.
Shipped in v1.1: the whole-fish visual cross-check (§2a) now runs in both apps — iOS via Apple Vision, Android via Google ML Kit — as the first non-placard signal in the service-case lane. It is a fraud tripwire, not a species ID: it can raise substitution risk, never lower it below the placard read.
Open items for v1.2: (a) a confidence threshold for placard OCR before a field may reach known; (b) a market-norm price table per species to tune the substitution advisory; (c) handling of commingled multi-origin displays at the array level; and (d) a re-scan path that lets a packaged equivalent’s UPC, where one exists nearby, supersede the service-case record. None of these change the core rule: report the sign, flag the species, and never confirm what the photo cannot.
References
- Country of Origin Labeling for Fish and Shellfish, 7 C.F.R. Part 60; USDA AMS COOL retailer/consumer fact sheets — origin and method-of-production declaration via placards/signs; PACA-retailer scope; exemption of fish markets, butcher shops, and food-service establishments; exclusion of processed/value-added items.
- FDA, “The Seafood List — Guide to Acceptable Market Names”; FDA “Interstate Certified Shellfish Shippers List” and National Shellfish Sanitation Program Model Ordinance; FSIS Siluriformes inspection (9 C.F.R. Ch. III, Subch. F). See also FAT Seafood Research Series Paper No. 4.
- Warner, K., Timme, W., Lowell, B., & Hirshfield, M. (2013). Oceana Study Reveals Seafood Fraud Nationwide. Oceana — 1,215 DNA-tested samples, 33% mislabeled; only 7 of 120 “red snapper” samples were red snapper.
- Oceana (2019). Seafood Fraud Persists (2018 sampling) — 449 samples, 21% mislabeled; smaller markets 24% vs. chain grocers 12%.
- Cline, E. (2012). Marketplace substitution of Atlantic salmon for Pacific salmon in Washington State detected by DNA barcoding. Food Research International, 45(1), 388–393.
- FDA misbranding provisions, 21 U.S.C. § 343 — “previously frozen” disclosure for thawed product offered as fresh.
Companion to: Behind the Glass: Identifying Service-Case Seafood When There Is No Package to Scan (Seafood Research Series, Paper No. 5).
