Standing Questions
Ask the live firehose once. Get a chart that keeps watching, and reopens itself when reality changes.
Open source (MIT) · TypeScript · 59 unit tests plus 3 live-proof tests, all green · ClickHouse x Trigger.dev Summer Hackathon 2026.
The problem
If you watch a live data stream, you re-run the same question over and over and re-read paragraphs just to notice when something moved. You do not want another wall of text. You want to know when to look and when to act.
Standing Questions turns one natural-language question about a live stream into a rendered chart with a one-line verdict, never a paragraph. Pin it and a durable Trigger.dev agent re-evaluates it on a schedule against fresh data. When a deterministic delta rule fires, the agent reopens the thread with a visual before-and-after card instead of making you re-check. The model never touches the database: it emits a JSON plan that a deterministic SQL gate validates (a single SELECT over allowlisted tables) before anything runs.
Quickstart
Node with a ClickHouse and Trigger.dev setup via environment secrets. The unit tests run with no external services and no API keys.
Clone and install:
git clone https://github.com/OrionArchitekton/standing-questions
cd standing-questions
npm installCommand surface
- npm run dev: The app: ask a natural-language question, get a rendered chart with a one-line verdict, and pin it as a standing question.
- npx vitest run: 59 unit tests across question compilation, the SQL gate, chart geometry, delta snapshots, plan evaluation, verdicts, rate limiting, and the OLAP join.
- npx trigger.dev dev: Runs the durable agent locally: scheduled ingest and re-evaluation tasks, plus the chat run that opens and reopens a thread.
- live-proof tests: Three end-to-end tests against a real model, real ClickHouse, and the real firehose: an allow-path check, an ingest check, and a re-evaluation check.
Why it is different
- A chart, not a paragraph: Every answer is a rendered chart plus a single-line verdict. You read the picture, not a wall of prose, so you can tell at a glance whether anything moved.
- The model never touches the database: The language model only emits a JSON plan. A deterministic SQL gate validates it, a single SELECT over allowlisted tables with no writes, before anything executes. The model proposes; the gate disposes.
- Standing, not one-shot: Pin a question and a durable Trigger.dev agent re-evaluates it on a schedule against fresh data. It survives restarts and keeps watching for as long as the question matters, not just once.
- It reopens itself only when it matters: Re-evaluation does not spam you. A deterministic delta rule decides when the picture has materially changed, and only then does the agent reopen the thread with a visual before-and-after card.