Public Budget AI #4: Breaking Cartels via DART & Registries

📌 Key Takeaways
- Overcoming the Field Limitation: Addressing our honest admission from Part 2 that "procurement logs alone cannot identify borrowed-name dummy CEOs and decentralized shells", we built a real-time corporate governance ingestion client (
CorporateRegistryClient) integrating DART filings and supreme court corporate registries.- 2 Preempted Architectural Hurdles:
- Resolved identifier fragmentation across Tax IDs (10-digits), Court IDs (13-digits), and DART codes (8-digits) via a 3-way hash index bridge.
- Prevented knowledge graph explosion by enforcing governance significance thresholds (executive seats + 50%+ equity).
- 3 Real Production Bugs Resolved:
- Circular Cross-Shareholding: Fixed
RecursionErrorcrashes during recursive ownership traversals using NetworkX Strongly Connected Components (SCC) cycle condensation.- Newly Minted Shell Blind Spots: Added delta-day calculations (
<180 days) to flag entities incorporated immediately prior to high-value bids.- 51:49 Spousal Equity Disguise: Unmasked dummy sole-source privilege fronts via compound family relation graph rules.
- Shipped Verification: Unmasked a $130,000 tender where a single hidden individual owned 80% and held board seats across two seemingly competing bidders; 17/17 test suites passed.
⚠️ Legal Notice & Anonymization
[Notice] All entities, contract identifiers, and locations in this report are strictly anonymized.
To protect corporate confidentiality and avoid legal conflicts, all contracting agencies (e.g.,Agency A), corporate bidders (e.g.,Company B,Company C), real person names (Mr. K,Mr. P), contract IDs, and physical addresses have been masked and pseudonymized.
Introduction: Tackling the Most Painful Limitation of Part 2
In Part 2, we published our interim audit findings with full transparency, explicitly acknowledging a fundamental algorithmic blind spot:
"⚠️ Limitation 1: Borrowed-Name Representatives & Decentralized Shells — When fraudulent cartels register dummy firms under distant relatives or business associates with different physical addresses, procurement registries alone cannot establish hidden ownership."
In modern procurement corruption, bad actors rarely use identical business addresses or register multiple bidding firms under their own names. Instead, they incorporate dummy companies with minimal capital, appoint nominees as nominal CEOs, and retain executive board control or supermajority equity behind the scenes. In government tender portals, these entities appear as completely distinct competitors.
To eliminate this blind spot, we expanded our knowledge graph by directly ingesting Supreme Court corporate registries and Financial Supervisory Service (DART) ownership disclosures.
1. Corporate Governance & Registry Architecture
We enriched the fiscal knowledge graph with Person nodes, Executive Directorship edges, and Shareholding Equity edges:
flowchart TD
subgraph ProcurementData ["Public Procurement Ingestion"]
A[KONEPS Public Bids] --> B[Company Node]
end
subgraph CorporateRegistry ["Corporate Registry & DART Filings (New)"]
C[Court Registration Registry] --> D[CorporateRegistryClient]
E[Financial Supervisory DART] --> D
D --> F[Executive Roster<br/>CEO / Inside Directors]
D --> G[Shareholder Ledger<br/>Equity % / Family Ties]
D --> H[Incorporation Date & Capital]
end
subgraph GovernanceGraph ["Heterogeneous Graph (GraphRAG Extended)"]
B --> I[Company-Person Subgraph]
F -->|DIRECTOR_OF| I
G -->|OWNS_SHARE_OF| I
I --> J{Ownership Traversal}
J -->|Single Individual >50% Equity & Director Seat| K[🔴 Hidden Controlling Cartel Flag]
J -->|Incorporated <180 Days Before Bid| L[🟠 Dummy Paper Company Alert]
end
style ProcurementData fill:#eff6ff,stroke:#3b82f6,stroke-width:2px
style CorporateRegistry fill:#f3e8ff,stroke:#9333ea,stroke-width:2px
style GovernanceGraph fill:#fef2f2,stroke:#ef4444,stroke-width:2px
2. Preempted Engineering Challenges
🎯 Challenge 1: Identifier Fragmentation ➔ 3-Way Hash Index Bridge
- Problem: Public procurement tracks 10-digit Tax IDs (
101-81-XXXXX), commercial courts track 13-digit Corporate Registration IDs (110111-XXXXXXX), and financial disclosures track 8-digit DART entity codes (00123456). Standard relational joins immediately failed across disparate key domains. - Preemptive Fix: Built a resident
CorporateEntityBridgehash mapping table withinCorporateRegistryClient, resolving cross-domain identity lookups inO(1)time.
🎯 Challenge 2: Combinatorial Graph Explosion ➔ Significance Thresholds
- Problem: Corporate filings list dozens of non-executive directors, statutory auditors, and retail shareholders. Inserting all connections blindly into NetworkX caused edge counts to balloon by orders of magnitude, causing query timeouts.
- Preemptive Fix: Enforced Governance Significance Thresholds:
- Only ingest Executive/Inside Directors with statutory governance rights.
- Only ingest Shareholders owning
\ge 50.0\%equity (or\ge 30.0\%combined with a board seat).
3. Resolving 3 Unexpected Production Bugs
🚨 Bug 1: RecursionError on Circular Cross-Shareholding
- Symptom: Traversing corporate chains to find Ultimate Beneficial Owners (UBOs) threw
RecursionError: maximum recursion depth exceeded. - Root Cause: Two holding entities held reciprocal cross-equity stakes (Entity B held 60% of Entity C, while Entity C held 40% of Entity B), creating an infinite traversal cycle.
- Fix: Deployed NetworkX Strongly Connected Components (SCC) to condense cyclic dependency subgraphs into single cartel clusters, paired with call-stack visited sets:
def trace_ultimate_beneficial_owner(kg: BudgetKnowledgeGraph, start_corp_id: str, visited: set = None) -> List[str]:
"""
Safely traverses corporate chains, condensing cross-holding cycles
and preventing infinite recursion.
"""
if visited is None:
visited = set()
if start_corp_id in visited:
return [] # Cycle detected -> condense cluster
visited.add(start_corp_id)
ubos = []
for neighbor in kg.get_shareholders(start_corp_id):
share_ratio = kg.get_share_ratio(neighbor, start_corp_id)
if share_ratio >= 50.0:
if kg.is_person(neighbor):
ubos.append((neighbor, share_ratio))
else:
ubos.extend(trace_ultimate_beneficial_owner(kg, neighbor, visited))
return ubos
🚨 Bug 2: The 180-Day Shell Corporation Blind Spot
- Symptom: A shell company incorporated just 3 weeks prior to a $100K tender with $8,000 capital passed standard filters without triggering risk flags.
- Root Cause: Anomaly algorithms focused purely on pricing variances and address matching, ignoring the temporal delta between incorporation and contract award.
- Fix: Implemented
check_newly_established(days_threshold=180), automatically flagging any firm younger than 6 months winning non-competitive sole-source contracts with a 96-point risk score.
🚨 Bug 3: The 51:49 Spousal Equity Disguise
- Symptom: In a $40K preferential small-business grant, a vendor won 3 consecutive contracts. Corporate filings listed Female CEO Mrs. L with 51.0% equity and Inside Director Mr. J (her husband) with 49.0% equity. A simple strict
>50%rule treated Mrs. L as an independent owner, missing the cartel. - Root Cause: The cartel intentionally structured equity at 51:49 to satisfy statutory affirmative action criteria while keeping real operational control under the husband.
- Fix: Extended GraphRAG with Family Ties edges (Spouse/Direct Lineage), triggering
COMPOUND_CARTEL_RISKwhenever combined spousal equity equals 100% and the non-CEO spouse holds an active inside director seat.
4. Field Results: Unmasking a 1-Person Controlled Bid Cartel
flowchart TD
subgraph Owner ["Ultimate Beneficial Owner (UBO)"]
K["Mr. K (Controlling Shareholder)"]
end
subgraph CompanyB ["Company B"]
B_CEO["CEO: Mr. K (Self)"]
B_Share["Equity: 70% owned by Mr. K"]
end
subgraph CompanyC ["Company C"]
C_CEO["CEO: Mr. P (Nominee / Dummy)"]
C_Director["Inside Director: Mr. K (Concurrent)"]
C_Share["Equity: 80% owned by Mr. K!"]
end
subgraph PublicTender ["Public Tender ($130,000)"]
Tender[IT Platform Modernization Tender]
end
K -->|CEO & 70% Equity| CompanyB
K -->|Director & 80% Equity| CompanyC
CompanyB -->|Primary Bidder| Tender
CompanyC -->|Collusive Accompanier Bid| Tender
style Owner fill:#fef2f2,stroke:#ef4444,stroke-width:3px
style CompanyB fill:#fefce8,stroke:#eab308,stroke-width:2px
style CompanyC fill:#fee2e2,stroke:#dc2626,stroke-width:2px
style PublicTender fill:#eff6ff,stroke:#3b82f6,stroke-width:2px
- Surface Procurement Record: In a $130,000 tender (
CNTR-2026-0005),Company BandCompany Csubmitted bids as rival competitors. - Truth Revealed via DART Integration:
- While Company C's nominal CEO was Mr. P, its registered inside director was Mr. K (CEO of Company B).
- Furthermore, Mr. K owned 80.0% of Company C's equity.
- Company C was a dummy shell entity deployed by Mr. K to simulate a competitive tender, guaranteeing that Company B won the contract.
5. Verification: 17/17 Full Test Suites Passed
All 17 integration and unit test suites completed with a 100% pass rate via national_budget_ai/tools/run_all_tests.py:
[PASS 17/17] tools/verify_corporate_and_summons.py <-- Corporate Registry Verified
======================================================================
🎉 National Budget AI: 17/17 Full Test Suites Passed (100% PASS)
======================================================================
6. Conclusion: Equipping Audit AI with Corporate X-Rays
Inspecting public procurement logs without corporate registry data is like examining only the visible tip of an iceberg. Real collusion hides beneath the surface in shareholder ledgers and boardroom rosters.
By linking DART disclosures and company registries into GraphRAG, our AI auditor has evolved from a text searcher into a forensic X-ray machine capable of unmasking ultimate economic beneficiaries.
In Part 5, we will explore the Full 6-Sector Partition Suite, detailing how our agent targets 50M KRW sole-source smurfing and year-end budget dumps!
