---
title: 'Drafting and verification: your agent writes, the gate checks it'
description: 'How your agent drafts from a brief with the channel writer prompt, checks the draft with lint_draft, reads verdicts for free, and keeps the board truthful while it works.'
slug: drafting-and-verification
group: workflows
order: 13
keywords:
  [lint_draft, draft verification, writer system prompt, lint rubric, get_draft_status, content brief, waiveChecks]
related: [five-channels, publishing-and-attestation, suggestion-statuses, entitlement-walls]
updated: '2026-10-26'
---

VarynForge does not draft content on its servers. Your agent drafts, on your tokens, with the brief as its prompt. VarynForge supplies the writer prompt and the gate: a check that grades the draft against the brief it was written from. This page covers the loop from a `brief_ready` suggestion to a `ready_to_publish` one.

## Get the writer prompt for the channel

An article, an X thread and a short video script are written differently, so each channel has its own prompt. Your agent calls `get_writer_system_prompt` with `channel` set to `article`, `x`, `linkedin`, `reels` or `youtube`; `article` is the default. The prompt covers the submission format, the gate checks with their limits, the craft rules and the usual ways a draft fails. It binds to the brief, its rubric and the opportunity behind it, so your agent fetches those before it writes. The brief itself comes from `download_brief_markdown`, or `get_article_brief` with the channel. [Five channels](/docs/five-channels) explains what each one submits.

## Read the rubric before writing

`get_lint_rubric` takes the suggestion id and the same `channel` your agent will pass to the gate. It returns the submission format, which checks are required and which are advisory, and `checkParams`: the exact numbers the gate grades against, such as per-post character caps, the hook fold, script word budgets and hashtag maxima. Reading it first lets the draft pass on the first submission.

## Set drafting while you work

Before it starts writing, your agent can set the suggestion to `drafting` with `update_article_status`. The gate does not require it, since `lint_draft` accepts a draft straight from `brief_ready`, but it keeps your board truthful while the piece is being written. Every status change records who made it, and calls over MCP register as the agent.

## Submit to the gate: `lint_draft`

```json
{ "suggestionId": "…", "channel": "article", "format": "website", "draft": "# …" }
```

`lint_draft` grades the draft against the channel's brief and returns a pass or flag verdict, the result of each check, the suggestion's status after the check, and a `nextAction` hint. Always pass `channel`. Without it, the channel is inferred from `format`, and an unknown label grades against the long-form article brief, which a short script cannot pass.

`format` names the destination the draft is for, ideally one of the project's destination type ids. The gate keeps one stored draft and one receipt per destination, so a TikTok script never overwrites the website article. Submitting the same `format` again replaces that destination's draft.

A suggestion has one pipeline status. The gate moves it forward only: a pass moves it to `ready_to_publish`, a flag moves it to `draft_ready`, and a later flag on one destination never demotes a suggestion another destination already moved forward.

| Status             | Set by                                                         |
| ------------------ | -------------------------------------------------------------- |
| `brief_ready`      | VarynForge, when the brief finishes forging                    |
| `drafting`         | Your agent or you, with `update_article_status`                |
| `draft_ready`      | The gate, when `lint_draft` flags the draft                    |
| `ready_to_publish` | The gate, when `lint_draft` passes the draft                   |
| `published`        | Your agent, with `mark_article_published` once the URL is live |

Publishing is covered in [publishing and attestation](/docs/publishing-and-attestation).

## Re-read a verdict for free

`get_draft_status` returns the suggestion's status and, per destination, the stored draft and the latest receipt. It is free and has no cap. When your agent loses a verdict, it reads it back here instead of spending another check.

## The lint cap

`lint_draft` is capped on every plan: 10 checks a day on Free Forge and 50 on a paid plan, counted in a 24-hour window that starts at the first check and shared by everyone in the project's organization. `get_account_status` reports the cap and what is left, so your agent checks the count before a revision loop and self-checks against the rubric between submissions. When the cap is reached, the gate returns a structured answer with the reset time instead of a verdict.

## When you deviate from the brief on purpose

Sometimes you drop a section or cut the scope on purpose. With your explicit say-so, your agent passes those check ids in `waiveChecks`. Waived checks still run and are recorded as waived in the receipt, but they stop failing the verdict. Your agent never waives a check on its own initiative.

When the brief itself is stale because you changed the angle, your agent regenerates the brief with `generate_article_brief`, `force: true` and `guidance` describing the correction, then drafts again.
