chore: improve agent harness guidance (#2185)

This commit is contained in:
Carlos Florêncio
2026-08-11 08:28:25 +01:00
committed by GitHub
parent a69a026741
commit 58e7be4b78
48 changed files with 1410 additions and 317 deletions
+133 -3
View File
@@ -8,7 +8,8 @@
#
# Raw output:
# JSON object with:
# - pr: { number, branch, is_cross_repository, head_repository_owner,
# - pr: { number, branch, is_cross_repository, base_ref_name, base_head_oid,
# merge_base_oid, base_advanced_since_head, head_repository_owner,
# head_repository_name, head_ref_name, head_ref_oid, maintainer_can_modify }
# - since: { head_oid, committed_at } or null
# - checks: [{ type, name, workflow, status, conclusion, details_url, target_url, run_id, job_id }]
@@ -30,7 +31,8 @@
#
# Summary output (--summary):
# JSON object with:
# - pr: { number, branch, is_cross_repository, head_repository_owner,
# - pr: { number, branch, is_cross_repository, base_ref_name, base_head_oid,
# merge_base_oid, base_advanced_since_head, head_repository_owner,
# head_repository_name, head_ref_name, head_ref_oid, maintainer_can_modify }
# - since: { head_oid, committed_at } or null
# - failed_checks: [{ name, workflow, status, conclusion, run_id, job_id, details_url, target_url }]
@@ -148,9 +150,14 @@ fi
errors='[]'
pr_json='{}'
pr_view_succeeded=false
checks_json='[]'
checks_head_sha=''
checks_snapshot_complete=false
base_ref_name=''
base_head_oid=''
merge_base_oid=''
base_advanced_since_head=null
approval_required_runs_json='[]'
review_threads_json='[]'
hidden_unresolved_threads_json='[]'
@@ -670,6 +677,38 @@ fetch_head_commit_json() {
}'
}
fetch_base_ref_json() {
local owner=$1
local repo=$2
local pr_number=$3
gh_json api graphql \
-f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
baseRefName
baseRefOid
}
}
}' \
-f owner="$owner" -f repo="$repo" -F pr="$pr_number" |
jq -c '{
base_ref_name: (.data.repository.pullRequest.baseRefName // null),
base_head_oid: (.data.repository.pullRequest.baseRefOid // null)
}'
}
fetch_merge_base_json() {
local owner=$1
local repo=$2
local base_head_oid=$3
local head_oid=$4
gh_json api "repos/$owner/$repo/compare/$base_head_oid...$head_oid" |
jq -c '{merge_base_oid: (.merge_base_commit.sha // null)}'
}
fetch_review_threads_nodes_json() {
local owner=$1
local repo=$2
@@ -761,7 +800,8 @@ comments_json='[]'
status_json='[]'
resolved_pr_number=''
is_cross_repository=null
if pr_view_json="$(gh_json pr view "$PR" --json number,headRefName,headRefOid,headRepositoryOwner,headRepository,maintainerCanModify,isCrossRepository,statusCheckRollup,comments,url)"; then
if pr_view_json="$(gh_json pr view "$PR" --json number,baseRefName,headRefName,headRefOid,headRepositoryOwner,headRepository,maintainerCanModify,isCrossRepository,statusCheckRollup,comments,url)"; then
pr_view_succeeded=true
resolved_pr_number="$(jq -r '.number // ""' <<<"$pr_view_json")"
if pr_url_owner="$(jq -r '.url | capture("github.com/(?<owner>[^/]+)/(?<repo>[^/]+)/pull/[0-9]+").owner // ""' <<<"$pr_view_json" 2>/dev/null)" && [[ -n "$pr_url_owner" ]]; then
repo_owner="$pr_url_owner"
@@ -771,6 +811,10 @@ if pr_view_json="$(gh_json pr view "$PR" --json number,headRefName,headRefOid,he
number: .number,
branch: (.headRefName // "unknown"),
is_cross_repository: (if has("isCrossRepository") then .isCrossRepository else null end),
base_ref_name: (.baseRefName // null),
base_head_oid: null,
merge_base_oid: null,
base_advanced_since_head: null,
head_repository_owner: (.headRepositoryOwner.login // null),
head_repository_name: (.headRepository.name // null),
head_ref_name: (.headRefName // null),
@@ -791,6 +835,43 @@ else
add_error "pr_view" "gh pr view failed"
fi
if [[ "$pr_view_succeeded" == "true" && -n "$repo_owner" && -n "$repo_name" && -n "$resolved_pr_number" ]]; then
if base_context_json="$(fetch_base_ref_json "$repo_owner" "$repo_name" "$resolved_pr_number")"; then
base_ref_name="$(jq -r '.base_ref_name // ""' <<<"$base_context_json")"
base_head_oid="$(jq -r '.base_head_oid // ""' <<<"$base_context_json")"
else
add_error "base" "gh api graphql base ref lookup failed"
fi
if [[ -n "$base_head_oid" && -n "$checks_head_sha" ]]; then
if merge_base_json="$(fetch_merge_base_json "$repo_owner" "$repo_name" "$base_head_oid" "$checks_head_sha")"; then
merge_base_oid="$(jq -r '.merge_base_oid // ""' <<<"$merge_base_json")"
else
add_error "merge_base" "gh api compare base and head failed"
fi
fi
if [[ -n "$base_head_oid" && -n "$merge_base_oid" ]]; then
if [[ "$base_head_oid" == "$merge_base_oid" ]]; then
base_advanced_since_head=false
else
base_advanced_since_head=true
fi
fi
pr_json="$(jq -c \
--arg base_ref_name "$base_ref_name" \
--arg base_head_oid "$base_head_oid" \
--arg merge_base_oid "$merge_base_oid" \
--argjson base_advanced_since_head "$base_advanced_since_head" \
'. + {
base_ref_name: (if $base_ref_name == "" then null else $base_ref_name end),
base_head_oid: (if $base_head_oid == "" then null else $base_head_oid end),
merge_base_oid: (if $merge_base_oid == "" then null else $merge_base_oid end),
base_advanced_since_head: $base_advanced_since_head
}' <<<"$pr_json")"
fi
if ! approval_required_runs_json="$(fetch_approval_required_runs_json "$repo_owner" "$repo_name" "$resolved_pr_number" "$checks_head_sha")"; then
approval_required_runs_json='[]'
add_error "approval_required_runs" "workflow runs API failed"
@@ -865,6 +946,55 @@ if [[ -n "$repo_owner" && -n "$repo_name" && -n "$resolved_pr_number" ]]; then
add_error "closing_head" "gh api graphql closing head commit failed"
fi
fi
# Re-read the base alongside the closing head. The base can advance while
# reviews and checks are collected, so the initial divergence fields are not a
# safe final snapshot.
if [[ -n "$repo_owner" && -n "$repo_name" && -n "$resolved_pr_number" ]]; then
if closing_base_context_json="$(fetch_base_ref_json "$repo_owner" "$repo_name" "$resolved_pr_number")"; then
closing_base_ref_name="$(jq -r '.base_ref_name // ""' <<<"$closing_base_context_json")"
closing_base_head_oid="$(jq -r '.base_head_oid // ""' <<<"$closing_base_context_json")"
closing_merge_base_oid=''
comparison_head_oid="$closing_head_oid"
[[ -n "$comparison_head_oid" ]] || comparison_head_oid="$checks_head_sha"
if [[ -n "$closing_base_head_oid" && -n "$comparison_head_oid" ]]; then
if closing_merge_base_json="$(fetch_merge_base_json "$repo_owner" "$repo_name" "$closing_base_head_oid" "$comparison_head_oid")"; then
closing_merge_base_oid="$(jq -r '.merge_base_oid // ""' <<<"$closing_merge_base_json")"
else
add_error "closing_merge_base" "gh api compare base and head failed after evidence collection"
fi
fi
base_ref_name="$closing_base_ref_name"
base_head_oid="$closing_base_head_oid"
merge_base_oid="$closing_merge_base_oid"
base_advanced_since_head=null
if [[ -n "$base_head_oid" && -n "$merge_base_oid" ]]; then
if [[ "$base_head_oid" == "$merge_base_oid" ]]; then
base_advanced_since_head=false
else
base_advanced_since_head=true
fi
fi
else
add_error "closing_base" "gh api graphql base ref lookup failed after evidence collection"
base_ref_name=''
base_head_oid=''
merge_base_oid=''
base_advanced_since_head=null
fi
pr_json="$(jq -c \
--arg base_ref_name "$base_ref_name" \
--arg base_head_oid "$base_head_oid" \
--arg merge_base_oid "$merge_base_oid" \
--argjson base_advanced_since_head "$base_advanced_since_head" \
'. + {
base_ref_name: (if $base_ref_name == "" then null else $base_ref_name end),
base_head_oid: (if $base_head_oid == "" then null else $base_head_oid end),
merge_base_oid: (if $merge_base_oid == "" then null else $merge_base_oid end),
base_advanced_since_head: $base_advanced_since_head
}' <<<"$pr_json")"
fi
if [[ -n "$opening_head_oid" && -n "$closing_head_oid" && "$opening_head_oid" != "$closing_head_oid" ]]; then
add_error "review_evidence" "head changed during evidence collection"
fi