Review SOP¶
Overview¶
One pipeline, two depths. openfin review gather collects data and builds context packets. The SOP (these instructions) determines the depth of analysis.
| Daily (light) | Weekly (full) | |
|---|---|---|
| Purpose | Morning triage — what changed, what's urgent | Full assessment cycle |
| Command | openfin review gather --depth light |
openfin review gather --depth full |
| Reflection | No | Reflect on prior week's assessments (Phase 1.5) |
| Hypotheses | Flag approaching horizons or contradictory evidence | Assess all, confirm/invalidate, generate new |
| Research | No self-directed research | Pursue gaps, verify hypotheses (Phase 2.5) |
| Scoring | No rubric scoring | Full rubric scoring per symbol |
| Evidence | Record only if notable | Record all relevant findings |
| Output | Single executive_summary annotation | Full annotations, scores, evidence, decisions |
| Finalize | No finalize step | Finalize → composites, actions, report.md |
Both depths produce the same artifact structure:
artifacts/reports/weekly/{DATE}/{RUN_ID}/
inputs.json, context.json, summary.json, overview.md
theses/{SLUG}.md # Per-thesis context packets
holdings/{SYM}.md # Per-holding context packets
Prerequisites¶
openfin initpasses (all API keys valid)- Active theses exist (
openfin thesis list) - Watchlist derived from theses + portfolio (
openfin watchlist list)
Phase 1 — Gather (Automation)¶
# Daily triage
openfin review gather --depth light
# Full weekly review
openfin review gather --depth full
# Options
--date YYYY-MM-DD # specific date (default: today)
--run-id ID # explicit run ID
--dry-run # preview without persisting
--force # bypass cache
--ai # run AI analysis after gather
Light depth: positions, market, macro, watchlist, news, quotes, forex, commodities, earnings, hypotheses. Full depth: + search, prior scores, analysis signals, social signals.
Context packets (use these for scoring):
-
Thesis packets (
theses/{SLUG}.md) — per active thesis. Contains: narrative, time horizon, thesis health, time pressure, active + recently resolved hypotheses, and all symbols' market/news/position data. -
Holding packets (
holdings/{SYMBOL}.md) — per portfolio position. Contains: position data (cost basis, P&L, gain%, weight%, tax status), prior scores, market data, news, thesis references.
Phase 1.5 — Reflect on Prior Week (Agent, Weekly only)¶
Before scoring or assessing, reflect on the previous review cycle. This builds continuity — the agent should evolve its thinking, not start fresh each week.
Retrieve prior context¶
openfin review list -n 5 # find the last finalized run
openfin review show <PRIOR_RUN_ID> # see prior scores, annotations, decisions
openfin review lookup <THESIS_SLUG> # see observation history for a thesis
openfin thesis status <SLUG> # current hypothesis state + health
Reflect and record¶
Compare the prior run's output against this week's data. For each thesis, work through these questions:
1. Hypothesis quality review
For hypotheses resolved since last week, assess whether they were well-formed: - Was the claim specific enough to be clearly confirmed or invalidated? - Was the invalidation criteria measurable and timely? - Did tracking this hypothesis actually inform a useful decision, or was it noise? - Would a differently-framed hypothesis have been more useful?
If a resolved hypothesis was poorly formed (too vague, untestable, irrelevant to decisions), note that in the reflection so future hypothesis generation improves.
2. Decision accuracy
Look at last week's scores and actions against what actually happened: - Did a BUY_MORE action lead to gains? Did a TRIM call avoid losses? - Were scores too bullish or bearish in hindsight? By how much? - Did a HOLD turn out to be a missed entry or exit?
3. Thesis evolution
- Did any catalyst states shift (e.g., ABSORBING → PRICED_IN)?
- Should any active hypothesis be revised (use
--status revised) rather than left as-is? - Are there new themes emerging from the data that don't fit existing theses?
Record the reflection as an annotation:
openfin review annotate --run-id <RUN_ID> --field "obs:<thesis-slug>" \
--value "REFLECTION: <what changed, hypothesis quality, decision accuracy, what to do differently>"
This reflection directly informs Phase 2 — when generating new hypotheses, avoid the patterns that produced low-quality ones. When scoring, adjust calibration based on where last week's scores were off.
Phase 2 — Assess Hypotheses (Agent)¶
For each thesis, read theses/{SLUG}.md.
Assess existing hypotheses¶
For each active hypothesis shown in the packet: - Confirmed? New data supports the claim → update status - Invalidated? Invalidation criteria met → update status - Still watching? No new evidence either way → leave active
openfin review hypothesis update <ID> --status confirmed \
--resolution "What happened + was this hypothesis useful for decision-making"
openfin review hypothesis update <ID> --status invalidated \
--resolution "What happened + was this hypothesis useful for decision-making"
The --resolution should include: (1) what data confirmed/invalidated the claim, (2) whether this hypothesis influenced a score or decision, and (3) if it was poorly formed, what a better version would look like. This builds the meta-learning trail — future runs see resolved hypotheses with quality assessments in thesis packets.
Generate new hypotheses¶
From the narrative + current data, identify new falsifiable claims. Generate at least one new hypothesis per thesis if fewer than 3 active hypotheses exist. Each hypothesis must include a concrete invalidation level — a specific price, date, or metric threshold, not vague conditions.
openfin review hypothesis create <THESIS_SLUG> \
--claim "If A then B" \
--invalidation "Unless C" \
--time-horizon "6 months" # optional, defaults to thesis time_horizon
Good hypotheses are: - Causal: "If NVDA Q2 data center revenue exceeds $35B, confirms enterprise AI adoption acceleration" - Falsifiable: has concrete invalidation — "Data center revenue below $30B or sequential decline in Q2 report" - Time-bounded: specify when you'd expect resolution
Generate bear-case hypothesis¶
For each thesis, ensure at least one active bear-case hypothesis exists. Use the BEAR: prefix convention:
openfin review hypothesis create <THESIS_SLUG> \
--claim "BEAR: If hyperscaler capex pulls back 20% QoQ, AI compute demand thesis fails as training workloads consolidate" \
--invalidation "Sustained QoQ capex growth across 3+ hyperscalers for 2 consecutive quarters"
Bear-case hypotheses follow the same lifecycle as regular hypotheses — they can be confirmed (thesis risk realized), invalidated (risk cleared), or revised. The BEAR: prefix makes them visually distinct in thesis packets.
Link evidence to hypotheses¶
When recording evidence that supports or challenges a hypothesis:
openfin review evidence <SYMBOL> --run-id <RUN_ID> \
--source-type news --claim "..." --direction confirming \
--hypothesis-id <HYPOTHESIS_ID>
Catalyst state assessment (weekly only)¶
For each thesis, assess whether recent catalysts are priced in or still driving price action. Use news age metadata (shown as "2d ago" etc. in packets) + price action + upcoming catalyst dates.
Record as an annotation:
openfin review annotate --run-id <RUN_ID> --field "obs:<thesis-slug>" \
--value "CATALYST_STATE: <state> | <1-2 sentence rationale>"
States: - PRICED_IN: Catalysts >5d old, price already moved, no further impulse expected - ABSORBING: Recent catalyst (1-5d), price holding/building on gains - DIVERGENT: News tone and price action disagree (positive news + decline, or vice versa) - IMPULSE_RISK: Dense upcoming catalysts within 2 weeks + elevated uncertainty
Daily vs weekly hypothesis workflow¶
Daily (light): Scan hypotheses for approaching horizons or contradictory new evidence. Flag but don't do full assessment. Record evidence only if notable.
Weekly (full): Assess every active hypothesis. Confirm/invalidate with evidence. Generate new hypotheses from narrative + current data. Assess catalyst state per thesis.
Phase 2.5 — Self-Directed Research (Agent)¶
The gather phase collects standard data (news, quotes, macro, search). But the agent should also pursue its own leads — especially when packet data is thin, a hypothesis needs verification, or the reflection flagged a gap.
When to research¶
- A symbol has no news in its packet but has a pending hypothesis approaching its horizon
- A catalyst state is DIVERGENT — price and news disagree, dig deeper
- The reflection identified a blind spot or missed signal from last week
- A thesis has fewer than 2 evidence records in the current run
- SEC filings (10-K, 10-Q, 8-K) may contain information not captured in news
How to research¶
openfin research news <SYMBOL> --limit 10 # deeper news pull
openfin research search "<specific query>" # targeted web search
openfin research search-symbol <SYMBOL> --limit 5 # investment-focused search
openfin research headlines # broad market scan
openfin research sec-filings <SYMBOL> --type 10-Q # recent filings list
openfin research sec-read <SYMBOL> --type 8-K # read a filing
Rules¶
- Targeted, not exhaustive. Research specific questions, don't blanket-search every symbol. 3-5 targeted queries per review is typical.
- Record what you find. Any material finding from self-directed research must be recorded as evidence linked to the relevant hypothesis:
openfin review evidence <SYMBOL> --run-id <RUN_ID> \ --source-type news --claim "<what you found>" \ --direction confirming --hypothesis-id <ID> - Note the gap. If research turns up nothing useful, that's informative too — record it as neutral evidence noting the data gap.
Phase 3 — Rubric Scoring (Weekly only)¶
IMPORTANT: The run_id is provided at the top of the user prompt. Use that exact value for every --run-id argument.
Step 1: Score thesis alignment (thesis packets)¶
For each thesis, read theses/{SLUG}.md. Score thesis_alignment for each symbol:
openfin review score <SYMBOL> -m thesis_alignment --score <0-10> -r "<rationale>" --run-id <RUN_ID>
Consider thesis health and hypothesis outcomes when scoring. A thesis with failing health or recently invalidated hypotheses should push thesis_alignment lower. When prior score trends are available (3+ data points), note whether the trend is improving, stable, or deteriorating. Factor trend direction into the current score.
Step 2: Score news sentiment (all symbols with news)¶
Score news_sentiment for every thesis symbol that has news in its packet — not just holdings. This gives watchlist-only symbols a second rubric score beyond thesis_alignment.
For holdings, also read holdings/{SYMBOL}.md and score valuation_signal:
openfin review score <SYMBOL> -m news_sentiment --score <0-10> -r "<rationale>" --run-id <RUN_ID>
openfin review score <SYMBOL> -m valuation_signal --score <0-10> -r "<rationale>" --run-id <RUN_ID>
Step 3: Score social signals (if data available)¶
openfin review score <SYMBOL> -m social_signal --score <0-10> -r "<rationale>" --run-id <RUN_ID>
Skip symbols with no social signal data.
Scoring rules: - Use anchor descriptions from rubric prompts (0-1 = bearish/broken, 4-5 = neutral, 8-9 = strongly bullish, 10 = extreme/caution) - Rationale must cite specific evidence from packets - If a symbol has insufficient data for a rubric, skip that rubric entirely rather than assigning a neutral default. Note the data gap in evidence instead
Phase 4 — Evidence Recording (Weekly only)¶
openfin review evidence <SYMBOL> --run-id <RUN_ID> \
--source-type <sec_filing|news|market_data|macro|thesis> \
--claim "<specific factual claim>" \
--direction <confirming|disconfirming|neutral> \
--hypothesis-id <ID> # optional, link to a hypothesis
Record when: earnings beat/miss, analyst upgrades/downgrades, material SEC filings, hypothesis-relevant events, macro shifts, cross-thesis signals.
Phase 5 — Annotation (Agent)¶
openfin review annotate --run-id <RUN_ID> --field executive_summary --value "<text>"
Daily: Write a brief executive_summary covering what changed overnight, urgent items, and hypothesis status flags.
Weekly executive summary should include: - Portfolio-level week change and key driver - Per-thesis assessment: health trend, hypothesis outcomes, catalyst state - What shifted since last week (reference Phase 1.5 reflection) - Top/bottom movers with reasons - Macro context relevant to theses - What the agent got wrong last week and how this week's analysis adjusts - Action items ranked by priority
Phase 6 — Finalize (Weekly only)¶
openfin review finalize --run-id <RUN_ID>
Computes weighted composites (thesis_alignment=0.35, news_sentiment=0.25, valuation_signal=0.25, social_signal=0.15), applies action thresholds informed by thesis health + time pressure, writes decisions with entry_zone/exit_trigger/sizing_note.
Thesis Health in Decisions¶
Thesis health and time pressure modulate how aggressively scores translate to actions:
| Health | Time Pressure | Effect |
|---|---|---|
| strong | early/mid | Standard thresholds |
| strong | late/overdue | Tighter exit triggers — the clock is running |
| weakening | any | Lower bar for TRIM/EXIT |
| failing | any | Strong bias toward EXIT unless position is tiny |
Error Handling¶
- If gather fails: check
openfin init, retry once - If a score command fails: verify run_id, check
openfin review rubricfor valid metrics - If finalize fails: ensure all symbols have been scored
- Hypothesis commands require DB access — if DB unavailable, skip hypothesis workflow
Scheduling¶
- Daily: weekdays pre-market (08:30 ET)
- Weekly: Sunday evening or Monday pre-market
- Full end-to-end:
openfin review gather --depth full --ai
Reference: Available Commands¶
# Research (use in Phase 2.5 for self-directed investigation)
openfin research news <SYMBOL> --limit 10
openfin research search "<query>"
openfin research search-symbol <SYMBOL> --limit 5
openfin research headlines
openfin research sec-filings <SYMBOL> --type 10-Q
openfin research sec-read <SYMBOL> --type 8-K
# Retrospection (use in Phase 1.5 for reflection)
openfin review list -n 5
openfin review show <RUN_ID>
openfin review lookup <TARGET>
openfin thesis status <SLUG>