Zo SEC Intelligence
Ask any question about any public company's SEC filings and get precise, cited answers from raw filing text — across tickers, across years.
When This Skill Activates
Activates when the user mentions:
- SEC / EDGAR / SEC filings / SEC data
- Company financial topics: earnings, revenue, guidance, income statement, cash flow, segment results, margins, guidance
- Filing types: 10-K, 10-Q, 8-K, DEF 14A, Form 3, Form 4, S-1, 20-F, 6-K, 13F, 13D, 13G
- Insider, proxy, shareholder, annual report, quarterly filing
- Risk factors, MD&A, executive comp, beneficial ownership, share repurchase, buyback
- Questions starting with "what does X say about..." / "how does X discuss..." / "compare X and Y"
Decision Tree
When a user message triggers this skill, map it through this tree before acting:
USER MESSAGE
│
├─ "what do we have indexed" / "show me tracked tickers" / "dashboard"
│ → Suggest the dashboard: https://cis.zo.space/sec
│ → Or run: check_indexed.py --ticker ALL (show all)
│
├─ "run a health check" / "diagnostics" / "is it working"
│ → doctor.py
│
├─ "how much space" / "storage" / "how big is this"
│ → manifest.py --storage-stats
│
├─ "track" / "monitor" / "alert me" / "notify me"
│ → Register monitor rule + create automation (see Monitoring section)
│
├─ "set up" / "install" / "initialize" / "get started"
│ → Run: python3 Skills/sec-edgar/scripts/install.py
│
├─ Question about a specific company's financials / operations / risks
│ → GO TO: Ask a Question About a Company
│
└─ Fetch or check filings
→ GO TO: Fetch Workflow
Fetch Workflow
First: Check What's Already Indexed
Always check first. Never fetch blindly.
User: "Fetch Tesla's latest 10-K"
Agent:
→ check_indexed.py --ticker TSLA
→ if already indexed: tell user what's available, ask if they want it re-fetched
→ if not: proceed to fetch
SEC User-Agent — Needed Once
If the user hasn't set up SEC EDGAR access yet, get the UA first:
Agent: "SEC EDGAR requires a name and email in the request header. What's your name and email? (Format: 'Your Name your@email.com')"
User: "Jing Xie jing@clarionintelligence.com"
Agent:
→ update config.json sec_user_agent = "Jing Xie jing@clarionintelligence.com"
→ proceed with fetch
Actually Fetch
Agent:
→ fetch.py --ticker TSLA --forms 10-K --max 2
→ index.py --auto (background, returns immediately)
→ tell user: "Downloading 2 TSLA 10-Ks. Indexing in background — I'll let you know when ready."
After Fetching
Agent:
→ check_indexing_status (poll until done)
→ when complete: report what was indexed
→ then: GO TO: Ask a Question workflow
Supported Form Types
| Form | What it is |
|---|---|
| 10-K | Annual report — Business, Risk Factors, MD&A, Financials |
| 10-Q | Quarterly report — Financials, MD&A, Risk Factors |
| 8-K | Current report — earnings, leadership, material events |
| DEF 14A | Proxy statement — exec comp, board, shareholder proposals |
| Form 3/4 | Insider ownership — who owns what, trading activity |
| S-1 | IPO registration — risk factors, use of proceeds |
| 20-F | Foreign company annual (non-US issuers) |
| 6-K | Foreign company current events |
| 13F | Institutional investment holdings (quarterly) |
| 13D/G | Beneficial ownership (5%+ holders) |
| 424B5 | Prospectus supplement |
| S-1/A, 10-Q/A | Amendments — stored and indexed independently |
Ask a Question About a Company
Step 1: Ensure the filing is indexed
Agent:
→ check_indexed.py --ticker TSLA
→ if not indexed: fetch + index first
→ if indexed: proceed to search
Step 2: Search
Agent:
→ search.py --query "risk factors" --tickers TSLA
→ returns ranked matches with doc_id, node_id, snippet, score
Step 3: Get Full Text
Agent:
→ get_document_section(doc_id, node_id) for each top result
→ present raw filing text with citation
Step 4: Synthesize and Cite
Always cite:
According to Tesla's 2025 10-K (doc:
TSLA--10-K--20250128--000131860525000014, Item 1A Risk Factors, node 0008): "Our business is subject to risks including supply chain disruption, EV market adoption uncertainty, and regulatory compliance across multiple jurisdictions..."Source: TSLA--10-K--20250128--000131860525000014, node 0008
Cross-Company Comparison
User: "Compare how Apple, Microsoft, and Google discuss AI in their 2025 10-Ks"
Agent:
→ ensure AAPL, MSFT, GOOGL latest 10-Ks are indexed
→ search.py --query "artificial intelligence AI" --tickers AAPL,MSFT,GOOGL
→ for each top match: get_document_section
→ synthesize with per-company citations
Multi-Year Tracking
User: "Show me how Amazon's AWS segment revenue discussion evolved from 2022 to 2025"
Agent:
→ ensure AMZN 10-K filings from 2022, 2023, 2024, 2025 are indexed
→ search.py for each year individually
→ present side-by-side raw text showing evolution
Query Routing — Where Answers Live
| User is asking about | Primary SEC section |
|---|---|
| Risk factors | Item 1A (10-K / 10-Q) |
| Management discussion | Item 7 MD&A (10-K), Part I Item 2 (10-Q) |
| Revenue / segment breakdown | Item 8 footnotes, Item 7 MD&A |
| Earnings / quarterly results | 8-K Item 2.02 (results), 10-Q Part I Item 2 (MD&A) |
| Revenue guidance / forward-looking | 8-K, 10-Q MD&A |
| Segment / geography results | Item 8 segment footnotes |
| Executive compensation | DEF 14A, Item 11 (10-K) |
| Insider ownership / 10b5-1 plans | Form 3/4, Item 12 (10-K) |
| Share repurchases / buybacks | Item 5 (10-K / 10-Q) |
| Legal proceedings / lawsuits | Item 3 (10-K / 10-Q) |
| Debt and credit facilities | Item 8 footnotes, Item 7 liquidity |
| Related party transactions | Item 13 (10-K) |
| Acquisitions / mergers | Item 8 notes, Item 7 |
| Accounting policies | Item 8 footnote 1-2 |
| Goodwill and intangibles | Item 8 intangible asset footnotes |
| Institutional holdings | 13F (quarterly) |
| Beneficial ownership (5%+ holders) | 13D / 13G |
Monitoring — Set Up an Alert
Register a Rule
User: "Alert me when any of my tracked companies files an 8-K mentioning acquisition"
Agent:
→ config.py add_monitor_rule(
name="8-K acquisitions",
applies_to_forms=["8-K"],
keywords=["acquisition", "merger", "letter of intent"],
alert_channel="sms"
)
→ verify the rule is stored in sec/config.json
Create the Weekly Automation
Agent:
→ create_automation(
title="SEC Filing Monitor",
rrule="WEEKLY",
instruction_file="Skills/sec-edgar/prompts/weekly_fetch.md",
delivery_method="sms"
)
→ confirm automation created with trigger time
The automation reads file sec/config.json for tracked tickers and monitor rules. It:
- Fetches new filings for all tracked tickers
- Applies each rule's keywords to each new filing
- Only sends alerts when at least one rule matches
- Skips filings that match no rules (no alert fatigue)
- Reports storage usage in the weekly digest
Key Principles
Check before fetch. Always
check_indexed.py --ticker Xfirst — avoids redundant downloads and respects SEC rate limits.Summaries are navigation only. The system builds summaries to help locate relevant sections. Answers always come from full raw text, never from summaries.
Cite with doc_id + node_id. Every answer must include the source citation in format:
(ticker: doc_id, section: node_id).SEC rate limits are real. EDGAR allows 10 req/s. Scripts handle this with jitter and backoff. If rate-limited, wait 10 minutes before retrying.
Amendments are stored independently. 10-K/A is not a replacement for 10-K — both are kept, with
is_latest_for_periodflagged in the manifest.Dashboard is read-only. The Zo Space dashboard at
https://cis.zo.space/secis for reading and monitoring. All actions (add ticker, change config, trigger fetch) go through chat or file edit.Only suggest dashboard on "what do we have indexed" queries. Not on fetch, search, or analysis — those are chat-first workflows.
One skill, one job. Don't try to do financial analysis, trading, or portfolio management. Stay focused on SEC filing intelligence.
Error Recovery
| Problem | What to do |
|---|---|
| Ticker not found | Verify the ticker symbol. Try searching on SEC EDGAR directly. |
| SEC rate limited | "SEC rate limited — I'll wait 10 minutes before retrying." |
| Filing not in index | Check check_indexed.py --ticker X. If not indexed, fetch it. |
| No search results | Try broader terms. Check the document overview to understand structure. |
| Indexing failed | Check file index.py output. Verify the HTML file exists and is valid. |
| LLM call failed | Retry once. If still failing, note the section will use raw text without summarization. |
Scripts Reference
All scripts run from /home/workspace with python3 Skills/sec-edgar/scripts/<script>.py.
| Script | What it does |
|---|---|
fetch.py --ticker TSLA --forms 10-K,10-Q --max 5 |
Download filings. --skip-indexed skips already downloaded. |
index.py --auto |
Index all unindexed HTML files in sec/index/. |
index.py --file <path> |
Index a single file. |
check_indexed.py --ticker TSLA |
What's indexed vs. available on SEC EDGAR. Use --all for all tickers. |
search.py --query "risk factors" --tickers TSLA,IBM |
Keyword + LLM-reasoning search across indexed filings. |
manifest.py --ticker TSLA |
Per-ticker manifest. --storage-stats shows total + per-ticker storage. |
config.py --add-ticker MSFT --add-rule "..." |
Add tickers or monitor rules to config. |
| Health check: filesystem, config, storage, EDGAR reachability. | |
llm.py --verify-model |
Verify MiniMax 2.7 is reachable via Zo. |
| First-time setup: creates sec/ dirs, sets config, runs smoke test. |
Data Storage
/home/workspace/sec/
index/
[TICKER]/
[TICKER].manifest.json ← source of truth per ticker
[TICKER]--[FORM]--[DATE]--[ACCESSION].html ← original HTML
[TICKER]--[FORM]--[DATE]--[ACCESSION].json ← PageIndex tree
[TICKER]--[FORM]--[DATE]--[ACCESSION].manifest.json ← per-filing sidecar
manifests/
global.json ← aggregated view (rebuilt on read)
cache/
company_tickers.json ← ticker→CIK (5-min TTL)
edgar_check.json ← last-known filing per ticker
logs/
fetch_YYYY-MM-DD.log
index_YYYY-MM-DD.log
config.json ← user prefs, tracked tickers, monitor rules
First-Time Setup
User: "Set up SEC intelligence"
Agent:
→ python3 Skills/sec-edgar/scripts/install.py
→ prompt for SEC User-Agent (name + email)
→ prompt for initial tickers to track
→ run smoke test (fetch one filing, index it, verify search works)
→ report setup complete with status