session adopt: settle the --force precondition before the ownership gate
Commit
Same-store adoption requires --force whatever either store holds, but the check lived inside adoptFromSameSessionStore, behind ensureAdoptSourceIsCaller. A call without the flag therefore drew the ownership question before reaching the precondition that was going to refuse it anyway: non-interactively it printed --allow-foreign-session while --force was the flag actually missing, and interactively it asked a human to approve moving someone else's running session โ the most consequential prompt this command has โ for a call that could not succeed either way.
runAdopt now settles it ahead of the gate. The check reads a flag and no state, so nothing is lost by deciding it early, and opts is a value no later caller can change. adoptFromSameSessionStore drops its options parameter entirely as a result; everything it still checks it re-reads under the state lock. The external path's --force check stays where it is, because that one depends on what the target store turns out to hold once locked.
Both wordings now come from errAdoptAlreadyTracked, so the two paths cannot drift apart while refusing on the same precondition at different moments.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com Entire-Checkpoint: 01M6E7R2NFKJCFW1F954VVS879