* fix(workspace): refresh a present per-task worktree at every respawn
ensure_worktree_self_heal treated an already-present worktree as a pure
no-op (venv-link + chown only), so a worktree created once at first claim
or first claim_review stayed frozen at that commit across every later
respawn even as new commits landed on origin — the root mechanism behind
a live multi-round QA/PR-gate bounce loop, where the reviewer kept
re-examining its own stale round-1 checkout.
_ensure_worktree_before_spawn now classifies the caller's role
(WORKTREE_AUTHOR_ROLES: developer/documenter, mirroring the gateway
commit tool's RBAC) and _refresh_present_worktree compares local HEAD
against origin/<branch>: behind-or-equal fast-forwards for every role
(never discarding an author's uncommitted edits to do it); strictly
ahead is always left alone; diverged only resets for a pure reader,
whose local history can never be anything but a stale prior-round
checkout.
conventions_check_for_task's list-vs-content gap (list from git objects,
content from the physical worktree) is closed as a side effect: the
reviewer's worktree is now current as of spawn, and the branch under
review gains no further commits while it sits in awaiting_pr_review.
* fix(workspace): refresh re-added worktrees; fail the dirty guard toward preservation
- A pruned worktree re-added from a surviving local ref now runs the same
fetch-and-classify refresh as a present one, so an evicted reviewer
worktree cannot resurrect a stale checkout.
- A failing git status reads as dirty, never clean: the guard that
protects an author's uncommitted edits fails toward preservation.
- The hard reset verifies the worktree is actually on the task branch
first; a detached or drifted worktree is left alone with a warning.
- The conventions-check docstring states the remaining second-claim
ceiling instead of claiming full closure.
---------
Co-authored-by: Renn F <rennf93@users.noreply.github.com>