Top-level roadmap for Signal beyond the Phase-1 MVP. Single-tenant. Tracks a 13-tool AI-coding roster across two markets (pro-dev, vibe-coding). Three anchor modes:
isUs(you are the vendor — partisan framing),isMain(a declared subject you do not claim to be — neutral framing), or pure market-watch. The shipped default anoints nobody; this deployment anchors on Claude Code viaisMain. Guiding principle: signal quality > UI polish. Convergence > single alerts.
The plan index lives in plans/README.md — tier, effort, cost and status for every plan, plus the recommended cross-tier ordering.
It used to be duplicated here. The two copies drifted (this one still called Plan 11 "deploy pending" long after the cron was live on Railway), which is the predictable outcome of maintaining the same table twice. One index, one place.
Signal evolves from a news dashboard into a knowledge system. See nextsteps.md for the architecture + why.
Approved architecture: hybrid two-tier knowledge layer.
- Turso (libSQL) = 100% canonical (system-of-record, fast queries, audit trail)
- Obsidian vault = workspace (native markdown editing, graph view, mobile, git versioning)
- Sync is explicit and opt-in via whitelisted fields.
Detailed executable plan: plans/08-knowledge-graph.md. Closes multiple blind spots identified in blindspots.md (feedback loop, hallucination check, cross-run learning).
Status: Ready to execute. Build triggered by "build plan 08" or "start knowledge graph work."
Start here: plans/README.md for the cross-tier recommended ordering.
- ✅ Company registry + ~60 RSS/Atom feeds derived from the roster (news, reviews, reddit, GitHub releases, vendor blogs, plus per-market category feeds) — add a company, get its feeds automatically
- ✅ LLM classification (Haiku 4.5) + business-impact scoring
- ✅ Turso (libSQL) canonical store — dedup on
hashId PRIMARY KEY - ✅ Config override layer —
$SIGNALS_*→*.local.mjs(gitignored) →*.default.mjsfor companies, feeds, deal-context, subdomain-signals, agent-policy and aeo-prompts. You never edit a tracked file to make the deployment yours, sogit pullnever conflicts with your configuration - ✅ Comparison anchor card (
battlecards/<MAIN_COMPANY_ID>.md) grounds every other battlecard. Only anisUsdeployment gets a true partisan self-card; in anchored (isMain) mode the same file is a neutral reference profile - ✅ 13 competitor battlecards with kill shots + objection handlers + feature matrix
- ✅ Correlation engine + convergence signals with structured
evidencecitations - ✅ Self-measurement loop — operator verdicts (
signal_feedback) feed per-rule precision innpm run report:weekly - ✅ Generated artifacts (battlecards, talk-tracks, briefs, transcripts) canonical in the store, disk as mirror —
core/artifacts.mjs - ✅ Spend controls — rolling 24h ceiling (
CI_LLM_DAILY_CEILING_USD), per-run cost footer,npm run cost:estimatepriced from the local ledger, prompt caching on Anthropic models - ✅ Tavily search (budget-guarded), YouTube transcripts, cert transparency, sitemap + robots diff, Google Trends, Hacker News, GitHub releases/activity, Reddit, and weekly answer-engine visibility (
watch:aeo) - ✅ Localhost viewer at
:5180— Linear-style sidebar with two labelled axes: VIEWS, eight modes across the whole market (Live Feed / Battle / Compare / Market / Intel / Report / Briefs / Inbox), and COMPANIES, where a click opens that company's own page (Overview · Signals · Infrastructure · Battlecard) from anywhere. Number keys 1-8 switch modes;g+ letter (f/b/c/m/i/r/s/x) also works. Battle is call-prep (deal-context filters, kill shots, objections, win themes, talk-track, saved preps, Infrastructure panel); Compare is the N-way side-by-side (anchor + up to 3 rivals,vs=a,b,c) with the section grid, verified-facts table and feature matrix - ✅ Analyst CLI (
npm run analyst) — 5 modes driven byanalyst/persona.md - ✅ MCP server (
npm run mcp) — 8 tools +signal://battlecard/{id}andsignal://brief/{id}resources. Read-only by default; every signal-reporting tool returns acoverageblock (fresh/slowing/stale/never + trustEmptyResult) so an agent can tell "nothing happened" from "we stopped looking".run_analystspends money and is off unlessconfig/agent-policy.local.mjsopts in, bounded by a rolling 24h USD ceiling against the sharedllm_costtable - ✅ Deep-research CLI (
npm run research) — appends a timestamped AI-RESEARCH block inside the HUMAN section; generation voice comes fromframing()incore/home-brand.mjs, so anchored and market-watch cards are third-person and onlyisUsis partisan - ✅
npm run doctor— roster, anchor mode, hosted-vs-local DB, collection freshness, which keys are set and what each missing one blocks, agent policy + remaining budget, and an MCP resolution check run from an unrelated directory
What's weak today: no push channel for humans beyond localhost + Windows toasts (no email, Slack or mobile — agents get the MCP surface, people don't), knowledge graph / Obsidian vault sync not built yet, no LLM hallucination fact-check layer.
Signal has its own correlation engine — pipeline/correlate.mjs + config/correlation-rules.mjs. Pointed at company signals, it's what turns 200 noise signals/week into 3 "this matters — act today" insights.
Do not build 30 signal types in isolation. Build 6, feed them into correlation, let convergence be the alert.
Most of the original order has shipped. Weeks 1–3 are done — sitemap/robots diff
(watchers/sitemap-watch.mjs), cert transparency (watchers/cert-watch.mjs), toasts
(pipeline/notify.mjs, npm run notify:test), the weekly digest (npm run report:weekly),
YouTube + Whisper (watchers/youtube-watch.mjs + pipeline/transcript.mjs), and
customer-win detection (the customer_win type in core/signal-taxonomy.mjs plus the
customer-win-momentum rule in config/correlation-rules.mjs). So is Weeks 5–6 — the
correlation engine is pipeline/correlate.mjs.
What is actually open, in order:
Next — 00 Backlog: Demo-call recording (T4) — the AI coding moat nobody else can build. Still gated by the single-party-consent jurisdiction check in the legal baseline below.
Then — finish operator live setup for 07 Email Ingest / docs/gmail.md (Phase 1 code is in; OAuth + label + Task Scheduler remain human), and ship 09 Document Ingest.
After that — 13 arXiv Watcher (IDEA · GOOD) and 12 Notion Publish (THINKABLE · GOOD), then 08 Knowledge Graph — the approved direction, and the largest build of the four.
Ongoing — 00 Backlog §Speculative — one every 2 weeks when between major builds.
- Month 1: 3 competitor launches caught before their official announcement (cert transparency + sitemap diff)
- Month 2: First kill shot from AUTO section confirmed as "landed on a call" → promoted to HUMAN section
- Month 3: First customer-win signal picked up → sales outreach to similar-ICP prospect within 24h
- Month 6: Correlation engine produces ≥1 convergence insight/week that drives a GTM decision
The goal is not volume of signals. It's number of GTM decisions altered by what the system surfaced.
Cadence, not model choice, is what actually moves these numbers. A job that makes one LLM call per tracked company costs 4× more on the 6-hourly tier than the daily one — battlecard refresh sat there until 2026-09-25 and cost ~$209/month on its own. See cost.md and run
npm run cost:estimatebefore trusting any row below.
| Phase | Monthly cost |
|---|---|
| Phase 1 (current) | ~$10–15 (LLM only), at the shipped cadence and models |
| + backlog G2 wins + G3 LinkedIn + G5 podcasts shipped | ~$75 |
| + backlog T4 demo calls + others shipped | ~$120 |
| Steady-state | ~$150–200/mo |
Solo-founder affordable throughout.
All plans respect:
- ✅ Public data + published feeds (RSS, Reddit, HN, YouTube, SEC, cert transparency)
- ✅ ToS-compliant API access (Proxycurl for LinkedIn, not direct scraping)
- ✅ Single-party-consent demo-call recording (verify jurisdiction first)
- ❌ No impersonation
- ❌ No individual targeting in customer-facing output
- ❌ No personal-account scraping
- ❌ No dark-pattern outreach using competitive intel
- If this deployment ever sets
isUs, which jurisdiction is that vendor in? (Blocks backlog T4 demo-call recording — single-party-consent check. Moot while the roster is anchored viaisMainwith no home vendor) - Proxycurl vs. existing sales tooling — consolidate, don't stack
- Who owns the HUMAN section long-term? In anchored mode it asks for verification and corrections, not deal history — that is an analyst's job, not a PMM's. (Revisit if this deployment ever sets
isUs.) - Turso free-tier capacity (9 GB / 1B reads / 25M writes) — currently ~1,100 signals, plenty of headroom