Human-in-the-loop for legal products
A lawyer signs it, not the model.
The supervising attorney reviews and signs off from their phone, and the record of who approved what is kept for you.
How do legal AI products get an attorney to review output before it goes out?
Pushary puts a named attorney in front of the step where legal work leaves your product. Wrap the filing, the send, or the advice in decisions.ask() and the agent holds until that person approves, declines, or returns corrected text. The decision is written to a durable ledger with the reviewer and the timestamp, which is the evidence a supervision obligation actually asks for.
Where it stops
The calls that should not be automatic
- fileDocument(matterId, draft)
- A filing is a deadline and a public record at the same time. There is no version of undoing one that costs nothing.
- sendToClient(matterId, letter)
- Once advice reaches a client they act on it. That is the moment a draft becomes something a person relied on.
- acceptContractTerms(dealId, redlines)
- Accepting a counterparty's language is agreeing to it. The model can spot the change and it cannot decide whether your client is willing to live with it.
- answerLegalQuestion(query)
- The gap between summarising a document and giving advice is the gap a supervising lawyer exists to stand in.
The integration
Two calls inside the step you already have
Wrap the action, not the whole agent. Everything the agent does that is safe keeps running without asking anyone.
import { createPusharyServer } from "@pushary/server"
const px = createPusharyServer({ apiKey: process.env.PUSHARY_API_KEY! })
async function releaseWorkProduct(matter: Matter, draft: Draft) {
const decision = await px.decisions.ask({
externalId: matter.supervisingAttorneyId,
type: "select",
question: `Release "${draft.title}" on matter ${matter.reference}?`,
options: ["Approve as drafted", "Return with changes", "Do not send"],
})
// The ledger row is the supervision record: who, what, when.
if (decision.answer === "Approve as drafted") {
return sendToClient(matter.id, draft)
}
return returnToDraftingQueue(matter.id, draft, decision.answer)
}Who answers
The approver is usually not an engineer
The approver is a licensed attorney who is responsible for the work regardless of how it was produced, and who is in court, with a client, or between meetings for most of the working day. A review queue inside your product assumes they will come back to a screen. Their obligation does not pause while they are away from one, which is why the practical question for a legal AI product is not whether there is a review step but whether the reviewer can reach it in the window the matter allows. Pushary addresses them by the id you already store on the matter and reaches the device they carry.
Our users are lawyers. Will they accept approving something on a phone?
They already do the equivalent constantly, and the distinction that matters is what they are approving. Nobody should redline a merger agreement on a phone, and Pushary is not asking them to. What works on a phone is a decision that has been narrowed to something answerable: this draft, on this matter, with the specific change flagged, release or return. The reading happens wherever they normally read. The decision is the thing that has been stuck waiting for them to be at a desk. If a matter genuinely needs full review before anyone can say yes, the right answer is to send the question later rather than to make the reviewer the bottleneck for hours.
Worth reading: ABA Model Rule 5.3 on responsibilities regarding nonlawyer assistance.
Embed it in your product. Your users never see a Pushary login or bill.
FAQ
Questions, answered
Put a person on the step that needs one.
Connect a user with one tap, ask a human with one call, and act on a fail-closed decision. Every decision is saved to a durable ledger you can audit.