← All projects

Obstat

Gallery

1 / 4

0 comments

What it does

Proposals written by AI agents sound convincing even when a claim is wrong. In the EINSTEIN dataset, one researcher is stored twice under two IDs, so a writer can credit her with a paper that's filed under her other record, and nothing in the text gives it away. Obstat is a multi-agent matchmaker built on Mozaik. Profiler, analyst and matchmaker agents pair researchers with company challenges, and three writers draft collaboration proposals in parallel. Every write_proposal call is held at a gate until a separate Critic has run ten checks on each claim against the actual records (ID exists, attribution, duplicate profile, namesake and more). A failure goes back to the writer with the exact reason and fix, while the other writers keep working. In the committed run, the Critic caught the duplicate-profile trap, the writer fixed it in round 2, and three proposals for three different pairs were written. Every claim is tied to a dataset record, and 135 of 489 challenges were turned away with a reason. Anyone can watch the full run replay in the browser at obstat.vercel.app, or reproduce it with npm run replay, no API key needed.

How the agents run concurrently

Everything runs in one Mozaik 4.1.0 runtime (defineRuntime<ObstatState>). Each participant is its own AgentLoop, started with runLoop and not awaited, so loops really overlap: 4 Profilers read researcher profiles in parallel while the Industry Analyst classifies 489 challenges. The Matchmaker then shortlists pairs, and the Coordinator hands one pair each to 3 Writers, who draft at the same time. The committed run peaked at 5 loops at once, with all 3 writers and all 4 profilers running together. The Critic is a separate participant. Every write_proposal call passes through an InterceptionHandler (the gate), which holds only that writer's loop and sends a claim.review.requested event. The Critic runs its ten checks and replies with claim.review.completed, which resolves the held call: it either executes, or the writer gets the failures back and revises. The other loops never wait: while Writer 2 was held for 1.1 s on the duplicate-profile failure, Writers 1 and 3 kept making model calls. Shared state lives in ObstatState: the in-memory dataset index (read-only), challenge classifications, the shortlist, writer assignments, open reviews, and commitments. Commitments record researchers already in passed proposals, so the Critic's availability and capacity checks see what other writers have done. All model calls go through one rate-limited runner that gives the Critic priority, so reviews aren't starved. Every event lands in out/trace.jsonl, and npm run proof checks the overlap from the trace.

Comments

No comments yet.

Sign in to like and comment