Outputs are risk leads for review, not findings of wrongdoing. Every item links to its source.

Follow the Public Dollar

Traceability: how every fact gets back to its source

Investigation graph

Every claim links to a primary record. Nothing is generated.

Regulators and inspectors general won't act on a lead they can't check. So each fact here carries a source ID, a publisher, a retrieval time and a stored copy of the response. Copy is filled from fixed templates, and missing data is shown as missing, never as clean.

42Registered sources31 are primary government or registry records
41Sourced facts in the ledgereach quotes what its source says, and where
5 → 0Citation errors in the case filesafter the citation audit
56/62Data needs verifiedagainst vendor docs or a live response
0Rows without a source recordreplay run of every dataset job
25Recorded vendor responseshashed and timestamped, for replay
24Datasets planned25-company pilot, dry-run checked
46Automated testsprovenance, templates, budgets, citations
Walkthrough

Follow one fact, from the dossier to the government record

The same path applies to every sentence, signal and relationship in the product. Click a source ID anywhere on this page to jump to its registry entry.

  1. Step 1

    A sentence in the Lead Dossier

    OOO SERNIYA INZHINIRING is listed on the OFAC SDN List under Executive Order 14024, with a designation date of 31 March 2022. S01S02
  2. Step 2

    Filled from a fixed template, not written by a model

    Every sentence is a template from config/narrative_templates.yaml filled with sourced fields. If a field is missing, the sentence is dropped rather than guessed.

    strongest.self_listed: "{entity_name} is listed on the {self_list_name} under {self_list_program}, with a designation date of {self_list_date|date}."
  3. Step 4

    The evidence ledger records what the source actually says, and where

    F01designationConfidence AOFAC designated OOO Serniya Engineering under E.O. 14024 on 31 March 2022.Locator: paragraph beginning 'OFAC is designating Serniya, Sertal, Majory LLP...'
  4. Step 5

    The investigation graph carries the same citation, with who published it

    OFAC SDN Designation E.O. 14024Published by U.S. Treasury (OFAC) · retrieved via Tavily · S01
  5. Step 6

    The primary government record

    https://home.treasury.gov/news/press-releases/jy0692

    Anyone can open it and check the sentence at the top.

Source registry

Every citable record, with who published it and when we fetched it

Tier 1 is the government or registry record itself. Tier 2 is an aggregator record with a stable ID, corroborated where possible. Tier 3 (law firms, news, contract-data resellers) is used only to find leads and is never cited.

Tier 3: seen during research, never used as evidence (5)
  • fesenkolaw.com/blog/what-the-june-2026-ofac-delisting-of-three-russian-nationals-means: Law-firm blog. Replaced by S02/S03/S12.
  • arnoldporter.com/en/perspectives/advisories/2022/04/us-expands-sanctions-authority-to-target-russia: Law-firm advisory. Replaced by S01/S02.
  • highergov.com/awardee/palantir-technologies-inc-10000294: Contract-data reseller. Replaced by S15/S16.
  • sweetspot.so, fed-spend.com: Contract-data resellers. Replaced by S16/S33.
  • jdsupra.com, thompsonhinesmartrade.com: Law-firm commentary on the OFAC reconsideration portal. Context only.
Evidence ledger

What each source actually says

One row per fact or relationship, quoting the source and pointing to where in the record it appears. Graph edges and dossier sentences are built from these rows.

  • F01designationGrade A
    OFAC designated OOO Serniya Engineering under E.O. 14024 on 31 March 2022.

    S01 · paragraph beginning 'OFAC is designating Serniya, Sertal, Majory LLP...'

  • F02designationGrade A
    OFAC designated OOO Sertal under E.O. 14024 on 31 March 2022.

    S01 · same paragraph as F01

  • F03designationGrade A
    OFAC designated OOO Robin Treid under E.O. 14024 on 31 March 2022.

    S01 · same paragraph as F01

  • F04designationGrade A
    OFAC designated Majory LLP under E.O. 14024 on 31 March 2022.

    S01 · same paragraph as F01

  • F05designationGrade A
    OFAC designated Photon Pro LLP under E.O. 14024 on 31 March 2022.

    S01 · same paragraph as F01

  • F06designationGrade A
    OFAC designated Invention Bridge SL under E.O. 14024 for being owned or controlled by, or having acted or purported to act for or on behalf of, directly or indirectly, Serniya.

    S01 · paragraph 'OFAC is designating Invention Bridge SL...'

    The basis is disjunctive and does not establish ownership. Do not render it as BENEFICIAL_OWNER.

  • F07designationGrade A
    Singapore-based Alexsong Pte Ltd facilitated transactions in support of sanctions evasion by the Serniya network; designated under E.O. 14024.

    S01 · paragraph beginning 'Singapore-based Alexsong'

    New node.

  • F08designationGrade A
    SDN entry for GRININ, Yevgeniy Aleksandrovich is Linked To: OOO SERNIYA INZHINIRING; Linked To: PHOTON PRO LLP.

    S02 · SDN entry GRININ

    Officer role corroborated by Companies House officers list (S13). S09 footnote 4 says Grinin is the owner and operator of Photon Pro.

Citation audit

We checked our own case files, and fixed what didn't hold up

A link that loads isn't enough. The audit caught claims cited to the wrong agency, law-firm blogs standing in for OFAC records, and relationships stronger than the source states.

Serniya validation case

4Citation errors before
0After the audit28 citations checked

Palantir control case

1Citation errors before
0After the audit2 citations checked

What changed, citation by citation

  • ent_serniyaDOJ Indictment - Procurement Network Hub (EDNY)bis.govclaim mentions 'DOJ' but cites www.bis.gov
    Named in DOJ superseding indictment (E.D.N.Y., 13 Dec 2022) as heading the procurement networkS05 U.S. Department of Justice (E.D.N.Y.) · justice.govPrimary record
  • ent_robintreidOFAC SDN Designation - front company used by Serniyaarnoldporter.comtier-3 domain (www.arnoldporter.com): context only, never an evidence recordclaim mentions 'OFAC' but cites www.arnoldporter.com
    OFAC SDN Designation E.O. 14024 (Treasury: “utilized by Serniya to facilitate its procurement”)S02 OFAC · ofac.treasury.govPrimary record
  • ent_majoryOFAC-designated front company for Serniya procurement (via officer Krugovov)fesenkolaw.comtier-3 domain (fesenkolaw.com): context only, never an evidence recordclaim mentions 'OFAC' but cites fesenkolaw.com
    OFAC SDN Designation E.O. 14024S02 OFAC · ofac.treasury.govPrimary record
  • person_krugovovSTATUS CHANGE: OFAC delisted 2026-06-23 - was senior exec officer of Majory LLPfesenkolaw.comtier-3 domain (fesenkolaw.com): context only, never an evidence recordclaim mentions 'OFAC' but cites fesenkolaw.com
    STATUS CHANGE: removed from the OFAC SDN List on 23 Jun 2026 (designated 31 Mar 2022 as senior executive officer of Majory LLP)S03 OFAC · ofac.treasury.govPrimary record
  • person_krugovov → ent_majoryOFFICER_DIRECTORfesenkolaw.comtier-3 domain (fesenkolaw.com): context only, never an evidence record
    OFFICER_DIRECTORS12 Companies House (UK) · find-and-update.company-information.service.gov.ukPrimary record
  • ent_palantirExact UEI/CAGE identifier match, SAM.gov active registrationhighergov.comtier-3 domain (www.highergov.com): context only, never an evidence recordclaim mentions 'UEI' but cites www.highergov.com
    UEI FSY4LVSBGWB7 matches the USAspending recipient record (grade B: shared UEI and name, spec 7.1)S16 USAspending.gov · usaspending.govPrimary record
  • ent_palantirNYSE-listed, SEC-disclosed ownership and financials (PLTR) - no structural opacitysam.govclaim mentions 'NYSE' but cites sam.gov
    Nasdaq-listed (PLTR), SEC-disclosed ownership and financialsS18 U.S. SEC (EDGAR) · sec.govPrimary record

Relationships the sources did not support

A working link can still overstate what a record says. These were retyped or removed.

  • ent_serniya → ent_sertal SHARED_ADDRESSDifferent OFAC addresses: Serniya is at ul. Vavilova 57A; Sertal is at ul. Yablochkova 21 (S02)Drop it. Add Sertal ↔ Robin Treid SHARED_ADDRESS (F14) and Majory ↔ Photon Pro SHARED_ADDRESS (F15), both from S02
  • ent_serniya → {robintreid, majory, photonpro, inventionbridge} BENEFICIAL_OWNERTreasury calls these companies "utilized by Serniya", and Invention Bridge's designation basis is "owned or controlled by, or acted … on behalf of" (F06, F16). No source states ownershipNeeds a new relationship type such as ACTING_ON_BEHALF_OF. BENEFICIAL_OWNER overstates what the source says
  • ent_sertal → ent_awsstrandway SUPPLY_CHAIN_SHIPMENTNo source records a shipment. The TDO says Livshits owns or controls Advanced Web Services and Strandway (F21)Replace with person_livshits → ent_aws and person_livshits → ent_strandway (new type OWNS_OR_CONTROLS, or BENEFICIAL_OWNER with a note), citing S08

The checker (scripts/check_citations.py) rejects law-firm, news and contract-reseller links, homepages, tracking or bot-challenge tokens, and claims cited to the wrong agency. It also flags government pages that answer an automated request with a bot-challenge page while returning HTTP 200. The fixes were applied by scripts/apply_citation_audit.py, which reads every replacement from the source registry.

Name traps

Matches that looked like hits, and weren't

Name-only matching produces confident-looking false leads. These are the real examples we logged, and the matching rule each one taught us.

Data-source map

Every data need, checked against the vendor's own documentation

Endpoints and fields come from saved vendor and agency docs, never from memory. Anything unverified is marked UNCONFIRMED and parked in the backlog.

78Sayari API operations65 paths read from Sayari's own OpenAPI spec
47Tradeverifyd toolschecked against the live tool list
56/62Data needs confirmedin vendor docs, or seen in a live response
Confirmed 45Pilot 11Design 3Unconfirmed 2Gap 1
QuestionNeedToolStatus
Q1. Did federal money reach this company, and how?Federal contract awards to a recipientUSAspending API, award search: POST https://api.usaspending.gov/api/v2/search/spending_by_award/ (free, no key). Filters: recipient_search_text, time_period, award_type_codes, agen…Confirmed
Q1. Did federal money reach this company, and how?Whether the award was competedUSAspending award detail: GET /api/v2/awards/{award_id}/Confirmed
Q1. Did federal money reach this company, and how?Where the prime sent the moneyUSAspending award search with "subawards": true (same endpoint as row 1). Corrected: the separate POST /api/v2/subawards/ returns no subrecipient UEI (fields: subaward_number, desc…Confirmed
Q1. Did federal money reach this company, and how?SAM.gov registrationSayari entity profile (SAM.gov Entity Registration source); SAM.gov Entity Management API GET https://api.sam.gov/entity-information/v4/entities (free key via api.data.gov; public …Confirmed
Q1. Did federal money reach this company, and how?Excluded or debarred partiesSayari (SAM.gov Entity Exclusions source); SAM.gov Exclusions API GET https://api.sam.gov/entity-information/v4/exclusionsPilot
Q1. Did federal money reach this company, and how?PPP and SBA loansSayari (sources "USA Paycheck Protection Program (PPP) Loan Recipient Database", "USA SBA 504 and 7(a) Loan Program Database", "USA SBA Dynamic Small Business Database")Pilot
Q1. Did federal money reach this company, and how?Contract awards via SayariSayari (source "USA USASpending.gov Profiles Database"); contracts appear as entities of type contract linked by recipient_ofPilot
Q1. Did federal money reach this company, and how?Firm size and age, for award size versus profile (PM2) (new row; spec §9.1 "PM2 Award size versus profile … SAM.gov, USAspending")Sayari registration_date; SAM businessTypeList, registrationDate; SBA Dynamic Small Business Database via SayariConfirmed
Q1. Did federal money reach this company, and how?Competing bidders on the same solicitation, for shared principals (PM5) (new row; spec §9.1 "PM5 Shared principals across bidders … Same officers or addresses behind competing firms")None. USAspending gives number_of_offers_received, not who bidGap
Ownership structureOwners and ultimate ownersSayari GET /v1/ubo/{id} (upward); GET /v1/downstream/{id} (owned entities). Parameters: min_depth, max_depth (default 4), limit (default 10, max 50), psa, min_shares, include_unkno…Confirmed
Ownership structureChain ends at a company, not a personSayari UBOConfirmed
Ownership structureLayered or circular ownershipSayari ownership and traversal (GET /v1/traversal/{id})Confirmed
The tool registry: the only calls the app is allowed to make (28)
  • find_awardsConfirmedUSAspending POST /api/v2/search/spending_by_award/
  • award_detailConfirmedUSAspending GET /api/v2/awards/{award_id}/
  • find_subawardsConfirmedUSAspending POST /api/v2/search/spending_by_award/ with subawards: true
  • spending_over_time (new)ConfirmedUSAspending POST /api/v2/search/spending_over_time/
  • sam_exclusions (new)Confirmed (key needed)SAM.gov GET /entity-information/v4/exclusions
  • resolve_entityConfirmedSayari /v1/resolution or /v1/search/entity, plus identifier lookups
  • entity_facets (new)ConfirmedSayari GET /v1/search/entity with facets / geo_facets
  • screen_by_name (new)ConfirmedSayari GET /v1/screen (name, type)
  • entity_profileConfirmedSayari GET /v1/entity/{id}
  • entity_summary (new)ConfirmedSayari GET /v1/entity_summary/{id}
  • ownershipConfirmedSayari GET /v1/ubo/{id}, GET /v1/downstream/{id}
  • networkConfirmedSayari GET /v1/traversal/{id}
  • listed_party_pathsConfirmedSayari GET /v1/watchlist/{id} (explicit psa setting on every call)
  • shortest_path (new)ConfirmedSayari GET /v1/shortest_path
  • tradeConfirmedSayari shipments, suppliers, buyers, upstream traversal
  • trade_facets (new)ConfirmedSayari POST /v1/trade/search/{shipments,suppliers,buyers} with facets in the body
  • hs_code_lookup (new)ConfirmedSayari GET /v1/hs_codes
  • ontology_lookup (new)ConfirmedSayari GET /v1/ontology/{entity_types,relationships,identifiers,countries,attributes,enums,source_types,…}
  • source_record (new)ConfirmedSayari GET /v1/record/{id}
  • risk_factor_definitions (new)ConfirmedSayari GET /v1/ontology/risk_factors
  • negative_news (new)ConfirmedSayari GET /v1/negative_news
  • sayari_usage (new)ConfirmedSayari GET /v1/usage
  • screen_official_listsDownloads confirmed; API path unconfirmed (B7)Consolidated Screening List downloads (daily file) or search API
  • federal_register_documents (new)PilotFederal Register GET /api/v1/documents.json
  • lei_record (new)PilotGLEIF GET /api/v1/lei-records/{lei}
  • web_presenceConfirmedTavily POST /search
  • extract_page (new)Confirmed (tavily/extract.md)Tavily POST /extract (urls, extract_depth, format, query)
  • tv_search_entities, tv_entity_details, tv_entity_score, tv_entity_annotations, tv_trade_relationships, tv_annotated_paths, tv_affiliates, tv_quick_check, tv_hs_trends, tv_disruptions (new)Confirmed (MCP)Tradeverifyd MCP tools search_entities, entity_details, entity_score, entity_annotations, entity_trade_relationships, annotated_relationship_paths, entity_affiliate_relationships, tia_quick_check, tia_hs_trends, tia_get_disruptions
Dataset pipeline

From public money to provenance-backed datasets

The build is planned and budgeted before any call is made, and replayable offline from recorded responses.

1. Seed

A reproducible random draw of 25 federal-money recipients across seven typologies, 2019-10-01 to 2026-09-30.

2. Adapters

Only confirmed operations. Every response is hashed and stored before anything reads it. Budgets stop the run cleanly.

3. Datasets

One job per dataset. Missing data is stored as empty with a reason, never as zero.

4. Export

Parquet, plus a manifest of calls, time range, failures and source-record IDs. Loaded into PostgreSQL.

5. Quality report

Counts only. Rows missing a source record must be zero.

Pilot seed: 25 companies

russia sanctions evasion5423690, 334515, 334413
xinjiang critical minerals4331410, 335910, 325180
fentanyl precursors3424690, 325199
gold3423940
sudan uae arms gold3{"country":"ARE"}
pandemic loan fraud459.073
humanitarian fronts3nonprofit

Dry run: planned calls against each budget

Nothing was called. Follow-up calls depend on responses, so they are estimates.

  • Sayari~652 / 700
  • USAspending~254 / 650
  • Tradeverifyd~150 / 200
  • Tavily~57 / 100
  • SAM.gov~50 / 50 (≤10/day)
  • GLEIF~25 / 25
  • Federal Register~1 / 30
  • Screening List~1 / —

Replay run on the recorded pilot fixtures

0Rows missing a source recordmust be zero
124Rows backed by a stored record
95Gap rows, each with a reasoncalls not recorded yet: empty, not zero
DatasetStatusRowsWith source recordGapsMost common gap reason
seed_awardsblocked000not used: seeds come from config/datasets.yaml replay_seeds (spec appendix A), not a USAspending draw
public_moneycomplete202no recorded response (replay mode)
award_competitioncomplete000—
subawardscomplete101no recorded response (replay mode)
entitiescomplete651no recorded response (replay mode)
network_edgescomplete505no recorded response (replay mode)
entity_memberscomplete550—
entity_identifierscomplete18180—
ownership_edgescomplete10010no recorded response (replay mode)
listed_party_pathscomplete10010no recorded response (replay mode)
trade_edgescomplete15015no recorded response (replay mode)
web_presencecomplete11011no recorded response (replay mode)
address_clusterscomplete505no recorded response (replay mode)
tradeverifyd_annotationscomplete19127no recorded response (replay mode)
tradeverifyd_tradecomplete927no recorded response (replay mode)
news_itemscomplete808no recorded response (replay mode)
official_list_entriescomplete101no recorded response (replay mode)
spending_trendscomplete707no recorded response (replay mode)
reference_listscomplete54522not stated on the BIS page (B5)
false_positive_samplecomplete33303no recorded response (replay mode)
signalsblocked000derived dataset: computed by the signal engine (build plan M4), which does not exist yet; no external calls
assessmentsblocked000derived dataset: tier and combined score (spec §9.3-9.4) come from `signals`, not built yet (M4)
backtest_candidatesblocked000blocked: B26 (Sayari search syntax for filtering by source and risk factor is UNCONFIRMED) and B25 (Sayari REST credentials). Candidates also need your approval before use
Lead dossiers

The output a reviewer receives

Written for an inspector-general intake analyst. It presents risk leads for human review, never findings of wrongdoing, and every statement is footnoted.

Serniya (validation) · rendered from narrative/inputs/serniya.json with the templates in config/narrative_templates.yaml. Source chips jump to the registry. Sentences whose data is missing are dropped, never guessed: 5 templates skipped here.

Lead dossier: OOO SERNIYA INZHINIRING

Identifiers: OGRN 1177746132563; OFAC SDN UID 35076

Report ID: DRAFT-SERNIYA-20260925

Generated: 25 September 2026

Content hash: sha256:d172cbb94546facf

This dossier presents a risk lead for human review. It is not a finding of wrongdoing. Every statement is sourced; see the sources appendix.

1. Executive rationale

No federal contract or loan records were found for OOO SERNIYA INZHINIRING in USAspending.gov as of 25 September 2026; OpenSanctions reports SAM.gov exclusion records for the entity under UEIs LF8MULLSH397 and NYCYDYP1RNJ6.S15S28 The entity was matched to corporate records at grade A using a shared registration number (OGRN 1177746132563).S02S20 The screen produced a composite score of 65 out of 100, with a confidence grade of B. OOO SERNIYA INZHINIRING is listed on the OFAC SDN List under Executive Order 14024, with a designation date of 31 March 2022.S01S02 2 signals could not be assessed because Tradeverifyd trade relationships were not retrieved for this entity in this pass and the Sayari ownership trace for this entity was not run in this pass. This is a risk lead for human review, not a finding of wrongdoing.

2. Why this dossier was prepared

This entity was screened because an analyst selected it as a validation case: a procurement network with published US sanctions, export-control, and law-enforcement actions.

Intended use: to help an oversight body decide whether further review is warranted.

3. Identity

How this entity was identified, and how confident the match is.

FieldValueSource
Canonical nameOOO SERNIYA INZHINIRINGS02
Other namesSerniya Engineering; Sernia Engineering; ООО Серния ИнжинирингS01S20
Registration number (OGRN)1177746132563S02S20
Tax ID971529478 as listed by OFAC; 9715292478 in the Russian registry as reported by OpenSanctions. The two differ by one digit, so matching uses the OGRN.S02S28
Address (OFAC listing)d. 57A etazh 2 pom. 211 kom. 211-13, ul. Vavilova, Moscow 117292, RussiaS02
Registration date10 February 2017S20
OFAC SDN UID35076S20
Matched recordsSayari entity 7-U98RGw67tUi01ILV4CCQ (grade A, shared OGRN); OpenSanctions NK-m5uxh7GMpRei95QkP8qEUA (grade A, shared OGRN)S20S28

4. Federal awards and loans

No federal contract or loan records were found for OOO SERNIYA INZHINIRING in USAspending.gov as of 25 September 2026.S15

5. Signals found

  • Listed party: The entity itself appears on a US sanctions list. Evidence: listed on the OFAC SDN List under Executive Order 14024 on 31 March 2022; the stated basis is owned or controlled by, or having acted or purporting to act for or on behalf of, directly or indirectly, the GoR (Treasury press release JY0692).S01S02
  • Procurement exclusion: The entity appears in SAM.gov exclusion records. Evidence: OpenSanctions reports SAM.gov exclusion records under UEIs LF8MULLSH397 and NYCYDYP1RNJ6.S28
  • Federal charges against a linked person: A person linked to the entity in a sanctions listing is named in a federal charging document. Evidence: Yevgeniy Aleksandrovich Grinin, whom OFAC lists as linked to the entity, is one of 7 defendants named in a 16-count superseding indictment unsealed in the U.S. District Court for the Eastern District of New York on 13 December 2022.S02S05S07 Charges in an indictment are allegations. Every defendant is presumed innocent unless and until proven guilty in a court of law.
  • Guilty plea in a linked case: A defendant in a case about the entity's network has pleaded guilty. Evidence: Co-defendant Vadim Yermolenko pleaded guilty in November 2024 to conspiracy to violate the Export Control Reform Act, bank fraud conspiracy, and conspiracy to defraud the United States.S10
  • Export-control action against affiliated parties: Parties that a US agency describes as affiliated with the entity are subject to an export-control order. Evidence: Boris Livshits, Svetlana Skvortsova, Aleksey Ippolitov, Advanced Web Services, and Strandway, LLC, which BIS describes as affiliated with Serniya and Sertal, are subject to a Temporary Denial Order issued on 13 December 2022 (FR Doc. 2022-27347) and renewed on 14 June 2023 (FR Doc. 2023-12679).S07S08S09
  • Status change of a linked person: A person listed as linked to the entity has been removed from a sanctions list. Evidence: Anton Alekseevich Krugovov, listed in 2022 as linked to the entity and to Majory LLP, was removed from the OFAC SDN List on 23 June 2026 (OFAC Recent Actions 20260623).S02S03 A removal means the party is no longer on the list from that date. The records of the earlier designation remain part of the public record and are cited as historical.
  • Recorded trade activity: The entity is a recorded party to international shipments. Evidence: Sayari records 47 received shipments.S20

6. Signals not found and not assessable

What the screen checked without finding a signal, and what it could not check.

  • Federal award or loan: no record found in USAspending.gov (searched by both exclusion UEIs and by name) as of 25 September 2026.S15
  • Removal of the entity from the OFAC SDN List: no record found in OFAC removal notices of 23 June 2026 and 27 July 2026 as of 25 September 2026.S03S04
  • Trade lanes (Tradeverifyd): not assessable because Tradeverifyd trade relationships were not retrieved for this entity in this pass.
  • Ownership chain: not assessable because the Sayari ownership trace for this entity was not run in this pass.

7. Graphs

Money trail

  • What it shows: No federal award to OOO SERNIYA INZHINIRING was found in USAspending.gov as of 25 September 2026, so this view has no starting point.
  • Why it matters: This is the core question for oversight: whether federal money reached a company connected to a restricted party.
  • Primary reader: IG intake analyst, auditor

Ownership chain

This view was not produced for this dossier because the Sayari ownership trace for this entity was not run in this pass.

Network

  • What it shows: Officers, owners, and linked companies within 2 links of OOO SERNIYA INZHINIRING.
  • How to read it: Node shape and label show the entity type and any list status. Lines show the relationship type recorded in the source.
  • Why it matters: Shared officers and owners can link a recipient to other companies, including ones that have closed or been listed.
  • Primary reader: Investigator, researcher
FromRelationshipToSource
Yevgeniy Aleksandrovich Grininlisted by OFAC as linked toOOO SERNIYA INZHINIRING; PHOTON PRO LLPS02
Evgeny Grininofficer of (Companies House)PHOTON PRO LLP (OC425116)S13
Anton Alekseevich Krugovovsenior executive officer of (OFAC); removed from SDN List 23 June 2026MAJORY LLP (OC400827)S01S03S12
OOO ROBIN TREID; MAJORY LLP; PHOTON PRO LLP; INVENTION BRIDGE SLdescribed by Treasury as utilized by Serniya to facilitate its procurementOOO SERNIYA INZHINIRINGS01
OOO SERTALshares a listed street address withOOO ROBIN TREIDS02
MAJORY LLPshares both listed London addresses withPHOTON PRO LLPS02
ALEXSONG PTE LTDdescribed by Treasury as having facilitated transactions in support of sanctions evasion by the Serniya networkOOO SERNIYA INZHINIRINGS01
Boris Livshitsowns or controls (BIS Temporary Denial Order)Advanced Web Services; STRANDWAY, LLCS08

Supply chain

This view was not produced for this dossier because Sayari reports 47 received shipments for the entity that have not yet been reviewed, and Tradeverifyd was unavailable.S20

Signal summary

  • What it shows: Each signal the screen checks, grouped by family, marked as found, not found, or not assessable.
  • How to read it: Select a signal to see its evidence and sources. The tier is based on how many families have signals, not on any single signal.
  • Why it matters: No single signal indicates wrongdoing. Signals across several families are a stronger reason for review.
  • Primary reader: All readers

9. Methodology and limitations

  • How signals and tiers work: the screen checks a fixed set of signals grouped into seven families. A tier reflects how many families have at least one signal, not the weight of any single signal. Some signals are designed to detect patterns associated with shell or front companies, such as mass-registration addresses or ownership chains that end at a company; a signal firing does not mean an entity is one.
  • Identity matching: a record is linked to the entity only when it shares an identifier (UEI, CAGE, company number, registration number or tax ID) or when an analyst confirms the link. Matches are graded A to D by the match keys that agree; only grade A merges automatically. Name-only matches (grade D) are shown as possible matches (unconfirmed) and never drive a signal.
  • Proximity: paths through registered agents, company-formation agents, and institutional asset managers are excluded, because they connect unrelated companies at scale.
  • Federal grants passed through state agencies to sub-recipients are not covered.
  • Trade not recorded in customs data would not appear.
  • A missing list flag means no record was found, not that none exists.
  • Aggregator data (Sayari, OpenSanctions) is cited with its record ID and, where possible, corroborated against the government or registry record it was drawn from.
  • Template config version: narrative_templates.yaml v1.

10. Sources appendix

S15 USAspending.gov API: spending_by_award_count / spending_by_award. Record: POST /api/v2/search/spending_by_award_count/ filters.recipient_search_text, time_period 2007-10-01..2026-09-30. Retrieved 2026-09-25T16:58Z. https://api.usaspending.gov/api/v2/search/spending_by_award_count/

S28 OpenSanctions entity: Serniya Engineering. Record: NK-m5uxh7GMpRei95QkP8qEUA. Retrieved 2026-09-25T17:01Z. https://www.opensanctions.org/entities/NK-m5uxh7GMpRei95QkP8qEUA/

S02 OFAC Recent Actions 20220331 (Russia-related Designations). Record: 20220331. Retrieved 2026-09-25T16:47Z. https://ofac.treasury.gov/recent-actions/20220331

S20 Sayari entity: OOO Serniya Inzhiniring. Record: 7-U98RGw67tUi01ILV4CCQ. Retrieved 2026-09-25T16:53Z. https://graph.sayari.com/resource/entity/7-U98RGw67tUi01ILV4CCQ

S01 U.S. Department of the Treasury press release JY0692. Record: jy0692. Retrieved 2026-09-25T16:40Z. https://home.treasury.gov/news/press-releases/jy0692

S05 Superseding indictment, United States v. Grinin et al. (E.D.N.Y.). Record: grinin_superseder_0.pdf. Retrieved 2026-09-25T16:41Z. https://www.justice.gov/d9/press-releases/attachments/2022/12/13/grinin_superseder_0.pdf

S07 BIS press release: Commerce Cuts Off Russian Procurement Network Evading Export Controls. Record: n/a. Retrieved 2026-09-25T16:40Z. https://www.bis.gov/press-release/commerce-cuts-russian-procurement-network-evading-export-controls

S10 DOJ press release: New Jersey Resident Sentenced for Role in Global Export Control and Sanctions Evasion Scheme. Record: n/a. Retrieved 2026-09-25T16:42Z. https://www.justice.gov/opa/pr/new-jersey-resident-sentenced-role-global-export-control-and-sanctions-evasion-scheme

S08 Federal Register 2022-27347: Order Temporarily Denying Export Privileges (87 FR 77067). Record: FR Doc. 2022-27347. Retrieved 2026-09-25T16:45Z. https://www.federalregister.gov/d/2022-27347

S09 Federal Register 2023-12679: Order Renewing Temporary Denial of Export Privileges. Record: FR Doc. 2023-12679. Retrieved 2026-09-25T16:45Z. https://www.federalregister.gov/d/2023-12679

S03 OFAC Recent Actions 20260623 (Russia-related Designations Removals). Record: 20260623. Retrieved 2026-09-25T16:47Z. https://ofac.treasury.gov/recent-actions/20260623

S04 OFAC Recent Actions 20260727 (Sanctions List Removals). Record: 20260727. Retrieved 2026-09-25T16:47Z. https://ofac.treasury.gov/recent-actions/20260727

S13 Companies House: PHOTON PRO LLP (OC425116). Record: OC425116. Retrieved 2026-09-25T16:51Z. https://find-and-update.company-information.service.gov.uk/company/OC425116

S12 Companies House: MAJORY LLP (OC400827). Record: OC400827. Retrieved 2026-09-25T16:50Z. https://find-and-update.company-information.service.gov.uk/company/OC400827

Backlog

What we deliberately parked, and what needs a decision

Anything not essential right now is recorded here with its status, so nothing unverified slips into the product.

  • B1Obtain Tradeverifyd API docs: auth method, rate limits, score method, annotation categories, licensing, sample responsesResolvedMostly resolved 25 Sep 2026. Tradeverifyd has no REST API; the MCP tool reference is in docs/vendor/tradeverifyd/ and was checked against the live server (47 tools, matching the doc except the admin-only tia_invite_member). Sample responses recorded for 6 tools. Still open: rate limits and quotas; licensing; the Tradeverifyd Score scale (AZ Gold scored 258, level "High", version 1.0.0, so it is not a 0–100 scale); annotation detail access (annotations:read scope)
  • B2Confirm USAspending competition field names and the subaward endpoint in the official API docs at api.usaspending.govResolvedResolved: see Q1 rows 2–3
  • B3Confirm the current SAM.gov Entity API versionResolvedResolved: v4
  • B4Confirm the OFAC Sanctions List Service download formatResolvedResolved 25 Sep 2026: CSV exports download directly from sanctionslistservice.ofac.treas.gov/api/PublicationPreview/exports/ (see Q4 row)
  • B5Confirm the current Common High Priority List HS codesOpen / newPartly resolved: list source saved (50 HS codes); the page gives no version date
  • B6Confirm ProPublica Nonprofit Explorer API terms and fieldsOpen / newPartly resolved: fields and endpoints confirmed; "Data Terms of Use" not yet read
  • B7Register for a free trade.gov API key for the Consolidated Screening ListOpen / newNarrowed: needed only for the search API. The daily downloads need no key
  • B8Define the mission-mismatch signal for nonprofitsOpen / newOpen
  • B9Sayari lists cage and usa_sam_uei_number under both IdentifierType and WeakIdentifierType ("weak (non-unique) identifiers"). Ask Sayari whether UEI and CAGE can support a grade A mergeOpen / newOpen. Interim rule in spec §7.1: UEI/CAGE support grade A only when both records come from the SAM.gov or DLA CAGE source; otherwise they count toward grade B
  • B10Sayari rate limits and pagination limits: 429 is documented, the limits are not (spec §5.1 [VERIFY])Open / newNew
  • B11PM5 needs the identities of competing bidders. USAspending publishes only number_of_offers_received. Redefine PM5 (e.g. shared principals among recipients in the same NAICS and agency) or mark it not assessableOpen / newNew
  • B12docs/tracing_methodology.md and schema/investigation_schema.json used Sayari fields edge_counts and label_en and an address-entity nodeResolvedResolved 25 Sep 2026: replaced with relationship_count, translated_label and id; match_keys typed as {key, normalized, original}; address counts computed by the application. Still open: which fields value in /v1/search/entity searches addresses (B21)
  • B13Federal Register API documentation page blocks automated download. Save it manually into docs/vendor/federal_register/. Until then only conditions[agencies][] and per_page are used, and only the BIS agency slug (industry-and-security-bureau) is confirmed; OFAC and other agency slugs, date filters and paging must be confirmed from the docsOpen / newOpen
  • B14How Sayari exposes PPP, SBA and USAspending record values (amount, lender, date, award ID) on an entity. Record a fixture responseOpen / newNew
  • B15Tavily returns no publisher field, and published_date is an estimate. Spec §5.3 and §8.2 ("publisher, title, date") need a domain-to-publisher rule and a "date as estimated by Tavily" labelOpen / newNew
  • B16Companies House API base URL, auth header and free key registrationOpen / newNew
  • B17OpenSanctions API docs and licence terms for this useOpen / newNew
  • B18Re-record the 17 Appendix A fixtures through the Sayari REST API (/v1/entity, /v1/entity_summary), plus watchlist runs with psa=false and psa=true, once credentials are issued. The connector recordings in fixtures/recorded/sayari/ have a different response shape. Also confirm the possibly_same_as match-key vocabulary, which entity_members needs before it can grade PSA membersOpen / newOpen (Tradeverifyd recordings done 25 Sep; Sayari REST blocked on B25)
  • B19Calibrate the combined-score weights (0.45 / 0.35 / 0.20) and per-category points (spec §9.4, §12.4) on the backtest and false-positive setsOpen / newNew
  • B20Sayari's get_investigation_guidance connector tool has no REST equivalent. Ask Sayari whether the guidance is available through the API; if not, the app does without itOpen / newNew
  • B21Confirm the fields value for address search in Sayari GET /v1/search/entity (needed to count companies at one address, LO1)Open / newNew
  • B22SAM.gov allows 10 requests per day without a SAM.gov role. docs/call-budget.md uses 2 SAM calls per seed company, so only 5 seed companies per day. Request a SAM.gov role, or rely on Sayari's SAM sources and cache SAM responsesOpen / newNew
  • B23Naming clash: scoring/engine.py returns a score band called risk_grade (A–F), while spec §7.1 now uses match grades A–D. Rename the score band (e.g. score_band) so reports never confuse the twoOpen / newNew (for the scoring-engine owner)
  • B24scoring/engine.py sets the Tradeverifyd component to 0 when it is missing. Spec §9.4 requires an unassessed component to produce a score range (lower and upper bound), not a zero. Update the engine to return the rangeOpen / newNew (for the scoring-engine owner)
  • B25Obtain Sayari REST API credentials (client_id / client_secret, spec §5.1; docs/planning_doc.md §5). The dataset jobs call the REST API through the adapters, so every Sayari dataset is replay-only until then (docs/datasets.md)Open / newNew
  • B26Confirm the query syntax of Sayari GET /v1/search/entity advanced and facets parameters for filtering by source (e.g. SAM.gov Exclusions) and risk factor. Needed for backtest_candidatesOpen / newNew
  • B27Tradeverifyd find_companies_in_radius needs latitude and longitude, and entity_addresses returns none. Decide whether to add a geocoder for LO1, or rely on Sayari address countsOpen / newNew
  • B28search_entities confidence was 1 for every Palantir hit across five countries, so it does not separate true from false matches. Calibrate on Appendix A before using it (spec §7.1 already forbids it as the sole merge basis)Open / newNew
  • B29scoring/engine.py counts relationships by this repo's graph-contract types (beneficial_owner, shared_address, officer_director, supply_chain_shipment). Sayari's own relationship names differ (has_beneficial_owner, has_officer, ships_to, …; there is no shared-address relationship). The adapter needs a mapping from Sayari names to contract types before live Sayari counts can feed the engineOpen / newNew (for the scoring-engine owner)
  • B30Verify HS code lists for spec §9.1 TR6 (fentanyl precursors, against DEA and FinCEN sources) and TR7 (gallium and germanium). config/typologies.yaml leaves them empty until then, so TR6 and the gallium and germanium part of TR7 cannot fireOpen / newNew
  • B31Confirm which UAE-based companies Treasury press release JY2772 (research/sources.json S36) names, for the Sudan and UAE validation set in spec §9.5Open / newNew
  • B32Identify the IRS 990 fields that carry foreign grants and transfers (likely Schedule F), for spec §9.1 NP2. Check they are exposed by ProPublica Nonprofit ExplorerOpen / newNew
  • B33PostgreSQL is not installed on the build machine, and Docker is not either. The loader (apps/api/storage/db.py) is tested on SQLite only, and docker-compose.yml is untested. Run docker compose up -d db, set DATABASE_URL, and load a runLaterLater
  • B34Typed tables for datasets without a spec §6 table (seed_awards, award_competition, subawards, listed_party_paths, web_presence, official_list_entries, spending_trends, reference_lists, tradeverifyd_*, address_clusters, false_positive_sample). They are stored in dataset_rows as JSON for nowLaterLater
  • B35The CHPL parser finds 52 HS codes on the saved BIS page, which says 50. Check which two are extra (probably codes mentioned outside the tier tables)LaterLater
  • B36The frontend's public/fixtures/serniya.json (PR #2) still uses edge_counts. Align it with the backend's relationship_count together with whoever owns the frontendResolvedResolved 25 Sep 2026: lib/types.ts and the node panel use relationship_count; scripts/build_showcase.py copies the audited root fixtures to public/fixtures/
  • B37Runtime: spec §4.1 says Python 3.12, but the build machine's usable Python is 3.9 (Xcode licence not accepted), so the code is kept 3.9-compatible and packages are installed with pip --user (requirements.txt). Move to a 3.12 virtual environment when availableLaterLater
  • B38Tradeverifyd candidate matching (tradeverifyd_annotations) uses name-or-alias word overlap of at least 0.8 plus country. Provisional: calibrate on Appendix A together with B28LaterLater
  • B39web_presence classifies results with a small provisional domain list. Spec §8.2 expects config/news_topics.yaml with typology keyword rules; news queries currently sit in config/datasets.yaml news. Move them and define the rulesLaterLater
  • B40Seeds whose Sayari candidates don't share the seed's UEI stay unresolved (all PPP seeds, because PPP rows carry no UEI). Spec §7.2 needs an analyst selection step before those seeds can get Sayari datasetsLaterLater (needed before the live pilot covers pandemic seeds)
  • B41SAM.gov Entity API and Exclusions responses have not been recorded yet, so entity_identifiers stores only the UEI queried. Record one of each (needs a SAM key; B22)Open / newOpen
  • B42The GitHub repository is public, and fixtures/recorded/ contains raw Sayari and Tradeverifyd responses whose licence is unconfirmed (spec §2.10). Options: make the repo private; or move the recordings to a git-ignored path and remove them from Git history; or confirm with the vendors that test fixtures may be publishedDecision neededDecision needed
  • B43In USAspending subaward mode, which party recipient_search_text matches is unconfirmed. subawards keeps only rows whose Prime Award Recipient UEI equals the seed UEILaterLater
  • B44The CSL JSON download's envelope is unconfirmed (the parser accepts a list or a results list). Record one live downloadLaterLater
  • B45Parquet exports store nested values (lists, objects) as JSON text so the schema stays stable. Decide on typed nested columns once the downstream readers are knownLaterLater
  • B46Credentials for the live pilot (Task 2f steps 2–3): Sayari REST (B25), SAM_API_KEY, TAVILY_API_KEY, and the Tradeverifyd variables in .env.example. None are set in the build environmentOpen / newOpen (needed for 2f step 2)
  • B47tests/test_scoring.py imports pytest, which isn't in requirements.txt, so it only runs through a local shim. Add a requirements-dev.txt with pytest and a single test command (or CI)LaterLater
  • B48The Claude Code Tradeverifyd MCP connector returned HTTP 401 on 25 Sep 2026 (the repo adapter's token is separate). Refresh the token before the live pilot. The dossiers now say trade lanes were not retrieved in this pass, not that there was an authorization errorOpen / newOpen (needed for 2f step 2)
  • B49The /traceability showcase reads lib/generated/showcase.json, which scripts/build_showcase.py writes. Re-run the script after changing research, fixtures or the backlog (or add it to the build) so the page doesn't go staleLaterLater