Drafts, schedules, and the discipline of public surfaces
Publishing is a business rule. Your build should enforce it.
Publishing is not a toggle
Most teams treat “draft” as a UI state. We treat it as a contract.
If a post is public, it must have:
- a stable slug
- a title and description that hold up in search and social
- a publish date
- an author, category, and tags
Where this goes wrong
Without rules, drafts leak into:
- category/tag pages
- RSS feeds
- sitemaps
- and search indexes
That’s how you accidentally ship broken metadata to Google.
The VibeShip posture
Our blog is a product surface. That means:
- build-time validation is preferred over “best effort”
- public lists only show public posts
- “scheduled” is real: publish date in the future means not public yet
Shipping gets easier when your system refuses to lie.