ModelRig Quickstart Route bundles Probes Bake-offs & replay How it fits Feedback protocol Optimization loop Leaderboard

The ModelRig feedback protocol (open)

Feedback is how judgment enters the optimization loop: a typed verdict your code attaches to one model call (an inference) or to a whole run (an episode). ModelRig aggregates it into per-route optimization coverage — the evidence level that decides how much confidence a swap proposal carries. The protocol is deliberately open: any tool that emits rows in this shape can participate in the loop.

The call


// one call — the inference id rides on every RunResult:
const result = await rig.run("support.summarize", { input, tags: { run_id } });
rig.feedback(result.meta.inferenceId, { verdict: "up" });

// a whole run (episode = your run_id tag):
rig.feedback({ episode: run_id }, { verdict: "down", score: 0.2, note: "CAGR off by 10x", source: "review-agent" });

The write is synchronous and local (SQLite) — never a network call, never a failure your path can see. The cloud mirror rides the telemetry exporter's normal cadence. Over HTTP: POST /feedback on modelrig-server with the same fields ({inferenceId | episode, verdict, score?, note?, source?}).

The row

fieldtypemeaning
iduuidassigned at write
tsISO-8601when judged
inference_idstring \nullthe judged call; from result.meta.inferenceId
episode_keystring \nullthe judged run (matches the run_id tag)
verdictup \downthe primary signal — always required
scorenumber \nulloptional grade in [0, 1]; refines, never replaces, the verdict
notestring \nullfree text for humans reading the row later
sourcestringwho judged: sdk, human, a review-agent name, …

Exactly one of inference_id/episode_key is typically set (both-null is rejected). Feedback that matches no known inference or episode attaches to nothing — attribution is never guessed.

The ladder (rungs 0–1 today)

Coverage renders per route on the console's /coverage page.

Privacy

Feedback rows carry your verdict and note — never the model's input or output text (those live only in the local, never-exported capture store when a route opts in). The mirror is subject to the same export isolation as all telemetry.