agent-exec transport 2f332e8b99c2b13e0f8734136a777328/db30d3293d24
This commit is contained in:
@@ -62,8 +62,8 @@ LOCAL_READY 只用于局部恢复;新任务入口始终校验严格 READY,
|
||||
一致、工作区干净且组件状态未变;收据 `root_target/immediate_target` 等于卡片范围;目标只允许快进落后,回退或分叉拒绝。
|
||||
远端跟踪目标 ref 缺失时,local 模式的 precheck 与 `resume-local` 只在当前登记任务身份、本地 R0 对象、R0 为本地 HEAD 祖先、
|
||||
工作区干净、分支/worktree、组件与范围全部核验通过时继续。缺失或过期的远端 ref 从不证明新鲜度;只要有任一目标历史可用,
|
||||
其祖先关系须一致。local precheck 刷新失败时,远端不可查询或目标 ref 缺失按上述本地核验继续;远端可查询且已有缓存目标时,
|
||||
通告提交须本地存在且为缓存目标后代才继续,回退/分叉或通告提交本地缺失无法比较均判 REMOTE_UNVERIFIED。
|
||||
其祖先关系须一致。local precheck 刷新失败时,远端不可查询按上述本地核验继续;远端可查询时,以缓存目标(无缓存时为活动任务卡
|
||||
登记的 R0)为基线,通告提交须本地存在且为基线后代才继续,目标 ref 缺失、回退/分叉或通告提交本地缺失无法比较均判 REMOTE_UNVERIFIED。
|
||||
正式 Review 与合入仍须先完成新鲜的权威同步。
|
||||
`resume-delivery` 仍要求 READY 且收据目标等于当前权威目标。LOCAL_READY 始终是 SELF 本地工作记录,
|
||||
不能用于建任务、正式交付、Review、合入、CI、GATE 或 REPLAY。
|
||||
|
||||
+12
-10
@@ -18,13 +18,13 @@ fetch_target() {
|
||||
git rev-parse --verify "refs/remotes/origin/${TARGET_BRANCH}^{commit}" >/dev/null \
|
||||
|| { echo "[verdict] REMOTE_UNVERIFIED — target commit missing" >&2; return 6; }
|
||||
}
|
||||
target_history() { # $1=可选基线(无缓存目标时代替比较,如任务 R0)→ 输出 ok(远端不可查询/目标 ref 缺失/无缓存目标/通告提交为缓存后代)、rewound(回退或分叉)或 uncomparable(通告提交本地缺失或无法比较)
|
||||
local cached advertised rc=0
|
||||
target_history() { # $1=可选基线(无缓存目标时代替比较,如任务 R0)→ 输出 ok(远端不可查询/通告提交为基线后代)、rewound(回退或分叉)或 uncomparable(远端可查询但目标 ref 缺失、无基线、通告提交本地缺失或无法比较)
|
||||
local cached listing advertised rc=0
|
||||
cached=$(git rev-parse -q --verify "refs/remotes/origin/${TARGET_BRANCH}^{commit}" 2>/dev/null) || cached=${1:-}
|
||||
[ -n "$cached" ] || { echo ok; return 0; }
|
||||
advertised=$(git ls-remote origin "refs/heads/${TARGET_BRANCH}" 2>/dev/null \
|
||||
| awk -v ref="refs/heads/${TARGET_BRANCH}" '$2 == ref && !seen { print $1; seen = 1 }') || { echo ok; return 0; }
|
||||
[ -n "$advertised" ] || { echo ok; return 0; }
|
||||
listing=$(git ls-remote origin "refs/heads/${TARGET_BRANCH}" 2>/dev/null) || { echo ok; return 0; }
|
||||
advertised=$(printf '%s\n' "$listing" \
|
||||
| awk -v ref="refs/heads/${TARGET_BRANCH}" '$2 == ref && !seen { print $1; seen = 1 }')
|
||||
[ -n "$advertised" ] && [ -n "$cached" ] || { echo uncomparable; return 0; }
|
||||
git cat-file -e "${advertised}^{commit}" 2>/dev/null || { echo uncomparable; return 0; }
|
||||
git merge-base --is-ancestor "$cached" "$advertised" 2>/dev/null || rc=$?
|
||||
case "$rc" in 0) echo ok ;; 1) echo rewound ;; *) echo uncomparable ;; esac
|
||||
@@ -153,12 +153,13 @@ cmd_precheck() {
|
||||
if [ "$mode" = local ]; then
|
||||
python3 "${SCRIPT_DIR}/evidence.py" --local-context --active || return 2
|
||||
if [ "$remote_fresh" -eq 0 ]; then
|
||||
case "$(target_history)" in
|
||||
# 无缓存目标时只以活动任务卡登记的 R0 作比较基线,不把它当作远端最新值。
|
||||
case "$(target_history "$(card_r0 "$(branch_card "$branch")")")" in
|
||||
rewound)
|
||||
echo "[verdict] REMOTE_UNVERIFIED — origin/${TARGET_BRANCH} rewound or diverged from the cached target; preserve local work and reconcile the target history"
|
||||
echo "[verdict] REMOTE_UNVERIFIED — origin/${TARGET_BRANCH} rewound or diverged from the known target; preserve local work and reconcile the target history"
|
||||
return 6 ;;
|
||||
uncomparable)
|
||||
echo "[verdict] REMOTE_UNVERIFIED — advertised origin/${TARGET_BRANCH} commit is missing locally and cannot be compared with the cached target; preserve local work and retry the refresh"
|
||||
echo "[verdict] REMOTE_UNVERIFIED — origin/${TARGET_BRANCH} is missing or its advertised commit cannot be compared with the known target; preserve local work and retry the refresh"
|
||||
return 6 ;;
|
||||
esac
|
||||
fi
|
||||
@@ -498,7 +499,7 @@ cmd_resume() {
|
||||
remote_fresh=0
|
||||
local r0 ls_rc=0
|
||||
[ -n "$card" ] || die "no registered task card for ${branch}; receipt not imported"
|
||||
r0=$(sed -n 's/^- 权威仓:.*;R0(initial_base_sha)= \([0-9a-f]\+\)[[:space:]]*$/\1/p' "$card" | head -1)
|
||||
r0=$(card_r0 "$card")
|
||||
[ -n "$r0" ] || die "task card has no initial baseline; receipt not imported"
|
||||
git ls-remote --exit-code --heads origin "refs/heads/${TARGET_BRANCH}" >/dev/null 2>&1 || ls_rc=$?
|
||||
if [ "$ls_rc" -eq 2 ]; then
|
||||
@@ -604,6 +605,7 @@ card_status() { sed -n 's/^.*;状态:\([^;]*\).*/\1/p' "$1" | head -1; }
|
||||
# 两级分支元数据行:'- 分支类型:<kind>;initiative_id:…;root_target:…;immediate_target:…;accepting_requirements:…'。
|
||||
# 旧卡没有该行:按 standalone、root/immediate 均为目标分支、不接收新需求处理。
|
||||
card_field() { sed -n "s/^- 分支类型:.*;$2:\([^;]*\).*/\1/p" "$1" 2>/dev/null | head -1; }
|
||||
card_r0() { sed -n 's/^- 权威仓:.*;R0(initial_base_sha)= \([0-9a-f]\+\)[[:space:]]*$/\1/p' "$1" 2>/dev/null | head -1; }
|
||||
card_branch_kind() { local v; v=$(sed -n 's/^- 分支类型:\([^;]*\).*/\1/p' "$1" 2>/dev/null | head -1); printf '%s\n' "${v:-standalone}"; }
|
||||
card_initiative_id() { card_field "$1" initiative_id; }
|
||||
card_root_target() { local v; v=$(card_field "$1" root_target); printf '%s\n' "${v:-${TARGET_BRANCH}}"; }
|
||||
|
||||
Reference in New Issue
Block a user