@yottagraph-app/aether-instructions 1.1.34 → 1.1.36
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/rules/agents.mdc +26 -0
- package/skills/data-model/edgar/DATA_DICTIONARY.md +60 -4
- package/skills/data-model/edgar/schema.yaml +106 -15
- package/skills/data-model/fred/DATA_DICTIONARY.md +4 -8
- package/skills/data-model/fred/schema.yaml +2 -2
- package/skills/data-model/industries/schema.yaml +64 -0
- package/skills/elemental-mcp-patterns/SKILL.md +11 -0
- package/variants/mcp-only/commands/build_my_app.md +32 -0
package/package.json
CHANGED
package/rules/agents.mdc
CHANGED
|
@@ -455,3 +455,29 @@ exploration but requires more tool calls and is more error-prone.
|
|
|
455
455
|
returns formatted strings. Fewer tools, more reliable, better for production
|
|
456
456
|
use cases. **Prefer this pattern** unless the agent genuinely needs to
|
|
457
457
|
explore arbitrary entity types.
|
|
458
|
+
|
|
459
|
+
### McpToolset passthrough is not a substitute for custom tools
|
|
460
|
+
|
|
461
|
+
When DESIGN.md specifies named agent tools (e.g. `entity_search`,
|
|
462
|
+
`corporate_structure`, `event_monitor`), each must be implemented as a
|
|
463
|
+
**Python function** that calls MCP, formats results, and handles errors.
|
|
464
|
+
Passing a raw `McpToolset` as the agent's only tool source and writing a
|
|
465
|
+
long system prompt does **not** satisfy the spec.
|
|
466
|
+
|
|
467
|
+
`McpToolset` passthrough means:
|
|
468
|
+
- The LLM receives raw JSON responses — no Markdown formatting, no
|
|
469
|
+
human-readable reports
|
|
470
|
+
- No session-state caching — repeated queries for the same entity make
|
|
471
|
+
redundant MCP calls every turn
|
|
472
|
+
- No property type handling — `data_nindex` values (entity references)
|
|
473
|
+
render as meaningless 19-digit numbers
|
|
474
|
+
- No error boundaries — MCP failures surface as opaque tool errors
|
|
475
|
+
- No compound cache keys or report generation — the patterns that make
|
|
476
|
+
multi-turn research conversations reliable
|
|
477
|
+
|
|
478
|
+
`McpToolset` passthrough is fine for **simple exploration agents** or
|
|
479
|
+
quick prototypes. It is **not acceptable** when the project spec
|
|
480
|
+
describes a production agent with a defined tool suite. If DESIGN.md
|
|
481
|
+
lists N custom tools, build N custom Python functions — each calling MCP
|
|
482
|
+
tools internally, formatting output as Markdown, catching exceptions,
|
|
483
|
+
and saving reports to session state where appropriate.
|
|
@@ -52,7 +52,32 @@ Each SEC form type is a separate flavor, namespaced under `sec`. All share the s
|
|
|
52
52
|
| `sec::13f_hr` | 13F-HR | Institutional investment manager holdings |
|
|
53
53
|
| `sec::def_14a` | DEF 14A | Definitive proxy statement |
|
|
54
54
|
|
|
55
|
-
Sub-
|
|
55
|
+
### Sub-Records (8-K Events, Form 4 Transactions, Form 3 Holdings)
|
|
56
|
+
|
|
57
|
+
Sub-records are **separate graph entities**, not nested properties on the parent filing. Each sub-record has its own NEID and can be queried independently. They use the same flavor as their parent filing (e.g., `sec::8_k` for 8-K events, `sec::form_4` for Form 4 transactions).
|
|
58
|
+
|
|
59
|
+
**Entity naming pattern:**
|
|
60
|
+
- 8-K events: `{accession_number}_evt_{n}` (e.g., `0000320193-24-000067_evt_1`)
|
|
61
|
+
- Form 4 transactions: `{accession_number}_trx_{n}` (e.g., `0000320193-24-000067_trx_1`)
|
|
62
|
+
- Form 3 holdings: `{accession_number}_holding_{n}`
|
|
63
|
+
|
|
64
|
+
**Relationships on sub-records:**
|
|
65
|
+
- `filed` — points to the parent filing's accession number
|
|
66
|
+
- `issued_by` — points to the company
|
|
67
|
+
|
|
68
|
+
**Critical querying note:** Properties like `form_8k_event`, `form_8k_item_code`, `transaction_type`, `shares_transacted`, and other sub-record-specific properties do NOT appear on the parent filing entity or the organization entity. You must traverse the graph to the sub-record entities to access them.
|
|
69
|
+
|
|
70
|
+
**Traversal path:**
|
|
71
|
+
```
|
|
72
|
+
organization --[filed]--> 8-K filing --[linked, distance 1]--> event sub-records
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**Example: Finding 8-K event sub-records for a company:**
|
|
76
|
+
1. Get filing NEIDs from the organization's `filed` property
|
|
77
|
+
2. Filter to 8-K filings by checking `form_type == "8-K"`
|
|
78
|
+
3. For each 8-K filing, use a `linked` expression (distance 1, direction both) to find connected entities
|
|
79
|
+
4. Exclude the organization and the filing itself from results — the remaining entities are the event sub-records
|
|
80
|
+
5. Query those sub-record NEIDs for `form_8k_event` and `form_8k_item_code`
|
|
56
81
|
|
|
57
82
|
### `person`
|
|
58
83
|
|
|
@@ -161,12 +186,34 @@ The six core financial properties appear on both the **organization** and its **
|
|
|
161
186
|
|
|
162
187
|
#### 8-K Corporate Events (source: `edgar_8k`)
|
|
163
188
|
|
|
164
|
-
Data source: 8-K current report filings.
|
|
189
|
+
Data source: 8-K current report filings.
|
|
190
|
+
|
|
191
|
+
> **Important:** These properties are on **event sub-record entities**, not on the parent 8-K filing or the organization. See the [Sub-Records section](#sub-records-8-k-events-form-4-transactions-form-3-holdings) above for how to find them.
|
|
165
192
|
|
|
193
|
+
**Core event properties:**
|
|
166
194
|
* `form_8k_event` — Snake_case event identifier. Examples: `"material_agreement"`, `"officer_director_change"`
|
|
167
195
|
* `form_8k_item_code` — Raw SEC item number. Examples: `"1.01"`, `"5.02"`
|
|
196
|
+
* `event_severity` — Event importance classification. Values: `"critical"`, `"high"`, `"medium"`, `"low"`
|
|
168
197
|
* `category` — Sub-classification of Item 8.01 Other Events. Examples: `"cybersecurity_incident"`
|
|
169
198
|
|
|
199
|
+
**Sub-record identity and relationships:**
|
|
200
|
+
* `accession_number` — Synthetic sub-record identifier. Example: `"0000320193-24-000067_evt_1"`
|
|
201
|
+
* `filed` — Relationship: event sub-record → parent 8-K filing
|
|
202
|
+
* `issued_by` — Relationship: event sub-record → company
|
|
203
|
+
|
|
204
|
+
**Item 8.01 keyword flags** (set to `"true"` when matched):
|
|
205
|
+
* `8k_cybersecurity_keyword` — Cybersecurity-related disclosure detected
|
|
206
|
+
* `8k_litigation_keyword` — Litigation-related disclosure detected
|
|
207
|
+
* `8k_regulatory_keyword` — Regulatory-related disclosure detected
|
|
208
|
+
* `8k_operational_keyword` — Operational issue disclosure detected
|
|
209
|
+
|
|
210
|
+
**ABS event flags** (Items 6.01–6.05, set to `"true"` when applicable):
|
|
211
|
+
* `abs_servicing_event` — Item 6.01: ABS servicing event
|
|
212
|
+
* `abs_servicer_change` — Item 6.02: ABS servicer change
|
|
213
|
+
* `abs_credit_enhancement_change` — Item 6.03: ABS credit enhancement change
|
|
214
|
+
* `abs_failure_event` — Item 6.04: ABS failure to make distribution
|
|
215
|
+
* `abs_securities_act` — Item 6.05: ABS Securities Act updating disclosure
|
|
216
|
+
|
|
170
217
|
#### Beneficial Ownership (source: `edgar_sc_13d`, `edgar_sc_13g`)
|
|
171
218
|
|
|
172
219
|
Data source: SC 13D/G XML filings. Properties on the filer organization.
|
|
@@ -240,8 +287,14 @@ Data source: Form 3/4 XML.
|
|
|
240
287
|
|
|
241
288
|
#### Form 4 Transactions (source: `edgar_4`)
|
|
242
289
|
|
|
243
|
-
|
|
290
|
+
> **Important:** These properties are on **transaction sub-record entities**, not on the parent Form 4 filing. See the [Sub-Records section](#sub-records-8-k-events-form-4-transactions-form-3-holdings) above for how to find them.
|
|
291
|
+
|
|
292
|
+
**Sub-record identity and relationships:**
|
|
293
|
+
* `accession_number` — Synthetic sub-record identifier. Example: `"0000320193-24-000067_trx_1"`
|
|
294
|
+
* `filed` — Relationship: transaction sub-record → parent Form 4 filing
|
|
295
|
+
* `issued_by` — Relationship: transaction sub-record → issuer company
|
|
244
296
|
|
|
297
|
+
**Transaction properties:**
|
|
245
298
|
* `transaction_type` — Human-readable code description. Examples: `"Open market or private purchase"`, `"Grant, award, or other acquisition"`
|
|
246
299
|
* `transaction_date` — Transaction date (YYYY-MM-DD)
|
|
247
300
|
* `acquired_disposed_code` — `"A"` (acquired) or `"D"` (disposed)
|
|
@@ -284,6 +337,8 @@ Data source: 13F-HR XML information table.
|
|
|
284
337
|
|
|
285
338
|
## Entity Relationships
|
|
286
339
|
|
|
340
|
+
> **Sub-record traversal:** Sub-records (8-K events, Form 4 transactions, Form 3 holdings) are separate document entities. To find them, traverse from the parent filing using a `linked` expression (distance 1). The sub-record's `filed` property points back to the parent filing, and `issued_by` points to the company.
|
|
341
|
+
|
|
287
342
|
```
|
|
288
343
|
organization ──[filed]────────────────────→ document
|
|
289
344
|
organization ──[filing_reference]─────────→ document
|
|
@@ -296,7 +351,8 @@ document ──[refers_to]──────────────
|
|
|
296
351
|
document ──[filer]────────────────────→ organization (SC 13D/G)
|
|
297
352
|
document ──[group_member]─────────────→ organization (SC 13D)
|
|
298
353
|
document ──[compares_to]──────────────→ organization (DEF 14A)
|
|
299
|
-
document
|
|
354
|
+
document (sub-record)──[filed]────────────────────→ document (8-K event → parent 8-K filing)
|
|
355
|
+
document (sub-record)──[issued_by]────────────────→ organization (8-K event / Form 4 txn → company)
|
|
300
356
|
person ──[is_officer]───────────────→ organization
|
|
301
357
|
person ──[is_director]──────────────→ organization
|
|
302
358
|
person ──[is_ten_percent_owner]─────→ organization
|
|
@@ -126,6 +126,14 @@ flavors:
|
|
|
126
126
|
strong_id_properties: ["accession_number"]
|
|
127
127
|
passive: true
|
|
128
128
|
|
|
129
|
+
- name: "filing"
|
|
130
|
+
namespace: "sec"
|
|
131
|
+
description: "SEC filing (generic, for form types without a specific modeled flavor)"
|
|
132
|
+
display_name: "SEC Filing"
|
|
133
|
+
mergeability: not_mergeable
|
|
134
|
+
strong_id_properties: ["accession_number"]
|
|
135
|
+
passive: true
|
|
136
|
+
|
|
129
137
|
- name: "person"
|
|
130
138
|
description: "A real person as opposed to a fictional character, such as a CEO, politician, or public figure"
|
|
131
139
|
display_name: "Person"
|
|
@@ -140,6 +148,13 @@ flavors:
|
|
|
140
148
|
strong_id_properties: ["cusip_number"]
|
|
141
149
|
passive: true
|
|
142
150
|
|
|
151
|
+
- name: "industry"
|
|
152
|
+
description: "A Standard Industrial Classification (SIC) industry category assigned by the SEC"
|
|
153
|
+
display_name: "Industry"
|
|
154
|
+
mergeability: not_mergeable
|
|
155
|
+
strong_id_properties: ["sic_code"]
|
|
156
|
+
passive: true
|
|
157
|
+
|
|
143
158
|
# =============================================================================
|
|
144
159
|
# PROPERTIES — Organization
|
|
145
160
|
# =============================================================================
|
|
@@ -176,7 +191,7 @@ properties:
|
|
|
176
191
|
description: "Four-digit Standard Industrial Classification code"
|
|
177
192
|
display_name: "SIC Code"
|
|
178
193
|
mergeability: not_mergeable
|
|
179
|
-
domain_flavors: ["organization"]
|
|
194
|
+
domain_flavors: ["organization", "industry"]
|
|
180
195
|
passive: true
|
|
181
196
|
|
|
182
197
|
- name: "sic_description"
|
|
@@ -184,7 +199,7 @@ properties:
|
|
|
184
199
|
description: "Human-readable SIC code description"
|
|
185
200
|
display_name: "SIC Description"
|
|
186
201
|
mergeability: not_mergeable
|
|
187
|
-
domain_flavors: ["organization"]
|
|
202
|
+
domain_flavors: ["organization", "industry"]
|
|
188
203
|
passive: true
|
|
189
204
|
|
|
190
205
|
- name: "state_of_incorporation"
|
|
@@ -574,7 +589,7 @@ properties:
|
|
|
574
589
|
description: "SEC accession number uniquely identifying a filing"
|
|
575
590
|
display_name: "Accession Number"
|
|
576
591
|
mergeability: not_mergeable
|
|
577
|
-
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"]
|
|
592
|
+
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::filing"]
|
|
578
593
|
passive: true
|
|
579
594
|
|
|
580
595
|
- name: "form_type"
|
|
@@ -582,7 +597,7 @@ properties:
|
|
|
582
597
|
description: "Normalized SEC form type (e.g. 10-K, SC 13D, 4)"
|
|
583
598
|
display_name: "Form Type"
|
|
584
599
|
mergeability: not_mergeable
|
|
585
|
-
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"]
|
|
600
|
+
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::filing"]
|
|
586
601
|
passive: true
|
|
587
602
|
|
|
588
603
|
- name: "filing_date"
|
|
@@ -590,7 +605,7 @@ properties:
|
|
|
590
605
|
description: "Date the filing was submitted to the SEC (YYYY-MM-DD)"
|
|
591
606
|
display_name: "Filing Date"
|
|
592
607
|
mergeability: not_mergeable
|
|
593
|
-
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"]
|
|
608
|
+
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::filing"]
|
|
594
609
|
passive: true
|
|
595
610
|
|
|
596
611
|
- name: "report_date"
|
|
@@ -598,7 +613,7 @@ properties:
|
|
|
598
613
|
description: "End date of the primary reporting period (YYYY-MM-DD)"
|
|
599
614
|
display_name: "Report Date"
|
|
600
615
|
mergeability: not_mergeable
|
|
601
|
-
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"]
|
|
616
|
+
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::filing"]
|
|
602
617
|
passive: true
|
|
603
618
|
|
|
604
619
|
# ── XBRL Financial Facts (key concepts) ──
|
|
@@ -1717,11 +1732,19 @@ relationships:
|
|
|
1717
1732
|
# ── Organization → Filing ──
|
|
1718
1733
|
|
|
1719
1734
|
- name: "filed"
|
|
1720
|
-
description: "Link from a company to an SEC filing document
|
|
1735
|
+
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"
|
|
1721
1736
|
display_name: "Filed"
|
|
1722
1737
|
mergeability: not_mergeable
|
|
1723
|
-
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"]
|
|
1724
|
-
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"]
|
|
1738
|
+
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::filing"]
|
|
1739
|
+
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::filing"]
|
|
1740
|
+
passive: true
|
|
1741
|
+
|
|
1742
|
+
- name: "is_issuer_of"
|
|
1743
|
+
description: "Link from an issuer organization to an ownership filing (Forms 3/4, SC 13D/G) where the CIK is the issuer, not the filer"
|
|
1744
|
+
display_name: "Is Issuer Of"
|
|
1745
|
+
mergeability: not_mergeable
|
|
1746
|
+
domain_flavors: ["organization"]
|
|
1747
|
+
target_flavors: ["sec::form_3", "sec::form_4", "sec::sc_13d", "sec::sc_13g", "sec::filing"]
|
|
1725
1748
|
passive: true
|
|
1726
1749
|
|
|
1727
1750
|
- name: "filing_reference"
|
|
@@ -1735,10 +1758,10 @@ relationships:
|
|
|
1735
1758
|
# ── Filing → Organization ──
|
|
1736
1759
|
|
|
1737
1760
|
- name: "issued_by"
|
|
1738
|
-
description: "Link from a filing to the company it pertains to (the filer for most forms; the issuer for ownership forms)"
|
|
1761
|
+
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)"
|
|
1739
1762
|
display_name: "Issued By"
|
|
1740
1763
|
mergeability: not_mergeable
|
|
1741
|
-
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"]
|
|
1764
|
+
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::filing", "financial_instrument"]
|
|
1742
1765
|
target_flavors: ["organization"]
|
|
1743
1766
|
passive: true
|
|
1744
1767
|
|
|
@@ -1751,10 +1774,10 @@ relationships:
|
|
|
1751
1774
|
passive: true
|
|
1752
1775
|
|
|
1753
1776
|
- name: "filer"
|
|
1754
|
-
description: "Link from a filing to the
|
|
1777
|
+
description: "Link from a filing to the entity (person or organization) who filed it"
|
|
1755
1778
|
display_name: "Filer"
|
|
1756
1779
|
mergeability: not_mergeable
|
|
1757
|
-
domain_flavors: ["sec::sc_13d", "sec::sc_13g", "sec::13f_hr"]
|
|
1780
|
+
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::filing"]
|
|
1758
1781
|
target_flavors: ["organization", "person"]
|
|
1759
1782
|
passive: true
|
|
1760
1783
|
|
|
@@ -1803,10 +1826,10 @@ relationships:
|
|
|
1803
1826
|
# ── Organization → Financial Instrument ──
|
|
1804
1827
|
|
|
1805
1828
|
- name: "holds_position"
|
|
1806
|
-
description: "Link from an investment manager to a security it holds (13F-HR)"
|
|
1829
|
+
description: "Link from an investment manager or fund to a security it holds (13F-HR, N-PORT)"
|
|
1807
1830
|
display_name: "Holds Position"
|
|
1808
1831
|
mergeability: not_mergeable
|
|
1809
|
-
domain_flavors: ["organization"]
|
|
1832
|
+
domain_flavors: ["organization", "financial_instrument"]
|
|
1810
1833
|
target_flavors: ["financial_instrument"]
|
|
1811
1834
|
passive: true
|
|
1812
1835
|
|
|
@@ -1844,6 +1867,16 @@ relationships:
|
|
|
1844
1867
|
target_flavors: ["organization"]
|
|
1845
1868
|
passive: true
|
|
1846
1869
|
|
|
1870
|
+
# ── Organization → Financial Instrument (issuer link) ──
|
|
1871
|
+
|
|
1872
|
+
- name: "issues_security"
|
|
1873
|
+
description: "Link from an issuing company to a financial instrument it has issued, identified by CUSIP (SC 13D/G)"
|
|
1874
|
+
display_name: "Issues Security"
|
|
1875
|
+
mergeability: not_mergeable
|
|
1876
|
+
domain_flavors: ["organization"]
|
|
1877
|
+
target_flavors: ["financial_instrument"]
|
|
1878
|
+
passive: true
|
|
1879
|
+
|
|
1847
1880
|
# =============================================================================
|
|
1848
1881
|
# ATTRIBUTES
|
|
1849
1882
|
# =============================================================================
|
|
@@ -1891,3 +1924,61 @@ attributes:
|
|
|
1891
1924
|
description: "Fiscal period: FY (annual), Q1, Q2, Q3 (quarterly)"
|
|
1892
1925
|
display_name: "Filing Period"
|
|
1893
1926
|
mergeability: not_mergeable
|
|
1927
|
+
|
|
1928
|
+
# ── holds_position relationship attributes (13F-HR) ──
|
|
1929
|
+
|
|
1930
|
+
- property: "holds_position"
|
|
1931
|
+
name: "position_value"
|
|
1932
|
+
type: string
|
|
1933
|
+
description: "Market value of the position in thousands of USD"
|
|
1934
|
+
display_name: "Position Value"
|
|
1935
|
+
mergeability: not_mergeable
|
|
1936
|
+
|
|
1937
|
+
- property: "holds_position"
|
|
1938
|
+
name: "shares_held"
|
|
1939
|
+
type: string
|
|
1940
|
+
description: "Number of shares or principal amount held"
|
|
1941
|
+
display_name: "Shares Held"
|
|
1942
|
+
mergeability: not_mergeable
|
|
1943
|
+
|
|
1944
|
+
- property: "holds_position"
|
|
1945
|
+
name: "instrument_type"
|
|
1946
|
+
type: string
|
|
1947
|
+
description: "Type of instrument: SH (shares) or PRN (principal amount)"
|
|
1948
|
+
display_name: "Instrument Type"
|
|
1949
|
+
mergeability: not_mergeable
|
|
1950
|
+
|
|
1951
|
+
- property: "holds_position"
|
|
1952
|
+
name: "put_call"
|
|
1953
|
+
type: string
|
|
1954
|
+
description: "Option type if applicable: PUT or CALL"
|
|
1955
|
+
display_name: "Put/Call"
|
|
1956
|
+
mergeability: not_mergeable
|
|
1957
|
+
|
|
1958
|
+
- property: "holds_position"
|
|
1959
|
+
name: "investment_discretion"
|
|
1960
|
+
type: string
|
|
1961
|
+
description: "Investment discretion: SOLE, SHARED, or DEFINED"
|
|
1962
|
+
display_name: "Investment Discretion"
|
|
1963
|
+
mergeability: not_mergeable
|
|
1964
|
+
|
|
1965
|
+
- property: "holds_position"
|
|
1966
|
+
name: "voting_authority_sole"
|
|
1967
|
+
type: string
|
|
1968
|
+
description: "Shares with sole voting authority"
|
|
1969
|
+
display_name: "Voting Authority (Sole)"
|
|
1970
|
+
mergeability: not_mergeable
|
|
1971
|
+
|
|
1972
|
+
- property: "holds_position"
|
|
1973
|
+
name: "voting_authority_shared"
|
|
1974
|
+
type: string
|
|
1975
|
+
description: "Shares with shared voting authority"
|
|
1976
|
+
display_name: "Voting Authority (Shared)"
|
|
1977
|
+
mergeability: not_mergeable
|
|
1978
|
+
|
|
1979
|
+
- property: "holds_position"
|
|
1980
|
+
name: "voting_authority_none"
|
|
1981
|
+
type: string
|
|
1982
|
+
description: "Shares with no voting authority"
|
|
1983
|
+
display_name: "Voting Authority (None)"
|
|
1984
|
+
mergeability: not_mergeable
|
|
@@ -48,7 +48,7 @@ A traded security, index, or reference rate for which FRED publishes price or yi
|
|
|
48
48
|
- Primary key: entity name (e.g. "10-Year U.S. Treasury", "S&P 500"). No strong ID — resolved by name with MERGEABLE mergeability.
|
|
49
49
|
- Entity resolver: named entity, MERGEABLE. Disambiguation snippet includes series title, frequency, and units.
|
|
50
50
|
- Source: `fred-source`
|
|
51
|
-
- Entities produced: U.S. Treasuries (1Y, 2Y, 10Y, 30Y, 3M bill), SOFR, SONIA,
|
|
51
|
+
- Entities produced: U.S. Treasuries (1Y, 2Y, 10Y, 30Y, 3M bill), SOFR, SONIA, NASDAQ Composite, CBOE VIX, FX pairs (JPY/USD, KRW/USD, USD/EUR, USD/GBP, CAD/USD, CNY/USD), U.S. Dollar Index, U.S. Dollar Advanced Economy Index
|
|
52
52
|
|
|
53
53
|
### `product`
|
|
54
54
|
|
|
@@ -77,7 +77,7 @@ These atoms appear once per series record, timestamped at the first observation
|
|
|
77
77
|
* `fred_series_id`
|
|
78
78
|
* Definition: FRED's unique alphanumeric identifier for the series.
|
|
79
79
|
* Source flavor: location, organization, financial_instrument, product
|
|
80
|
-
* Examples: `"GDP"`, `"UNRATE"`, `"DGS10"
|
|
80
|
+
* Examples: `"GDP"`, `"UNRATE"`, `"DGS10"`
|
|
81
81
|
* Derivation: `id` field from the FRED `/series` API response.
|
|
82
82
|
|
|
83
83
|
* `notes`
|
|
@@ -198,7 +198,6 @@ Each observation in a series becomes one atom timestamped at the observation dat
|
|
|
198
198
|
* `bank_lending_standards` — Net % of banks tightening C&I loan standards for large firms (Percent, quarterly). Series: DRTSCILM.
|
|
199
199
|
* `bank_lending_standards_small` — Net % of banks tightening C&I loan standards for small firms (Percent, quarterly). Series: DRTSCLNM. **Note: FRED reports this series as discontinued/nonexistent as of 2026-03.**
|
|
200
200
|
* `bank_lending_standards_cre` — Net % of banks tightening CRE lending standards (Percent, quarterly). Series: DRTSRCL. **Note: FRED reports this series as discontinued/nonexistent as of 2026-03.**
|
|
201
|
-
* `baa_10y_spread` — Moody's Baa corporate bond yield minus 10Y Treasury (Percent, daily). Series: BAA10Y.
|
|
202
201
|
* `credit_card_delinquency_rate` — Delinquency rate on credit card loans, all commercial banks (Percent, quarterly). Series: DRCCLACBS.
|
|
203
202
|
* `cre_delinquency_rate` — Delinquency rate on CRE loans excluding farmland (Percent, quarterly). Series: DRCRELEXFACBS.
|
|
204
203
|
|
|
@@ -215,8 +214,6 @@ Each observation in a series becomes one atom timestamped at the observation dat
|
|
|
215
214
|
* `building_permits` — New privately-owned housing units authorized, SAAR (Thousands of Units, monthly). Series: PERMIT.
|
|
216
215
|
* `housing_months_supply` — Monthly supply of new houses, seasonally adjusted (Months' Supply, monthly). Series: MSACSR.
|
|
217
216
|
* `home_price_median` — Median sales price of houses sold (Dollars, quarterly). Series: MSPUS.
|
|
218
|
-
* `home_price_index` — S&P CoreLogic Case-Shiller U.S. National Home Price Index (Index Jan 2000=100, monthly). Series: CSUSHPINSA.
|
|
219
|
-
* `home_price_index_20city` — S&P CoreLogic Case-Shiller 20-City Composite Home Price Index (Index Jan 2000=100, monthly). Series: SPCS20RSA.
|
|
220
217
|
* `home_price_index_fhfa` — FHFA all-transactions house price index (Index 1980:Q1=100, quarterly). Series: USSTHPI.
|
|
221
218
|
* `mortgage_rate_30y` — 30-year fixed rate mortgage average (Percent, weekly). Series: MORTGAGE30US.
|
|
222
219
|
* `rental_vacancy_rate` — Rental housing vacancy rate (Percent, quarterly). Series: RRVRUSQ156N.
|
|
@@ -286,8 +283,7 @@ Each observation in a series becomes one atom timestamped at the observation dat
|
|
|
286
283
|
#### Financial Markets (financial_instrument)
|
|
287
284
|
|
|
288
285
|
* `yield` — Market yield or interest rate for a fixed-income instrument (Percent). Series: DGS1, DGS2, DGS10, DGS30, DTB3, TB3MS, SOFR, IUDSOIA.
|
|
289
|
-
* `price` — Market price, index level, or exchange rate (varies by instrument). Series:
|
|
290
|
-
* `option_adjusted_spread` — Option-adjusted spread for a bond index (Percent, daily). Series: BAMLH0A0HYM2.
|
|
286
|
+
* `price` — Market price, index level, or exchange rate (varies by instrument). Series: NASDAQCOM, VIXCLS, DTWEXBGS, TWEXAFEGSMTH, DEXUSEU, DEXUSUK, DEXJPUS, DEXKOUS, EXCAUS, DEXCHUS.
|
|
291
287
|
|
|
292
288
|
#### Commodity Prices (product)
|
|
293
289
|
|
|
@@ -308,6 +304,6 @@ The FRED source produces no `data_nindex` relationship properties. All atoms are
|
|
|
308
304
|
```
|
|
309
305
|
location ── [fed_funds_rate, gdp, unemployment_rate, cpi, ...] (scalar observation properties)
|
|
310
306
|
organization ── [fed_funds_rate, policy_rate, monetary_base, ...]
|
|
311
|
-
financial_instrument ── [yield, price
|
|
307
|
+
financial_instrument ── [yield, price]
|
|
312
308
|
product ── [price]
|
|
313
309
|
```
|
|
@@ -77,7 +77,7 @@ properties:
|
|
|
77
77
|
display_name: "FRED Series ID"
|
|
78
78
|
mergeability: not_mergeable
|
|
79
79
|
domain_flavors: ["fred_series"]
|
|
80
|
-
examples: ["GDP", "UNRATE", "DGS10"
|
|
80
|
+
examples: ["GDP", "UNRATE", "DGS10"]
|
|
81
81
|
passive: true
|
|
82
82
|
|
|
83
83
|
- name: "name"
|
|
@@ -86,7 +86,7 @@ properties:
|
|
|
86
86
|
display_name: "Name"
|
|
87
87
|
mergeability: not_mergeable
|
|
88
88
|
domain_flavors: ["fred_series"]
|
|
89
|
-
examples: ["Gross Domestic Product", "Federal Funds Effective Rate"
|
|
89
|
+
examples: ["Gross Domestic Product", "Federal Funds Effective Rate"]
|
|
90
90
|
passive: true
|
|
91
91
|
|
|
92
92
|
- name: "notes"
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# Dataset schema for SIC industry classifications derived from SEC EDGAR filings.
|
|
2
|
+
#
|
|
3
|
+
# This schema introduces the `industry` flavor — a Standard Industrial
|
|
4
|
+
# Classification (SIC) category identified by its 4-digit code. Organizations
|
|
5
|
+
# are linked to their industry via the `works_in_industry` relationship.
|
|
6
|
+
#
|
|
7
|
+
# All elements are passive (deterministic extraction from filing headers).
|
|
8
|
+
name: "industries"
|
|
9
|
+
description: "SIC industry classifications linking SEC-registered organizations to their Standard Industrial Classification codes"
|
|
10
|
+
|
|
11
|
+
extraction:
|
|
12
|
+
flavors: closed
|
|
13
|
+
properties: closed
|
|
14
|
+
relationships: closed
|
|
15
|
+
attributes: closed
|
|
16
|
+
|
|
17
|
+
flavors:
|
|
18
|
+
- name: "industry"
|
|
19
|
+
description: "A Standard Industrial Classification (SIC) industry category assigned by the SEC"
|
|
20
|
+
display_name: "Industry"
|
|
21
|
+
mergeability: not_mergeable
|
|
22
|
+
strong_id_properties: ["sic_code"]
|
|
23
|
+
passive: true
|
|
24
|
+
|
|
25
|
+
- name: "organization"
|
|
26
|
+
description: "A particular business, institution, or organization such as a corporation, university, government agency, or non-profit"
|
|
27
|
+
display_name: "Organization"
|
|
28
|
+
mergeability: not_mergeable
|
|
29
|
+
strong_id_properties: ["company_cik"]
|
|
30
|
+
passive: true
|
|
31
|
+
|
|
32
|
+
properties:
|
|
33
|
+
- name: "sic_code"
|
|
34
|
+
type: string
|
|
35
|
+
description: "Four-digit Standard Industrial Classification code"
|
|
36
|
+
display_name: "SIC Code"
|
|
37
|
+
mergeability: not_mergeable
|
|
38
|
+
domain_flavors: ["industry", "organization"]
|
|
39
|
+
passive: true
|
|
40
|
+
|
|
41
|
+
- name: "sic_description"
|
|
42
|
+
type: string
|
|
43
|
+
description: "Human-readable SIC code description"
|
|
44
|
+
display_name: "SIC Description"
|
|
45
|
+
mergeability: not_mergeable
|
|
46
|
+
domain_flavors: ["industry", "organization"]
|
|
47
|
+
passive: true
|
|
48
|
+
|
|
49
|
+
- name: "company_cik"
|
|
50
|
+
type: string
|
|
51
|
+
description: "SEC Central Index Key, 10-digit zero-padded"
|
|
52
|
+
display_name: "CIK"
|
|
53
|
+
mergeability: not_mergeable
|
|
54
|
+
domain_flavors: ["organization"]
|
|
55
|
+
passive: true
|
|
56
|
+
|
|
57
|
+
relationships:
|
|
58
|
+
- name: "works_in_industry"
|
|
59
|
+
description: "Link from an organization to its SIC industry classification"
|
|
60
|
+
display_name: "Works In Industry"
|
|
61
|
+
mergeability: not_mergeable
|
|
62
|
+
domain_flavors: ["organization"]
|
|
63
|
+
target_flavors: ["industry"]
|
|
64
|
+
passive: true
|
|
@@ -604,6 +604,17 @@ These are mistakes previous agents have made. Do not repeat them.
|
|
|
604
604
|
when the `ref` field is actually present in the tool response data.
|
|
605
605
|
The client renders these as numbered citations with source links.
|
|
606
606
|
|
|
607
|
+
6. **Do not pass raw `McpToolset` when the spec calls for custom tools.**
|
|
608
|
+
If DESIGN.md describes named tools (e.g. `entity_search`,
|
|
609
|
+
`corporate_structure`, `event_monitor`), each must be a Python
|
|
610
|
+
function that calls MCP internally. Passing `McpToolset` as the
|
|
611
|
+
agent's only tool source means: no Markdown report formatting, no
|
|
612
|
+
session-state caching, no property type resolution (`data_nindex`
|
|
613
|
+
values render as raw NEIDs), no compound cache keys, and no error
|
|
614
|
+
boundaries. The LLM gets raw JSON and hallucinates when responses
|
|
615
|
+
are large. `McpToolset` passthrough is acceptable for quick
|
|
616
|
+
prototypes but not for production agents with a defined tool suite.
|
|
617
|
+
|
|
607
618
|
---
|
|
608
619
|
|
|
609
620
|
## Citation Handling
|
|
@@ -114,6 +114,18 @@ Match the brief: dashboards from `/api/...`, **chat** as primary, or both. No El
|
|
|
114
114
|
|
|
115
115
|
## Step 6: Build
|
|
116
116
|
|
|
117
|
+
**If the brief is agent-heavy** (the agent IS the product — chatbot,
|
|
118
|
+
research assistant, investigation tool, etc.), build the agent FIRST:
|
|
119
|
+
|
|
120
|
+
1. **`agents/`** — Build the full agent with all tools specified in DESIGN.md.
|
|
121
|
+
Each named tool must be a Python function — do NOT just pass `McpToolset`
|
|
122
|
+
through and write a system prompt. Read the `agents` rule ("McpToolset
|
|
123
|
+
passthrough" section) for why this matters.
|
|
124
|
+
2. Test the agent locally with `adk web` before building the UI.
|
|
125
|
+
3. Then build the UI around the working agent.
|
|
126
|
+
|
|
127
|
+
**For all projects:**
|
|
128
|
+
|
|
117
129
|
1. **`agents/`** — one or more agents per `agents-data` (sync, research, channeling, or mixed).
|
|
118
130
|
2. **`server/api/` + composables + `pages/`** — when the brief needs materialized lists or detail.
|
|
119
131
|
3. **`pages/chat` or custom** — when the brief is agent-forward.
|
|
@@ -121,6 +133,26 @@ Match the brief: dashboards from `/api/...`, **chat** as primary, or both. No El
|
|
|
121
133
|
|
|
122
134
|
---
|
|
123
135
|
|
|
136
|
+
## Step 6b: Audit Against the Spec
|
|
137
|
+
|
|
138
|
+
Before committing, re-read DESIGN.md and compare what you built against
|
|
139
|
+
what it specifies. This is a mechanical check — no judgment needed.
|
|
140
|
+
|
|
141
|
+
1. **List every agent tool** DESIGN.md describes (by name, with purpose).
|
|
142
|
+
2. For each, confirm it exists in your code with the described behavior.
|
|
143
|
+
3. If the spec describes N custom tools and you built fewer, **go back
|
|
144
|
+
and build the missing ones** before proceeding.
|
|
145
|
+
4. If you used `McpToolset` passthrough where the spec calls for custom
|
|
146
|
+
Python tool functions, **replace it** — passthrough does not satisfy a
|
|
147
|
+
spec that describes named tools with specific behaviors.
|
|
148
|
+
5. Check that tools format output as Markdown, handle errors, and cache
|
|
149
|
+
results in session state where the spec requires it.
|
|
150
|
+
|
|
151
|
+
Do not skip this step. The most common failure mode is building a polished
|
|
152
|
+
UI connected to a stub agent that passes raw MCP tools through to the LLM.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
124
156
|
## Step 7: Verify and Commit
|
|
125
157
|
|
|
126
158
|
After building, ensure dependencies are installed and run a production build:
|