Human-in-the-loop for legal products
A lawyer signs it, not the model.
The supervising attorney signs off from their phone, and you keep a record of who approved what.
How do legal AI products get an attorney to review output before it goes out?
Pushary lets legal AI products get a named attorney to review output before it goes out. Put one call before the filing, the client letter or the advice. The attorney approves it, sends it back or stops it. You can also ask them to type corrected text instead. Your agent waits for that answer. If nobody answers in time, nothing is sent. Each answer is saved with the reviewer and the time, the evidence a supervision duty asks for.
What needs a yes
The calls that should not be automatic
- fileDocument(matterId, draft)
- A filing is a deadline and a public record at once. There is no way 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 the other side's wording means agreeing to it. The model can spot the change. It cannot decide whether your client is willing to live with it.
- answerLegalQuestion(query)
- The gap between summarizing a document and giving advice is the gap a supervising lawyer exists to stand in.
The code
One call 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.
npm i @pushary/serverimport { 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.value === "Approve as drafted") {
return sendToClient(matter.id, draft)
}
return returnToDraftingQueue(matter.id, draft, decision.value)
}Who answers
The approver is not at a desk
The approver is a licensed attorney who answers for the work however it was produced. They spend the day in court, with clients or in meetings. A review queue in your product assumes they will come back to a screen. Their duty does not pause while they are away. So the test is whether they can answer within the time the matter allows. Pushary reaches the phone they carry.
Our users are lawyers. Will they accept approving something on a phone?
They already do the same thing all the time. What matters is what they are approving. Nobody should redline a merger agreement on a phone, and Pushary does not ask them to. A phone works for a decision narrowed to something they can answer: this draft, on this matter, with the change flagged, release or return. The reading happens wherever they normally read. The decision is the part that has been stuck waiting for them to reach a desk. If a matter truly needs a full review before anyone can say yes, send the question later. Do not make the reviewer the bottleneck for hours.
Worth reading: ABA Model Rule 5.3 on responsibilities regarding nonlawyer assistance.
Add it to your product. Your users never make a Pushary account or pay us.
FAQ
Questions, answered
Can the reviewer choose between more than approve and deny?
Is the ledger enough to evidence supervision?
Can we keep matter content out of Pushary?
What happens if the attorney does not respond before a deadline?
Put a person on the step that needs one.
Connect a user once, ask with one call, and run the action only on a yes. Every answer is saved.
Start free