FlowDrop Workflow Specification 1.0-draft

A pause does not destroy artifacts, and does not deliver them twice

The rule

Normative: this is the rule
  1. Artifacts produced before a run pauses are held durably against the turn that produced them rather than discarded, and are never exposed on the wire while they are held.
  2. The next write-back for the same execution takes them, prepends them to whatever the resumed run collected, and delivers the merged list on the resumed turn's assistant message.
  3. Taking is destructive, so a delivered artifact is never delivered a second time, and a resume that pauses again holds everything for the next one.
  4. A write-back that fails after taking them puts them back before it reports the failure, so a failed write postpones delivery rather than destroying it.
  5. The held list is itself bounded; where it would exceed the bound, the newest entries are dropped with a warning.

What it means

A pause is the hard case: a tool already ran and produced an artifact before the run stopped to ask a question, and there is no assistant message yet to carry it. The artifact is held rather than lost, but it stays off the wire while it waits — a caller polling the paused turn never sees it. Only the resume's write-back takes it, and taking it is destructive: once delivered on the resumed turn's assistant message, the same artifact is never handed out again, even if the run pauses a second time.

Example

What is held against the paused turnheld
{ "type": "link", "payload": { "url": "https://example.com/report" }, "tool_call_id": "call_1" }

Answering the question resumes the run and delivers it exactly once, on the resumed turn's assistant message; asking the same question again finds nothing left to deliver.

Rule identifiers are permanent and are never renumbered. Each implementation publishes its own standing against these rules; this specification does not.spec 1.0-draft · RT-TOOL-7 · changed in spec 1.0