Inspiration

Every B2B deal ships a security questionnaire (50 to 300 rows) and most of it asks what the team already answered somewhere in Slack, in last quarter's spreadsheet, or in the SOC 2 doc. It lands on the same one or two experts every time and stalls live deals for days. And it's the one writing task where a confident wrong answer isn't a typo. It's a false statement in a security attestation.

What it does

Hand it a questionnaire (xlsx/csv or pasted text). It searches your workspace with the Real-Time Search API scoped to what you can see and sorts every question into one of three states:

  • Verified: a matching answer an expert already approved, reused only after re-checking that you can still see all of its evidence.
  • Grounded: a fresh draft, cited to the Slack messages and files behind it.
  • Needs SME: not enough evidence, ungrounded citations, stale evidence, or an ACL block; it refuses to draft and routes the question to a human.

You review in a native Block Kit table, approve/edit/reject each answer, and export the finished questionnaire with citations and an approval record. Approved answers compound: the next questionnaire starts mostly done.

It never invents a compliance answer. No proof, no answer; a human gets asked.

How we built it

TypeScript + Bolt. A small, sharp core:

  • Query Planner: rate-aware RTS search.
  • Multi-agent Jury: heterogeneous drafters (Anthropic / OpenAI / Azure) behind one interface.
  • GroundingGate: deterministic snippet-level citation verification (NFKC + exact/trigram match).
  • DraftingPipeline: three-state, fail-closed, with citation-subset and ACL guards.
  • EvidenceGraph: typed SUPPORTS / CONTRADICTS / SUPERSEDES edges; stale approved answers degrade automatically.
  • ConformalMatcher: split-conformal prediction for question matching instead of a magic threshold.
  • AnswerLibrary: approved answers with ACL revalidation on every reuse.
  • LedgerV2: event-sourced, hash-chained approval lifecycle with two distinct human gates and a live verify.

Surfaces: agent Messages tab, Block Kit review table + cards, App Home dashboard (ACL-filtered), Data Table of runs, Canvas export, Workflow Builder step, and an MCP server exposing the approved library read-only and fail-closed.

The engineering we're proud of is a permission invariant, machine-checked

No answer text ever flows to a requester who cannot see all of its evidence.

Most "memory" agents cache answers and serve them back; almost none re-check who is asking against the evidence the answer was built from. We do, in three places; library reuse, fresh drafts, and the MCP server all fail-closed. It's property-tested (200-run fast-check), exposed as a live /invariant health check that goes red if the guard is disabled, and its negation is proved unsatisfiable in Z3 in CI.

Evals (reproducible: npx tsx evals/run.ts)

Against a seeded workspace with public/private channels and planted injection / stale-evidence / near-miss docs, over 127 labeled cases (103 dev, 24 held-out). The deterministic guards hold independent of the drafting model: fail-closed correctness, citation faithfulness, and stale-evidence detection all measured at 100%; guard-only metrics 98.7%. Grounded recall depends on the drafting model and is reproducible per provider with AA_EVAL_LLM=anthropic|openai|azure. Unit tests: 214/214.

What we deliberately didn't build

PDF/OCR intake, per-sentence citations, and auto-approval rejected on principle. A compliance tool that self-approves is a liability, not a feature.

What's next

PDF intake, semantic RTS where the plan supports it, and Marketplace distribution.

Built With

  • anthropic
  • azure-openai
  • block-kit
  • bolt
  • fast-check
  • model-context-protocol
  • node.js
  • openai
  • slack
  • slack-canvas
  • slack-real-time-search-api
  • sqlite
  • typescript
  • vitest
  • workflow-builder
  • z3
Share this project:

Updates