CI / Test & Type-Check (push) Canceled after 0s
UI: - /alerts page: event history with acknowledge, subscription create/manage with toggle - /admin/smtp: SMTP config form (host, port, auth, test) - Watchlist sidebar: dropdown selector for multiple watchlists, create/delete - Sidebar: alerts count badge, SMTP link under admin - Mobile tab nav: alerts tab added - Client trpc.ts: all new API methods + types Backend: - watchlists.listByWatchlist procedure + listSymbolsByWatchlist repo fn - yfinance min-interval 1500->2000ms to reduce Edge 429s - Fixed e.date.slice error in yfinance-adjustments with typeof guard - Removed defunct BITF from watchlist+queue - Cleared 83 failed + 12 backoff queue jobs Docs: - FUNCTIONAL_DESIGN.md: alerts + multiple watchlists + SMTP documented - TECH_DESIGN.md: new modules, tRPC procs, routes updated
10 KiB
10 KiB
Investor Flow — Functional Design (as built)
Audit date: 2026-07-23
Source of truth for status: this file + code under app/. Older slice SPECs, HANDOFF.md, and Automaton WORKFLOW.md are historical.
Product intent: Beginner-first multi-tenant educational research terminal for conviction investing (not day trading). Legal posture: educational publisher (ADR-0007).
Status legend
| Status | Meaning |
|---|---|
| Live | Backend + UI end-to-end usable for the intended job |
| Backend-ready | Engine and/or tRPC exist with tests; little or no product UI |
| UI-local | Screen exists but state is browser-only (localStorage / Zustand), not multi-device / multi-tenant |
| Stub | Surface or procedure exists but incomplete (empty timeline, thin universe, etc.) |
| Missing | Designed in domain model; not implemented as a product path |
1. User jobs and surfaces
1.1 Identity, access, onboarding
| Capability | Status | Notes |
|---|---|---|
| Email/password signup | Live | New users get status=pending_approval; no session until admin approves |
| Login + session cookie | Live | Non-active users rejected at login and protectedProcedure |
| TOTP 2FA + backup codes | Live | Settings page |
| GitHub / Google OAuth | Backend-ready | Router complete; env-dependent; OAuth users default active |
| Onboarding wizard | Live | Complexity, risk, drawdown, starter watchlist, optional portfolio; queues SEC fetch |
| Admin approve/reject | Live | /admin/users |
| Settings / profile | Live | /settings |
1.2 Research workbench (desktop)
| Surface | Route | Status | Data path |
|---|---|---|---|
| Symbol overview | / |
Live | market.snapshot, company meta, X feed, collapsible filings + options |
| Multiple watchlists | sidebar | Live | Create/delete/rename/reorder, dropdown selector in sidebar, per-watchlist symbols |
| Charts | /chart-lab |
Live | candles, indicators, institutional buy markers |
| Institutional dashboard | /institutional |
Live | dashboard rollup, flow, insider stream, filings; Q-o-Q / M-o-M |
| Filings | /filings |
Live | EDGAR index + 13F + Form 4 detail |
| Options DD | /options-dd |
Live | chain + greeks (read-only teaching surface) |
| Market outlook | /market-outlook |
Live (Phase 1–3 core) | Beginner language. Condition strip; stronger/weaker-vs-market map; seasonality + calendar; rank snapshots; auto leadership check; truck/factory; macro notes. True ETF flow/COT still later. |
| Social / X feed | on overview | Live | DB-backed 30d history + admin X credentials/accounts |
| Command palette + nav | shell | Live | ⌘K, g-key shortcuts, theme presets |
1.3 Process / journal workflow
| Surface | Route | Status | Gap |
|---|---|---|---|
| Trade plan | /trade-plan |
UI-local | Zustand only; not theses / trades / sizing APIs |
| Execution | /execution |
UI-local | Playbook + checklist local; not trade_executions |
| Trade closure | /trade-closure |
UI-local | localStorage |
| Daily focus / goals | /daily-focus |
UI-local | localStorage goals |
| Emotion logger | on execution | Partial | UI + emotionLogger API exist; UI still primarily local path |
| Sizing math | /risk (calculator) |
Live | sizing.compute + UI cascade (math only, ADR-0007) |
| Risk posture (M20) | /risk |
Live | risk.posture / risk.haltStatus + RiskPosturePanel; halt persisted on drawdown breach |
| Derisking suggestions | (no screen) | Backend-ready | derisking.suggest |
| Thesis monitor | (no screen) | Stub | thesisMonitor.assess / timeline (empty events / empty timeline) |
1.4 Discovery & strategy lab
| Capability | Status | Notes |
|---|---|---|
| Filter screener (M15a) | Backend-ready | screener.filter over watchlist quotes only; no UI; not in frontend api client |
| Strategy screener (M15b) | Backend-ready | screener.strategy; thin universe; no UI |
| Strategy authoring | Backend-ready | strategies.list/create; no Strategy Lab UI |
| Backtest | Backend-ready | backtest.run / evaluateLatest; no equity-curve UI |
| Sector confirmation cross-link | Stub | sectorCrosslink.confirm with empty universe in practice |
| Screener saved filters | Schema only | tables exist; incomplete product loop |
1.5 Options convexity sleeve (M17)
| Capability | Status | Notes |
|---|---|---|
| Options DD (read-only) | Live | M3 teaching panel |
| Unlock ladder + payoff API | Backend-ready | optionsConvexity.unlock / getPayoff |
| Option legs book + risk contribution | Live (MVP) | portfolio.optionLegs / add / remove; Risk posture premium-at-risk + CSP cash reserve |
| Portfolio sleeve workflow (M17 full) | Missing | Unlock UX + sleeve risk budget not enforced in product path |
1.6 Macro (M18)
| Capability | Status | Notes |
|---|---|---|
| FRED series / key admin | Live | Admin X Accounts page also manages FRED key |
| Truck sales + manufacturing PMI charts | Live | Market routes |
| Sector rotation heatmap-style panel | Live | Relative-strength style rotation, not full designed phase library UI |
| Regime classify / history | Backend-ready | macro.regimeClassify, regimeHistory |
| Portfolio-impact commentary | Live (partial) | macro.commentary via Market Outlook; 2 unit tests failing on wording assertions |
| Full economic calendar UI | Stub | macro.calendar |
1.7 Alerts & mobile
| Capability | Status | Notes |
|---|---|---|
| Alert list / ack / unacked count | Live | /alerts page with event history + subscription management |
| Alert subscriptions (create/list/update/delete) | Live | Per-user with ticker-level / list-level / global inheritance |
| Alert producers: informed_buy, informed_sell | Live | Insider tx comparison state, batched every 10 min |
| Alert producer: new_13da | Live | New 13D/13G filing detection, batched every 10 min |
| Alert producers: 7 more types (rotation, regime, conviction, thesis, cluster, drawdown, asymmetry) | Stub | Engine types exist; producers not wired |
| Email delivery (SMTP) | Live | Nodemailer, admin SMTP config page, rate limit 1/hr per type/symbol/user |
| SSE push | Missing | Design called for SSE; poll/list only |
Mobile companion /mobile |
Live (thin) | Auth, holdings glance, unacked alerts — not full M19 job A vision |
1.8 Admin / operator
| Capability | Status |
|---|---|
| Users, sessions, reset password | Live |
| Pending approval queue | Live |
| Adapter queue health, pause/resume, retry, schedules, error stacks | Live |
| SEC queue fetch + lint holders/insiders + data quality | Live |
| X credentials, accounts, prune | Live |
| FRED key | Live |
| SMTP config (host, port, auth, test) | Live |
| Audit log | Live |
| Server restart control | Live |
| GDPR export | Backend-ready (admin API) |
1.9 Reports
| Capability | Status |
|---|---|
| HTML research note generator | Backend-ready |
2. Functional architecture (intended jobs)
Job A — Monitor (mobile + alerts)
alerts.list/ack · portfolio.holdings · rotation chip
Job B — Research (desktop workbench)
watchlist → active symbol → market + SEC + institutional + options + social
market outlook (macro + rotation)
Job C — Process (planned investor loop)
thesis + confluence + sizing → plan → execute → emotion → close → unlock
[mostly UI-local today; engines exist but not productized]
Job D — Discover (planned)
filter/strategy screener → open in workbench
[API only]
3. Design principles still in force
Unchanged from domain model / ADRs:
- Primary Rule (ADR-0007) — education, not advice; Primary-Rule lint test on curated strings.
- Analyst Voice (ADR-0005) — Alfred/Druckenmiller blend where LLM copy is used.
- P6 plain English / P7 teach mechanics — UI redesign token system supports this.
- Local-first multi-tenant (ADR-0001) + shared cache dedupe (ADR-0004).
- LLM data provenance (ADR-0006) — sensitive data stays on local-class providers; full gateway module is thin/incomplete vs original design.
- Anti-gamification — no confetti / outcome celebration.
4. Explicit non-goals (still)
- Brokerage execution or custody
- Investment adviser recommendations
- Mobile-first full research workbench
- Undefined-risk options strategies for beginners
- Training on user portfolio/thesis content via external LLMs
5. Gap priority (product value)
| P | Gap | Why it matters |
|---|---|---|
| P0 | Fix failing MacroRegime commentary tests | Done 2026-07-18 — suite green (504 pass / 1 skip) |
| P0 | Expose SizingEngine + RiskEngine on tRPC + M20 UI | Done 2026-07-18 — /risk + sizing/risk routers |
| P1 | Persist trade plan / thesis / execution / closure server-side | Today process screens are single-browser toys |
| P1 | Frontend client coverage for backend-only routers | APIs unreachable from SPA client |
| P1 | Wire emotion logger UI to emotionLogger API |
Schema + API exist; dual paths confuse |
| P2 | Strategy Lab + backtest UI | Engines exist; no learning surface |
| P2 | Screener UI (filter + strategy) | Discovery job unfinished |
| P2 | Derisking + thesis monitor product surfaces | Process depth |
| P2 | Options convexity sleeve UI | M17 incomplete |
| P3 | Reports UI | Export pedagogy |
| P3 | Wire remaining 7 alert producers | rotation, regime, conviction, thesis, cluster, drawdown, asymmetry |
| P3 | SSE alerts / continuous event producers | Ops polish |
| P3 | Full LLM Gateway as designed | Provenance enforcement completeness |
6. Related docs
- Tech design (modules, stack, API map):
TECH_DESIGN.md - Domain glossary:
../CONTEXT.md - ADRs:
adr/ - Living wiki page: Obsidian
investor-flow.md(synced with this audit)