@yottagraph-app/data-model-skill 0.0.32 → 0.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,299 @@
1
+ # Dataset schema for Companies House People with Significant Control (PSC).
2
+ #
3
+ # Architecture:
4
+ # Each PSC JSON record produces TWO records:
5
+ # 1. An organization record (the controlled company) with identity
6
+ # properties (company number).
7
+ # 2. A person or organization record (the PSC) with a "controls"
8
+ # relationship to the company, carrying natures_of_control,
9
+ # notified_on, and ceased_on as attributes.
10
+ #
11
+ # All elements are passive — created by the atomizer from parsed JSON
12
+ # snapshot data, not by LLM extraction.
13
+ #
14
+ # Source identifier: "companieshousepsc-source"
15
+ name: "companieshousepsc"
16
+ description: "UK People with Significant Control (PSC) data from Companies House — individuals and entities with significant control over UK companies"
17
+
18
+ extraction:
19
+ flavors: closed
20
+ properties: closed
21
+ relationships: closed
22
+ attributes: closed
23
+ events: closed
24
+
25
+ flavors:
26
+ - name: "organization"
27
+ description: "A particular business, institution, or organization such as a corporation, university, government agency, or non-profit"
28
+ display_name: "Organization"
29
+ mergeability: not_mergeable
30
+ strong_id_properties: ["companies_house_number", "registration_number"]
31
+ passive: true
32
+
33
+ - name: "person"
34
+ description: "A real person as opposed to a fictional character, such as a CEO, politician, or public figure"
35
+ display_name: "Person"
36
+ mergeability: not_mergeable
37
+ passive: true
38
+
39
+ - name: "verification_info"
40
+ namespace: "companieshousepsc"
41
+ description: "Identity verification details for a person with significant control."
42
+ display_name: "Verification Info"
43
+ mergeability: not_mergeable
44
+ strong_id_properties: ["companieshousepsc_verification_id"]
45
+ passive: true
46
+
47
+ # --- Identity properties (on organization) ---
48
+
49
+ properties:
50
+ - name: "companies_house_number"
51
+ type: string
52
+ description: "Companies House registered company number uniquely identifying a UK company"
53
+ display_name: "Companies House Number"
54
+ mergeability: not_mergeable
55
+ domain_flavors: ["organization"]
56
+ examples: ["00000006", "12345678", "SC123456"]
57
+ passive: true
58
+
59
+ - name: "registration_number"
60
+ type: string
61
+ description: "Registration number of a corporate entity PSC as provided in their identification details"
62
+ display_name: "Registration Number"
63
+ mergeability: not_mergeable
64
+ domain_flavors: ["organization"]
65
+ examples: ["00686734", "HRB 12345", "34317340"]
66
+ passive: true
67
+
68
+ - name: "country_registered"
69
+ type: string
70
+ description: "Country in which a corporate entity PSC is registered"
71
+ display_name: "Country Registered"
72
+ mergeability: not_mergeable
73
+ domain_flavors: ["organization"]
74
+ examples: ["England & Wales", "Netherlands", "United Kingdom"]
75
+ passive: true
76
+
77
+ - name: "legal_form"
78
+ type: string
79
+ description: "Legal form of a corporate entity PSC (e.g. Private Limited Company, LLP)"
80
+ display_name: "Legal Form"
81
+ mergeability: not_mergeable
82
+ domain_flavors: ["organization"]
83
+ examples: ["Private Limited Company", "Limited Liability Partnership", "Public Limited Company"]
84
+ passive: true
85
+
86
+ - name: "legal_authority"
87
+ type: string
88
+ description: "Legal authority under which a corporate entity PSC is registered"
89
+ display_name: "Legal Authority"
90
+ mergeability: not_mergeable
91
+ domain_flavors: ["organization"]
92
+ examples: ["Companies Act", "Companies Act 2006", "Dutch Company Law"]
93
+ passive: true
94
+
95
+ - name: "place_registered"
96
+ type: string
97
+ description: "Place or registry where a corporate entity PSC is registered"
98
+ display_name: "Place Registered"
99
+ mergeability: not_mergeable
100
+ domain_flavors: ["organization"]
101
+ examples: ["Companies House Cardiff", "Kamer Van Koophandel", "Register Of Companies"]
102
+ passive: true
103
+
104
+ # --- PSC person properties ---
105
+
106
+ - name: "honorific"
107
+ type: string
108
+ description: "Title of an individual person with significant control (e.g. Mr, Mrs, Dr)"
109
+ display_name: "Honorific"
110
+ mergeability: not_mergeable
111
+ domain_flavors: ["person"]
112
+ examples: ["Mr", "Mrs", "Dr", "Ms"]
113
+ passive: true
114
+
115
+ - name: "forename"
116
+ type: string
117
+ description: "First name of an individual person with significant control"
118
+ display_name: "Forename"
119
+ mergeability: not_mergeable
120
+ domain_flavors: ["person"]
121
+ examples: ["John", "Jane", "Mohammed"]
122
+ passive: true
123
+
124
+ - name: "middle_name"
125
+ type: string
126
+ description: "Middle name of an individual person with significant control"
127
+ display_name: "Middle Name"
128
+ mergeability: not_mergeable
129
+ domain_flavors: ["person"]
130
+ examples: ["James", "Elizabeth", "Lee"]
131
+ passive: true
132
+
133
+ - name: "surname"
134
+ type: string
135
+ description: "Surname of an individual person with significant control"
136
+ display_name: "Surname"
137
+ mergeability: not_mergeable
138
+ domain_flavors: ["person"]
139
+ examples: ["Smith", "Doe", "Patel"]
140
+ passive: true
141
+
142
+ - name: "date_of_birth"
143
+ type: string
144
+ description: "Date of birth of an individual person with significant control, as YYYY-MM (month and year only; day is not disclosed)"
145
+ display_name: "Date of Birth"
146
+ mergeability: not_mergeable
147
+ domain_flavors: ["person"]
148
+ examples: ["1971-02", "1985-11"]
149
+ passive: true
150
+
151
+ - name: "declared_nationality"
152
+ type: string
153
+ description: "Self-declared nationality of an individual person with significant control, as free text"
154
+ display_name: "Declared Nationality"
155
+ mergeability: not_mergeable
156
+ domain_flavors: ["person"]
157
+ examples: ["British", "American", "German"]
158
+ passive: true
159
+
160
+ - name: "country_of_residence"
161
+ type: string
162
+ description: "Country of residence of an individual person with significant control"
163
+ display_name: "Country of Residence"
164
+ mergeability: not_mergeable
165
+ domain_flavors: ["person"]
166
+ examples: ["England", "Scotland", "United States"]
167
+ passive: true
168
+
169
+ - name: "notified_on"
170
+ type: string
171
+ description: "Date on which Companies House was notified of this person or organization with significant control, as YYYY-MM-DD"
172
+ display_name: "Notified On"
173
+ mergeability: not_mergeable
174
+ domain_flavors: ["person", "organization"]
175
+ examples: ["2016-04-06", "2023-01-15"]
176
+ passive: true
177
+
178
+ - name: "address"
179
+ type: string
180
+ description: "Physical street address of the entity"
181
+ display_name: "Address"
182
+ mergeability: not_mergeable
183
+ domain_flavors: ["person", "organization"]
184
+ examples: ["Norfolk House Farm, Gedney Marsh, Holbeach, Spalding, Lincolnshire, PE12 9PB"]
185
+ passive: true
186
+
187
+ # --- Identity verification properties (on verification_info) ---
188
+
189
+ - name: "identity_verified_on"
190
+ type: string
191
+ description: "Date on which the PSC's identity was verified, as an ISO 8601 timestamp"
192
+ display_name: "Identity Verified On"
193
+ mergeability: not_mergeable
194
+ domain_flavors: ["companieshousepsc::verification_info"]
195
+ examples: ["2026-05-01"]
196
+ passive: true
197
+
198
+ - name: "verification_start_on"
199
+ type: string
200
+ description: "Date from which an identity verification statement can be supplied for the PSC notification"
201
+ display_name: "Verification Start On"
202
+ mergeability: not_mergeable
203
+ domain_flavors: ["companieshousepsc::verification_info"]
204
+ examples: ["2025-12-17T00:00:00Z"]
205
+ passive: true
206
+
207
+ - name: "verification_end_on"
208
+ type: string
209
+ description: "Date on which the identity verification statement was removed for the PSC notification"
210
+ display_name: "Verification End On"
211
+ mergeability: not_mergeable
212
+ domain_flavors: ["companieshousepsc::verification_info"]
213
+ examples: ["9999-12-31T00:00:00Z"]
214
+ passive: true
215
+
216
+ - name: "verification_statement_date"
217
+ type: string
218
+ description: "Date on which the identity verification statement was supplied for the PSC notification"
219
+ display_name: "Verification Statement Date"
220
+ mergeability: not_mergeable
221
+ domain_flavors: ["companieshousepsc::verification_info"]
222
+ examples: ["2026-08-23T00:00:00Z"]
223
+ passive: true
224
+
225
+ - name: "verification_statement_due_on"
226
+ type: string
227
+ description: "Date by which an identity verification statement must be supplied for the PSC notification"
228
+ display_name: "Verification Statement Due On"
229
+ mergeability: not_mergeable
230
+ domain_flavors: ["companieshousepsc::verification_info"]
231
+ examples: ["2026-09-05T00:00:00Z"]
232
+ passive: true
233
+
234
+
235
+ # --- Relationships ---
236
+
237
+ relationships:
238
+ - name: "controls"
239
+ description: "Link from a person or organization to a company they have significant control over"
240
+ display_name: "Controls"
241
+ mergeability: not_mergeable
242
+ domain_flavors: ["person", "organization"]
243
+ target_flavors: ["organization"]
244
+ passive: true
245
+
246
+ - name: "has_verification"
247
+ description: "Link from a person to their identity verification record"
248
+ display_name: "Has Verification"
249
+ mergeability: not_mergeable
250
+ domain_flavors: ["person"]
251
+ target_flavors: ["companieshousepsc::verification_info"]
252
+ passive: true
253
+
254
+ - name: "verified_by_csp"
255
+ description: "Link from a verification record to the authorised corporate service provider that verified the PSC's identity"
256
+ display_name: "Verified By CSP"
257
+ mergeability: not_mergeable
258
+ domain_flavors: ["companieshousepsc::verification_info"]
259
+ target_flavors: ["organization"]
260
+ passive: true
261
+
262
+ - name: "anti_money_laundering_supervisory_body"
263
+ description: "Link from a verification record to the anti-money laundering supervisory body that performed the verification"
264
+ display_name: "AML Supervisory Body"
265
+ mergeability: not_mergeable
266
+ domain_flavors: ["companieshousepsc::verification_info"]
267
+ target_flavors: ["organization"]
268
+ passive: true
269
+
270
+ # --- Attributes (on the controls relationship) ---
271
+
272
+ attributes:
273
+ - properties: ["controls"]
274
+ name: "kind"
275
+ type: string
276
+ description: "The kind of PSC entry, indicating whether the controlling party is an individual, corporate entity, or legal person"
277
+ display_name: "PSC Kind"
278
+ mergeability: not_mergeable
279
+
280
+ - properties: ["controls"]
281
+ name: "nature_of_control"
282
+ type: string
283
+ description: "A single nature of significant control, e.g. share ownership percentage band or voting rights; multiple values may be present as separate attributes"
284
+ display_name: "Nature of Control"
285
+ mergeability: not_mergeable
286
+
287
+ - properties: ["controls"]
288
+ name: "notified_on"
289
+ type: string
290
+ description: "Date on which Companies House was notified of this person with significant control, as YYYY-MM-DD"
291
+ display_name: "Notified On"
292
+ mergeability: not_mergeable
293
+
294
+ - properties: ["controls"]
295
+ name: "ceased_on"
296
+ type: string
297
+ description: "Date on which this person ceased to have significant control, as YYYY-MM-DD; empty if still active"
298
+ display_name: "Ceased On"
299
+ mergeability: not_mergeable
@@ -2532,7 +2532,7 @@ relationships:
2532
2532
  # ── Organization → Filing ──
2533
2533
 
2534
2534
  - name: "filed"
2535
- description: "Link from a company or person to an SEC filing document they filed, or from a sub-record (event, transaction, holding) to its parent filing"
2535
+ description: "Link from a company or person to a regulatory filing document they filed, or from a sub-record to its parent filing"
2536
2536
  display_name: "Filed"
2537
2537
  mergeability: not_mergeable
2538
2538
  domain_flavors: ["organization", "person", "sec::10_k", "sec::10_q", "sec::20_f", "sec::8_k", "sec::6_k", "sec::40_f", "sec::form_3", "sec::form_4", "sec::sc_13d", "sec::sc_13g", "sec::13f_hr", "sec::def_14a", "sec::nport_p", "sec::ncen", "sec::form_d", "sec::filing"]
@@ -18,6 +18,7 @@ Financial figures are reported in thousands of USD as filed in Call Reports. Not
18
18
  |----------|----------------|
19
19
  | Institution profiles + financials | `fdic` |
20
20
  | Bank failures | `fdic_failure` |
21
+ | Structure-change events (mergers, consolidations, name changes, regulator changes, failures, voluntary closings, etc.) | `fdic_history` |
21
22
 
22
23
  ---
23
24
 
@@ -29,7 +30,21 @@ An FDIC-insured depository institution (commercial bank, savings bank, savings a
29
30
 
30
31
  - Primary key: `fdic_certificate_number` (FDIC Certificate Number, unique identifier assigned to each insured institution)
31
32
  - Entity resolver: named entity. Strong ID = `fdic_certificate_number`. Disambiguation context includes institution name, city, state, and holding company name. Prior names serve as aliases.
32
- - Sources: `fdic`, `fdic_failure`
33
+ - Sources: `fdic`, `fdic_failure`, `fdic_history`
34
+
35
+ ### `bank_structure_event`
36
+
37
+ A structure-change transaction recorded by the FDIC against an FDIC-insured (or FDIC-tracked) depository institution. Each row in the FDIC History API at the institution level (`ORG_ROLE_CDE = "FI"`) becomes one `bank_structure_event` entity. This single flavor covers the full breadth of FI-level CHANGECODEs the FDIC tracks: unassisted mergers, consolidations, absorptions, FDIC-assisted resolutions, voluntary closings, new charters, name changes, regulator and chartering-agency changes, class changes, and trust-power grants (among others).
38
+
39
+ This event-as-entity model lets a single FDIC transaction be queried as a first-class graph object with explicit relationships to every party involved. It is intentionally emitted in parallel with two simpler direct bank-to-bank edges: the existing `acquired_by` edge on failed-bank `organization` entities (sourced from `fdic_failure`) and the new general `succeeded_by` edge on disappearing `organization` entities (sourced from `fdic_history`). Both direct edges and the `bank_structure_event` entity coexist permanently — they are redundant by design so consumers can pick whichever shape fits their query.
40
+
41
+ - Primary key: `fdic_transaction_number` (FDIC's `TRANSNUM`, a globally unique transaction identifier) for the ~91% of FI-level events that are transaction-backed; the ~9% of events with `TRANSNUM = 0` (~16K of ~185K rows, dominated by ~14K `CC = 1` "Institution Established" plus location changes, cert reassignments, charter changes, etc.) instead use `fdic_history_event_id` (the row's `ID` field, a composite of effective date + CHANGECODE + an internal identifier, unique per row).
42
+ - Entity resolver: named entity. Strong ID is `fdic_transaction_number` when `TRANSNUM > 0`, otherwise `fdic_history_event_id`. The two strong-ID properties are mutually exclusive for any given event. Disambiguation context includes the change description, effective date, and the names of the affected institutions.
43
+ - Sources: `fdic_history`
44
+ - Naming: deterministic, derived from the parties and CHANGECODE_DESC. Examples:
45
+ - `"FDIC TXN 2026008583 — Merger -Without Assistance: Flint Hills Bank → The Bennington State Bank (2026-04-08)"`
46
+ - `"FDIC TXN 2026007976 — Change in Legal Name (FO or BR): ASSOCIATED CREDIT UNION → Openland Credit Union (2026-04-02)"`
47
+ - `"FDIC TXN 2026007610 — Closing - Voluntary: 1st Bank Yuma (2026-03-31)"`
33
48
 
34
49
  ---
35
50
 
@@ -222,16 +237,146 @@ Data source: FDIC BankFind Suite Failures API (`https://api.fdic.gov/banks/failu
222
237
  * Link from the failed institution to the acquiring institution (the bank that purchased assets/assumed deposits).
223
238
  * Target flavor: `organization`
224
239
  * Examples: First Independence Bank acquired Metropolitan Capital B&T
240
+ * Source: `fdic_failure`. Coexists permanently with the more general `succeeded_by` edge (from `fdic_history`) and with the `bank_structure_event` entity model — the parallel representations are emitted intentionally.
241
+
242
+ * `succeeded_by`
243
+ * Direct link from a depository institution that ceased to exist (via merger, consolidation, absorption, or FDIC resolution) to its successor institution.
244
+ * Domain flavor: `organization` (the disappearing party). Target flavor: `organization` (the surviving/acquiring party).
245
+ * Source: `fdic_history`. Emitted whenever a History API row has a non-zero `OUT_CERT`, an acquirer side (`ACQ_CERT`, falling back to `SUR_CERT`) that is non-zero AND distinct from `OUT_CERT`, AND `ORG_STAT_FLG = "N"` (the outgoing institution actually disappeared). This skips branch-purchase rows (CHANGECODE 712) where both banks survive and live-after-reorg cases (e.g. some CHANGECODE 224 affiliated mergers).
246
+ * Direction: emitted on the disappearing entity, pointing to the successor.
247
+ * Examples: Wachovia Bank of Delaware → Wells Fargo Bank, National Association; Silicon Valley Bank → Deposit Insurance National Bank of Santa Clara; Flint Hills Bank → The Bennington State Bank
248
+ * Coexists permanently with the `bank_structure_event` entity model (which captures richer party metadata via `subject_institution` / `outgoing_institution` / `successor_institution`) and with the failure-specific `acquired_by` edge.
225
249
  * Derivation: `BIDNAME` field from the Failures API response. Omitted when no acquirer (payout resolution). The acquiring institution is created as a separate organization entity identified by name.
250
+ * Status: planned to be removed in a follow-up migration once `bank_structure_event` is in use.
251
+
252
+ ### Bank Structure Event Properties (source: `fdic_history`)
253
+
254
+ Data source: FDIC BankFind Suite History API (`https://api.fdic.gov/banks/history`), filtered to `ORG_ROLE_CDE:FI` (institution-level rows). Branch-level rows (`BR`) are skipped.
255
+
256
+ #### Identification
257
+
258
+ * `fdic_transaction_number`
259
+ * The FDIC `TRANSNUM`, globally unique per transaction-backed structure-change. Serves as the entity's strong ID for the ~91% of FI-level events that have a TRANSNUM. **Emitted only when `TRANSNUM > 0`.**
260
+ * Examples: `"2026008583"`, `"2026007976"`, `"2026002845"`
261
+ * Derivation: `TRANSNUM` field from the History API, formatted as a string.
262
+
263
+ * `fdic_history_event_id`
264
+ * Per-row identifier from the `ID` field of the FDIC History API. Used as the entity's strong ID for the ~9% of FI-level events that have `TRANSNUM = 0` (~16K of ~185K rows). The ID is a composite of effective date, CHANGECODE, and an internal identifier — unique per row — so it disambiguates events that the History API itself does not assign a transaction number to (most CC=1 "Institution Established" rows, all CC=150 cert reassignments, many CC=510 location changes, charter-class changes, etc.). **Emitted only when `TRANSNUM = 0`**; mutually exclusive with `fdic_transaction_number`.
265
+ * Examples: `"1972-09-28T00:00:00_150_14384__"`, `"1970-03-31T00:00:00_150_13853__"`
266
+ * Derivation: `ID` field from the History API, copied verbatim. When the API returns both `TRANSNUM = 0` AND empty `ID` (vanishingly rare in practice), falls back to a composite key of `cc-<code>-eff-<date>-cert-<cert>-out-<out>-sur-<sur>-acq-<acq>` so the event still has a non-colliding strong ID.
267
+
268
+ #### Event Description
269
+
270
+ * `event_change_code`
271
+ * Numeric FDIC change-event code identifying the kind of structure change (e.g. `223` = unassisted merger, `211` = whole-institution failure, `510` = legal-name change, `240` = voluntary closing, `110` = new institution).
272
+ * Examples: `"223"`, `"110"`, `"510"`, `"240"`, `"211"`, `"810"`, `"440"`
273
+ * Derivation: `CHANGECODE` field from the History API, stored as a string to preserve leading-zero semantics in display.
274
+
275
+ * `event_change_description`
276
+ * Human-readable description of the change-event code as published by the FDIC.
277
+ * Examples: `"Merger -Without Assistance"`, `"Failure - Whole Institution"`, `"Closing - Voluntary"`, `"Change in Legal Name (FO or BR)"`, `"New Institution"`, `"Participated in Absorbtion/Consolidation/Merger"`, `"Change in Primary Regulatory Agency"`
278
+ * Derivation: `CHANGECODE_DESC` field from the History API.
279
+
280
+ * `event_category`
281
+ * Normalized categorical bucket for the structure-change event, derived from `CHANGECODE` so consumers can filter without memorizing numeric codes. Always present on every `bank_structure_event` record.
282
+ * Values: `"merger"`, `"failure"`, `"voluntary_closing"`, `"new_institution"`, `"name_change"`, `"location_change"`, `"charter_change"`, `"other"`.
283
+ * Mapping (rooted in the full FI-level backfill; see `GUIDANCE_LOG.md`):
284
+ * `merger`: unassisted absorptions/consolidations/mergers, affiliated pooling, branch purchases, and partner-side merger rows. CHANGECODEs 221, 222, 223, 224, 225, 712, 810, 811, 812.
285
+ * `failure`: FDIC-assisted resolutions, conservatorships, RTC payoffs, open-bank assistance, and chartering-agency-driven closures. CHANGECODEs 211, 213, 215, 216, 217, 230, 235, 260, 350, 360, 830.
286
+ * `voluntary_closing`: CHANGECODE 240.
287
+ * `new_institution`: newly chartered institutions and administrative cert reassignments. CHANGECODEs 110, 150.
288
+ * `name_change`: CHANGECODE 510.
289
+ * `location_change`: physical-address moves. CHANGECODE 520.
290
+ * `charter_change`: FRS membership, insurance-status, chartering-agency/class/org-type/primary-regulator changes, trust powers granted, and phantom holding-company reorgs. CHANGECODEs 310, 320, 340, 410, 420, 430, 440, 470, 610, 820.
291
+ * `other`: any CHANGECODE not in the above buckets. Currently only CC 1 (History Record Initiation, the pre-history-of-tracking baseline marker). Future-unknown codes also fall here so they surface visibly downstream rather than silently disappearing.
292
+ * Source of truth for the CHANGECODE numeric-to-description mapping: the FDIC History API itself. Every History API row carries the human-readable description inline in `CHANGECODE_DESC` (which we also pass through as `event_change_description`), and the `CHANGECODE` field is documented in the FDIC's official [History API definitions](https://banks.data.fdic.gov/docs/history_properties.yaml) (raw YAML at `https://api.fdic.gov/banks/docs/history_properties.yaml`). The FDIC does not publish a separate code-list document — the canonical descriptions live in the API payloads — so the seven category buckets here are our editorial grouping over those FDIC-published descriptions, empirically validated against the full ~116K-row FI-level backfill (every distinct `(CHANGECODE, CHANGECODE_DESC)` pair observed is covered; see `GUIDANCE_LOG.md` 2026-05-20 entry for the per-code counts).
293
+ * Derivation: `fdic.HistoryEventCategory(CHANGECODE)` in Go.
294
+
295
+ * `is_fdic_assisted`
296
+ * String-encoded boolean (`"true"` or `"false"`) indicating whether the FDIC (or its predecessor RTC) provided financial assistance, brokered the resolution, or otherwise stepped in to handle the institution involved in the event. Always present on every `bank_structure_event` record.
297
+ * Examples: `"true"`, `"false"`.
298
+ * Mapping (true for the 13 codes below, false for everything else):
299
+ * `211` Failure - Whole Institution
300
+ * `213` Merger - Assisted
301
+ * `215` Failure Multiple Acquirer
302
+ * `216` Bridge Bank Resolution
303
+ * `217` Passthrough Receivorship/Conservatorship Resolution
304
+ * `230` Closing - Failure Payoff
305
+ * `235` Rtc Supervised Payoffs, Liquidations, and Closings
306
+ * `260` Bank Closed by Chartering Agency Pending Sale (always leads to FDIC-brokered resolution)
307
+ * `350` Institution Enters Conservatorship
308
+ * `360` Conservatorship Institution Resolved
309
+ * `811` Participated in FDIC Assisted Merger
310
+ * `812` Rtc Assisted Merger
311
+ * `830` Open Bank Assistance
312
+ * Intentionally orthogonal to `event_category`: 811 and 812 are in the `merger` bucket (they are merger transactions) but are simultaneously FDIC-assisted. All other true-codes overlap with the `failure` bucket. CHANGECODE 240 (voluntary closing) and all charter/name/location/regulator changes are always `"false"`.
313
+ * Source of truth: the FDIC's own [History API definitions](https://banks.data.fdic.gov/docs/history_properties.yaml) for the `CHANGECODE` field, plus the `CHANGECODE_DESC` text returned inline on every row (the words "Assisted" / "Bridge" / "Conservatorship" / "Payoff" / "Receivorship" / "Open Bank Assistance" are FDIC's own labels for these codes). The cutoff between assisted and unassisted follows FDIC's own usage of "FDIC-assisted transaction" in its public failure/resolution literature.
314
+ * Derivation: `fdic.HistoryIsFdicAssisted(CHANGECODE)` in Go.
315
+
316
+ * `event_charter_class`
317
+ * FDIC institution charter-class code in effect at the time of the event, sourced directly from the History API `CLASS` field. Uses the same code set as the `organization`-level `charter_class` property (`N` = national bank OCC-supervised, `SM` = state-chartered Fed member, `NM` = state-chartered non-member, `SB` = savings bank, `SA` = savings association, etc.).
318
+ * Examples: `"N"`, `"SM"`, `"NM"`, `"SB"`, `"SA"`.
319
+ * Coverage: 100% of FI-level History rows have `CLASS` populated (confirmed against the live API: zero rows return `!_exists_:CLASS`).
320
+ * Critical for charter/regulator-change events: for `CHANGECODE = 430` (Change in Class), `440` (Change in Organization Type), and `470` (Change in Primary Regulatory Agency), this is literally the value the event changed *to*. For all other events it records the institution's class at the time the event happened.
321
+ * Derivation: `CLASS` field from the FDIC History API, passed through unmodified. See the [History API definitions](https://banks.data.fdic.gov/docs/history_properties.yaml).
322
+
323
+ * `event_effective_date`
324
+ * Date the structure change took effect, formatted YYYY-MM-DD.
325
+ * Examples: `"2026-04-08"`, `"2026-03-31"`, `"2008-12-31"`
326
+ * Derivation: `EFFDATE` field from the History API, parsed from `YYYY-MM-DDTHH:MM:SS`.
327
+
328
+ * `previous_legal_name`
329
+ * The institution's prior legal name when the event represents a name change. One value per affected entity.
330
+ * Examples: `"ASSOCIATED CREDIT UNION"`, `"Wachovia Bank, National Association"`
331
+ * Derivation: `FRM_INSTNAME` field from the History API, emitted only when it differs from `INSTNAME` (typical for `CHANGECODE = 510`).
332
+
333
+ * `previous_fdic_certificate_number`
334
+ * The institution's prior FDIC certificate number when the event records a cert reassignment. One value per affected entity.
335
+ * Examples: `"90054"`, `"90465"`, `"90337"` (in the FDIC's data the canonical cases reassign legacy 90000-range temp certs to modern 20000-range stable certs).
336
+ * Coverage: emitted only when `FRM_CERT` is populated and distinct from `CERT`. Canonical case is `CHANGECODE = 150` ("Cert Changed from Old Cert by Administrative Order"); ~280 such rows exist in the full FI-level backfill.
337
+ * Strong-ID alias behavior: the same prior CERT is **also added as an additional `fdic_certificate_number` strong-id on the `subject_institution` organization entity**, so entity resolution merges the bank's old-cert and new-cert identities into a single `organization`. This means a downstream query for either cert number resolves to the same bank, regardless of which cert era the citing source used.
338
+ * Derivation: `FRM_CERT` field from the History API; emitted only when `FRM_CERT != 0 && FRM_CERT != CERT`.
339
+
340
+ #### Party Relationships (target flavor: `organization`)
341
+
342
+ For each event we emit a relationship per party that the History API row populates. Most events (mergers, failures) populate `subject_institution` plus `outgoing_institution` and `successor_institution`. Single-party events (name change, regulator change, new institution, voluntary closing) populate only `subject_institution`.
343
+
344
+ * `subject_institution`
345
+ * The institution this History API row is filed against (the row's primary CERT). For mergers/failures, this is the disappearing party (the same bank also surfaced as `outgoing_institution`); for name/regulator/charter/class changes, voluntary closings, and new institutions, this is the affected institution itself.
346
+ * Target flavor: `organization`
347
+ * Derivation: `CERT` + `INSTNAME` (with `FRM_INSTNAME` recorded as an alias when present and distinct).
348
+ * Strong-IDs on the target organization: always `fdic_certificate_number = CERT`; additionally `fdic_certificate_number = FRM_CERT` when `FRM_CERT` is populated and differs from `CERT` (see `previous_fdic_certificate_number` above). The multi-strong-id form ensures entity resolution collapses old-cert and new-cert identities for the same bank.
349
+
350
+ * `outgoing_institution`
351
+ * The institution that ceased to exist as a result of the event (its CERT may continue to appear in the History API only as historical reference). Emitted when `OUT_CERT` is populated.
352
+ * Target flavor: `organization`
353
+ * Derivation: `OUT_CERT` + `OUT_INSTNAME` from the History API.
354
+
355
+ * `successor_institution`
356
+ * The institution that took the outgoing party's deposits and/or assets following a merger, consolidation, absorption, or FDIC-assisted resolution. One edge per event, regardless of how the FDIC split the signal across `ACQ_CERT` and `SUR_CERT`.
357
+ * Target flavor: `organization`
358
+ * Derivation: `ACQ_CERT` + `ACQ_INSTNAME` preferred; falls back to `SUR_CERT` + `SUR_INSTNAME` when only the legal-survivor side is populated (~122 events in the full FI-level backfill). Emitted whenever at least one of those certs is non-zero.
359
+ * Why a single edge instead of separate `surviving_institution` + `acquiring_institution`: the FDIC publishes these as two fields, but empirically they almost always agree. Across the full 116,263-row FI-level backfill:
360
+ * 23,114 events have both `SUR_CERT` and `ACQ_CERT` populated; only **3** of those (0.01%) have different CERTs.
361
+ * 2,988 events have only `ACQ_CERT`.
362
+ * 122 events have only `SUR_CERT`.
363
+ * The 3 divergence cases all share the same INSTITUTION name on both sides (BayBank Middlesex, Gold Bank, University Savings Association) — they're administrative cert renumberings of the same successor entity, not genuinely distinct parties. So a separate edge is not worth the schema noise.
364
+ * Consumers needing the raw distinction can re-derive it from the underlying History API row (`ACQ_CERT` vs `SUR_CERT`).
226
365
 
227
366
  ---
228
367
 
229
368
  ## Entity Relationships
230
369
 
231
370
  ```
232
- organization ──[acquired_by]──→ organization (failed bank → acquirer, from fdic_failure)
371
+ organization ──[acquired_by]────────────→ organization (failed bank → acquirer, from fdic_failure)
372
+ organization ──[succeeded_by]───────────→ organization (disappearing bank → successor, from fdic_history; covers all M&A + failures)
373
+ bank_structure_event ──[subject_institution]────→ organization (event → primary affected bank)
374
+ bank_structure_event ──[outgoing_institution]───→ organization (event → disappearing bank, when applicable)
375
+ bank_structure_event ──[successor_institution]──→ organization (event → bank that took the deposits/assets, when applicable; collapses SUR + ACQ)
233
376
  ```
234
377
 
378
+ The three lineage representations (`acquired_by`, `succeeded_by`, and `bank_structure_event`) are intentionally redundant. `acquired_by` and `succeeded_by` provide direct bank-to-bank edges for queries that just need lineage; `bank_structure_event` provides the full event entity with change-code, effective date, and party metadata for queries that need transactional context.
379
+
235
380
  ---
236
381
 
237
382
  ## Attributes
@@ -241,3 +386,4 @@ FDIC records do not use source-specific attributes beyond the standard citation
241
386
  - **Institution atoms**: citation text follows the pattern `"FDIC BankFind: {field_description} for {institution_name} (CERT: {cert})"`.
242
387
  - **Financial atoms**: citation text follows the pattern `"FDIC Call Report ({report_date}): {field_description} for {institution_name} (CERT: {cert})"`.
243
388
  - **Failure atoms**: citation text follows the pattern `"FDIC Failure: {institution_name} failed {failure_date}"`.
389
+ - **Bank-structure-event atoms**: citation text follows the pattern `"FDIC History TXN {transnum} ({change_desc}, {effective_date}): {field_description}"`.