← All posts

Tag @artifact, and the turn owes you a document

"Draft a pipeline report" used to come back as a sentence of narration and an empty pane, with no way to tell whether the agent decided against an artifact or simply forgot. Whether a turn ends in a document is now a typed field on the request, armed by typing @artifact — and a backstop guarantees one when the loop does not deliver. Release notes 2026-09-16 — vocion-core#368.

Vocion Teamvocion-v2.88.0

Status: shipped. #368, commit e6410c47, carried by v2.83.0. Part of Vocion 2.88. The same pull request also fixed delegation failures that never reached the person — that is its own post.

One live artifact beside the conversation gave a turn somewhere to put a document. What it did not give anyone was a way to ask for one.

So "draft a pipeline report" came back as a sentence of narration — "I'll pull the full picture before drafting…" — and then nothing in the pane. And there was no way to tell, from the outside, whether the model had considered an artifact and decided against it, or had simply forgotten while it was busy doing the work.

The question is answered before the turn runs

Whether a turn ends in a document is no longer a judgement the model makes mid-flight. It is a field on the request:

Malformed counts as absent, so a typo can never quietly arm anything.

You arm it by typing @artifact

Not by a chip the system pre-selects for you. The first version of this inferred the intent from your draft and pre-armed a chip beside the send button; that was killed on the grounds that an inferred opt-in is a thing you have to notice and undo, which is a worse interaction than typing four characters.

@artifact is the composer's existing @ mention — the same gesture as tagging a team or the page — so there was nothing new to learn and nothing new to build. There is also a (+) menu beside the box, which inserts the tag at your cursor for anyone who would rather point than type.

The tag is a chip you can see and remove before sending, and it never reaches the model: it states what the turn owes, it does not name a record, so it is stripped before the context goes on the wire. The agent is never handed a record called Artifact.

The backstop

When a turn was sent owing an artifact and the loop did not render one, the harness makes one. Three branches, in order of how much is invented — which is to say, in order of how much you should trust them:

1. Wrapped. The answer already is a document. It has markdown headings, or a real table, or it runs past 120 words. In that case it is wrapped verbatim into an artifact: no second model call, no summarising, nothing invented. What you read in the pane is exactly what the agent wrote. The title comes from the answer's own first heading when it has one, because that is what the agent called it.

2. Composed. The answer was short — the narration case. There is no document to wrap, so one focused pass over the turn's transcript and its tool results produces the document. This is the only branch that calls a model, it fires only on a violation, and it never runs on the happy path.

3. Stub. The work genuinely could not be done. The pane gets a short document titled "<what you asked for> — not completed", with a What failed section naming each tool that failed and its message, and a What is needed section saying what to do about it — "re-run once the step above succeeds, or ask for the part that does not depend on it", and, if it keeps failing, that the problem is in the tool or the hand-off rather than in your request.

A stub is a legitimate artifact. A silent nothing is not. When the work did not happen, the pane says so in the pane, where you were looking — rather than leaving a Tool error badge in the transcript and an empty column beside it.

It says it made it, and who made it

Either way, one sentence is appended to the answer saying an artifact was created and why. An artifact that appears with no explanation is indistinguishable from one the agent decided to make on its own, and the difference matters.

The same honesty runs into the version history: a backstopped artifact is authored by the system, not by the agent, and its change summary says which branch produced it — captured from the turn's answer, composed from the turn, or stub recorded because an artifact was requested and the turn could not produce one. The version history does not claim the agent's judgement for something the harness did.

Where it applies

The backstop reads the turn's finished text and its tool calls, which every execution target returns, so the guarantee does not depend on where the loop ran. And the happy path costs one set lookup and no I/O: a turn that rendered an artifact, or that was never sent owing one, returns immediately.

Where this lives