@yottagraph-app/data-model-skill 0.0.38 → 0.0.40

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yottagraph-app/data-model-skill",
3
- "version": "0.0.38",
3
+ "version": "0.0.40",
4
4
  "description": "Data model skill documentation for AI agents - entity types, properties, and schemas from Lovelace fetch sources",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,6 +51,7 @@ Each SEC form type is a separate flavor, namespaced under `sec`. All share the s
51
51
  | `sec::sc_13g` | SC 13G | Beneficial ownership report (passive) |
52
52
  | `sec::13f_hr` | 13F-HR | Institutional investment manager holdings |
53
53
  | `sec::def_14a` | DEF 14A | Definitive proxy statement |
54
+ | `sec::s_4` | S-4 | Registration statement for securities issued in business combinations (mergers, acquisitions, exchange offers). Heuristic extraction of acquisition target, target legal counsel, and M&A classification. |
54
55
  | `sec::6_k` | 6-K | Foreign private issuer current report (XBRL only, no form download) |
55
56
  | `sec::40_f` | 40-F | Canadian cross-border annual report (XBRL only, no form download) |
56
57
  | `sec::filing` | SEC Filing | Generic filing — defined in `schema.yaml` but **never produced**: `SecFormFlavor()` returns `""` for unmodeled forms, causing them to be skipped in `AtomizeFilingsV2` |
@@ -157,6 +157,14 @@ flavors:
157
157
  strong_id_properties: ["accession_number"]
158
158
  passive: true
159
159
 
160
+ - name: "s_4"
161
+ namespace: "sec"
162
+ description: "Registration statement (Form S-4) filed to register securities issued in connection with a business combination, merger, or acquisition."
163
+ display_name: "S-4"
164
+ mergeability: not_mergeable
165
+ strong_id_properties: ["accession_number"]
166
+ passive: true
167
+
160
168
  - name: "valuation_method_change"
161
169
  namespace: "sec"
162
170
  description: "A material change to fund valuation methodology disclosed under N-CEN Item B.20. Each entity records one valuationMethodsChange record (date, asset type, regulatory basis, free-text explanation) and links to the disclosing N-CEN filing plus any per-series fund(s) affected."
@@ -212,7 +220,7 @@ properties:
212
220
  description: "SEC Central Index Key, 10-digit zero-padded"
213
221
  display_name: "CIK"
214
222
  mergeability: not_mergeable
215
- domain_flavors: ["organization", "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"]
223
+ domain_flavors: ["organization", "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::s_4"]
216
224
  passive: true
217
225
 
218
226
  - name: "ticker"
@@ -634,7 +642,7 @@ properties:
634
642
  description: "SEC accession number uniquely identifying a filing"
635
643
  display_name: "Accession Number"
636
644
  mergeability: not_mergeable
637
- domain_flavors: ["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"]
645
+ domain_flavors: ["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::s_4", "sec::filing"]
638
646
  passive: true
639
647
 
640
648
  - name: "form_type"
@@ -642,7 +650,7 @@ properties:
642
650
  description: "Normalized SEC form type (e.g. 10-K, SC 13D, 4)"
643
651
  display_name: "Form Type"
644
652
  mergeability: not_mergeable
645
- domain_flavors: ["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"]
653
+ domain_flavors: ["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::s_4", "sec::filing"]
646
654
  passive: true
647
655
 
648
656
  - name: "filing_date"
@@ -650,7 +658,7 @@ properties:
650
658
  description: "Date the filing was submitted to the SEC (YYYY-MM-DD)"
651
659
  display_name: "Filing Date"
652
660
  mergeability: not_mergeable
653
- domain_flavors: ["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"]
661
+ domain_flavors: ["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::s_4", "sec::filing"]
654
662
  passive: true
655
663
 
656
664
  - name: "report_date"
@@ -658,8 +666,280 @@ properties:
658
666
  description: "End date of the primary reporting period (YYYY-MM-DD)"
659
667
  display_name: "Report Date"
660
668
  mergeability: not_mergeable
661
- domain_flavors: ["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"]
662
- passive: true
669
+ domain_flavors: ["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::s_4", "sec::filing"]
670
+ passive: true
671
+
672
+ # ── S-4 M&A Metadata ──
673
+
674
+ - name: "mna_classification"
675
+ type: string
676
+ description: "High-level classification of the S-4 transaction type. merger / exchange_offer are real third-party transactions (target extraction applies); no_acquisition_target marks spin-offs, redomestications, internal restructurings, and shelf S-4s where the filing has no real third-party target (target extraction is skipped to avoid hallucinated emissions)."
677
+ display_name: "M&A Classification"
678
+ mergeability: not_mergeable
679
+ domain_flavors: ["sec::s_4"]
680
+ classification:
681
+ values:
682
+ - name: "merger"
683
+ description: "Statutory merger or acquisition via merger agreement"
684
+ - name: "exchange_offer"
685
+ description: "Securities exchange offer (one company offers its shares for shares of another)"
686
+ - name: "no_acquisition_target"
687
+ description: "Non-acquisition transaction — spin-off / separation, redomestication / change-of-jurisdiction, internal corporate restructuring, or business-combination shelf S-4. No third-party target."
688
+ passive: true
689
+
690
+ - name: "mna_filing_state"
691
+ type: string
692
+ description: |
693
+ State of the M&A transaction at the time of this filing. Derived
694
+ deterministically from the form_type — no LLM extraction:
695
+ - "registered" — initial registration or amendment, deal pending.
696
+ S-4, S-4/A, S-4EF, S-4POS, F-4, F-4/A, F-4EF, F-4POS.
697
+ - "effective" — merger has closed at filing time. S-4MEF, F-4MEF
698
+ (Merger Effective registrations are filed at or
699
+ immediately after the effective date).
700
+ Use this to distinguish pending acquisitions from completed ones when
701
+ querying the s_4 document set. The graph also carries this distinction
702
+ via the has_acquisition_target (pending) vs has_acquired (closed)
703
+ relationships.
704
+ display_name: "M&A Filing State"
705
+ mergeability: not_mergeable
706
+ domain_flavors: ["sec::s_4"]
707
+ passive: true
708
+
709
+ - name: "mna_deal_type"
710
+ type: string
711
+ description: |
712
+ How the consideration paid to target shareholders is structured. Look at the "Merger Consideration" or "Consideration" section of the merger agreement / Q&A — focus on what target shareholders RECEIVE at closing in exchange for each share they hold.
713
+
714
+ Reasoning steps:
715
+ 1. Find the merger-consideration clause (typically "Each share of [target] common stock ... shall be converted into the right to receive ...").
716
+ 2. Categorize what they receive: cash only, acquirer-stock only, or a mix.
717
+ 3. If shareholders may ELECT between cash and stock (with proration), that is cash_and_stock.
718
+ 4. asset_purchase is rare in S-4 filings and applies ONLY when the acquirer is purchasing specific assets and leaving the target entity intact — NOT a stock-for-stock merger of the whole company, NOT an acquisition of all outstanding shares.
719
+
720
+ Worked examples:
721
+ - "each share ... converted into 0.123 shares of Acquirer common stock" → stock
722
+ - "each share ... converted into $X.XX in cash" → cash
723
+ - "each share ... converted into $X.XX in cash AND 0.123 shares of Acquirer common stock" → cash_and_stock
724
+ - "each share ... shall be converted into, at the holder's election, either $X.XX cash or 0.123 shares (subject to proration)" → cash_and_stock
725
+ - Debt-for-debt exchange offer (registering new notes for old notes) → not_disclosed
726
+
727
+ Negative examples (do NOT classify as asset_purchase):
728
+ - "Acquirer will acquire all outstanding shares of Target" → this is stock or cash, NOT asset_purchase
729
+ - "purchase of the Company" without an explicit asset list → stock or cash, NOT asset_purchase
730
+ display_name: "M&A Deal Type"
731
+ mergeability: not_mergeable
732
+ domain_flavors: ["sec::s_4"]
733
+ extraction_config:
734
+ level: document
735
+ classification:
736
+ include_snippet: true
737
+ values:
738
+ - name: "cash"
739
+ description: "Target shareholders receive cash only"
740
+ - name: "stock"
741
+ description: "Target shareholders receive acquirer shares only (including stock-for-stock mergers with fractional cash)"
742
+ - name: "cash_and_stock"
743
+ description: "Target shareholders receive a mix of cash and acquirer shares, or may elect between them"
744
+ - name: "asset_purchase"
745
+ description: "Acquirer purchases specific assets of the target rather than acquiring the target's equity. Rare in S-4 filings."
746
+ - name: "not_disclosed"
747
+ description: "Consideration structure is not specified in the filing (e.g., debt-only exchange offers and notes-for-notes registrations)"
748
+
749
+ - name: "mna_deal_value_usd"
750
+ type: float
751
+ description: |
752
+ Aggregate transaction value in USD — the total consideration the acquirer is paying for the target as an enterprise. Return as a plain integer dollar amount with no symbols, units, commas, or words — e.g., 2300000000 for $2.3 billion, 850000000 for $850 million.
753
+
754
+ What qualifies (return ONE of these if explicitly stated):
755
+ - "aggregate transaction value of $X"
756
+ - "total enterprise value of $X"
757
+ - "total equity value of $X"
758
+ - "aggregate consideration of $X" (when X is the deal total, not per share)
759
+ - "valuing [target] at $X" (when X is total, not per share)
760
+
761
+ What does NOT qualify — return 'not stated' rather than guessing from these:
762
+ - Per-share price ("$13.00 per share", "$X.XX per share in cash") — even though the math would yield an aggregate, do NOT compute it; the prompt asks for a stated aggregate.
763
+ - Termination/breakup fees (these are typically 2-5% of deal size and appear in the agreement's termination article).
764
+ - Advisor / banker / financial-advisor / fairness-opinion fees (e.g., "Goldman Sachs received $23M").
765
+ - SPAC trust amounts ("$300M held in trust", "$19.4M remaining after redemptions") — those are SPAC cash, not deal value.
766
+ - Top-up consideration caps, contingent value rights (CVRs), earn-outs, or any conditional figure.
767
+ - The acquirer's market cap or the target's market cap (those are not the transaction value).
768
+
769
+ Worked examples (from real S-4 audit failures):
770
+ - "Goldman Sachs ... financial advisor ... aggregate fee of $23 million" → 'not stated' (advisor fee, not deal value).
771
+ - "termination fee of $296 million payable to [Acquirer]" → 'not stated' (termination fee).
772
+ - "$415 million election cap" → 'not stated' (per-share election cap, not aggregate).
773
+ - "remaining $19.4 million in the Trust Account" → 'not stated' (SPAC trust balance).
774
+ - "merger consideration of $6.50 per share" → 'not stated' (per-share, do not multiply).
775
+ - "transaction values the company at approximately $2.3 billion" → 2300000000.
776
+
777
+ Return 'not stated' if no aggregate transaction value is disclosed in the document.
778
+ display_name: "M&A Deal Value (USD)"
779
+ mergeability: not_mergeable
780
+ domain_flavors: ["sec::s_4"]
781
+ extraction_config:
782
+ level: document
783
+ literal:
784
+ include_snippet: true
785
+
786
+ - name: "mna_tax_treatment"
787
+ type: string
788
+ description: |
789
+ U.S. federal income tax treatment of the transaction. Look in the "Material U.S. Federal Income Tax Consequences" section — this is where tax treatment is characterized. If that section is not present in the provided text, return not_disclosed.
790
+
791
+ Decision rule:
792
+ - tax_free: ONLY when the filing explicitly says the transaction is intended to qualify as a "reorganization within the meaning of Section 368(a)" of the Internal Revenue Code (or equivalent tax-free reorganization language — Section 351, Section 332, etc.). The phrase "Section 368(a)" or "reorganization" is the canonical signal. The snippet you return MUST contain this language verbatim.
793
+ - taxable: when the filing explicitly states target shareholders will recognize taxable gain/loss on the entire consideration. Common in all-cash deals.
794
+ - partially_taxable: when the filing states the transaction has both taxable and tax-free components (e.g., cash boot in an otherwise tax-free reorganization).
795
+ - not_disclosed: when the filing does not characterize tax treatment in the text you are reading. This is the correct default for debt exchange offers, redomestications, and any filing missing a tax-consequences section. Do NOT guess from deal structure (all-stock does not automatically mean tax_free).
796
+
797
+ Worked examples (from real S-4 audit failures):
798
+ - Filing says "intended to qualify as a reorganization within the meaning of Section 368(a)" → tax_free (this is the canonical formula — never classify this as taxable).
799
+ - Filing says "the Merger will be a taxable transaction for U.S. federal income tax purposes" → taxable.
800
+ - Debt exchange offer with no tax section in the text → not_disclosed (do NOT commit to tax_free just because it's an exchange).
801
+ - All-stock merger with no Section 368 language anywhere in the document → not_disclosed.
802
+ display_name: "M&A Tax Treatment"
803
+ mergeability: not_mergeable
804
+ domain_flavors: ["sec::s_4"]
805
+ extraction_config:
806
+ level: document
807
+ classification:
808
+ include_snippet: true
809
+ values:
810
+ - name: "tax_free"
811
+ description: "Filing explicitly states the transaction is intended to qualify as a reorganization under Section 368(a) (or similar tax-free reorganization provision). The snippet MUST contain Section 368(a) / reorganization language verbatim."
812
+ - name: "taxable"
813
+ description: "Filing explicitly states the transaction is fully taxable to target shareholders on the entire consideration"
814
+ - name: "partially_taxable"
815
+ description: "Filing states the transaction has both taxable and tax-free components (e.g., cash boot in an otherwise tax-free reorganization)"
816
+ - name: "not_disclosed"
817
+ description: "Filing does not characterize tax treatment in the reviewed text. Default for debt exchange offers, redomestications, and any filing missing a Material U.S. Federal Income Tax Consequences section."
818
+
819
+ - name: "mna_termination_fee_usd"
820
+ type: float
821
+ description: |
822
+ Termination or break-up fee in USD — the amount one party must pay the other if the merger agreement is terminated under specified conditions (e.g., target accepts a superior offer). The termination fee lives in the "Termination" article of the merger agreement, NOT in the consideration section. Return as a plain integer dollar amount with no symbols, units, commas, or words — e.g., 85000000 for $85 million.
823
+
824
+ What qualifies:
825
+ - "termination fee of $X" or "breakup fee of $X" payable by one party to the other on specified termination events.
826
+ - Reciprocal fees: if there are two different figures (one payable by target, one by acquirer), return the LARGER one (typically the target-payable fee).
827
+
828
+ What does NOT qualify — return 'not stated' rather than guessing:
829
+ - The aggregate deal value (typically 20-50x larger).
830
+ - Per-share consideration.
831
+ - SPAC trust amounts or sponsor forfeiture amounts.
832
+ - Advisor/banker fees (e.g., "Goldman Sachs received $23M").
833
+ - Expense reimbursement caps (those are NOT the termination fee — they are typically much smaller, like $5-15M for documented expenses).
834
+
835
+ Worked examples (from real S-4 audit failures):
836
+ - "in the event of termination ... [Target] shall pay [Acquirer] a termination fee equal to $85,000,000" → 85000000.
837
+ - "Goldman Sachs ... $23 million fee" → 'not stated' (advisor fee, not termination fee).
838
+ - "$10 million expense reimbursement" → 'not stated' (expense cap, not termination fee).
839
+ - No "Termination" article in the provided text → 'not stated'.
840
+
841
+ Return 'not stated' if no termination fee is disclosed in the provided text. NEVER return 0 — use 'not stated'.
842
+ display_name: "M&A Termination Fee (USD)"
843
+ mergeability: not_mergeable
844
+ domain_flavors: ["sec::s_4"]
845
+ extraction_config:
846
+ level: document
847
+ literal:
848
+ include_snippet: true
849
+
850
+ - name: "mna_acquisition_target_name"
851
+ type: string
852
+ # The property description is wrapped into the LLM's system instruction
853
+ # by the extraction library. It needs to carry the role definitions,
854
+ # identification strategy, and anti-hedge guidance — the library's own
855
+ # boilerplate is "Extract the exact value as stated in the text. Be
856
+ # precise — return the value exactly as it appears, without
857
+ # interpretation", which primes the model to return "not stated" when
858
+ # it can't find a single self-contained verbatim phrase. The May-22
859
+ # diagnostic run showed 10/16 filings hit that hedge path even on
860
+ # obvious deals (Getty/Shutterstock, Quanterix/Akoya, etc.), so the
861
+ # description must override "verbatim only" with explicit
862
+ # "synthesize from context" framing.
863
+ description: |
864
+ Identify the operating company being acquired in this SEC Form S-4 transaction.
865
+
866
+ An S-4 is filed for a business combination (merger, exchange offer, reverse merger, or de-SPAC). The document has three roles:
867
+
868
+ 1. REGISTRANT (legal acquirer): the public company filing this S-4. It is named in the EXTRACTION CONTEXT block at the start of the filing text.
869
+
870
+ 2. TRANSITORY MERGER SUBSIDIARY: a wholly-owned shell the registrant creates solely to merge with the target. Names typically contain "Merger Sub", "Acquisition Sub", "Acquisition Corp", or numbered variants. Dissolves at closing — never the target.
871
+
872
+ 3. TARGET: the operating company being acquired. Its shares are converted or cancelled at the Effective Time; its shareholders receive the registrant's shares or cash consideration. This is what you must return.
873
+
874
+ The most reliable text anchor for the target is the Merger Consideration clause: "Each share of [TARGET] common stock outstanding immediately prior to the Effective Time shall be converted into the right to receive [consideration]." The company whose stock is being converted is the target.
875
+
876
+ Identifying the target requires INFERENCE across the document — the target's name is rarely stated in a single self-contained "the target is X" sentence. Synthesize from the Merger Consideration clause, the merger agreement parties list ("by and among ..."), the Q&A section ("Who is merging?", "What will [target] stockholders receive?"), and the "Information About the Companies" subsection of the Summary.
877
+
878
+ For reverse mergers and de-SPAC transactions, the operating company being acquired is the target — even when it is designated as the "accounting acquirer" under ASC 805. Follow legal structure, not accounting treatment.
879
+
880
+ Return the target's full legal name with corporate suffix (Inc., LLC, Corp., Ltd., LP, plc) exactly as it appears in the filing.
881
+
882
+ Return "not stated" ONLY when there is no acquisition target at all — debt-for-debt exchange offers, redomestications, jurisdiction redomiciliations, holdco reorganizations, or spin-offs. Do NOT return "not stated" because the target's name doesn't appear in a single self-contained verbatim phrase. The target is essentially always identifiable from the Merger Consideration clause and the merger agreement parties list.
883
+
884
+ Snippet: the verbatim Merger Consideration clause, or any single sentence from the filing that names the target.
885
+ display_name: "M&A Acquisition Target Name"
886
+ mergeability: not_mergeable
887
+ domain_flavors: ["sec::s_4"]
888
+ extraction_config:
889
+ level: document
890
+ literal:
891
+ include_snippet: true
892
+
893
+ - name: "mna_transitory_merger_sub"
894
+ type: string
895
+ description: |
896
+ Identify the transitory merger subsidiary used in this S-4 transaction, if one is named.
897
+
898
+ A transitory merger subsidiary is a wholly-owned shell entity created by the registrant solely to merge with the target. It dissolves at closing. Names typically contain "Merger Sub", "Acquisition Sub", "Acquisition Corp", "Merger Co", or numbered variants (e.g., "Merger Sub I", "Polar Merger Sub, Inc.").
899
+
900
+ The merger sub is NEVER the target — it is a separate role.
901
+
902
+ Return the full legal name of the merger subsidiary with corporate suffix, exactly as it appears in the filing.
903
+
904
+ Return "not stated" only if no transitory merger subsidiary is named (common in direct mergers, exchange offers, and asset purchases where no shell vehicle is interposed).
905
+ display_name: "M&A Transitory Merger Sub"
906
+ mergeability: not_mergeable
907
+ domain_flavors: ["sec::s_4"]
908
+ extraction_config:
909
+ level: document
910
+ literal: {}
911
+
912
+ - name: "mna_target_legal_counsel_name"
913
+ type: string
914
+ description: |
915
+ Name of the law firm representing the acquisition target (the non-registrant party). Found on the S-4 cover page, typically in a "Copies to:" block.
916
+
917
+ Reasoning steps:
918
+ 1. The cover page lists two law firms: one for the registrant (filer), one for the target. Look for a "Copies to:" or "Copies of all communications to:" block.
919
+ 2. The firm whose contact line names an officer of the TARGET (CEO, General Counsel, etc. of the company being acquired) is the target's counsel.
920
+ 3. If the cover-page contact block names two firms side-by-side, the second firm or the one paired with the target-officer contact is target counsel.
921
+
922
+ What qualifies — return the full firm name with suffix:
923
+ - "Sullivan & Cromwell LLP"
924
+ - "Wachtell, Lipton, Rosen & Katz"
925
+ - "Skadden, Arps, Slate, Meagher & Flom LLP"
926
+ - "Dentons US LLP"
927
+ - "Stevens & Lee, P.C."
928
+
929
+ What does NOT qualify — return 'not stated' rather than guess:
930
+ - Advisor / financial advisor names (Goldman Sachs, JPMorgan, Centerview) — those are bankers, not legal counsel.
931
+ - Auditor / accountant names (Deloitte, PwC, KPMG, EY).
932
+ - The acquirer's counsel (only target counsel is wanted here).
933
+ - Generic placeholders like "Legal Counsel" or "Outside Counsel".
934
+
935
+ If only the acquirer's counsel is identified and no separate target counsel block is present, return 'not stated'. Return the full firm name including suffix (LLP, PC, P.C., PLLC, LLC). Snippet should be the cover-page contact block text where you found the firm.
936
+ display_name: "M&A Target Legal Counsel Name"
937
+ mergeability: not_mergeable
938
+ domain_flavors: ["sec::s_4"]
939
+ extraction_config:
940
+ level: document
941
+ literal:
942
+ include_snippet: true
663
943
 
664
944
  # ── XBRL Financial Facts (key concepts) ──
665
945
 
@@ -2535,8 +2815,8 @@ relationships:
2535
2815
  description: "Link from a company or person to a regulatory filing document they filed, or from a sub-record to its parent filing"
2536
2816
  display_name: "Filed"
2537
2817
  mergeability: not_mergeable
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"]
2539
- target_flavors: ["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"]
2818
+ 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::s_4", "sec::filing"]
2819
+ target_flavors: ["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::s_4", "sec::filing"]
2540
2820
  passive: true
2541
2821
 
2542
2822
  - name: "is_issuer_of"
@@ -2552,7 +2832,7 @@ relationships:
2552
2832
  display_name: "Filing Reference"
2553
2833
  mergeability: not_mergeable
2554
2834
  domain_flavors: ["organization", "person", "financial_instrument"]
2555
- target_flavors: ["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"]
2835
+ target_flavors: ["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::s_4"]
2556
2836
  passive: true
2557
2837
 
2558
2838
  # ── Filing → Organization ──
@@ -2561,7 +2841,7 @@ relationships:
2561
2841
  description: "Link from a filing or financial instrument to the company it pertains to (the filer for most forms; the issuer for ownership forms and 13F holdings)"
2562
2842
  display_name: "Issued By"
2563
2843
  mergeability: not_mergeable
2564
- domain_flavors: ["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", "financial_instrument"]
2844
+ domain_flavors: ["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::s_4", "sec::filing", "financial_instrument"]
2565
2845
  target_flavors: ["organization"]
2566
2846
  passive: true
2567
2847
 
@@ -2569,7 +2849,7 @@ relationships:
2569
2849
  description: "Link from a filing or counterparty to the company the document is principally about"
2570
2850
  display_name: "Refers To"
2571
2851
  mergeability: not_mergeable
2572
- domain_flavors: ["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", "organization"]
2852
+ domain_flavors: ["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::s_4", "organization"]
2573
2853
  target_flavors: ["organization"]
2574
2854
  passive: true
2575
2855
 
@@ -2577,7 +2857,7 @@ relationships:
2577
2857
  description: "Link from a filing to the entity (person or organization) who filed it"
2578
2858
  display_name: "Filer"
2579
2859
  mergeability: not_mergeable
2580
- domain_flavors: ["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"]
2860
+ domain_flavors: ["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::s_4", "sec::filing"]
2581
2861
  target_flavors: ["organization", "person"]
2582
2862
  passive: true
2583
2863
 
@@ -2860,6 +3140,56 @@ relationships:
2860
3140
  target_flavors: ["financial_instrument"]
2861
3141
  passive: true
2862
3142
 
3143
+ # ── S-4 M&A Relationships ──
3144
+
3145
+ - name: "has_acquisition_target"
3146
+ description: "Link from an acquiring organization to the company being acquired in a merger or acquisition disclosed via Form S-4."
3147
+ display_name: "Has Acquisition Target"
3148
+ mergeability: not_mergeable
3149
+ domain_flavors: ["organization"]
3150
+ target_flavors: ["organization"]
3151
+ passive: true
3152
+
3153
+ - name: "is_acquisition_target_of"
3154
+ description: "Inverse of has_acquisition_target. Link from the target company to the acquirer in a merger or acquisition disclosed via Form S-4."
3155
+ display_name: "Is Acquisition Target Of"
3156
+ mergeability: not_mergeable
3157
+ domain_flavors: ["organization"]
3158
+ target_flavors: ["organization"]
3159
+ passive: true
3160
+
3161
+ - name: "has_target_legal_counsel"
3162
+ description: "Link from an acquirer to the law firm acting as legal counsel to the target company in an S-4 merger transaction."
3163
+ display_name: "Has Target Legal Counsel"
3164
+ mergeability: not_mergeable
3165
+ domain_flavors: ["organization"]
3166
+ target_flavors: ["organization"]
3167
+ passive: true
3168
+
3169
+ - name: "is_target_legal_counsel_of"
3170
+ description: "Link from a law firm to the company it represents as target legal counsel in an S-4 merger transaction."
3171
+ display_name: "Is Target Legal Counsel Of"
3172
+ mergeability: not_mergeable
3173
+ domain_flavors: ["organization"]
3174
+ target_flavors: ["organization"]
3175
+ passive: true
3176
+
3177
+ - name: "has_acquired"
3178
+ description: "Link from an acquiring organization to a company it has acquired, where the merger has closed. Distinguishes completed acquisitions from pending ones (see has_acquisition_target). Emitted from S-4MEF and F-4MEF filings — Merger Effective registrations filed at or after the merger's effective date."
3179
+ display_name: "Has Acquired"
3180
+ mergeability: not_mergeable
3181
+ domain_flavors: ["organization"]
3182
+ target_flavors: ["organization"]
3183
+ passive: true
3184
+
3185
+ - name: "was_acquired_by"
3186
+ description: "Inverse of has_acquired. Link from a company to the organization that has acquired it, where the merger has closed."
3187
+ display_name: "Was Acquired By"
3188
+ mergeability: not_mergeable
3189
+ domain_flavors: ["organization"]
3190
+ target_flavors: ["organization"]
3191
+ passive: true
3192
+
2863
3193
  # =============================================================================
2864
3194
  # ATTRIBUTES
2865
3195
  # =============================================================================
@@ -0,0 +1,134 @@
1
+ # Data Dictionary: Finnhub Bonds (ISIN-LEI + Bond Prices)
2
+
3
+ Last updated: 2026-05-28
4
+
5
+ ## Source Overview
6
+
7
+ This source combines two upstream datasets:
8
+
9
+ 1. **GLEIF-ANNA ISIN-to-LEI mapping** — daily open-source file linking financial instruments (ISIN) to issuers (LEI). The published ZIP is a **full snapshot** of mappings from participating national numbering agencies (~8.7M pairs as of May 2026), refreshed daily. It is not a delta of only newly issued ISINs from the prior day.
10
+ 2. **Finnhub bond prices** — end-of-day close prices from `GET /bond/price` for each ISIN in the mapping file, fetched for **yesterday UTC** each poll cycle.
11
+
12
+ The streamer uses the **diffing** pipeline (`DiffingStreamer`): each mapping pair and each ISIN price observation is stored as JSON under the raw download store, SHA-256 compared against the previous run, and only changed rows are atomized and published.
13
+
14
+ | Item | Value |
15
+ |------|--------|
16
+ | Stream source constant | `finnhubbond-source` |
17
+ | `Record.Source` | `finnhubbond` |
18
+ | GLEIF mapping API | `https://mapping.gleif.org/api/v2/isin-lei` |
19
+ | Finnhub price API | `https://finnhub.io/api/v1/bond/price` |
20
+ | Default poll cadence | 1440 min (`pollTimeMin`) |
21
+
22
+ **Data quality notes**
23
+
24
+ - GLEIF mapping coverage depends on participating NNAs; legacy ISINs outside the program may be absent.
25
+ - Finnhub `/bond/price` returns BondCandles (`c[]` close, `t[]` unix timestamps, `s` status). Status `no_data` produces no price record.
26
+ - Yield on `/bond/price` is only emitted when Finnhub returns a `y[]` array; TRACE trade-level yield is on `/bond/tick` (not ingested in v1).
27
+ - Many mapped ISINs may have no Finnhub price (non-US, non-TRACE, delisted). Failures are logged and skipped.
28
+
29
+ ---
30
+
31
+ ## Entity Types
32
+
33
+ ### `organization`
34
+
35
+ A legal entity that **issued** a mapped security, identified by LEI from the GLEIF-ANNA CSV.
36
+
37
+ - **Subject name:** LEI string (no legal name in mapping file).
38
+ - **Strong id:** `lei` on the organization subject.
39
+ - **Resolver:** Organization flavor `NOT_MERGEABLE`; named entity `MERGEABLE` on LEI for cross-source merge with `gleif-source` entities.
40
+ - **Emitted when:** A `(LEI, ISIN)` mapping row is new or changed in the diffing pass.
41
+
42
+ ### `financial_instrument`
43
+
44
+ A bond or fixed-income instrument identified by ISIN.
45
+
46
+ - **Subject name:** ISIN.
47
+ - **Strong id:** `isin`.
48
+ - **Resolver:** `MERGEABLE` on ISIN — aligns with `gleif`, `sanctions`, and EDGAR `holding_isin` resolution.
49
+ - **Emitted when:** (1) mapping rows add `issued_security` target entities, or (2) price rows publish close/yield observations.
50
+
51
+ ---
52
+
53
+ ## Properties
54
+
55
+ ### Organization
56
+
57
+ * `lei`
58
+ * Definition: Legal Entity Identifier (ISO 17442) of the issuer.
59
+ * Examples: `"5493001KJTIIGC8Y1R12"`
60
+ * Derivation: First CSV column in GLEIF ISIN-LEI mapping.
61
+
62
+ ### Financial instrument
63
+
64
+ * `isin`
65
+ * Definition: International Securities Identification Number (ISO 6166).
66
+ * Examples: `"US0378331005"`, `"US46625HQW33"`
67
+ * Derivation: Second CSV column in mapping; or Finnhub price query key.
68
+
69
+ * `close_price`
70
+ * Definition: Bond close price in USD from Finnhub `/bond/price` field `c[]`.
71
+ * Derivation: One atom per candle point in the response; timestamp from matching `t[]` entry.
72
+ * Attribute: `price_date` (YYYY-MM-DD UTC) on each observation atom.
73
+
74
+ * `yield`
75
+ * Definition: Bond yield when Finnhub returns field `y[]` alongside price candles.
76
+ * Derivation: Optional; same indexing as `c[]` / `t[]`. Often absent on `/bond/price`.
77
+ * Attribute: `price_date` on each observation atom.
78
+
79
+ ---
80
+
81
+ ## Relationships
82
+
83
+ * `issued_security`
84
+ * Definition: The organization (issuer LEI) has issued the target financial instrument (ISIN).
85
+ * Direction: `organization` → `financial_instrument`.
86
+ * Derivation: Each GLEIF-ANNA mapping row where both LEI and ISIN are non-empty.
87
+ * Note: Same relationship name and semantics as `gleif-source` ISIN enrichment (`buildISINAtoms`).
88
+
89
+ ---
90
+
91
+ ## Attributes
92
+
93
+ * `price_date`
94
+ * Definition: UTC calendar date of the bond price observation.
95
+ * Examples: `"2026-05-27"`
96
+ * Derivation: From Finnhub candle timestamp `t[]`, or the configured yesterday date when timestamp missing.
97
+
98
+ ---
99
+
100
+ ## Pipeline Behavior
101
+
102
+ ### FetchRows (single cycle)
103
+
104
+ 1. Download latest GLEIF ISIN-LEI ZIP.
105
+ 2. Parse CSV; emit one diffing row per `(LEI, ISIN)` pair (subject to `maxRows`).
106
+ 3. Deduplicate ISINs; optionally cap with `maxIsins`.
107
+ 4. Parallel Finnhub `/bond/price` for yesterday UTC (`priceWorkers`, `finnhubQPS`).
108
+ 5. Emit one diffing price row per ISIN (`price-{ISIN}-{date}.json`).
109
+
110
+ ### Atomization
111
+
112
+ - **Changed mapping rows:** One record per pair — organization subject + `lei` property + `issued_security` target.
113
+ - **Changed price rows:** One record per ISIN — financial_instrument subject + `isin` + `close_price` / optional `yield` atoms.
114
+
115
+ ### Configuration args
116
+
117
+ | Arg | Default | Purpose |
118
+ |-----|---------|---------|
119
+ | `finnhubToken` | `$FINNHUB_TOKEN` | Required API token |
120
+ | `priceWorkers` | 16 | Parallel Finnhub workers |
121
+ | `finnhubQPS` | 10 | Client-side rate limit |
122
+ | `maxIsins` | 0 (all) | Cap price fetches for dev |
123
+ | `maxRows` | 0 (all) | Cap mapping rows emitted |
124
+ | `writeWorkers` | 8 | Diffing raw-store parallelism |
125
+ | `batchSize` | 100 | Publish batch size |
126
+ | `pollTimeMin` | 1440 | Poll interval (minutes) |
127
+
128
+ ---
129
+
130
+ ## Cross-Source Resolution
131
+
132
+ - **`lei`** property matches `gleif.organization.lei` — issuer orgs from this source should merge with GLEIF LEI records when both exist.
133
+ - **`isin`** property matches `financial_instrument.isin` across gleif, sanctions, EDGAR holdings.
134
+ - **`issued_security`** inverse query: find issuer org whose `issued_security` points at an ISIN instrument node.
@@ -0,0 +1,241 @@
1
+ # Dataset schema for GLEIF ISIN-LEI mapping + Finnhub bond end-of-day prices.
2
+ #
3
+ # The streamer diffs LEI→ISIN mapping rows from the daily GLEIF-ANNA file and
4
+ # fetches Finnhub /bond/price candles for every ISIN in the mapping each cycle.
5
+ name: "finnhubbond"
6
+ description: "GLEIF-ANNA ISIN-to-LEI issuer mappings and Finnhub bond end-of-day close prices for mapped ISINs"
7
+
8
+ extraction:
9
+ flavors: closed
10
+ properties: closed
11
+ relationships: closed
12
+ attributes: closed
13
+ events: closed
14
+
15
+ flavors:
16
+ - name: "organization"
17
+ description: "A particular business, institution, or organization such as a corporation, university, government agency, or non-profit"
18
+ display_name: "Organization"
19
+ mergeability: not_mergeable
20
+ strong_id_properties: ["lei"]
21
+ passive: true
22
+
23
+ - name: "financial_instrument"
24
+ description: "A specific asset that can be traded, such as a stock, ETF, bond, CD, or fund. Companies are organizations, NOT financial instruments. Specific currency amounts are NOT financial instruments."
25
+ display_name: "Financial Instrument"
26
+ mergeability: not_mergeable
27
+ strong_id_properties: ["isin", "figi"]
28
+ passive: true
29
+
30
+ properties:
31
+ - name: "lei"
32
+ type: string
33
+ description: "Legal Entity Identifier — a 20-character alphanumeric code uniquely identifying a legal entity in the global financial system (ISO 17442)"
34
+ display_name: "LEI"
35
+ mergeability: not_mergeable
36
+ domain_flavors: ["organization"]
37
+ passive: true
38
+
39
+ - name: "isin"
40
+ type: string
41
+ description: "International Securities Identification Number (ISO 6166) uniquely identifying this financial instrument"
42
+ display_name: "ISIN"
43
+ mergeability: not_mergeable
44
+ domain_flavors: ["financial_instrument"]
45
+ passive: true
46
+
47
+ - name: "close_price"
48
+ type: float
49
+ description: "Closing price of the trading interval in USD"
50
+ display_name: "Close Price"
51
+ mergeability: not_mergeable
52
+ domain_flavors: ["financial_instrument"]
53
+ passive: true
54
+
55
+ - name: "yield"
56
+ type: float
57
+ description: "Yield on the security."
58
+ display_name: "Yield"
59
+ mergeability: not_mergeable
60
+ domain_flavors: ["financial_instrument"]
61
+ passive: true
62
+
63
+ - name: "figi"
64
+ type: string
65
+ description: "Financial Instrument Global Identifier (Bloomberg OpenFIGI)"
66
+ display_name: "FIGI"
67
+ mergeability: not_mergeable
68
+ domain_flavors: ["financial_instrument"]
69
+ passive: true
70
+
71
+ - name: "bond_type"
72
+ type: string
73
+ description: "Bond type from Finnhub /bond/profile (e.g. Corporate, Government)"
74
+ display_name: "Bond Type"
75
+ mergeability: not_mergeable
76
+ domain_flavors: ["financial_instrument"]
77
+ passive: true
78
+
79
+ - name: "debt_type"
80
+ type: string
81
+ description: "Debt type from Finnhub /bond/profile"
82
+ display_name: "Debt Type"
83
+ mergeability: not_mergeable
84
+ domain_flavors: ["financial_instrument"]
85
+ passive: true
86
+
87
+ - name: "coupon"
88
+ type: float
89
+ description: "Coupon rate of the security (e.g. 7.000% or Variable)."
90
+ display_name: "Coupon"
91
+ mergeability: not_mergeable
92
+ domain_flavors: ["financial_instrument"]
93
+ passive: true
94
+
95
+ - name: "coupon_type"
96
+ type: string
97
+ description: "Coupon type from Finnhub /bond/profile (e.g. Fixed)"
98
+ display_name: "Coupon Type"
99
+ mergeability: not_mergeable
100
+ domain_flavors: ["financial_instrument"]
101
+ passive: true
102
+
103
+ - name: "maturity_date"
104
+ type: string
105
+ description: "Maturity date of the security."
106
+ display_name: "Maturity Date"
107
+ mergeability: not_mergeable
108
+ domain_flavors: ["financial_instrument"]
109
+ passive: true
110
+
111
+ - name: "issue_date"
112
+ type: string
113
+ description: "Issue date of the bonds."
114
+ display_name: "Issue Date"
115
+ mergeability: not_mergeable
116
+ domain_flavors: ["financial_instrument"]
117
+ passive: true
118
+
119
+ - name: "first_coupon_date"
120
+ type: string
121
+ description: "First coupon date from Finnhub /bond/profile"
122
+ display_name: "First Coupon Date"
123
+ mergeability: not_mergeable
124
+ domain_flavors: ["financial_instrument"]
125
+ passive: true
126
+
127
+ - name: "dated_date"
128
+ type: string
129
+ description: "Dated date of the bonds."
130
+ display_name: "Dated Date"
131
+ mergeability: not_mergeable
132
+ domain_flavors: ["financial_instrument"]
133
+ passive: true
134
+
135
+ - name: "payment_frequency"
136
+ type: string
137
+ description: "Payment frequency from Finnhub /bond/profile"
138
+ display_name: "Payment Frequency"
139
+ mergeability: not_mergeable
140
+ domain_flavors: ["financial_instrument"]
141
+ passive: true
142
+
143
+ - name: "security_level"
144
+ type: string
145
+ description: "Security level from Finnhub /bond/profile (e.g. Senior)"
146
+ display_name: "Security Level"
147
+ mergeability: not_mergeable
148
+ domain_flavors: ["financial_instrument"]
149
+ passive: true
150
+
151
+ - name: "amount_outstanding"
152
+ type: float
153
+ description: "Amount outstanding from Finnhub /bond/profile"
154
+ display_name: "Amount Outstanding"
155
+ mergeability: not_mergeable
156
+ domain_flavors: ["financial_instrument"]
157
+ passive: true
158
+
159
+ - name: "original_offering"
160
+ type: float
161
+ description: "Original offering amount from Finnhub /bond/profile"
162
+ display_name: "Original Offering"
163
+ mergeability: not_mergeable
164
+ domain_flavors: ["financial_instrument"]
165
+ passive: true
166
+
167
+ - name: "offering_price"
168
+ type: float
169
+ description: "Offering price from Finnhub /bond/profile"
170
+ display_name: "Offering Price"
171
+ mergeability: not_mergeable
172
+ domain_flavors: ["financial_instrument"]
173
+ passive: true
174
+
175
+ - name: "industry_group"
176
+ type: string
177
+ description: "Industry group from Finnhub /bond/profile"
178
+ display_name: "Industry Group"
179
+ mergeability: not_mergeable
180
+ domain_flavors: ["financial_instrument"]
181
+ passive: true
182
+
183
+ - name: "industry_subgroup"
184
+ type: string
185
+ description: "Industry subgroup from Finnhub /bond/profile"
186
+ display_name: "Industry Subgroup"
187
+ mergeability: not_mergeable
188
+ domain_flavors: ["financial_instrument"]
189
+ passive: true
190
+
191
+ - name: "asset"
192
+ type: string
193
+ description: "Asset from Finnhub /bond/profile"
194
+ display_name: "Asset"
195
+ mergeability: not_mergeable
196
+ domain_flavors: ["financial_instrument"]
197
+ passive: true
198
+
199
+ - name: "asset_type"
200
+ type: string
201
+ description: "Asset type from Finnhub /bond/profile"
202
+ display_name: "Asset Type"
203
+ mergeability: not_mergeable
204
+ domain_flavors: ["financial_instrument"]
205
+ passive: true
206
+
207
+ - name: "day_count"
208
+ type: string
209
+ description: "Day count convention from Finnhub /bond/profile"
210
+ display_name: "Day Count"
211
+ mergeability: not_mergeable
212
+ domain_flavors: ["financial_instrument"]
213
+ passive: true
214
+
215
+ - name: "security_term"
216
+ type: string
217
+ description: "Security term from Finnhub /bond/profile"
218
+ display_name: "Security Term"
219
+ mergeability: not_mergeable
220
+ domain_flavors: ["financial_instrument"]
221
+ passive: true
222
+
223
+ relationships:
224
+ - name: "issued_security"
225
+ description: "The organization has issued this financial instrument, linked via GLEIF-ANNA ISIN-LEI daily mapping. To find the issuer of a security, query inversely: find the entity whose issued_security points to the instrument."
226
+ display_name: "Issued Security"
227
+ mergeability: not_mergeable
228
+ domain_flavors: ["organization"]
229
+ target_flavors: ["financial_instrument"]
230
+ passive: true
231
+
232
+ attributes:
233
+ - properties:
234
+ - "close_price"
235
+ - "yield"
236
+ name: "price_date"
237
+ type: string
238
+ description: "UTC calendar date (YYYY-MM-DD) of the bond price observation from Finnhub timestamp t[]"
239
+ display_name: "Price Date"
240
+ mergeability: not_mergeable
241
+ passive: true
@@ -106,7 +106,7 @@ properties:
106
106
 
107
107
  - name: "close_price"
108
108
  type: float
109
- description: "Closing price of the trading interval in USD, from Alpha Vantage field '4. close'"
109
+ description: "Closing price of the trading interval in USD"
110
110
  display_name: "Close Price"
111
111
  mergeability: not_mergeable
112
112
  domain_flavors: ["financial_instrument"]