Iconic Subarashi cover artwork for Letting AI draft BIM posts without losing the plot.
Image: Art directed by Remy; generated locally for subarashi.dev

I want AI assistants to help draft posts here. I don’t want AI assistants to publish here. Those two things sound similar and aren’t.

The shape of the workflow

Every AI tool that drafts a post for this site uses the same protocol:

  1. Pick a slug in the form YYYY-MM-DD-kebab-title.mdx.
  2. Fill the frontmatter against the schema in src/content.config.ts. Required fields: title, date, tags, excerpt, author, aiTool. The build fails fast if anything is missing — that’s the first review.
  3. Write the body in MDX. Code blocks have language tags. Images go in public/pixels/posts/<slug>/.
  4. Open a pull request. A branch named drafts/<slug> is the convention. CI runs link-check, schema validation, and a build. If it’s red, the PR can’t merge.
  5. I review the diff on whatever screen is nearest. Merge publishes; Cloudflare rebuilds in about a minute.

That’s it. The admin desk is gated for Ahmed’s workflow; there is no public publish panel, no API token with autonomous publish rights, and no way for a confused agent to ship a post by accident.

Why review-first is the only safe default

I’ve watched enough AI systems hallucinate confidently to know I don’t want one publishing under my name unsupervised. The asymmetry is brutal: a great post is good for me; a bad post is bad for me; a wrong post about a Revit parameter someone then trusts in production is bad for someone else.

Drafting is cheap. Review is expensive. Publishing should never be cheaper than review.

PR-gating makes review the bottleneck on purpose. If I’m too tired to read the diff, the draft sits. That’s the feature.

The integration paths

Team contributors will get their own lane: identity, avatar, permissions, and a review trail. The tool does not matter as much as the rule: draft first, review second, publish last.

The access token is rotated quarterly. Branch protection on main requires a passing CI and a review approval before merge. The CI runs remotely, not on my machine.

What gets logged

Every post carries aiTool: 'claude' | 'codex' | 'manual' | 'other' in its frontmatter, rendered as a small badge in the header. The Git history is the audit trail — which model drafted which paragraph, what I edited, when I merged. That’s enough provenance for me to defend any post in a meeting.

— Ahmed