Land a PR by monitoring conflicts, resolving them, waiting for checks, and squash-merging when green; use when asked to land, merge, or shepherd a PR to completion.
72
88%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Medium
Suggest reviewing before use
Merging as the human approval signal for
reviewDecision=REVIEW_REQUIRED only when the fast-path preflight is run with
the explicit admin-bypass flag and reports that bypass is required.gh CLI is authenticated.Human Review handoff: head=<PR head SHA>; at=<ISO-8601 timestamp>; validation=<commands>.python3 .codex/skills/land/land_watch.py --preflight --json --allow-review-required-admin-bypass --handoff-note '<handoff note>'.0, skip full local validation and the full watcher
loop for this already-green PR. The preflight has confirmed the head SHA is
unchanged since Human Review, checks are green, and no new human/Codex
feedback appeared since Human Review. Squash-merge with the PR title/body
after one final gh pr view --json mergeable,mergeStateStatus,reviewDecision
check still reports either a clean merge state or the exact
BLOCKED + REVIEW_REQUIRED state that requires administrator bypass.6, fails, or reports missing/uncertain data, use the
conservative fallback below.git diff --check; backend checks for backend changes; frontend checks for
frontend changes; and smoke/runtime checks for user-facing app changes.commit skill
and push with the push skill before proceeding.pull skill to fetch/merge origin/main and
resolve conflicts, then use the push skill to publish the updated branch.commit skill,
push with the push skill, and re-run checks.# Ensure branch and PR context
branch=$(git branch --show-current)
pr_number=$(gh pr view --json number -q .number)
pr_title=$(gh pr view --json title -q .title)
pr_body=$(gh pr view --json body -q .body)
handoff_note='Human Review handoff: head=<sha>; at=<timestamp>; validation=<commands>'
# Fast path for already-green PRs. If this exits 0, skip local validation and
# the full watcher loop. If it exits 6 or errors, use the conservative fallback.
if preflight_json=$(python3 .codex/skills/land/land_watch.py --preflight --json --allow-review-required-admin-bypass --handoff-note "$handoff_note"); then
requires_admin_bypass=$(
printf '%s' "$preflight_json" |
python3 -c 'import json,sys; print("true" if json.load(sys.stdin).get("requires_admin_bypass") else "false")'
)
mergeable=$(gh pr view --json mergeable -q .mergeable)
merge_state=$(gh pr view --json mergeStateStatus -q .mergeStateStatus)
review_decision=$(gh pr view --json reviewDecision -q .reviewDecision)
merge_args=(--squash --subject "$pr_title" --body "$pr_body")
if [ "$requires_admin_bypass" = "true" ]; then
if [ "$mergeable" = "MERGEABLE" ] && [ "$merge_state" = "BLOCKED" ] && [ "$review_decision" = "REVIEW_REQUIRED" ]; then
merge_args+=(--admin)
gh pr merge "${merge_args[@]}"
merge_rc=$?
if [ "$merge_rc" -eq 0 ]; then
exit 0
fi
exit "$merge_rc"
fi
elif [ "$mergeable" = "MERGEABLE" ] && { [ "$merge_state" = "CLEAN" ] || [ "$merge_state" = "HAS_HOOKS" ]; }; then
gh pr merge "${merge_args[@]}"
merge_rc=$?
if [ "$merge_rc" -eq 0 ]; then
exit 0
fi
exit "$merge_rc"
fi
fi
# Check mergeability and conflicts for the conservative fallback.
mergeable=$(gh pr view --json mergeable -q .mergeable)
if [ "$mergeable" = "CONFLICTING" ]; then
# Run the `pull` skill to handle fetch + merge + conflict resolution.
# Then run the `push` skill to publish the updated branch.
fi
# Conservative fallback: Borg UI local validation before merge. Keep this
# scope-sensitive for the PR.
git diff --check
if git diff --name-only origin/main...HEAD | rg -q '^(app|tests|requirements.txt|pytest.ini|ruff.toml)(/|$)'; then
ruff check app tests
ruff format --check app tests
pytest tests/unit -v
fi
if git diff --name-only origin/main...HEAD | rg -q '^frontend/'; then
(cd frontend && npm run check:locales && npm run typecheck && npm run lint && npm run build)
fi
# Fallback watcher path. The manual loop is a fallback when Python cannot run or
# the helper script is unavailable.
# Wait for review feedback: Codex reviews arrive as issue comments that start
# with "## Codex Review — <persona>". Treat them like reviewer feedback: reply
# with a `[codex]` issue comment acknowledging the findings and whether you're
# addressing or deferring them.
while true; do
gh api repos/{owner}/{repo}/issues/"$pr_number"/comments \
--jq '.[] | select(.body | startswith("## Codex Review")) | .id' | rg -q '.' \
&& break
sleep 10
done
# Watch checks
if ! gh pr checks --watch; then
gh pr checks
# Identify failing run and inspect logs
# gh run list --branch "$branch"
# gh run view <run-id> --log
exit 1
fi
# Squash-merge (remote branches auto-delete on merge in this repo)
gh pr merge --squash --subject "$pr_title" --body "$pr_body"For already-green PRs, the preflight command checks current GitHub state instead of repeating local validation:
python3 .codex/skills/land/land_watch.py --preflight --json --allow-review-required-admin-bypass --handoff-note "$handoff_note"The handoff note must come from the workpad final handoff notes:
Human Review handoff: head=<PR head SHA>; at=<ISO-8601 timestamp>; validation=<commands>The normal fast path is allowed only when all of these are true:
MERGEABLE and merge state is CLEAN or HAS_HOOKS.The review-required administrator-bypass fast path is allowed only when the
same head/check/feedback requirements pass, the preflight was run with
--allow-review-required-admin-bypass, mergeability is MERGEABLE, merge state
is BLOCKED, and reviewDecision is REVIEW_REQUIRED. In that case the
preflight JSON includes "requires_admin_bypass": true; merge with
gh pr merge --admin. If GitHub rejects the admin merge, record the missing
merge permission or branch-policy error in the workpad as the landing blocker.
Exit codes:
requires_admin_bypass field before choosing merge arguments.Use the asyncio watcher in the conservative fallback to monitor review comments, CI, and head updates in parallel:
python3 .codex/skills/land/land_watch.pyExit codes:
gh pr checks and gh run view --log, then
fix locally, commit with the commit skill, push with the push skill, and
re-run the watch.origin/main if needed, add a real author commit, and force-push to retrigger
CI, then restart the checks loop.origin/main, merge, force-push, and rerun CI.UNKNOWN, wait and re-check.gh pr merge --admin fails, do not retry normal merge. Record the exact
permission or branch-policy error in the workpad as the landing blocker.## Codex Review — <persona> issue comments (not job status) as the signal
that review feedback is available.git push --force-with-lease.## Codex Review — <persona> and include the reviewer’s
methodology + guardrails used. Treat these as feedback that must be
acknowledged before merge.gh api and reply with a prefixed comment.gh api repos/{owner}/{repo}/pulls/<pr_number>/commentsgh api repos/{owner}/{repo}/issues/<pr_number>/commentsgh api -X POST /repos/{owner}/{repo}/pulls/<pr_number>/comments \
-f body='[codex] <response>' -F in_reply_to=<comment_id>in_reply_to must be the numeric review comment id (e.g., 2710521800), not
the GraphQL node id (e.g., PRRC_...), and the endpoint must include the PR
number (/pulls/<pr_number>/comments).[codex].[codex] and state whether you will address the feedback now or
defer it (include rationale).[codex] ...) as an inline reply to the original review comment using
the review comment endpoint and in_reply_to (do not use issue comments for
this).[codex] ...) in the same place
you acknowledged the feedback (issue comment for Codex reviews, inline reply
for review comments).[codex] issue comment is posted acknowledging the findings.[codex] inline
replies).[codex] Changes since last review:
- <short bullets of deltas>
Commits: <sha>, <sha>
Tests: <commands run>[codex] update with a brief reason (e.g.,
out-of-scope, conflicts with intent, unnecessary).380827d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.