A mandatory reason field on the archive action, refused with a 400 if blank, stored in its own column alongside an archived_at timestamp. It is deliberately not stored in the generation-error column, which belongs to the writer, so a human's reason and a machine's diagnostic can never overwrite each other.
Also called: archive reason · why did we unpublish · content audit trail
- 1The archive action requires a non-empty reason string and returns 'Say why this post is being archived — it's the only record anyone gets' when it is missing.
- 2The reason and timestamp are written to their own columns.
- 3If the post was live, archiving also announces the URL change so crawlers come back and drop it.
- 4The list shows the reason on the archived row.
The migration quotes the request and states the precedent: "Keith 08-24: 'If it's been archived, I also want to be able to hover or click on archived… and see the reasoning why it was archived.' Four posts are archived on this site today and NOTHING records why… That's the same shape as the invoice void/delete work: an action that removes something a customer or a search engine could see is exactly the action that has to say why." The backfill is equally deliberate — timestamps only, because "there is no honest reason to invent for the four already-archived posts, and a made-up one is worse than a blank."
- Pulling a public page left no record beyond a modified date.
- A human's reason and a machine's error message shared one column.
See it on your own jobs
Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.
or keep browsing features →