@yottagraph-app/data-model-skill 0.0.31 → 0.0.33
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.
- package/package.json +1 -1
- package/skill/companieshouse/DATA_DICTIONARY.md +145 -0
- package/skill/companieshouse/schema.yaml +190 -0
- package/skill/companieshousepsc/DATA_DICTIONARY.md +99 -0
- package/skill/companieshousepsc/schema.yaml +299 -0
- package/skill/edgar/schema.yaml +1 -1
- package/skill/faaregistry/schema.yaml +10 -1
- package/skill/fdic/DATA_DICTIONARY.md +148 -2
- package/skill/fdic/schema.yaml +146 -4
- package/skill/usaspending/DATA_DICTIONARY.md +1075 -0
- package/skill/usaspending/schema.yaml +863 -0
|
@@ -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
|
package/skill/edgar/schema.yaml
CHANGED
|
@@ -2532,7 +2532,7 @@ relationships:
|
|
|
2532
2532
|
# ── Organization → Filing ──
|
|
2533
2533
|
|
|
2534
2534
|
- name: "filed"
|
|
2535
|
-
description: "Link from a company or person to
|
|
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"]
|
|
@@ -65,7 +65,7 @@ properties:
|
|
|
65
65
|
|
|
66
66
|
- name: "serial_number"
|
|
67
67
|
type: string
|
|
68
|
-
description: "
|
|
68
|
+
description: "Manufacturer serial number of the aircraft"
|
|
69
69
|
display_name: "Serial Number"
|
|
70
70
|
mergeability: not_mergeable
|
|
71
71
|
domain_flavors: ["aircraft"]
|
|
@@ -376,6 +376,15 @@ relationships:
|
|
|
376
376
|
examples: ["DELTA AIR LINES INC owns aircraft N12345"]
|
|
377
377
|
passive: true
|
|
378
378
|
|
|
379
|
+
- name: "manufactures"
|
|
380
|
+
description: "An organization manufactures or produced an aircraft"
|
|
381
|
+
display_name: "Manufactures"
|
|
382
|
+
mergeability: not_mergeable
|
|
383
|
+
domain_flavors: ["organization"]
|
|
384
|
+
target_flavors: ["aircraft"]
|
|
385
|
+
examples: ["CESSNA manufactures CESSNA 172S (S/N 28-7990244)"]
|
|
386
|
+
passive: true
|
|
387
|
+
|
|
379
388
|
- name: "is_located_at"
|
|
380
389
|
description: "An entity is located at, operates in, resides in, is headquartered in, was born in, visits, or died in a location"
|
|
381
390
|
display_name: "Located At"
|
|
@@ -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
|
|
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}"`.
|