Store post state as text so Go owns the allowed values and future states such as locked remain representable without a database enum migration.
Provide one creation path for roots and replies, recursive thread loading, body-only updates, root listings, and post voting across PostgreSQL and the in-memory test store.