promptdojo_

Batch plan and calendar — creative at volume, gated before it ships — step 4 of 7

The calendar is data, and the approval column is the gate

Ask AI to expand the relaunch brief into a two-week calendar and it does a genuinely good job: sensible cadence, channels alternating, launch-day cluster, a winback email at the end. Expanding a brief into a grid is exactly the kind of work models are built for.

Then look at what it produced: a list of things that will be published under your brand's name, generated in eight seconds, reviewed by no one. The grid is not the dangerous part. The dangerous part is that every scheduling tool on earth will accept the grid as-is.

So the calendar gets a schema, and the schema gets a gate:

date, channel, piece, owner, approved_by, status

Two of those columns do the safety work:

  • approved_by — a name, or empty. Not "marketing." Not "the team." A person who read the piece and put their name in the row. Scripts fill every other column; this one only ever gets filled by a human. When the FTC, a journalist, or your CEO asks who signed off on the post, this column is the answer — which is precisely why no script writes to it.
  • statusapproved or rejected. And here's the counterintuitive rule: rejected rows stay in the file. Delete a rejected row and you've deleted the record of what the team said no to. Next month, when the model proposes the same meme-post again — it will — the rejected row is how you know it was already considered and killed, and why.

Run the editor. The teaser story has status: approved but an empty approved_by — someone flipped the status in a hurry without putting a name on it. The gate holds it. Status is an opinion; a named approver is accountability. The gate demands both.

The rule with teeth

Only rows that pass the gate reach the scheduling tool. This is the chapter's spine applied to publishing: the AI proposes, your script filters, a named human approves, and then the scheduler gets its rows. Courses and vendors mostly treat generation and publication as one continuous motion — draft it, schedule it, done. The gate is you cutting that motion in half and putting a human in the seam.

Two smaller rules ride along, both learned the embarrassing way. The timezone is stated once at the top of the file — a 9am send in the wrong timezone is a 3am send in your customers' inboxes. And no channel posts twice in one day without a stated reason; if the model stacks three stories on launch day, either write the reason into the row or reject two.

Next: the gate runs on four rows, and you predict what survives it before Python tells you.