! (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.
Provenance and message handling move from the patch-row shape onto POST's own !/fragment.
pent[i].shape (sniff/POST.c:2712-2758); target keys on (a) the row's named-sha flag → picked, else (b) the post fragment's trailing ! → foster, else parent.#msg vs #msg!: the trailing ! is the forget modifier. Needs a fragment-tail parse in POST's arg classification, distinct from the verb-token !.sniff/POST.c:2273-2299).! must be refused with a dedicated error (ron60, ≤10 chars, e.g. POSTBANG) — else a literal fix it! silently becomes a forget. Add to the message-validation path.post! verb-token → --force (commit through conflict markers); wire the trailing ! on argv verb to the existing force flag. Compose: be post! '#msg!' = force + new-msg + forget.Coupled with DIS-030 (the wtlog row must carry the named-sha flag and scope). Land together. Spec rewrite is DIS-032.
Move the provenance/message decision onto POST's ! and fragment; add the message-! ban and post! alias.
test/post/* cases — branch row + #msg→parent header; + #msg!→foster; + #!→foster + reused message; named-sha row→picked; a message ending in ! is refused; be post! commits past a conflict marker. FAIL pre-change.! and the verb-token !; rewrite header emission to key on row-named-flag + post-! instead of pent[].shape.! refusal + error code; reject before pack write.test/post/* and beagle/test/*.sh to the new forms; update sniff/INDEX.md; cross-link DIS-030/DIS-032.