diff --git a/policy/governance.md b/policy/governance.md index 00f5ed5f..3fe29728 100644 --- a/policy/governance.md +++ b/policy/governance.md @@ -44,8 +44,8 @@ make task-start NAME=feature/my-task TRIAGE_RECEIPT=/tmp/my-task-triage.json PRE 默认 `TASK_WORK_MODE=delivery`,继续要求严格 READY 和当前目标一致。 工作区忙或落后时先由 owner 保存现场并同步。远端不可达时,delivery 恢复仍以 REMOTE_UNVERIFIED 拒绝; 显式 `TASK_WORK_MODE=local` 可在先核验收据、活动任务、原 R0/HEAD/工作区范围后导入 LOCAL_READY 收据, -继续已授权局部工作(子任务以已登记的本地父分支为参考,且须包含记录的 `parent_head_sha`)。远端可达但目标缺失、 -回退/分叉或无法比较时仍拒绝。离线不得建任务、同步、PR 检查、Review/合入或交付,本地参考不视为最新或可交付。 +继续已授权局部工作(子任务仅在远端不可查询时以已登记的本地父分支为参考,且须包含记录的 `parent_head_sha`)。 +远端可达但目标或已登记父分支缺失(即使本地同名分支存在)、回退/分叉或无法比较时仍以 REMOTE_UNVERIFIED 拒绝,不导入收据。离线不得建任务、同步、PR 检查、Review/合入或交付,本地参考不视为最新或可交付。 局部恢复接口已具备,正式交付仍按[合入调度](delivery.md#合入调度)的单一最终窗口执行。 启用后,既有任务可以显式选择 local,保持原 R0,标记落后,继续已授权局部工作: diff --git a/scripts/task.sh b/scripts/task.sh index 9d1f6fee..da30cc4a 100755 --- a/scripts/task.sh +++ b/scripts/task.sh @@ -663,7 +663,7 @@ except Stop as error: sys.exit("ERROR: " + error.message) sys.exit(0 if any(row["子任务分支"].strip("`").strip() == sys.argv[2] for row in rows) else 1)' "$SCRIPT_DIR" "$1" } -resolve_parent_ref() { # $1=父 initiative 分支 → 打印用于同步/核验的提交(delivery 仅远端;local 取远端与本地包含对方的一侧,远端不可查询时取本地) +resolve_parent_ref() { # $1=父 initiative 分支 → 打印用于同步/核验的提交(delivery 仅远端;local 取远端与本地包含对方的一侧,远端可达但父分支缺失返回 6,仅远端不可查询时取本地) git check-ref-format "refs/heads/$1" >/dev/null || die "invalid parent branch $1" if [ "$(work_mode)" = delivery ]; then # delivery 只认 origin 上刚取回的父分支头:本地领先/分叉意味着未准入的提交,不得被同步或合入。 @@ -684,7 +684,11 @@ resolve_parent_ref() { # $1=父 initiative 分支 → 打印用于同步/核验 return 6 fi remote=$(git rev-parse --verify "refs/remotes/origin/$1^{commit}") - elif [ "$rc" -ne 2 ]; then + elif [ "$rc" -eq 2 ]; then + # 远端可达而登记的父分支缺失:权威侧已不认该父分支,本地同名分支不得替代。 + echo "[verdict] REMOTE_UNVERIFIED — origin is reachable but $1 is missing; preserve local work and reconcile the parent initiative" >&2 + return 6 + else # 远端不可查询时只把已登记的本地父分支作为局部续作参考;不声称其为最新或可交付,调用方仍核验 parent_head_sha。 local_ref=$(git rev-parse -q --verify "refs/heads/$1^{commit}" 2>/dev/null || true) if [ -z "$local_ref" ]; then