Install
openclaw skills install @thesentitrader/us-stocks-analysisUS stocks analysis by an adversarial investment committee. Legendary-investor personas independently research a thesis, attack each other's cases against a shared evidence ledger (sentiment, smart money, SEC fundamentals), and reconcile into a verdict with recorded dissents. Structured rubrics keep every number sourced, on any model. Includes five quick data workflows. Use for stock research, investment thesis, bull case vs bear case, due diligence on a ticker, should I buy this stock, deep dive on a company. Read-only. No trading, no purchases, no write operations, no wallet access.
openclaw skills install @thesentitrader/us-stocks-analysisAdversarial investment-committee analysis for US equities. For quick data asks, five expert workflows synthesize price, sentiment, smart money, analyst ratings, and AI insights into terminal-grade briefs. For thesis-grade questions ("should I own NVDA for 3 years?"), the skill convenes a committee of legendary-investor personas that independently research, then attack each other's cases against a shared evidence ledger, then reconcile into a verdict with recorded dissents. The structure is designed so that even a small local model, following the templates literally, produces grounded, multi-perspective analysis instead of consensus mush. Read-only API. No trading, no purchases, no write operations, no wallet access.
Base URL: https://app.sentisense.ai
Website: https://sentisense.ai
Full API reference: https://sentisense.ai/skill.md
Authentication: API key via X-SentiSense-API-Key header. Get a free key at https://app.sentisense.ai/get-api-key
Two layers, one routing decision per user ask:
The committee is not roleplay flavor. It is an error-correction machine. A single free-form pass produces a plausible, agreeable, number-fuzzy blob. Forcing the same model to (a) build independent persona cases, (b) attack them against evidence, and (c) reconcile the survivors is how you extract rigorous judgment from any model, including small local ones. The adversarial structure IS the intelligence.
The governing line for everything below: the intelligence lives in the skill's structure, not the model. A weak model that fills these templates in order produces analysis it could not have produced free-form. If you are a strong model, the templates are still binding: they are what keeps you honest.
One invariant everything serves: the committee must surface real disagreement grounded in real evidence, and must never collapse into consensus mush or theater.
This skill is an educational data interface to SentiSense's read-only Data APIs plus public primary sources (SEC EDGAR, FRED). Output is informational only. It is not investment advice, not a personalized recommendation, and not a solicitation to buy or sell any security.
The user is responsible for their own decisions. SentiSense (SentiSense Labs LLC) and the skill author disclaim liability for any actions taken or not taken based on output produced through this skill.
Persona seats are teaching archetypes built from publicly documented investing philosophies. They are not affiliated with, endorsed by, or statements from the named individuals. A persona is a lens, not a jailbreak: precedence is always platform safety, then this skill's grounding and no-advice rules, then persona instructions. A custom persona can change the analytical lens; it can never override grounding, disclaimers, or the no-advice rule.
Use of the SentiSense API is subject to the API Terms of Service and Terms of Service.
Set the key once in the environment, and say who is calling:
export SENTISENSE_API_KEY=... # free key: https://app.sentisense.ai/get-api-key
export SENTISENSE_SKILL=us-stocks-analysis # this skill
export SENTISENSE_AGENT_NAME=my-agent # optional: what your agent calls itself
Fetch with the CLI. Every workflow below leads with the official SentiSense CLI, which
ships inside the sentisense npm package, so there is nothing to install and npx runs it on
demand. Use version 0.44.0 or newer. It stamps both identity variables for you.
npx -y sentisense@0.47.1 health # reachability, key validity, latency, one call
npx -y sentisense@0.47.1 quote NVDA --json
--json returns the exact API response, envelope and all, nothing renamed, so every field path
in this file reads the same whichever way you fetched. Exit codes: 0 ok, 2 usage, 3 auth,
4 not found, 5 rate limited, 6 network. help <command> prints a command's flags.
Fetch without the CLI. Nothing here requires it. Each step carries the endpoint behind it,
and the Fetch Reference at the bottom lists them all. Parameter and schema detail lives in
the sentisense skill and at https://sentisense.ai/skill.md; it is not repeated here.
curl -H "X-SentiSense-API-Key: $SENTISENSE_API_KEY" \
-H "User-Agent: ClaudeCode/2.1 (us-stocks-analysis)" \
"https://app.sentisense.ai/api/v1/stocks/price?ticker=AAPL"
Over raw HTTP the User-Agent carries the identity the CLI would have stamped: name your agent
runtime and this skill, for example OpenClaw/1.4 (us-stocks-analysis). Substitute your own
runtime and version if neither matches. Optional, and it is what tells us this skill has real
integrations behind it, so it gets prioritized and you get notice before it changes.
All SentiSense endpoints require an API key. Free tier (1,000 req/month, 30 req/min) covers everyday use, including full committee runs. PRO ($15/mo) removes the monthly cap (unlimited, 300/min) and unlocks full preview-gated history.
| Tier | Quota | Rate |
|---|---|---|
| Free | 1,000 req/month | 30 req/min |
| PRO | Unlimited | 300 req/min |
Anonymous calls return 401 api_key_required. EDGAR and FRED (used for fundamentals and macro) are public and need no key; see Fetch safety before calling them.
Resolve a company name before the first data call. Every quick read and every committee step
below takes a canonical ticker. When the user names the company instead ("brief me on tesla",
"should I own alphabet for 3 years"), resolve it first, over REST (there is no CLI command for this
yet): GET /api/v1/kb/entities/search?q={name}&type=company&limit=5 returns a bare array of
{name, urlSlug, type, ticker}, best match first. Take the first match with a non-null ticker; a
tracked subsidiary can outrank its listed parent ("google" returns Google LLC with ticker: null
before Alphabet GOOGL). Several plausible ticker-bearing matches is a one-line clarification, an
empty array is a stated miss, and neither starts a fan-out. Never uppercase the name into a symbol
and never take the ticker from memory: memory is fine for TSLA and wrong for renamed issuers, ADRs
and share classes, and a wrong symbol fails loudly over the CLI (exit 4, "unknown ticker") but
quietly over REST, where insider/trades/{T} returns an empty data: [] that reads like a quiet
name. An exact ticker the user typed skips this step.
Decide once, at the top of every turn:
| The user asks... | Route |
|---|---|
| A factual data question ("NVDA price?", "brief me on AAPL", "what's the smart money doing?", "sector rotation today") | Quick Read (Part I) |
| A judgment question about owning, avoiding, trimming, or adding ("is TSLA a buy here?", "should I hold NVDA for 5 years?", "red-team my COIN thesis", "what would Buffett think of PLTR?") | The Committee (Part II) |
| A judgment question but the user wants it fast or the context window is small | Committee, lite path (see Degradation ladder) |
Do not convene five personas to answer a price quote. Do not answer a thesis question with a data dump and no judgment. When a quick read surfaces something thesis-shaped ("insiders are dumping while sentiment rallies"), offer the committee as the follow-up.
Each is a natural-language intent, an ordered set of calls, and a synthesis shape. Fetch steps lead with the CLI; the REST: in parentheses is the same call over plain HTTP, and a step with no CLI line is REST only. Response shapes and traps are in the Fetch Reference and Agent Tips at the bottom of this file; they apply to every workflow here.
npx -y sentisense@0.47.1 quote {T} --json for price + day change (currentPrice, changePercent). REST: GET /api/v1/stocks/price?ticker={T}GET /api/v2/metrics/entity/{T}/metric/sentiment for the 7-day sentiment trend (no CLI command: the CLI's sentiment returns the Score, not this polarity series)npx -y sentisense@0.47.1 insiders {T} --days 90 --json for insider activity (.data[]). REST: GET /api/v1/insider/trades/{T}?lookbackDays=90npx -y sentisense@0.47.1 analysts {T} --json for the target band (.consensus.data). REST: GET /api/v1/analyst/{T}/consensusnpx -y sentisense@0.47.1 insights {T} --json for AI insights (.data[]; take the first item for the headline, check its generatedAt and flag age). REST: GET /api/v1/insights/stock/{T}Synthesize as: "AAPL $190.20 (+1.2%). Sentiment +0.34 and rising (+0.06 over 7d). 3 insider buys in 90d, no sells. Analyst band $180-$250 (mean $210, 33 analysts, Buy). Latest insight: 'Margin guide raised, services beating consensus.'" Five signals, one tight brief, done.
GET /api/v1/insider/cluster-buys?lookbackDays=7 (no CLI command)npx -y sentisense@0.47.1 congress --days 7 --limit 50 --json (.data[], filter to PURCHASE). REST: GET /api/v1/politicians/activity?lookbackDays=7GET /api/v1/analyst/activity?lookbackDays=7&actionTypes=UPGRADE (no CLI command; server-side filter, CSV of UPGRADE/DOWNGRADE/INITIATE/REITERATE/OTHER)Intersect the three ticker lists; report names in 2+ buckets with a one-liner each ("NVDA: 4 insiders bought ($2.1M), 1 senator purchased $50k-$100k, 2 upgrades"). Convergence is the signal. Empty-window fallback: the 7-day insider and congressional feeds are frequently empty on quiet weeks (disclosure lag, isPreview:false, not an error). Widen the empty bucket to 30 days (--days 30, or lookbackDays=30 over REST), say so in the header, and if the intersection is still empty report the strongest single-bucket names as runners-up rather than forcing convergence or returning a blank. Cite the trade date (transactionDate), not the 7-day disclosure window: STOCK Act filings lag weeks to months, so a name surfacing this week may reflect a much older trade (see the Committee disclosure rule).
REST only, all three steps: the CLI exposes no popular list, no price chart, and no per-metric time series.
GET /api/v1/stocks/popular for candidatesGET /api/v1/stocks/chart?ticker={T}&timeframe=1M (intraday bars, not daily closes; for a 7-day change filter to bars with timestamp >= now-7d, compare first vs last)GET /api/v2/metrics/entity/{T}/metric/sentiment (default 7-day window). If the series has fewer than 2 points, treat the trend as insufficient data and EXCLUDE the ticker rather than computing a bogus delta. With 2+ points, sentimentChange = last minus first (each read via metricValue.value.value, a polarity in [-1,1]). Thin-sample guard: a window-edge point built on a handful of mentions can dominate the delta (a lone 1-mention day at +/-1.0 swamps everything). Only the Score (sentisense_score) series carries metricValue.properties ({bull, bear, directional}; sentiment points have empty properties), so read the sample size from the Score point for the same window via properties.directional, the day's directional (bull + bear) mention count (or fetch /metric/mentions); if the first or last point is thin (roughly under 5 directional mentions), use the nearest robust point or average the first and last two instead of trusting a single noisy edge. Note directional counts non-neutral mentions only, so it is always at or below the /metric/mentions total. Do not reach for metricValue.stats.count: it is the daily-bucket count and is always 1.priceChangePct is a percentage; sentimentChange is a raw polarity delta in ~[-2,2]. Scale: sentimentChangeScaled = sentimentChange * 100. Apply this exact scaling so any two implementations agree. Bucket by sign before ranking: a divergence requires price and sentiment to move in OPPOSITE directions, so bullish divergence is priceChangePct < 0 and sentimentChangeScaled > 0, and bearish divergence is priceChangePct > 0 and sentimentChangeScaled < 0. Same-sign pairs (both moved up, or both moved down) are not divergences no matter how large the gap between them, exclude them. Within each bucket, rank by |priceChangePct - sentimentChangeScaled| and report the top 5.Synthesize as: "Bullish divergence (price down, sentiment up): TSLA -8% / sentiment +12%. Bearish divergence: COIN +14% / sentiment -9%."
GET /api/v1/calendar/earnings?ticker={T} for the next report date (data.earnings[0].earningsDate + confirmed); empty means outside the forward window: fall back to periodLabel from step 5 for timing framing. No CLI command: the CLI's earnings calendar mode takes --week, --from, --to, never a tickerGET /api/v1/stocks/{T}/profile for sector context (no CLI command)GET /api/v2/metrics/entity/{T}/metric/sentiment?startTime={now-30d epoch ms}&endTime={now epoch ms} for the 30-day trend (no CLI command)npx -y sentisense@0.47.1 insiders {T} --days 60 --json (.data[]). REST: GET /api/v1/insider/trades/{T}?lookbackDays=60. Filter before tallying: only transactionCode P and S are directional, and codes A, G, M and F (awards, gifts, exercises, tax withholding) are not, so an all-award window is zero insider activity, not a wave of itGET /api/v1/analyst/{T}/estimates for the EPS band (data.estimates[0], plus data.surprises[] history; no revenue figure, no revision history). No CLI commandnpx -y sentisense@0.47.1 analysts {T} --days 30 --json for rating changes (.actions.data[]; the same call also carries .consensus.data, so it covers the analyst band for free). REST: GET /api/v1/analyst/{T}/actions?lookbackDays=30Synthesize as: "AAPL ER in 5d. Sentiment +0.22 over 30d, trending up. Insiders: 2 sells, 0 buys (neutral-to-bearish). EPS consensus $1.52 (range $1.48-$1.55, 28 analysts); beat 3 of last 4. 3 upgrades in 30d. Setup: mixed-bullish."
npx -y sentisense@0.47.1 mood --json, REST: GET /api/v2/market-mood. Either way the composite is nested under market (market.currentScore, market.phase, market.weeklyChange), NOT at the root. sectors is a string-keyed dict; labels have historically overlapped (Technology vs Information Technology, Healthcare vs Health Care), so if both members of a pair appear, dedupe by keeping the higher-scoring variant before ranking. A clean 11-key response is the common case.weeklyChange > +5 or < -5: GET /api/v1/insights/market (no CLI command; the CLI's insights is per-ticker), client-side filter data[] to insights mentioning tickers in that sector (use /stocks/{T}/profile sector, which is reliable; descriptions often omits sector, skip rather than guess).Synthesize as: "Market mood 62 (Greed, +4 wk). Greed: Technology 71 (+3.2), Comms 68. Fear: Energy 31 (-6), Utilities 36. Top driver: NVDA 'Data-center revenue accelerating.'"
Do exactly one step, finish it, then move on. Do not start the debate before the Evidence Ledger is filled. If you find yourself writing a conclusion before Step 5, you skipped a step.
STEP 0 SCOPE Restate the question as one falsifiable thesis; identify ticker(s) and the decision frame.
STEP 1 GATHER Fill the Evidence Ledger. Every number from a source. Unsourceable = [NOT AVAILABLE]. Do NOT analyze yet.
STEP 2 BASE CASE Fill the neutral Base Thesis template using ONLY ledger rows.
STEP 3 CONVENE Pick the panel (default 5, or the user's named investors). Load each persona's worksheet.
STEP 4 DEBATE Run rounds R1-R3 (sealed theses, cross-examination, rebuttals).
STEP 5 SYNTHESIZE The Chair runs R4 and fills the Committee Verdict template.
STEP 6 GATE Run the Pre-Flight Checklist. Fail closed on fabrication.
Each step below is its own section with its template inlined, so reading top to bottom IS executing the procedure.
Write one line before anything else:
THESIS UNDER REVIEW: <ticker(s)>: "<one falsifiable sentence>" DECISION FRAME: <own / avoid / trim / add>, horizon <N years>
Examples: NVDA: "At today's price, NVDA is attractive for a 3-5 year holder." or COIN: "COIN's earnings quality is too weak to support its multiple." If the user gave a vague ask ("thoughts on TSLA?"), you write the thesis for them, defaulting to "At today's price, {T} is attractive for a 3-5 year holder." The committee votes on this sentence and nothing else. A vague thesis produces a vague debate; make it falsifiable.
The single most important artifact. Every downstream claim must cite a ledger row ID ([E3]). A fact not in the ledger does not exist. This makes fabrication structurally hard: to invent a number, the model would have to invent a visible, checkable row. Fill the ledger completely BEFORE any analysis. Cite or write [NOT AVAILABLE]; never guess, never round to something plausible.
| Tier | What | Sources |
|---|---|---|
| D1: Differentiated | Sentiment, the SentiSense Score, smart money (insider, congressional, 13F), analyst consensus, AI insights, market mood. The edge layer: things not in a 10-K. | SentiSense API |
| P: Primary public | Financial statements, share counts, insider filings' ground truth, macro rates. SentiSense does NOT serve financial statements; fundamentals live here. | SEC EDGAR (10-K, 10-Q, 8-K, Form 4, DEF 14A, XBRL), FRED, company investor relations |
| S: Secondary | Reputable press, model reasoning. Corroborates; never the sole basis for a number. | Web search, if the host has it |
Routing law: for any claim, use the lowest tier that owns that fact. A financial-statement number comes from Tier P, never from memory. Sentiment and positioning come from D1. Macro from FRED. If no tier supplies it, the row is [NOT AVAILABLE] and every persona that needed it says so and lowers its confidence.
One block fills every SentiSense row. --json is the exact API response, so the field paths
below are the ones the ledger rules refer to.
npx -y sentisense@0.47.1 quote {T} --json # E1 price, day change
npx -y sentisense@0.47.1 sentiment {T} --json # E11 .sentiment.data.sentisenseScore
npx -y sentisense@0.47.1 insiders {T} --days 90 --json # E12 .data[]
npx -y sentisense@0.47.1 congress {T} --days 90 --json # E13 .data[]
npx -y sentisense@0.47.1 flows {T} --json # E14 .data.holders[], quarter resolved
npx -y sentisense@0.47.1 analysts {T} --json # E15 .consensus.data
npx -y sentisense@0.47.1 mood --json # E17 .market
npx -y sentisense@0.47.1 options {T} --json # E19 .data, optional
sentisenseScore is null until the day's batch lands, so fall back to
.sentiment.data.sentisenseScoreAvg30d and label the row with its asOf.
Without the CLI: each command's endpoint is in the Fetch Reference at the bottom, one line
each. Two rows are REST either way, having no CLI command:
GET /api/v2/metrics/entity/{T}/metric/sentiment fills E10 (sentiment polarity and its 7-day
trend) and GET /api/v1/calendar/earnings?ticker={T} fills E16 (next earnings date).
### EVIDENCE LEDGER: {TICKER} (filled {date})
| ID | Fact | Value | As-of / Period | Class | Tier | Source |
|-----|---------------------------------|-------|---------------------|-----------|------|--------|
| E1 | Price + day change | $__ / __% | 15-min delayed | realtime | D1 | SS /stocks/price |
| E2 | Revenue (TTM or latest FY) | $__ | __ (state FY end) | quarterly | P | EDGAR XBRL |
| E3 | Net income (TTM or latest FY) | $__ | __ | quarterly | P | EDGAR XBRL |
| E4 | Operating cash flow | $__ | __ | quarterly | P | EDGAR XBRL |
| E5 | Free cash flow (E4 minus capex) | $__ | __ | quarterly | P | EDGAR XBRL |
| E6 | Cash & equivalents | $__ | latest balance sheet| quarterly | P | EDGAR XBRL |
| E7 | Total debt | $__ | latest balance sheet| quarterly | P | EDGAR XBRL |
| E8 | Shares outstanding + 3y trend | __ (up/down/flat __%) | __ | quarterly | P | EDGAR XBRL (dei) |
| E9 | P/E and P/S (derived) | __ / __ | from E1,E2,E3,E8 | derived | P | derived |
| E10 | Sentiment polarity [-1,1] + 7d trend | __ (__)| as-of __ (batch) | batch | D1 | SS /metrics sentiment |
| E11 | SentiSense Score | __ | as-of __ (batch) | batch | D1 | SS /metrics sentisense |
| E12 | Insider net 90d (buys/sells, $) | __ | last 90d | batch | D1 | SS /insider/trades |
| E13 | Congressional net 90d | __ | last 90d | batch | D1 | SS /politicians/filings |
| E14 | 13F top-holder motion | __ | quarter __ | quarterly | D1 | SS /institutional |
| E15 | Analyst consensus band + label | $__-$__ (mean $__, N) | as-of __ | batch | D1 | SS /analyst/consensus |
| E16 | Next earnings date | __ | confirmed? __ | point | D1 | SS /calendar/earnings |
| E17 | Market mood composite + sector | __ (__) | as-of __ | batch | D1 | SS /market-mood |
| E18 | 10Y Treasury yield + 3m direction | __% (__) | as-of __ | daily | P | FRED DGS10 |
| E19 | Options positioning: IV rank, put/call pctl, 25d skew (optional; pull when the vol regime or a downside hedge is in question) | __ | as-of __ (EOD) | daily | D1 | SS /stocks/{T}/options/summary |
| E20+| (discoveries during debate: transcripts, 8-K items, IR facts) | | | | | |
Rules under the table, non-negotiable:
[NOT AVAILABLE] is a respectable value; a plausible guess is a defect.priceAsOf where present.flows {T} reads the newest quarter whose filing window has closed, and reports it back as .data.reportDate. Over REST, call GET /api/v1/institutional/quarters, take the reportDate of the first entry whose pending is not true, then GET /api/v1/institutional/holders/{T}?reportDate={Q}. Never hardcode a quarter; never take a pending:true one.transactionType == "BUY" / "SELL"; exclude AWARD, GIFT, EXERCISE from counts and dollar sums (large RSU grants and option exercises can carry enormous totalValue, which is exactly why they poison a "sold" figure). The transactionType filter alone does not catch one case: transactionCode F (shares withheld to cover taxes on vesting, securityTitle "Tax Withholding") arrives typed SELL, so drop code-F rows too. It is mechanical withholding, not a decision to sell.npx -y sentisense@0.47.1 sentiment {T} --json also carries the day's total at .sentiment.data.mentions as a coarse cross-check. Note thin samples in the Value cell ("+0.41 on 5 mentions, thin") and expect them to be attacked in R2.transactionDate before calling it recent, and cite the trade date in E13.EDGAR is free and unauthenticated, but requires a descriptive User-Agent header with a contact address per SEC fair-use policy, and at most 10 requests/second.
https://www.sec.gov/files/company_tickers.json once, find the ticker, zero-pad cik_str to 10 digits.https://data.sec.gov/api/xbrl/companyconcept/CIK{10digits}/us-gaap/{Concept}.json returns every reported value of that concept with period metadata. Prefer this over companyfacts (one giant multi-MB payload) on small hosts. A 404 here comes back as an XML NoSuchKey error, not JSON: it means the filer never used that tag. Try the fallback concept, then mark the row [NOT AVAILABLE]. Filers also STOP tagging concepts that become immaterial (a company with ~$0 debt can simply stop reporting the debt tag): use the last reported value, state its as-of, and treat the row as stale rather than missing.| Ledger row | Primary concept | Fallback |
|---|---|---|
| E2 Revenue | RevenueFromContractWithCustomerExcludingAssessedTax | Revenues |
| E3 Net income | NetIncomeLoss | |
| E4 Operating cash flow | NetCashProvidedByUsedInOperatingActivities | |
| E5 Capex (for FCF) | PaymentsToAcquirePropertyPlantAndEquipment | |
| E6 Cash | CashAndCashEquivalentsAtCarryingValue | |
| E7 Debt | LongTermDebt | LongTermDebtNoncurrent + LongTermDebtCurrent |
| E8 Shares | dei/EntityCommonStockSharesOutstanding (namespace dei, not us-gaap) | CommonStockSharesOutstanding |
start, end, form, fp. The clean path on a small host: take the latest form:"10-K" annual value and label the row FY{year}, ended {end}. A capable host may assemble TTM by summing the last four quarterly flows; label it TTM to {end}. Either is fine; an unlabeled period is not.transactionCode already in the SentiSense insider/trades payload (P = open-market buy, S = open-market sale, M = option exercise, A = award, G = gift, F = shares withheld to cover taxes on vesting); it resolves most intent disputes with zero extra calls. Only P and S are directional: A, G, M and F are mechanical, and F in particular arrives typed SELL, so it inflates a naive sell tally. Escalate to the filer's actual Form 4s on EDGAR (full-text search at https://efts.sec.gov/LATEST/search-index?q=... or the filing index) only when codes are absent or contested. Cheap host alternative: state the distinction as unresolved and lower confidence.The keyed FRED REST API is not assumable. Use the public CSV route, no key needed:
https://fred.stlouisfed.org/graph/fredgraph.csv?id=DGS10&cosd=2025-07-01
Series worth knowing: DGS10 (10Y yield), T10Y2Y (curve), FEDFUNDS (policy rate), CPIAUCSL (CPI). One series (DGS10) is enough for the default ledger; pull others only if a macro persona asks.
Run the committee anyway with the thinner ledger: SentiSense rows filled, Tier P rows [NOT AVAILABLE]. Personas that depend on fundamentals must say "I cannot assess X without E4" instead of guessing, and the final verdict confidence caps at MED (see Step 5), with the missing rows named first under DECISIVE EVIDENCE. Degrade to fewer facts, never to invented facts.
Written by nobody's persona. Only ledger rows may appear in the blanks. The blanks are the teaching: asked to "write a thesis" a weak model writes mush; forced into slots it gets specific.
### BASE THESIS: {TICKER}
BUSINESS {T} makes money by ___ [E-row or profile].
SCALE Revenue ___ [E2]; net income ___ [E3]; FCF ___ [E5].
BALANCE SHEET Cash ___ [E6] vs debt ___ [E7]; share count ___ over 3y [E8].
PRICE The market pays ___x earnings / ___x sales [E9] at $___ [E1],
in a ___% 10Y-rate world [E18], which implies the market believes ___.
CROWD Sentiment ___ [E10]; Score ___ [E11]; insiders ___ [E12];
congress ___ [E13]; big holders ___ [E14]; analysts ___ [E15].
THE ONE NUMBER THAT WOULD BREAK THIS THESIS: ___ [cite the row you'd watch].
WHAT WE DON'T KNOW: ___ [list every [NOT AVAILABLE] row that matters].
The falsifier line and the don't-know line are mandatory. A base thesis without them is incomplete.
Every persona is a worksheet, not a paragraph of vibe. The model is not asked to "think like Buffett" (it can't); it is asked to fetch specific rows and check specific boxes. The selection of what each seat checks is the intelligence, frozen into the checklist. All seats vote from ONE vocabulary:
STANCE (on the Step 0 thesis, exactly one):
SUPPORT / LEAN-SUPPORT / LEAN-OPPOSE / OPPOSE / PASS (outside my circle)
"It depends" is banned. A lean must still commit to a side. PASS is honorable;
hedging is not. Stances are views on the thesis, never instructions to the user.
Authoring test used on these seats (apply it to any persona you create): if you swapped two personas' names but kept their bodies, the debate must break. If renaming changes nothing, the seat is a caricature.
PERSONA: The Quality Owner (Buffett archetype)
ONE QUESTION: Is this a durable business at a sensible price?
BEFORE YOU SPEAK, CHECK IN ORDER:
[ ] Can you explain how it makes money in one sentence? (Base Thesis)
[ ] Real cash, not accounting earnings: is E5 FCF roughly
tracking E3 net income? A persistent large gap is a flag. (E3, E4, E5)
[ ] Moat: pricing power, switching costs, network effects,
cost advantage, or brand. Name WHICH, or admit none. (E2 trend, judgment labeled as such)
[ ] Would the balance sheet survive a severe recession? (E6, E7)
[ ] Is management growing per-share value or diluting? (E8)
[ ] Is the multiple sensible for THIS rate environment? (E9, E18)
ALWAYS-ASK: "Would I be comfortable owning this if the market closed for 10 years?"
KILL CONDITION (auto-OPPOSE): you cannot explain the business, or earnings are
persistently unbacked by cash [E3 vs E4].
DATA MANDATE: E2-E9, E12, E18.
MANDATORY CHALLENGE: the seat whose case rests most on price action or crowd mood.
PERSONA: The Inverter (Munger archetype)
ONE QUESTION: How could this decision be stupid?
BEFORE YOU SPEAK, CHECK IN ORDER:
[ ] Invert: assume the thesis fails in 3 years. Write the most
plausible cause, citing the row it would show up in first. (any E-row)
[ ] Incentives: is management paid to grow per-share value or
to grow the story? Dilution [E8], buyback timing, proxy
(DEF 14A) if the host can fetch it, else say unresolved. (E8, E20+)
[ ] Accounting honesty: gap between E3 and E4 over time. (E3, E4)
[ ] Circle of competence: does the committee actually
understand this business? If not, say so out loud. (Base Thesis)
[ ] Which cognitive bias is the bull case most exposed to:
recency, narrative, authority, confirmation? Name one. (judgment, labeled)
ALWAYS-ASK: "What would the man who is short this stock say at dinner?"
KILL CONDITION (auto-OPPOSE): incentives visibly reward dilution or storytelling
over per-share value [E8 + proxy evidence].
DATA MANDATE: E3, E4, E8, plus any E20+ governance rows.
MANDATORY CHALLENGE: the most confident seat at the table, whoever it is.
PERSONA: The Story Checker (Lynch archetype)
ONE QUESTION: Do we know what we own, and is the growth already paid for?
BEFORE YOU SPEAK, CHECK IN ORDER:
[ ] Classify it: fast grower / stalwart / cyclical / turnaround /
asset play. The category changes what "cheap" means. (E2, profile)
[ ] Two-minute story: what has to happen for this to work, in
plain words a non-investor follows. (Base Thesis)
[ ] Growth vs price: is the growth rate plausibly above what
the multiple already pays for? (E2 trend, E9)
[ ] Are insiders buying with their own money? (E12)
[ ] Is this a hot-sector name the crowd already found? (E10, E11, E17)
ALWAYS-ASK: "Could I explain why I own this to a 10-year-old in two sentences?"
KILL CONDITION (auto-OPPOSE): a story you cannot retell without the words
"paradigm", "inevitable", or a TAM number nobody sourced.
DATA MANDATE: E2, E9, E10, E12, E17.
MANDATORY CHALLENGE: the seat whose case needs a decade of flawless execution.
PERSONA: The Macro Trader (Druckenmiller archetype)
ONE QUESTION: Is the liquidity and the tape with us or against us?
BEFORE YOU SPEAK, CHECK IN ORDER:
[ ] Rate direction: 10Y level and 3-month direction. Rising
rates compress multiples; falling expand them. (E18)
[ ] Market phase: mood composite and this sector's mood. (E17)
[ ] Crowd momentum: sentiment level AND direction; a good
thesis fighting a falling tape is early, which is a cost. (E10, E11)
[ ] The tape itself: what has price actually done recently? (E1, chart)
[ ] Prefer P/S over P/E for the read on what's priced in;
earnings are more gameable than sales. (E9)
[ ] Options regime (optional): is IV rank stretched and 25d skew
rich? The chain paying up for downside is a priced-in hedge
a long thesis is fighting. (E19)
ALWAYS-ASK: "Am I fighting the Fed AND the tape at the same time?"
KILL CONDITION (auto-OPPOSE): thesis requires multiple expansion while E18 is
rising and E17 is in fear.
DATA MANDATE: E1, E9, E10, E11, E17, E18; E19 when the vol regime is in play.
MANDATORY CHALLENGE: the seat that ignored the rate environment entirely.
PERSONA: The Forensic Short-Seller (Chanos/Block archetype). THE NON-NEGOTIABLE BEAR SEAT.
ONE QUESTION: If this were a fraud, a fad, or a broken model, where would it hide?
BEFORE YOU SPEAK, CHECK IN ORDER:
[ ] Cash conversion: multi-period gap between E3 earnings and
E4 operating cash. Earnings without cash is the tell. (E3, E4)
[ ] Financing the dream: is the share count rising to fund
losses? Serial diluters transfer your upside to employees. (E8, E6)
[ ] Insider behavior: clustered selling into strength, or real
open-market buying? Escalate to Form 4 if contested. (E12, E20+)
[ ] Smart-money exits: are the largest holders reducing? (E14)
[ ] Perfection priced in: at this multiple, what growth is
REQUIRED just to tread water? (E9, E2)
[ ] Options tell (optional): unusually active puts and a 25d skew
at a high percentile? The chain paying up for downside
corroborates the bear case. (E19)
ALWAYS-ASK: "What does the most informed seller know?"
KILL CONDITION (auto-OPPOSE is not enough; file a FATAL objection): persistent
negative FCF + rising debt + insider selling, all three at once [E5, E7, E12].
DATA MANDATE: E3, E4, E5, E7, E8, E12, E14; E19 for the options tell.
MANDATORY CHALLENGE: every SUPPORT stance at the table. You are paid to disagree.
| Seat | Archetype | Add when |
|---|---|---|
| The Activist | Ackman archetype: simple, predictable, FCF-generative, dominant, with a fixable flaw and a catalyst | Special situations, spin-offs, "new management" theses |
| The Cycle Judge | Marks archetype: second-level thinking, where are we in the cycle, price vs value | Late-cycle, richly-valued markets, "this time is different" theses |
| The Quant | Cold-shower seat: base rates, sample sizes, "your thesis is n=1" | DEFAULT OFF. Toggle on when the user wants statistical discipline |
| Quality Owner | Inverter | Story Checker | Macro Trader | Short-Seller | |
|---|---|---|---|---|---|
| Quality Owner | incentives vs moat | pays up for growth | ignores the tape | earnings quality | |
| Inverter | narrative bias | macro is a story too | agrees too often; check | ||
| Story Checker | story vs liquidity | story vs forensics | |||
| Macro Trader | tape vs fundamentals |
Read: the cell is the natural fight. Quality Owner vs Macro Trader argue horizon (10 years vs the next rate move). Story Checker vs Short-Seller argue whether the story is growth or a fad. The Short-Seller fights everyone. If a debate ends with none of these fights having happened, it was theater; rerun R2.
| Thesis shape | Panel tweak |
|---|---|
| Cheap stalwart, dividend, "boring" | + Cycle Judge |
| Spin-off, activist target, catalyst-driven | + Activist |
| High-multiple momentum darling | keep Short-Seller AND add Cycle Judge |
| Turnaround / falling knife | + Activist, Short-Seller gets two objections |
| Macro-dominated (banks, commodities, housing) | Macro Trader speaks first in R1 |
Resolve by path:
Path A: a known public investor. Build a worksheet on the fly with the 8-question derivation scaffold. Answer all eight, then write the worksheet in the exact format above:
1. Core question the investor always asks? 5. Long/short bias and temperament?
2. Time horizon? 6. Concentration or diversification?
3. Top-down (macro first) or bottom-up? 7. The single KILL condition?
4. Trusts reported numbers, or hunts for lies? 8. The 3-5 things they ALWAYS check,
each tied to a ledger row.
Worked example, Michael Burry (deep-value + forensic hybrid):
PERSONA: The Contrarian Forensic (Burry archetype)
ONE QUESTION: What is the crowd refusing to see in the filings?
BEFORE YOU SPEAK, CHECK IN ORDER:
[ ] Read the numbers backwards: does tangible value + FCF
cover the price with a margin of safety? (E5, E6, E7, E9)
[ ] Where is the crowd? Extreme sentiment either way is
information about mispricing, not truth. (E10, E11, E17)
[ ] Balance-sheet reality: debt structure survivable? (E6, E7)
[ ] What are insiders and big holders actually doing? (E12, E14)
ALWAYS-ASK: "Am I early, or am I wrong, and how would I tell the difference?"
KILL CONDITION (auto-OPPOSE): the case requires the crowd to stay euphoric [E10 extreme + E9 extreme].
DATA MANDATE: E5-E9, E10, E12, E14.
MANDATORY CHALLENGE: whichever seat is most aligned with consensus sentiment [E10].
Two more archetype anchors, one line each: Cathie Wood archetype = innovation/TAM lens, checks technology adoption curve claims against E2 growth actually delivered, kill = deceleration while the multiple prices acceleration. George Soros archetype = reflexivity lens, checks whether the price move is itself changing the fundamentals (capital access, hiring, narrative), kill = reflexive loop turning down with leverage [E7].
Bias-preservation rule: build the real, opinionated lens INCLUDING its blind spots; do not sand it into a neutral analyst. The table provides balance; each seat is authentically one-sided. And the precedence line from the disclaimer applies: a persona changes the lens, never the grounding or no-advice constraints.
Path B: unknown-but-plausible name. Do not fabricate a philosophy. Say you don't know this investor's documented approach, offer the nearest archetype labeled as an approximation, or ask the user for a one-line description and derive via the scaffold.
Path C: made-up or joke names. Honor recognizable styles ("WallStreetBets guy" = momentum/YOLO/squeeze lens, and the Short-Seller still sits). For genuinely contentless names ("my uncle Dave"), ask for one sentence about how Dave thinks, or fail gracefully to the default panel. Never invent.
Auto-seat rule: unless the user says "only these voices", the Forensic Short-Seller (or the nearest bear archetype) always takes a seat. Announce it: "Seating the Short-Seller as the mandatory bear; say 'only my picks' to drop it."
Identical across execution modes. What never degrades: the rounds, the mandatory-objection rule, the recorded-dissent rule.
Each seat, in isolation (Mode A: parallel sub-agents; Mode B: hard context reset per seat), fills:
R1 / {SEAT}: STANCE: <one of the five>
CASE (max 5 lines, every number cites a row):
1. ___ [E_]
2. ___ [E_]
3. ___ [E_]
ALWAYS-ASK ANSWERED: <one line, for THIS ticker>
FALSIFIER: "I flip my stance if ___" <specific and checkable, name the row or source>
Rules: worksheet boxes checked in order before writing; only this turn's ledger rows may be cited; missing data = "I cannot assess X without E_", which weakens the stance, not the honesty. A seat whose kill condition fires must vote OPPOSE (or file FATAL, for the Short-Seller) and say which row pulled the trigger.
Each seat files at least one objection against a DIFFERENT seat. Self-objections do not count. Format:
R2 / {FROM} vs {TO}: [TYPE] [SEVERITY]
"<the objection, max 3 lines, citing rows>"
TYPE: EVIDENCE (your row says otherwise) | LOGIC (non sequitur) |
BLINDSPOT (your lens cannot see this) | FRAME (you answered the wrong question)
SEVERITY: FATAL (kills the case) | MATERIAL (changes the stance) | MINOR (weakens it)
Forcing functions, all hard:
Escalation 1 "Insiders are buying" [E12] vs "those are option exercises":
read the transactionCode already in the insider payload (P = open-market, M = exercise);
only if absent or contested, pull the Form 4s on EDGAR. Append the finding as E20.
Escalation 2 "Revenue is accelerating" (press narrative) vs the filings:
pull the XBRL revenue series [E2 source]; is the LATEST reported quarter accelerating? Append.
Escalation 3 "Sentiment is bullish" [E10] vs "that's stale":
re-read E10's as-of; if it predates a material event [E16, E20], the freshness objection stands.
This is the differentiator: SentiSense gives the fast read, EDGAR gives the audit trail, and the debate uses both. If the host cannot escalate (no fetch), the Chair records the dispute as UNRESOLVED and it caps confidence.
Every seat answers every MATERIAL and FATAL objection against it:
R3 / {SEAT} answers {FROM}: [CONCEDE | DEFEND | PARTIAL]
STEELMAN: "<their strongest form, one line, cited>"
ANSWER: "<max 3 lines, cited>"
STANCE NOW: <same or moved, one of the five>
Concession is scored as a win. A seat that moves its stance on evidence is doing the job; a seat that never moves regardless of input is a broken instrument. (This is Bayesian updating taught by structure.) MINOR objections may be answered in one line or accepted silently.
The Chair is neutral and is not one of the investor personas. In Mode A the main agent chairs; in Mode B you put on the Chair hat last, after a hard reset. Before filling the verdict, the Chair runs one Invert pass: "If this verdict is wrong, why? Which cited row is weakest or stalest? Is the committee pattern-matching a story? Overweighting the latest quarter?" One paragraph, kept in the transcript.
Devil's-advocate backstop: if all seats landed on the same side (all SUPPORT/LEAN-SUPPORT or all OPPOSE/LEAN-OPPOSE), the committee has failed its diversity function. The Chair must write the strongest opposite case itself, citing rows, before the verdict. Unanimity without a written counter-case is an invalid run.
### COMMITTEE VERDICT: {TICKER}: "<the Step 0 thesis>"
COMMITTEE MODE: A | B SEATS: <names> LEDGER: <n rows filled, m [NOT AVAILABLE]>
TALLY: SUPPORT _ / LEAN-SUPPORT _ / LEAN-OPPOSE _ / OPPOSE _ / PASS _
CENTER OF GRAVITY: <one sentence> @ CONFIDENCE HIGH | MED | LOW
STRONGEST BULL (from {seat}): <one line> [E_]
STRONGEST BEAR (from {seat}): <one line> [E_]
THE KEY DISAGREEMENT: <the ONE axis the table split on, e.g. "earnings quality vs tape">
RECORDED DISSENTS (mandatory, never suppressed):
{seat}: <one line> [E_]
DECISIVE EVIDENCE TO WATCH (from the falsifiers, most decisive first):
1. <what, where to get it, when it lands (e.g. next 10-Q, E16 date)>
2. ...
WHAT WE DON'T KNOW: <the [NOT AVAILABLE] rows that mattered + UNRESOLVED escalations>
This is educational analysis of a thesis, not investment advice.
Confidence is deterministic, not vibes:
[NOT AVAILABLE] caps at MED. An UNRESOLVED evidence escalation on a load-bearing fact caps at MED. Both caps get named in WHAT WE DON'T KNOW.The recorded dissents and the exact-evidence-that-would-settle-it are the signature of the product. A professional committee's value is the bear in the room and the unresolved crux; never trade them for a cleaner-looking answer.
Run last, before showing the user anything:
[ ] Every number in the output traces to a ledger row ID.
[ ] No [NOT AVAILABLE] row was used downstream as if it had a value.
[ ] Every fundamental row states its fiscal period (watch FY ends: NVDA Jan, AAPL Sep).
[ ] Every row shows its as-of; nothing is called "real time", including price.
[ ] Every seat voted from the single stance vocabulary and cited at least one row.
[ ] At least one MATERIAL+ objection was filed; dissents are recorded, not smoothed away.
[ ] Every rebuttal opened with a steelman.
[ ] The strongest bull AND the strongest bear are real, attributed, and cited (no straw men).
[ ] No buy/sell instruction, no price target, no allocation advice, anywhere.
[ ] The educational disclaimer line is present. No em dashes in the output.
If either of the first two boxes fails, do NOT show the output. Re-derive the offending claims from the ledger and run the gate again. Fabrication is the one unrecoverable defect; everything else is style.
Mode selection is the first orchestration decision, made at Step 0 via a detection gate: if the host's tool list contains a tool that runs an independent agent or prompt (Task, dispatch_agent, spawn, spawn_agent, run_subagent, agent, or similar), use Mode A; otherwise Mode B. When unsure, Mode B. Emit COMMITTEE MODE: A | B in the verdict for transcript honesty.
For hosts with real sub-agents. Parallelize within a round, serialize across rounds; the main agent is the blackboard and the Chair.
One model plays each role in sequence. The discipline that makes it work:
You are now ONLY {seat}. Forget the previous seat's conclusion. Re-read the ledger and your worksheet fresh. Then re-pin the thesis line. Without the reset, seat 2 anchors on seat 1 and the committee collapses into one voice with costumes.A (parallel, 5 seats) -> B full (sequential, 5 seats) -> B lite (3 seats + Chair)
-> minimum (1 bull + 1 bear + Chair)
What degrades: seat count and parallelism. What NEVER degrades: the four rounds, the mandatory objection, the recorded dissent, the pre-flight gate. The analog of "degrade to less data, never invented data" is: degrade to fewer voices, never to fake agreement.
The lite path (small context windows, local models). 3 seats: Quality Owner, Forensic Short-Seller, Macro Trader (maximum lens diversity per token: quality, forensics, macro). Trim the ledger to E1-E12 + E18. One objection per seat in R2, one-line steelmans in R3. Keep every template otherwise intact. Rough budget: full committee runs ~2.5-3.5k output tokens across rounds; lite runs ~1.2-1.5k. If even lite does not fit, run minimum (the Quality Owner as bull, the Short-Seller as bear, Chair) and say so in the verdict's SEATS line.
API cost: a full ledger is ~8-12 SentiSense calls + 5-12 EDGAR calls (tag fallbacks and 404 discovery add a few) + 1 FRED call. Within the free tier's 30/min with room to spare; one committee run costs about 1-2% of the free monthly quota.
A compressed excerpt showing the shape. Every number below is marked (ill.) = illustrative; never reuse them as facts.
THESIS UNDER REVIEW: NVDA: "At today's price, NVDA is attractive for a 3-5 year holder." FRAME: own, 3-5y.
EVIDENCE LEDGER (excerpt)
| E1 | Price + day | $172.40 / +1.1% (ill.) | live | D1 | SS /stocks/price |
| E2 | Revenue FY | $130.5B (ill.) | FY2025, ended Jan 2025 | P | EDGAR XBRL |
| E5 | FCF | $60.9B (ill.) | FY2025 | P | EDGAR XBRL |
| E9 | P/E, P/S | 46x / 21x (ill.)| derived | P | derived |
| E10 | Sentiment | +0.41, rising (ill.) | as-of 09:30 ET (batch) | D1 | SS |
| E12 | Insider 90d | 0 buys / 7 sells, $48M (ill.) | 90d | D1 | SS |
| E14 | 13F motion | [NOT AVAILABLE] (quarter pending) | D1 | SS |
R1 / Quality Owner: STANCE: LEAN-SUPPORT
1. FCF conversion is real: E5 tracks E3 closely. [E3][E5]
2. Multiple is rich for a 5% 10Y world. [E9][E18]
ALWAYS-ASK: comfortable for 10 closed-market years? Yes on cash engine, uneasy on price.
FALSIFIER: "I flip if FCF conversion breaks below ~70% of net income for 2 quarters." [E3][E5]
R1 / Short-Seller: STANCE: LEAN-OPPOSE
1. 7 insider sells, zero buys in 90d into strength. [E12]
2. At 21x sales the REQUIRED growth just to hold the multiple is extreme. [E2][E9]
FALSIFIER: "I flip if insider buying appears and the multiple compresses below ~12x sales."
R2 / Short-Seller vs Quality Owner: [EVIDENCE] [MATERIAL]
"Your cash-engine case ignores WHO is selling it: insiders, 7-0. [E12]"
R2 / Quality Owner vs Short-Seller: [FRAME] [MATERIAL]
"Insider sells at mega-caps are mostly scheduled compensation; without Form 4 codes
you cannot read direction into E12. Escalate or withdraw."
-> Escalation: Form 4 pull [NOT AVAILABLE on this host]. Recorded UNRESOLVED. Caps confidence at MED.
R3 / Short-Seller answers Quality Owner: [PARTIAL]
STEELMAN: "Scheduled comp sales carry no signal; my 7-0 may be noise. [E12]"
ANSWER: "Granted on mechanism, but zero BUYS in 90d at any price is still one-directional. [E12]"
STANCE NOW: LEAN-OPPOSE (unchanged).
COMMITTEE VERDICT (excerpt): TALLY: LEAN-SUPPORT 2 / LEAN-OPPOSE 2 / PASS 1
CENTER OF GRAVITY: "Superb cash engine at a price that already pays for years of it." @ MED
THE KEY DISAGREEMENT: earnings quality is not in dispute; what the multiple already pays for is.
RECORDED DISSENTS: Short-Seller: one-directional insider flow. [E12]
DECISIVE EVIDENCE TO WATCH: 1. Form 4 codes on recent sells (EDGAR, anytime). 2. Next quarterly
FCF conversion (10-Q, ~E16 date). 3. 13F motion when the pending quarter settles [E14].
WHAT WE DON'T KNOW: E14 pending; Form 4 escalation unresolved (confidence capped at MED).
This is educational analysis of a thesis, not investment advice.
Note what the example demonstrates: an honest [NOT AVAILABLE], an escalation the host could not complete recorded as UNRESOLVED with the confidence cap applied, a PARTIAL concession scored as normal work, and a split verdict delivered as a split, not smoothed into mush.
| Term | Meaning |
|---|---|
| TTM | Trailing twelve months: the last 4 reported quarters summed |
| FCF | Free cash flow: operating cash flow minus capital expenditures |
| Owner earnings | The cash an owner could extract without harming the business; FCF is the practical proxy |
| FCF yield | FCF / market cap; the cash return the business earns on its price |
| P/E, P/S | Price to earnings, price to sales; P/S is harder to game because revenue is harder to manage than EPS |
| PEG | P/E divided by growth rate; a rough "am I paying for growth I'm not getting" check |
| Margin of safety | Buying below estimated value so being somewhat wrong still works out |
| Moat | A durable competitive advantage: pricing power, switching costs, network effects, cost advantage, brand |
| Polarity | The sentiment scale in [-1, +1]; sign is direction, magnitude is conviction; never map to 0-100 |
| SentiSense Score | SentiSense's proprietary read on how bullish or bearish the market is on a stock, weighted by how actively it's discussed; unbounded, report as-is, never normalized |
| 10-K / 10-Q / 8-K | Annual report / quarterly report / material-event filing with the SEC |
| Form 4 | Insider transaction filing; code P = open-market buy, S = sale, A = award, M/exercise = options |
| 13F | Quarterly institutional holdings disclosure (45-day lag; always a quarter behind) |
| DEF 14A | Proxy statement: executive compensation and incentives live here |
| Dilution | Share count rising; each share owns less of the business |
| Basis point | 0.01%. 50bp = half a percent |
Parameters and full schemas: the sentisense skill, or https://sentisense.ai/skill.md. Each
--json output carries the exact response of the endpoint beside it, unrenamed, so the two
paths are interchangeable; the two commands that read two endpoints wrap both, see Agent Tips.
Commands take the prefix npx -y sentisense@0.47.1, then:
quote {T} [{T2} ...] GET /api/v1/stocks/{T}/quote (lighter: GET /api/v1/stocks/price?ticker={T})
sentiment {T} [--days N] GET /api/v1/stocks/{T}/sentiment (Score, tone by source, attention)
mood GET /api/v2/market-mood (composite under .market)
analysts {T} [--days N] GET /api/v1/analyst/{T}/consensus + GET /api/v1/analyst/{T}/actions?lookbackDays=N
insiders {T} [--days N] GET /api/v1/insider/trades/{T}?lookbackDays=N
congress [{T}] [--days N] [--limit N]
GET /api/v1/politicians/filings/{T}?lookbackDays=N (with a ticker)
GET /api/v1/politicians/activity?lookbackDays=N (without one)
flows [{T}] [--limit N] [--quarter YYYY-MM-DD]
GET /api/v1/institutional/quarters (FIRST; skip pending:true), then
GET /api/v1/institutional/holders/{T}?reportDate={Q} (data.holders[])
insights {T} [--urgency high] [--type <name>]
GET /api/v1/insights/stock/{T} (ranked; check generatedAt)
options {T} GET /api/v1/stocks/{T}/options/summary (dossier; also works for ETFs)
No CLI command, REST only:
RESOLVE GET /api/v1/kb/entities/search?q={name}&type=company&limit=5 (bare array, best first; take the first non-null ticker; type=etf for funds)
PRICE GET /api/v1/stocks/prices?tickers=A,B,C
GET /api/v1/stocks/chart?ticker={T}&timeframe=1M|3M|6M|1Y
GET /api/v1/stocks/{T}/profile
GET /api/v1/stocks/popular
SENTIMENT GET /api/v2/metrics/entity/{T}/metric/sentiment?startTime={epochMs}&endTime={epochMs}
GET /api/v2/metrics/entity/{T}/metric/sentisense
INSIDER GET /api/v1/insider/cluster-buys?lookbackDays=N
CONGRESS GET /api/v1/politicians/member/{slug} (trades at data.recentTrades[])
ANALYST GET /api/v1/analyst/{T}/estimates (data.estimates[0] + data.surprises[])
GET /api/v1/analyst/activity?lookbackDays=N&actionTypes=UPGRADE,DOWNGRADE,INITIATE (rating changes only)
INSIGHTS GET /api/v1/insights/market
CALENDAR GET /api/v1/calendar/earnings?ticker={T} (data.earnings[]; an empty window still returns a metadata block with windowStart/windowEnd)
OPTIONS GET /api/v1/options/overview (end-of-day radar board, stocks only)
GET /api/v1/stocks/{T}/options/history?window=1y|2y|5y
PRIMARY (no key; see Fetch safety)
CIK map https://www.sec.gov/files/company_tickers.json
XBRL https://data.sec.gov/api/xbrl/companyconcept/CIK{10}/us-gaap/{Concept}.json
Shares https://data.sec.gov/api/xbrl/companyconcept/CIK{10}/dei/EntityCommonStockSharesOutstanding.json
FRED CSV https://fred.stlouisfed.org/graph/fredgraph.csv?id=DGS10
--json keeps it that way. Read FLAT (no .data): price, prices, chart, popular, market-mood, stocks/{T}/profile, descriptions, metrics/entity/{T}/metric/* (bare array). institutional/quarters is a bare array (take the first entry whose pending is not true). These ARE wrapped in { isPreview, previewReason, data }: insider/*, analyst/*, insights/*, politicians/*, institutional/holders, stocks/{T}/sentiment, stocks/{T}/options/summary, calendar/earnings (read data.earnings[]). When unsure: Array.isArray(raw) ? raw : (raw?.data ?? raw).sentiment {T} --json returns {sentiment, series}: the /stocks/{T}/sentiment envelope plus the Score time series (--days sets its window). analysts {T} --json returns {consensus, actions}, two /analyst/* envelopes side by side, actions null if that half failed. quote {T} --json is the bare quote for one ticker and an object keyed by ticker for several. Everything else returns its endpoint's response unchanged, so .data sits where the endpoint put it.isPreview:true is not an error. Free tier returns real, truncated data. Synthesize from what you get; mention PRO only when the truncation materially limits the answer.series[i].metricValue.value.value (nested; metricValue.value is itself a dict). Latest reading = last element. Polarity in [-1, 1]; the SentiSense Score is unbounded, report as-is.transactionType (BUY/SELL), congress uses PURCHASE/SALE. Exclude AWARD/GIFT/EXERCISE from tallies (grants and exercises can carry very large totalValue), and drop transactionCode F (tax withholding on vesting) even though it arrives typed SELL.market-mood nests the composite under market; sectors is a dict whose GICS labels have historically overlapped, so dedupe defensively if a pair appears./options/* gives put/call volume and OI, an ATM IV term structure, 25-delta skew, OI walls with max pain, and unusual contracts, each ranked as a percentile of that ticker's OWN trailing history (ivRank1y, pcVolPctl1y, skewPctl1y), asOf the prior session. Read it as positioning context, never as live sweeps or dealer books. The /options/overview board is stocks-only; ETFs (SPY, QQQ, TLT, sector XL*) are covered but reachable only via /stocks/{T}/options/summary.kb/entities/search before any other call (see Authentication); take the first match with a non-null ticker, and treat a CLI exit 4 ("unknown ticker") as a resolution problem, not a coverage gap./options/* endpoints above are end-of-day), no dark pool, no /congress (it's /politicians), no financial-statements endpoint on SentiSense (fundamentals come from EDGAR). The Fetch Reference above is the whole command list; npx -y sentisense@0.47.1 --help confirms it at runtime.priceAsOf where present./analyst/{T}/consensus (CLI analysts {T}) returns a currentPrice stamped with its own updatedAt, independent of the quote endpoint: on 2026-08-20 the AAPL consensus read $305.93 as of 2026-08-16 while quote read $316.83, an $11 gap. Present currentPrice and upsidePercent as of that updatedAt, and use quote whenever the answer needs a current price.updatedAt every time rather than probing the two fields once and hardcoding a conclusion about the relationship. upsidePercent is computed against the snapshot price, so it stays internally consistent with the band and does NOT silently re-baseline to the live quote./stocks/price timestamp is milliseconds since epoch; /insights/stock/{T} generatedAt is seconds since epoch. Both are the freshness field this skill tells you to check, so naive age math across the two (e.g. subtracting one from the other, or comparing both to Date.now() the same way) is off by 1000x. Convert to a common unit before comparing.Filling Tier P means fetching beyond the SentiSense API, so it must be bounded. Do not give this skill a broad fetch tool. Wrap a narrow, hardened fetcher that:
http/https to public hosts; rejects other schemes (file:, ftp:, data:, gopher:) outright;127.0.0.0/8, 10/8, 172.16/12, 192.168/16, 169.254.0.0/16 including 169.254.169.254, ::1, fd00::/8) and re-resolves and re-checks the IP after every redirect;www.sec.gov, data.sec.gov, efts.sec.gov, fred.stlouisfed.org) plus company IR pages reached from a SentiSense documents[] payload; never a URL the user composed;User-Agent with a contact address on SEC hosts, and stays under 10 req/s.If you cannot provide that fetcher, skip Tier P over HTTP entirely: run the thinner ledger with [NOT AVAILABLE] rows and the MED confidence cap. An analysis skill must never become a general URL fetcher.
| Capability | Free | PRO |
|---|---|---|
| Quick Reads 1-5 | Full workflows; preview-gated depth (top-3 insights, sliced flow) | Full lists and history |
| Committee run | Full committee; 13F depth and history preview-gated | Full 13F holder base and history for the smart-money rows |
| Options positioning (E19) | IV rank, put/call, skew, OI walls, max pain: full dossier for 10 tickers/month + top-25 board + 1y history | Unlimited dossiers, full board, full history |
| Divergence screen | Against /popular (~50 tickers, ~101 calls/run: 1 /popular + 2 per ticker, about 10% of the Free 1,000/month quota) | Full universe |
| Monthly quota | ~30 committee runs + daily quick reads | Unlimited |
PRO at $15/month: https://app.sentisense.ai/pricing?coupon=AGENTS26 (apply coupon AGENTS26 at checkout for a builder launch discount)
ClawHub Skill: clawhub.ai/TheSentiTrader/us-stocks-analysis