Deep SEC filing analysis — read full 10-K/proxy/13D text, extract related-party transactions, officers, subsidiaries, risk disclosures
TIER 1: DEPTH ANALYSIS — This skill reads full SEC filing text and extracts structured intelligence that surface-level searches miss. LLMs can process 100-500KB filings, cross-reference every name against the investigation, and find buried disclosures in footnotes that human analysts skim. Record every factual discovery separately. Do not theorize about what disclosures mean — extract and cross-reference.
/analyze-filing "Palantir Technologies" — look up CIK, list recent filings, analyze most relevant/analyze-filing --cik 1321655 — go directly to CIK/analyze-filing --url "https://sec.gov/..." — read a specific filing URL/analyze-filing --form "DEF 14A" — filter to proxy statements (default: 10-K)uv run python tools/investigation_context.py show
WORKDIR=$(mktemp -d /tmp/osint-XXXXXXXX)
echo "Session workdir: $WORKDIR"
# Look up CIK
uv run python tools/query_edgar.py lookup "<COMPANY_OR_PERSON>" --output $WORKDIR/edgar-lookup.json
# Get company metadata and recent filings
uv run python tools/query_edgar.py company <CIK> --output $WORKDIR/edgar-company.json
# List specific form types
uv run python tools/query_edgar.py filings <CIK> --form "10-K" --output $WORKDIR/edgar-filings.json
Select the most relevant filing: most recent, or one matching a key_date from the investigation profile.
This is the core LLM advantage — process the entire document, not just metadata.
uv run python tools/query_edgar.py read "<FILING_URL>" --lines 10000 --output $WORKDIR/filing-full.txt
For very large filings (>500KB), read in sections:
uv run python tools/query_edgar.py read "<FILING_URL>" --lines 3000 --output $WORKDIR/filing-part1.txt
uv run python tools/query_edgar.py read "<FILING_URL>" --lines 3000 --offset 3000 --output $WORKDIR/filing-part2.txt
Read the filing text and systematically extract information. Do not skim — read thoroughly. The value of this skill is exhaustive extraction.
Officers and directors (Part III or incorporated proxy reference)
entity_tracker.py add-roleSubsidiaries (Exhibit 21 or Item 1)
entity_tracker.py add-entityRelated-party transactions (footnotes, typically Note 12-20)
Risk factors mentioning litigation or investigations (Item 1A)
Material contracts (Item 1, or Exhibit index)
Segment revenue (footnotes)
Off-balance-sheet arrangements / VIEs (footnotes)
Subsequent events (final footnote)
Financial statements (structured extraction via edgartools)
uv run python tools/query_edgar.py sections <TICKER_OR_CIK> --section income_statement --output $WORKDIR/income.json
uv run python tools/query_edgar.py sections <TICKER_OR_CIK> --section balance_sheet --output $WORKDIR/balance.json
uv run python tools/query_edgar.py sections <TICKER_OR_CIK> --section cashflow_statement --output $WORKDIR/cashflow.json
uv run python tools/financial_ratios.py analyze $WORKDIR/income.json $WORKDIR/balance.json --cashflow $WORKDIR/cashflow.json --output $WORKDIR/ratios.json
--type financialAccounting policy changes (footnotes, typically Note 1-2)
Auditor information (filing signature page / Exhibit 99)
For every person and entity name extracted from the filing:
# Check if already in our database
uv run python tools/entity_tracker.py lookup --name "<NAME>"
# Check for existing findings
uv run python tools/findings_tracker.py search "<NAME>" --output $WORKDIR/xref-<slug>.json
# Check connections
uv run python -c "
import sqlite3
db = sqlite3.connect('investigation.db')
db.row_factory = sqlite3.Row
rows = db.execute('SELECT * FROM connections WHERE person_a LIKE ? OR person_b LIKE ?', ('%<NAME>%','%<NAME>%')).fetchall()
for r in rows: print(dict(r))
"
Flag names that appear in the investigation profile's key_persons or known_addresses.
uv run python tools/query_edgar.py insider <CIK> --detail --output $WORKDIR/insider-detail.json
Read the parsed XML data. Map:
DB-first principle: Record every discovery to findings_tracker.py add and every entity to entity_tracker.py as you extract them from the filing text. Do not accumulate observations and batch them at the end — if you run out of context, unrecorded observations are lost. The filing text in $WORKDIR/ is ephemeral; the database is permanent.
One finding per discrete factual discovery. Do not batch into one mega-finding.
# Direct quote from filing text
uv run python tools/findings_tracker.py add \
--target "<COMPANY>" \
--summary "<One-line factual summary>" \
--type <identity|financial|relationship|legal> \
--evidence "SEC:CIK<NUM>:<ACCESSION>" \
--claim-type direct_quote \
--source-quote "SEC:CIK<NUM>:<ACCESSION>:exact text from filing" \
--sources edgar \
--confidence confirmed
# Paraphrased disclosure
uv run python tools/findings_tracker.py add \
--target "<COMPANY>" \
--summary "<Summary of disclosed information>" \
--type financial \
--evidence "SEC:CIK<NUM>:<ACCESSION>" \
--claim-type paraphrase \
--source-quote "SEC:CIK<NUM>:<ACCESSION>:relevant text from filing" \
--sources edgar \
--confidence high
Register discovered entities and officers:
uv run python tools/entity_tracker.py add-entity --name "<SUBSIDIARY>" --entity-type llc --jurisdiction "<STATE>" --source "SEC:CIK<NUM>"
uv run python tools/entity_tracker.py add-role --entity-id <ID> --person-name "<OFFICER>" --role "<TITLE>" --source "SEC:CIK<NUM>"
# New person discovered in filing
uv run python tools/lead_tracker.py add \
--title "Investigate <PERSON> — officer of <COMPANY>, related-party transaction disclosed" \
--category person --priority medium \
--target "<PERSON>" --source "agent:analyze-filing" \
--evidence "SEC:CIK<NUM>:<ACCESSION>"
# Subsidiary worth tracing
uv run python tools/lead_tracker.py add \
--title "Trace <SUBSIDIARY> — subsidiary in <JURISDICTION>, <OWNERSHIP>% owned" \
--category entity --priority medium \
--target "<SUBSIDIARY>" --source "agent:analyze-filing"
# Referenced litigation
uv run python tools/lead_tracker.py add \
--title "Analyze case: <CASE_NAME> — disclosed in <COMPANY> 10-K risk factors" \
--category case --priority medium \
--target "<CASE_NAME>" --source "agent:analyze-filing"
A human analyst reading a 10-K skims the summary, checks the financials table, and maybe reads Item 1A risk factors. They rarely read every footnote, cross-reference every subsidiary name, or check every officer against other investigations.
An LLM agent reads the entire document and cross-references every name against the investigation database. This surfaces: