before → after diff, and a measured delta from simulation. The loop generates and measures these; the SDK is where your product shows the queue and lets a human decide.
Embedding this in your product means customers approve fixes from inside your admin surface — no jump to the Nora dashboard, but the single-approval gate is preserved (only the actor recorded in the audit changes).
Authenticated by PAT read for browsing, PAT approve for decisions.
The Improvement shape
improvements.list / improvements.get return objects with:
id,kind,title,statusaddresses— number of failures this improvement fixesdelta— simulated improvement magnitude (nullwhen not yet measured)clusterKey— the cluster this improvement targetsgraphSlug— the Flow slug the improvement applies to (nullfor workspace-scoped fixes)targetAgentId/targetAgentName— the agent being changeddiagnosis— why (from the loop’s classifier)proposal— the primarybefore → after(mirrorschanges[0])changes[]— full typed change-set{ surface, target, before, after, rationale }compare— 2-axis simulation result (before vs after)
Browsing
proposed (waiting for a decision), approved (adopted → deployed), rejected (dismissed), reverted (a deployed fix rolled back via revert). New statuses can be introduced server-side — treat as an extensible string.
Deciding
approve requires the approve scope; reject accepts read.
approve({ edits }) lets you accept only some entries from the multi-surface changes[] array — e.g. take the prompt change but skip the tool config change. Indices refer to the changes array order.
Safety valves
revert is the post-deployment undo — it requires approve because it changes production. staleFixes returns fixes whose measured effect has degraded (the underlying failure pattern reappeared), so you can queue them for re-simulation.
versions
Same DAG, different level. versions deals with the Flow version pointer directly — improvements ship as versions, but you can also roll the pointer without going through the improvement queue.
versions.rollback when the pointer needs to move faster than an improvement revert would allow (e.g. a bad publish that had nothing to do with an improvement).
Why simulate / generate aren’t here
The improvement queue is where the loop’s output lands. Making an improvement — running the failure classifier, generating candidates, measuring them in simulation — is what the loop’s internals do, not what the SDK exposes. The SDK is the decision surface, not the generator.
If you want to make evidence on-demand (e.g. re-simulate a specific fix), that’s simulations. Its promote(roundId) verb turns a simulation result into an improvement proposal that then flows back through this queue for approval.