DIS-031: POST provenance from trailing-! (refer/forget), post! = --force, ban messages ending in !

Per blog/uris.mkd (authoritative), POST — not PATCH (see DIS-030) — decides the message (reuse vs new) and refer-back vs forget, via a trailing ! on the fragment; and post! on the verb means --force. Today POST (sniff/POST.c:2710-2784) chooses the provenance header purely from the patch row's shape field (MERGE→parent, SQUASH/REBASE1→foster, CHERRY→picked) and takes the message from the arg. The target rule set: a branch-sourced row + #msg (no !) → parent (refer back / merge); + #msg! or #! (trailing !) → foster (forget / squash + rebase); a named-sha row → picked (cherry) regardless. An empty fragment reuses the original message, text supplies a new one, so #! = reuse + forget, #msg = new + refer, #msg! = new + forget, bare be post = reuse + refer. To keep the trailing ! unambiguous commit messages may not end in ! — POST refuses one that does (bash-history-expansion ruled out a prefix form). be post! = --force, an alias of the existing verb flag (the conflict-marker override hit during the DIS-029 patch squash fork landing). See POST, PATCH, CLAUDE.

Issues

Provenance and message handling move from the patch-row shape onto POST's own !/fragment.

Blockers

Coupled with DIS-030 (the wtlog row must carry the named-sha flag and scope). Land together. Spec rewrite is DIS-032.

Planned

Move the provenance/message decision onto POST's ! and fragment; add the message-! ban and post! alias.