accept: settle jurisdiction before merit in decide(); make post_uri unique master
Chunk-5 findings 1 + 6 from the second-opinion re-review. decide() judged a record's merit (lexicon validation first among them) before refusing a community move, and AdmitPost records every verdict under the EVENT's community — so a moving edit that also carried any merit failure filed its verdict under the move's TARGET: a second admissions row for one post_uri (never-accepted post), or a removal record signed with the target community's key for a post it never accepted, while the original community's outbound row was tombstoned and a Delete{Page} enqueued at it. The community-immutability discard now runs first — it is the only check that decides WHERE a verdict may be written rather than what the verdict is, and refusing a move needs no valid record. Migration 031 then makes "one post_uri, one community" a schema fact: clear any pre-existing duplicates (keeping the row whose community holds the post's outbound binding, else the oldest decision) and add a unique index on post_uri, so the next writer to violate the invariant fails at the INSERT instead of corrupting the binding GetByPostURI reads back with no ORDER BY. Repro tests pin both halves: the malformed community move of a rejected and of an accepted post (asserting nothing is written or signed under the target), and the store-level uniqueness refusal. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>