If you intend to merge into separate release branches, your function branches should be forked from the release branch, and not from the trunk. It is easier to merge with the parent branch than with the child branch.
1) If you really want to use function branches, each error will have its own branch. This will help keep bug fixes separate from new features. In the end, it does not require branching for each developer.
2) I use the Hg tag. You are right that someone changes the tag if they really want it, but the tags are versioned, and you can set interceptors on the main hg repository to trigger warnings if the tag moves. I really would not worry about moving tags if you cannot trust your developers, in which case you are screwed.
source share