After an independent review of the process tools. Each change is described by the guarantee it gives. - Only a reviewed process runs, decided when the application runs. A host registers the processes it reviewed for the assistant in AssistantQBitConfig (withReviewedProcesses, or withReviewedProcessesResource for a file on its classpath). With no list, only a table's own bulk edit and bulk delete are runnable: they act on records of a table the person may already change through the assistant. With a list: exactly the listed processes and those two, each still subject to every never-runnable rule, to an administrator's narrowing row and to the person's own permission. RunnableProcessReview stays as the way a host notices drift in its build, and now also fails when the reviewed file is not the registered list. - An input is only a field a screen asks a person for. A screen's field whose name the process keeps for its own working is never an input (ProcessControlNames: the inputs of the process's backend steps, and a fixed set this QBit owns, checked by a test against the QQQ version it builds with). The person is told the field cannot be set through the assistant; the process stays runnable for its other fields. - A person confirms what they were shown. A run stops at every later screen that has something to show (a form, values to read, a text, a list of records), and going on is a second card that shows it. Only a screen with nothing to show is passed. The screen a run starts at is on the first card. - A run is over exactly the records its card counted. A filter is resolved when the run is proposed, to at most 500 primary keys (more is refused, for the person to narrow); the confirmed run is sent those keys and does not start when one of them is gone. - A process that may run as a durable job is created waiting, or not run: where the application does not offer the operation that creates a job, the run is refused. - Text of the application reaches a model only inside the data envelope every tool result uses: a process's messages, what a screen shows, the application's message for a refusal or a failure. That holds for a result, for a card's lines, for the summary a later request keeps of a process step, for what a later request is told became of a confirmed run, and for the thread's own message about it (ToolLabels.forModel, MessageParts.modelText). - A card goes on only with the run as it stood when the card was made: a run counts a version up at every step and stop, and an older card of the same run is refused. One expectation of ChatToolSetTest changes: the scenario everythingAsAnotherPerson no longer holds the four process tools. That host registered no reviewed list, and its person may run processes of another QBit and change no table, so the assistant runs no process for them. ToolCallChecksTest is unchanged. No new tool. AssistantStore is still the only code that calls data actions. README, UPGRADE.md, CHANGELOG.md, CLAUDE.md and section 4.5 of docs/actions-and-mcp.md say the same. Co-Authored-By: Claude Fable 5.2 <noreply@anthropic.com>