Skip to content

Keep PR-batch review closeout autonomous - #160

Merged
justin808 merged 21 commits into
mainfrom
jg-codex/autonomous-pr-batch-review
Jul 15, 2026
Merged

Keep PR-batch review closeout autonomous#160
justin808 merged 21 commits into
mainfrom
jg-codex/autonomous-pr-batch-review

Conversation

@justin808

@justin808 justin808 commented Jul 15, 2026

Copy link
Copy Markdown
Member

Summary

  • Make trusted PR-batch review closeout follow its evidence-backed fix now, defer, or decline recommendation without another maintainer prompt.
  • Reserve maintainer interruption for an explicit ask user outcome, independent of merge authority.
  • Rebuild triage and worklists after verification so stale classifications cannot drive execution.
  • Preserve review feedback when an unpushable source PR must be replaced, including source-aware reply routing, restart-safe per-item outcome state, conditional cutoffs, and first-harvest review-bot waiting.
  • Add regression contracts and update the changelog.

Verification

  • bin/validate
  • ruby skills/pr-batch/bin/single_target_entrypoint_test.rb
  • ruby skills/address-review/bin/fetch-pr-review-data-test.rb
  • Independent GPT-5.4 high-reasoning review: no findings

Trusted reviewer investigation

PR #8 predates the trusted-actor allowlist addition. The current trust preflight recognizes the configured bot reviewers, and an audit of the recent merged PR sample did not reproduce a missed trusted actor. No trusted-actor configuration change is included here; a newer concrete PR URL would be needed to isolate any separate current miss.


Compound Engineering
Codex

Summary by CodeRabbit

  • New Features

    • Added autonomous, evidence-backed handling of trusted PR-batch review closeout, including fix, defer, and decline recommendations.
    • Added support for carrying review work between original and replacement pull requests while preserving item context and checkpoint status.
    • Added coordinated review flows that reduce unnecessary prompts and request maintainer input only when needed.
  • Bug Fixes

    • Improved review-result routing and resolution across related pull requests.
    • Strengthened safeguards against incomplete, ambiguous, or unsupported automated decisions.
  • Documentation

    • Clarified coordinated review, replacement pull request, checkpoint, and fallback behavior.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@justin808, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 39 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9c41fb96-43a0-4981-bd66-ea34c92d5367

📥 Commits

Reviewing files that changed from the base of the PR and between 3f89f4d and 8c15b47.

📒 Files selected for processing (8)
  • CHANGELOG.md
  • skills/address-review/SKILL.md
  • skills/address-review/references/actions.md
  • skills/address-review/references/templates.md
  • skills/pr-batch/SKILL.md
  • skills/pr-batch/bin/single_target_entrypoint_test.rb
  • workflows/address-review.md
  • workflows/pr-processing.md
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch jg-codex/autonomous-pr-batch-review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Comment thread skills/address-review/references/templates.md
Comment thread skills/pr-batch/SKILL.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review: Keep PR-batch review closeout autonomous (#160)

Overview

This PR extends the address-review / pr-batch coordination contract in three main ways:

  1. Decouples autonomous review-closeout (COORDINATED_AUTOFIX=1) from merge_authority: auto_merge_when_gates_pass - coordination now applies whenever the visible task directly authorizes updating the PR, independent of merge mode.
  2. Replaces the old binary "auto-resolve narrow SKIPPED / keep DISCUSS interactive" model with an evidence-backed recommendation taxonomy (fix now / defer / decline / ask user) applied to both DISCUSS and SKIPPED items, executing everything except ask user without a prompt.
  3. Adds "replacement carryover": when a PR-batch parent must replace an unpushable original PR with a new one, address-review can now be invoked with COORDINATED_REVIEW_SOURCE_PR to fetch/triage the original PR's reviews, apply fixes on the replacement, and route replies/resolutions back to the original PR via a new ITEM_SOURCE_PR binding and a parallel address-review-source-state:v1 restart-state format.

The change is almost entirely markdown "prompt spec" plus embedded shell/awk templates, mirrored verbatim across skills/address-review/SKILL.md, references/actions.md, references/templates.md, workflows/address-review.md, workflows/pr-processing.md, and skills/pr-batch/SKILL.md, with a large batch of new string-presence assertions in single_target_entrypoint_test.rb keeping the mirrors in sync.

Findings posted inline

  • skills/address-review/references/templates.md (around line 304-320): the new awk validator for SOURCE_STATE_ROWS treats any blank trailing line as NF == 0, which fails the NF != 7 check and spuriously reports "malformed or duplicate" state. Since the template appends one more newline via printf before piping into awk, a SOURCE_STATE_ROWS value that itself already ends in a newline (a very natural way to accumulate rows) triggers a false failure even though every row is valid. Other multi-line vars in the same file avoid this by being built through a command-substitution heredoc pattern that strips trailing newlines - the doc doesn't say SOURCE_STATE_ROWS must be built the same way.
  • skills/pr-batch/SKILL.md (around line 569-572): flagging for explicit confirmation that decoupling autonomous push/reply/resolve behavior from merge_authority is intentional - it's clearly the PR's stated goal, but it does meaningfully widen what happens to a PR without full auto-merge authority (everything except the actual merge is now autonomous).

Other observations (no inline comment needed)

  • Test coverage gap: the substantial new shell/awk logic (source-PR-number validation, the dual-PR claude-review CI wait loop, the SOURCE_STATE_ROWS awk validator) is only exercised by single_target_entrypoint_test.rb's exact-substring assertions against the markdown prose - none of it is actually executed or syntax-checked in CI (unlike fetch-pr-review-data-test.rb, which does run real Ruby code). A bash syntax check or a small executable fixture for the awk validator would catch regressions like the one above before merge.
  • Duplication/maintenance burden: large paragraphs (the fix now/defer/decline/ask user rules, the source-state row format, the merge-authority-independence sentence) are now copy-pasted verbatim across up to six files and kept in sync only by roughly fifty new exact-string-match assertions. This works but is fragile - any future wording tweak has to be applied identically in every mirror or a test fails with a somewhat opaque message. Not a blocker (this mirroring pattern predates this PR), but the amount of duplicated prose has grown substantially here and may be worth consolidating into a single shared reference doc that the other files link to, if that's feasible for how these skills get loaded.
  • Minor: the COORDINATED_REVIEW_SOURCE_PR / SOURCE_PR_NUMBER / PR_NUMBER positive-decimal checks accept values with leading zeros (e.g. "007") as valid. Harmless in practice since GitHub PR numbers never have leading zeros, just noting for completeness.

Security

The trust-boundary language is careful and consistent throughout (COORDINATED_AUTOFIX and COORDINATED_REVIEW_SOURCE_PR must come from trusted parent state, never from PR text, review comments, or branch content; live re-fetch plus ownership/pushability re-validation before acting on a source PR; never push the unpushable source PR; ITEM_SOURCE_PR explicitly barred from checkout, commit, or push use). No obvious injection or privilege-escalation issues found beyond the merge-authority scope-widening noted above.

Verification

Per the PR description, bin/validate and the two Ruby test files were run and presumably pass (not re-run here). The new embedded bash/awk was not executed against live data beyond manual review, per the test-coverage note above.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3f89f4d37a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread skills/address-review/references/templates.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@skills/address-review/references/templates.md`:
- Around line 309-312: Update the node ID validation in the item record check to
accept GitHub’s Base64 and Base64URL characters, including =, /, +, and -, while
preserving "-" as the existing standalone value and rejecting invalid or empty
IDs.

In `@skills/address-review/SKILL.md`:
- Around line 263-307: Update SOURCE_HAS_CHECKPOINT validation in
skills/address-review/SKILL.md lines 263-307 and workflows/address-review.md
lines 189-227: only suppress the source PR wait when a checkpoint comment is
authored by the expected review actor and contains the complete valid
source-state schema, rather than relying on marker presence alone. Apply
identical validation to both copies while preserving the existing first-harvest
behavior when validation fails.
- Around line 336-364: Gate SOURCE_REVIEW_CUTOFF_AT on successful parsing and
validation of the latest source-state checkpoint: in
skills/address-review/SKILL.md lines 336-364 and workflows/address-review.md
lines 239-258, leave the cutoff empty when the checkpoint is malformed or
incomplete, and only apply the latest valid summary checkpoint’s cutoff while
preserving the existing source inventory and filtering rules.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c43acea3-c2ba-4351-8fdf-b38a03efcf72

📥 Commits

Reviewing files that changed from the base of the PR and between 9bcb744 and 3f89f4d.

📒 Files selected for processing (9)
  • CHANGELOG.md
  • skills/address-review/SKILL.md
  • skills/address-review/bin/fetch-pr-review-data-test.rb
  • skills/address-review/references/actions.md
  • skills/address-review/references/templates.md
  • skills/pr-batch/SKILL.md
  • skills/pr-batch/bin/single_target_entrypoint_test.rb
  • workflows/address-review.md
  • workflows/pr-processing.md

Comment thread skills/address-review/references/templates.md
Comment thread skills/address-review/SKILL.md
Comment thread skills/address-review/SKILL.md
Comment thread skills/address-review/references/actions.md
@justin808

Copy link
Copy Markdown
Member Author

Address-review summary

Scan scope: full PR history; no prior address-review summary cutoff.

Mattered

  • Fixed source-state node-ID validation in 4b270b5: GitHub Base64/Base64URL characters are accepted while the standalone - sentinel and nonempty validation remain enforced. This resolves the duplicate Codex and CodeRabbit findings.
  • Fixed source first-harvest wait suppression in 4b270b5: only a checkpoint from the authenticated review actor with one complete schema-valid, identity-unique state block suppresses the source wait.
  • Fixed source restart/cutoff selection in 4b270b5: marker-only, wrong-author, malformed, duplicate, or incomplete state supplies neither restart state nor a cutoff; status checkpoints never advance the cutoff.
  • Confirmed the merge-authority separation is intentional: direct PR-update authorization governs review closeout, while merge authority governs only the merge action.
  • Confirmed the requested DISCUSS routing: confident fix now/defer/decline outcomes execute and are logged; only ask user pauses for human help.

Optional

  • Fixed trailing-blank-record tolerance in the source-state validator without weakening expected-row completeness checks.
  • Added an executable jq fixture covering authenticated valid checkpoints, padded node IDs, wrong authors, marker-only bodies, duplicate identities, and newest-first selection.
  • Declined broader prose-mirror consolidation in this review pass because it would expand beyond the bounded closeout and the current mirror contract is validated by repository tests.
  • Declined special handling for leading-zero PR numbers; GitHub PR identities do not use that form and the existing positive-decimal acceptance is harmless.

Skipped

Autonomously resolved threads

Validation: ruby skills/pr-batch/bin/single_target_entrypoint_test.rb, ruby skills/address-review/bin/fetch-pr-review-data-test.rb, and bin/validate all passed on 4b270b5; RuboCop inspected 49 files with no offenses.

Next default scan starts after this comment. Say check all reviews to rescan the full PR.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4b270b5c7c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread workflows/address-review.md
Comment thread skills/address-review/references/templates.md Outdated
Comment thread skills/address-review/SKILL.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review: Keep PR-batch review closeout autonomous (#160)

Overview

This is a documentation/spec-only PR (9 files, ~1063/-139 lines) touching the address-review and pr-batch agent skills. It has three main thrusts:

  1. Evidence-backed autonomy for DISCUSS/SKIPPED items under COORDINATED_AUTOFIX=1: instead of always stopping for a human on material DISCUSS items, the checkpoint now assigns each one a recommendation (fix now / defer / decline / ask user) and executes everything except ask user without prompting.
  2. Replacement-PR review carryover: when the original PR's head can't be pushed (e.g. fork without write access), address-review can now run against a replacement PR while still fetching, triaging, and closing out the original PR's review threads via a new COORDINATED_REVIEW_SOURCE_PR parameter, source-aware reply routing (ITEM_SOURCE_PR), and a separate restart-safe address-review-source-state:v1 checkpoint format.
  3. First-harvest-only review-bot wait on the source PR, plus mirrored contract tests (fetch-pr-review-data-test.rb, single_target_entrypoint_test.rb) that assert the prose stays byte-identical across the four places it's duplicated (skills/address-review/SKILL.md, references/actions.md, references/templates.md, workflows/address-review.md, skills/pr-batch/SKILL.md).

Code quality / consistency

  • The duplication-detection discipline is strong: single_target_entrypoint_test.rb asserts dozens of exact-string matches across the mirrored documents, and a dedicated extract_source_checkpoint_filter helper diffs the two embedded jq validators line-by-line so they can't silently drift. I spot-checked several of these (bot priority or severity alone never qualifies, never auto-fixed, the jq valid_row filter) and they match exactly across files.
  • The new fetch-pr-review-data-test.rb case (status-marker comment with a newer timestamp than the summary marker, asserting the cutoff still comes from the summary) is a well-targeted regression test — I traced it against compute_cutoff in fetch-pr-review-data, which already filters on SUMMARY_MARKER only, so this locks in existing-and-correct behavior rather than requiring an implementation change.
  • Left an inline nit: the awk-based source-state row validator in references/templates.md (item-id regex ^[0-9]+$ + != "0") is looser than the jq-based consumers (^[1-9][0-9]*$), so it isn't covered by the byte-identical mirroring test. Not exploitable in practice since GitHub IDs never have leading zeros, but worth tightening for provable consistency.

Security

  • COORDINATED_AUTOFIX and COORDINATED_REVIEW_SOURCE_PR are both explicitly restricted to trusted-parent state and repeatedly forbidden from being derived from PR text/comments/branch content — this is the right defense against prompt injection from untrusted review content, and it's backed by a test (trusted_source_origin).
  • Replacement-carryover source/primary identity is re-validated live (host, repo, distinct PR numbers, unpushable source head, pushable owned primary head) rather than trusted from caller input, which guards against a compromised or stale source-PR pointer being used to push/mutate the wrong PR.
  • Left an inline note on the bigger policy shift: coordinated DISCUSS items that the checkpoint self-certifies as "in-scope and safe" now execute (fix now/defer/decline) without a human in the loop, where before they always stayed interactive. The guardrails (ask user escape hatch, scope/security/behavior boundaries, no new tracking issues) look reasonable, but this is a genuine autonomy increase worth maintainers explicitly signing off on rather than a mechanical/bug-level concern.

Other notes

  • CHANGELOG.md entry is filed under "Fixed" even though this is primarily new capability (replacement carryover, evidence-backed recommendations) rather than a bug fix — consistent with how this repo's changelog seems to bucket most entries, so not blocking.
  • I was not able to execute bin/validate or the two Ruby test files in this sandboxed review environment (script execution was blocked), so the "PASS" status of those tests is based on static tracing rather than a live run — worth confirming CI is green before merge.

No blocking issues found. The two inline comments above are a minor consistency nit and a design-awareness callout, not correctness bugs.

@justin808

Copy link
Copy Markdown
Member Author

Address-review summary

Scan scope: review activity after 2026-07-15T01:31:52Z.

Mattered

Optional

Skipped

Autonomously resolved threads

Validation on 6be9b02: focused PR-batch contract test, review-data helper test, RuboCop, and full bin/validate all passed; 49 Ruby files had no offenses.

Next default scan starts after this comment. Say check all reviews to rescan the full PR.

Comment thread skills/pr-batch/SKILL.md
Comment thread skills/address-review/SKILL.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Summary

This PR is a spec/documentation-only change (no application code) that (1) decouples trusted PR-batch coordinated review closeout from merge_authority: auto_merge_when_gates_pass, replacing it with evidence-backed per-item fix now / defer / decline / ask user recommendations, and (2) adds a "replacement PR carryover" mechanism so review feedback on an unpushable original PR can be triaged, fixed, and replied-to via a pushable replacement PR while routing replies back to the original threads.

What the PR does:

  • Removes the prior merge_authority: auto_merge_when_gates_pass gate on COORDINATED_AUTOFIX=1; coordinated review-decision authority is now independent of merge authority (see inline comment).
  • Replaces the old "auto-resolve only locally-verified duplicate/incorrect threads" carve-out with a structured per-DISCUSS/SKIPPED item recommendation (fix now / defer / decline / ask user), executed without prompting except for ask user.
  • Adds COORDINATED_REVIEW_SOURCE_PR support: fetches and triages both the primary (replacement) and source PR review inventories, combines actionable source items into the replacement worklist, and posts a separate restart-safe address-review-source-state:v1 checkpoint on the source PR while only ever pushing code to the replacement.
  • Adds a "first harvest only" review-CI wait for the source PR to avoid re-waiting on every rerun.
  • Mirrors all of the above between skills/address-review/SKILL.md, skills/address-review/references/actions.md, skills/address-review/references/templates.md, workflows/address-review.md, skills/pr-batch/SKILL.md, and workflows/pr-processing.md, and extends single_target_entrypoint_test.rb with roughly 40 new contract assertions (including an actual jq execution test of the checkpoint validator, not just string matching) plus a new fetch-pr-review-data-test.rb case confirming status markers never advance the cutoff.

Correctness:

  • Verified the cutoff-computation claim in the new test case (fetch-pr-review-data-test.rb) against the actual implementation (bin/fetch-pr-review-data): compute_cutoff already only considers comments matching SUMMARY_MARKER via start_with?, so the new "status marker should not advance cutoff" test documents already-correct behavior rather than fixing a bug.
  • The shell/jq/awk validation logic for the new address-review-source-state:v1 row schema (regex checks for source-PR/item-ID/thread-ID/timestamp/outcome, dedup via seen[key]++, NF != 7 field-count check) looks internally consistent, and the new Ruby test actually executes the jq filter against fixture data (valid/duplicate/wrong-author/marker-only cases) rather than only asserting substrings are present, a good improvement in test rigor over the existing string-matching contract tests.
  • Left two inline comments: one on the merge_authority decoupling (a real, if intentional, widening of autonomous behavior worth flagging), and one on schema-validation logic duplicated 4x across two blocks in the same file (wait-probe vs fetch-bind) with no same-file consistency check.

Security:

  • COORDINATED_REVIEW_SOURCE_PR / COORDINATED_AUTOFIX continue to be sourced only from trusted parent state, never from PR text, comments, or branch content, consistent with the existing threat model in this file.
  • Source-PR checkpoints are authenticated by comparing the comment author against the current gh api user identity before being trusted as restart state, preventing a third party from spoofing checkpoint comments to suppress future scans.
  • ITEM_SOURCE_PR is explicitly documented as never used for checkout, commit, or push, keeping code mutation confined to the pushable replacement PR, good defense against accidentally pushing to a PR the automation does not own.

Test coverage:

  • bin/validate, the two Ruby test files, and (per the PR description) an independent GPT-5.4 review were run before submission. I was not able to execute the ruby test files myself in this sandbox (Bash approval unavailable), but read through both test files; the new single_target_entrypoint_test.rb assertions are substantive (exact shared phrases across address_review, address_review_actions, address_review_workflow, workflow, batch, and templates files, plus one real jq execution test), not just superficial padding.

Maintainability note:

  • The amount of near-identical prose and shell duplicated across SKILL.md, references/actions.md, references/templates.md, and the workflows/*.md mirrors continues to grow with this PR (large paragraphs repeated verbatim 3-5 times). The contract tests mitigate drift risk but make every future wording tweak a 4-6-file edit; worth keeping an eye on as this pattern scales further.

No blocking correctness or security issues found; the two inline comments are suggestions for reviewer awareness and follow-up hardening, not blockers.

@justin808

Copy link
Copy Markdown
Member Author

Address-review summary

Scan scope: review activity after 2026-07-15T01:47:14Z.

Mattered

Optional

  • Auto-deferred the non-blocking suggestion to add same-file validator-drift hardening at the final-candidate gate; no nit-only push was made, and the existing executable validator plus cross-mirror tests remain green. Thread: Keep PR-batch review closeout autonomous #160 (comment)

Skipped

Autonomously resolved threads

Current head 6be9b02: local bin/validate, hosted validate, Claude review, and CodeRabbit all passed; GitHub review decision is approved. No code changed and no push was made for this advisory-only pass.

Next default scan starts after this comment. Say check all reviews to rescan the full PR.

@justin808

Copy link
Copy Markdown
Member Author

Final-head QA evidence

QA required: yes — this PR changes developer workflow and autonomous review behavior.
Tested head: 6be9b02.
Focused workflow tests, review-data tests, diff checks, guard-mutation probes, producer/consumer validation probes, and the full repository validator passed.
Replay result: QA and priority-finding dispositions SATISFIED.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6be9b022b9

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread workflows/address-review.md
@justin808

Copy link
Copy Markdown
Member Author

Address-review summary

Scan scope: review activity after 2026-07-15T01:54:37Z.

Must-fix

  • Fixed the duplicate primary checkpoint post during replacement carryover by scoping the legacy direct post to non-carryover runs and making the Step 10 template the sole checkpoint owner during carryover. Added an executable workflow-mirror ownership contract. Thread: Keep PR-batch review closeout autonomous #160 (comment)

Autonomously resolved threads

Current head 1644340: focused tests, diff checks, RuboCop, and the full bin/validate suite pass locally. The fix was delivered in one fast-forward push. Hosted current-head checks are pending and will be polled before handoff.

Next default scan starts after this comment. Say check all reviews to rescan the full PR.

Comment thread skills/pr-batch/bin/single_target_entrypoint_test.rb
Comment thread skills/address-review/SKILL.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review summary

This PR is almost entirely a prose/spec change to the address-review and pr-batch skill docs (SKILL.md, actions.md, templates.md, and their workflows/*.md mirrors), plus two Ruby regression-test files. No application code paths change — the risk surface is (1) internal consistency between the mirrored documents, (2) correctness of the embedded shell/jq snippets these docs tell the agent to run, and (3) the trust boundary around the newly-autonomous fix now/defer/decline recommendation routing.

What it does

  • Makes coordinated (COORDINATED_AUTOFIX=1) address-review closeout execute its verified fix now/defer/decline recommendation without a maintainer prompt, reserving interruption for an explicit ask user outcome — and decouples that authority from merge_authority.
  • Adds COORDINATED_REVIEW_SOURCE_PR support so review feedback on an unpushable original PR can be carried over and closed out against a pushable replacement PR (dual-PR checkpoint state, source-aware reply routing, restart-safe per-item outcome rows).
  • Adds a first-harvest-only CI wait for the source PR, and a new address-review-source-state:v1 state-row schema with validators duplicated in jq (skill + workflow mirror) and awk (templates.md).
  • Expands fetch-pr-review-data-test.rb and adds a large new regression-test block to single_target_entrypoint_test.rb enforcing literal-string mirroring across the docs, plus a real jq-execution test against a fixture.

Strengths

  • The trust-boundary language is careful and repeated everywhere it matters: COORDINATED_REVIEW_SOURCE_PR must come from trusted parent state (never PR text/comments/branch content), requires live re-validation of host/repo/pushability facts, and an UNKNOWN/mismatched fact fails closed to blocking rather than silently proceeding.
  • Good fail-closed defaults: missing/duplicate/malformed source-state rows make readiness UNKNOWN rather than silently suppressing items; pending/ask-user rows are never treated as cutoff-safe.
  • The new Ruby test that shells out to jq against a fixture (checking author/marker/duplicate-row rejection) is a genuine behavioral check, not just string matching.

Findings posted inline

  1. skills/pr-batch/bin/single_target_entrypoint_test.rb (~L337-342): the new extract_source_checkpoint_filter cross-file consistency check only covers one of the two near-identical ~30-line jq validators embedded in SKILL.md/workflows/address-review.md (the cutoff-binding filter). The other copy — the Step 4 "first harvest" wait-probe filter — has no equivalent drift check, so it can silently diverge between the skill and its workflow-fallback mirror despite this PR's whole premise being tight mirroring.
  2. skills/address-review/SKILL.md (~L203-208): the COORDINATED_REVIEW_SOURCE_PR shell validation (case ... *[!0-9]*|0)) accepts leading-zero values like "007", which is looser than the "positive decimal" requirement stated in prose and the stricter ^[1-9][0-9]*$ pattern used elsewhere in the same feature (item-id validation). Low severity given downstream live-fact re-validation would likely catch resulting inconsistencies, but worth tightening for consistency.

Other observations (not blocking)

  • The address-review-source-state:v1 row validator is independently reimplemented at least 4 times in jq (2x in SKILL.md, 2x in workflows/address-review.md) plus once more in awk (templates.md) — three parallel implementations of the same schema, held in sync only by literal-string test assertions. Given the repo already extracted fetch-pr-review-data as a shared Ruby script for the main fetch, this validator seems like a strong candidate for the same treatment rather than relying on copy-paste + test-enforced mirroring (finding Fix seam-doctor crash under a non-UTF-8 locale #1 shows how that can already slip).
  • The overall duplication load across 5-6 files for this one feature is high (per the diff stats, ~1080 additions/140 deletions for what is conceptually one behavior change); that's a maintenance cost worth being aware of even though it appears to be this repo's established convention for skill vs. workflow-fallback docs.

No correctness bugs found in the actual logic (cutoff computation, row schema, dedup-by-identity semantics, mutual exclusion between primary/source PR mutations) — the two items above are consistency/coverage gaps rather than exploitable defects.

@justin808

Copy link
Copy Markdown
Member Author

Address-review summary

Scan scope: review activity after 2026-07-15T02:08:37Z.

Optional

  • Auto-deferred the request for a second cross-file wait-probe extractor as future mirror-maintenance hardening. Both copies are currently identical, and the executable fixture plus validator-count contracts pass; no final-candidate nit-only push was made. Thread: Keep PR-batch review closeout autonomous #160 (comment)
  • Auto-deferred canonical rejection of leading-zero source PR numbers as trusted-input normalization hardening. GitHub canonicalizes zero-padded pull paths, and live distinctness/ownership/pushability validation still fails closed before mutation; no final-candidate nit-only push was made. Thread: Keep PR-batch review closeout autonomous #160 (comment)

Skipped

Autonomously resolved threads

Current head 1644340: local full bin/validate and hosted validate passed; Claude current-head review passed. No code changed and no additional push was made for this advisory-only pass.

Next default scan starts after this comment. Say check all reviews to rescan the full PR.

@justin808

Copy link
Copy Markdown
Member Author

Final-head closeout evidence

Current head: 1644340.
Independent QA and adversarial review are clean. Local and hosted validation, Claude review, and CodeRabbit passed. All review threads are resolved.
Replay result: QA and priority-finding dispositions SATISFIED.

@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Summary

This PR is a large (1420/-170 across 9 files) behavioral-spec change to the address-review and pr-batch skills. It's almost entirely natural-language/prompt instructions plus embedded shell/jq/awk snippets meant to be executed by an agent, plus one new Ruby test file update. No traditional application code changed.

What it does

  • Decouples COORDINATED_AUTOFIX=1 autonomy from merge_authority: auto_merge_when_gates_pass — coordinated review closeout can now run any time the visible task authorizes updating the PR, independent of merge authority.
  • Formalizes a fix now / defer / decline / ask user recommendation contract for coordinated DISCUSS items, with ask user as the only case that still pauses for a maintainer.
  • Adds "replacement carryover": when the original PR's head can't be pushed, a trusted PR-batch parent can invoke address-review on a replacement PR via COORDINATED_REVIEW_SOURCE_PR=<original-pr-number>, and review obligations (replies, resolutions, checkpoints) get routed back to the correct source PR/thread while code changes land only on the replacement.
  • Adds dual-PR ownership claims, restart-safe per-item source state (address-review-source-state:v1), forged-marker protection (only same-actor address-review-source-reply markers are excluded from triage), and a "first harvest" optimization for the CI review-check wait.

Strengths

  • The new Ruby test (skills/pr-batch/bin/single_target_entrypoint_test.rb) doesn't just assert substring presence — it extracts the embedded jq filters from the markdown and actually executes them via Open3.capture3 against realistic JSON fixtures, including adversarial cases (forged markers from another actor, duplicate/malformed/pending rows, padded Base64 node IDs). That's real verification of the shell logic, not just prose-matching.
  • Security-conscious design throughout: source PR numbers are only ever accepted from trusted parent state (never derived from PR text/comments/branch), source-state rows fail closed (UNKNOWN readiness) on anything malformed/incomplete/duplicate, and the address-review-source-reply marker can't be forged by another actor to suppress a real review item.
  • Claim/rollback logic for the new dual-PR (primary + source) mutual-exclusion gate correctly captures $? before the else block runs anything else, and rolls back only the targets acquired in that same loop iteration if a later claim fails.

Concerns

  1. Autonomy-gating relaxation is a real policy change, not just refactoring (flagged inline on skills/pr-batch/SKILL.md). Removing the merge_authority: auto_merge_when_gates_pass requirement means coordinated fix now/defer/decline can now execute without a human in the loop on runs that previously would not have had that authority. This looks intentional per the PR description, but it's worth an explicit acknowledgment that this is the desired blast radius — silent declines (with rationale, but no maintainer check) are now possible on more classes of runs than before.
  2. Minor validation inconsistency (flagged inline on skills/address-review/SKILL.md): the SOURCE_PR_NUMBER/PRIMARY_PR_NUMBER "positive decimal" check allows leading zeros ("007" would pass), while the source-state row validators elsewhere in the same PR use the stricter ^[1-9][0-9]*$. Low real-world risk (GitHub PR numbers aren't zero-padded) but inconsistent with the fail-closed intent stated elsewhere in the same diff.
  3. Heavy verbatim duplication across 6 files. Large paragraphs (the jq validators, the fix now/defer/decline/ask user contract text, the dual-target claim loop, etc.) are copy-pasted byte-for-byte across skills/address-review/SKILL.md, references/actions.md, references/templates.md, workflows/address-review.md, workflows/pr-processing.md, and skills/pr-batch/SKILL.md. The new tests guard many of these via exact-substring assertions, which is good for catching accidental drift, but it also means every future behavior tweak requires editing (and re-mirroring) up to 6 locations by hand — a real ongoing maintenance cost for a change of this size.
  4. Doc gap: docs/pr-batch-skills.md (the human-facing guide) doesn't appear to mention the new COORDINATED_REVIEW_SOURCE_PR replacement-carryover mechanism or the relaxed COORDINATED_AUTOFIX gating, even though both are meaningful behavior changes for anyone operating this skill.
  5. I was not able to execute bin/validate, ruby skills/pr-batch/bin/single_target_entrypoint_test.rb, or ruby skills/address-review/bin/fetch-pr-review-data-test.rb in this review sandbox (command execution was blocked), so I could not independently confirm the "Verification" section's claims — I relied on static reading of the diff and the test source instead.

Nit

  • The new CHANGELOG entry (under #### Fixed) doesn't include a PR link/attribution like most neighboring entries — inconsistent with the file's convention, not a functional issue.

Overall this is a well-tested, carefully-scoped (if very large) extension of an existing autonomous-review-closeout system, with genuine executable test coverage for the trickiest new logic (the jq source-state validators). The main things worth a second look before merge are the autonomy/merge-authority decoupling (#1) and the maintenance cost of the multi-file duplication (#3).

@justin808

Copy link
Copy Markdown
Member Author

Final exact-head QA and priority disposition evidence for 4813a1be426eff89f4e4c1eec7ea0218d5a38de7:

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5aa2335579

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread skills/address-review/SKILL.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Summary

This PR extends the address-review / pr-batch coordinated-autofix machinery with two related changes: (1) coordinated f now executes an evidence-backed fix now / defer / decline recommendation for every DISCUSS/SKIPPED item without pausing, only stopping for ask user, and (2) it adds a "replacement carryover" flow so review feedback on an unpushable original PR gets triaged, applied on a pushable replacement PR, and reported back to the original via a source-state checkpoint protocol.

Overall: the change is well-specified and, unusually for this kind of prose/prompt spec, the embedded jq/awk snippets get real behavioral test coverage in single_target_entrypoint_test.rb (fixtures piped through Open3.capture3), not just substring assertions. The source-reply marker forgery protection (only a same-actor <!-- address-review-source-reply --> comment is excluded from triage; another actor's use of the marker is still a candidate) is a good, deliberate closing of a spoofing loophole.

Points worth a maintainer's explicit sign-off (not bugs, but real policy/consistency changes):

  1. Coordinated autofix authority is decoupled from merge_authority. Previously COORDINATED_AUTOFIX=1 required the parent to also hold merge_authority: auto_merge_when_gates_pass. This PR removes that coupling ("Coordinated review-decision authority... is independent of merge_authority; merge authority governs merge only") — see inline comment. That's the PR's stated goal, but it meaningfully broadens which runs get unattended-decline/defer authority over substantive DISCUSS feedback (previously interactive-only outside the narrow "duplicate/factually incorrect" carve-out). Worth a deliberate ack that this is the intended tradeoff.
  2. workflows/address-review.md (the non-Claude-Code fallback prompt) doesn't literally embed the SOURCE_PR_NUMBER validation shell logic the way skills/address-review/SKILL.md does — it describes it in prose instead. The test suite only asserts the phrase "leading-zero forms" appears, not byte/logic equivalence with the skill's case-statement. Since two other shared blocks (extract_source_checkpoint_filter, extract_source_wait_checkpoint_filter, and the claim/rollback loop) are asserted byte-identical between the two files, this one gap means the fallback path relies on an LLM re-deriving the exact validation from prose alone, which is a plausible drift point over time.
  3. Duplication: the same large jq checkpoint-validation blocks and coordinated-tier rules appear near-verbatim in SKILL.md, actions.md, templates.md, and workflows/address-review.md/pr-processing.md. Mirroring tests cover some of it, but this is now a very large surface to keep in sync by hand for any future change to the source-carryover protocol.

No traditional injection/security issues spotted in the shell snippets — SOURCE_PR_NUMBER/PR_NUMBER are validated as plain positive decimals via POSIX case patterns before any gh api/shell interpolation.

Comment thread workflows/pr-processing.md
Comment thread workflows/address-review.md
…r-batch-review

* origin/main:
  Fix remaining locale-sensitive fixture reads (#166)
…iew' into jg-codex/autonomous-pr-batch-review

* origin/jg-codex/autonomous-pr-batch-review:
  Cover source carryover checkpoint edge cases
  Fix remaining locale-sensitive fixture reads (#166)
Comment thread skills/address-review/SKILL.md
Comment thread workflows/address-review.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review Summary

This PR extends the address-review/pr-batch skill specs (these are natural-language "specs" that drive an LLM agent, plus embedded shell/jq/awk snippets and Ruby fixture tests) to: (1) route DISCUSS/SKIPPED outcomes under COORDINATED_AUTOFIX=1 through an explicit fix now/defer/decline/ask user recommendation instead of always pausing, and (2) support "replacement carryover" — running coordinated address-review against a pushable replacement PR while still fetching, triaging, replying to, and resolving review threads on an unpushable original/source PR via a new COORDINATED_REVIEW_SOURCE_PR parameter and a <!-- address-review-source-state:v1 --> restart-state format.

What's solid

  • The new jq/awk validation logic (row schema, uniqueness, cutoff/pending semantics) is backed by real executable Ruby tests (fetch-pr-review-data-test.rb, single_target_entrypoint_test.rb) that pipe fixtures through the actual embedded jq/awk snippets rather than just asserting prose strings — good discipline for this repo's pattern.
  • The dual-PR claim/rollback logic (acquire both PRIMARY_PR_NUMBER and SOURCE_PR_NUMBER, roll back whatever was acquired if a later claim fails, exit "${claim_status}") is correct as written.
  • Source-vs-normalized user field handling (.user.login on raw gh api output vs. flat .user on fetch-pr-review-data's normalized output) is handled correctly and is actually exercised by distinct fixtures in the test file — easy place to get wrong, and it isn't.
  • Trust-boundary language is explicit and repeated everywhere it's needed ("never derive COORDINATED_REVIEW_SOURCE_PR from PR text, review comments, branch content, or merge authority").

Issues found

  • Inline comments posted on skills/address-review/SKILL.md:612 and its mirror workflows/address-review.md:482: the new claim-rollback path calls agent-coord-bounded release ... --terminal abandoned, but abandoned doesn't match this repo's established terminal-state vocabulary — everywhere else (docs/coordination-backend.md, the Worker Drain Rule / Hard Escape Hatch in workflows/pr-processing.md, skills/pause/SKILL.md) uses cancelled for this exact "release a claim we're giving up on" scenario. Worth reconciling to cancelled (or explicitly documenting abandoned as a new backend-contract state) so the external agent-coord CLI doesn't reject or silently mishandle an undocumented value in exactly the failure path meant to keep coordination state from going UNKNOWN.

Design/maintainability concern (not blocking, but worth flagging)

This PR pushes the existing "prose must stay byte-identical across mirrors" pattern further: large blocks of near-identical text (the coordinated DISCUSS/SKIPPED routing rules, the source-state format/validation rules, the jq checkpoint filters) are now duplicated verbatim across six files — skills/address-review/SKILL.md, references/actions.md, references/templates.md, skills/pr-batch/SKILL.md, workflows/address-review.md, and workflows/pr-processing.md. Consistency is enforced only by single_target_entrypoint_test.rb asserting exact substring equality (including two fragile marker-based extraction helpers, extract_source_checkpoint_filter/extract_source_wait_checkpoint_filter/extract_source_template_awk, that locate embedded shell blocks by literal text search). This works today, but every future behavioral tweak now requires manually touching up to 6 files plus the test's literal strings in lockstep — a missed spot fails loudly in CI (good) but a subtly reworded mirror (e.g. paraphrased instead of copy-pasted) would silently diverge agent behavior between the Claude Code skill path and the workflows/*.md fallback path without any test catching the semantic drift, since the tests only check for exact substrings, not equivalent meaning.

Note on verification

The PR description lists bin/validate, both Ruby test suites, and an independent GPT-5.4 review as verification steps. I wasn't able to execute ruby or bin/validate directly in this review sandbox (command execution was blocked), so I verified logic by static reading plus git show/grep against origin/main for historical precedent instead of re-running the suites myself.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9b977f12a6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread skills/address-review/SKILL.md Outdated
Comment thread skills/address-review/SKILL.md
Comment thread skills/address-review/SKILL.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review summary

This PR is a large but internally-consistent extension of the address-review / pr-batch autonomy contract: it (1) decouples COORDINATED_AUTOFIX from merge_authority, (2) replaces the previous binary "auto-resolve only verified duplicates" rule with a structured per-item fix now/defer/decline/ask user recommendation contract, and (3) adds a whole cross-PR "replacement carryover" mechanism (COORDINATED_REVIEW_SOURCE_PR) so review feedback on an unpushable original PR can be carried into a replacement PR without losing reviewer context.

What I checked

  • Traced the embedded bash/jq/awk logic by hand (dedup keys, cutoff/terminal-row rules, claim/rollback loop, source-reply marker exclusion) — it's consistent and fails closed on ambiguity (empty SOURCE_STATE_ROWS defaults, SOURCE_CUTOFF_SAFE defaults to 0, UNKNOWN readiness on missing/invalid state).
  • Spot-verified a few invariants the new Ruby tests assert directly against the working tree: the dual-target claim loop (for CLAIM_TARGET in ${CLAIM_TARGETS}; do) appears exactly twice in both skills/address-review/SKILL.md and workflows/address-review.md (matches the test's >= 2 mirror check), and the old single-target-only claim/status pattern (--target "${PR_NUMBER}" alone) is fully removed from both files.
  • Note: I could not execute bin/validate, single_target_entrypoint_test.rb, or fetch-pr-review-data-test.rb in this review environment (interpreter execution was blocked by sandbox policy), so I'm relying on static reading rather than the test run itself. The PR description states these were run and passed, and an independent GPT-5.4 review reported no findings.

Findings (posted inline, low severity)

  1. Trust-boundary/scope note on skills/address-review/SKILL.md:41 — decoupling coordinated autofix from merge_authority: auto_merge_when_gates_pass means unattended code pushes/thread-resolution/declines can now happen on PRs where the batch process does not have auto-merge authority, whereas before merge authority was an extra gate on this exact autonomy. This is clearly the intended change and is compensated by the new evidence-backed per-item recommendation + ask user escape hatch, but it's worth an explicit maintainer sign-off since it widens what happens fully unattended.
  2. Minor dead code at skills/address-review/SKILL.md:204 (and mirrored in workflows/address-review.md and references/templates.md) — the '' case alternative in the SOURCE_PR_NUMBER/SOURCE_STATE_EXPECTED_COUNT validation guards is unreachable because it's always nested inside a [ -n "..." ] check. Harmless, just a minor clarity nit.

Overall this looks like a careful, well cross-referenced change with good test coverage for the new cross-PR carryover mechanics (the Open3-based jq/awk fixture tests in single_target_entrypoint_test.rb actually exercise the embedded filters rather than just checking prose presence, which is a nice level of rigor for a documentation-as-code repo). No blocking correctness or security issues found beyond the scope-widening note above, which reads as intentional.

Comment thread skills/pr-batch/SKILL.md
Comment thread CHANGELOG.md
@claude

claude Bot commented Jul 15, 2026

Copy link
Copy Markdown

Review: Keep PR-batch review closeout autonomous (#160)

Overview

This PR is entirely a "specification" change: it edits prose/markdown skill instructions (skills/address-review/SKILL.md, skills/address-review/references/actions.md, skills/address-review/references/templates.md, skills/pr-batch/SKILL.md, workflows/address-review.md, workflows/pr-processing.md) plus two Ruby regression tests that assert literal strings/shell/jq/awk snippets are present and mirrored across those docs. No application/runtime code is touched. It:

  • Lets a trusted, evidence-backed DISCUSS/SKIPPED recommendation (fix now / defer / decline) execute autonomously under COORDINATED_AUTOFIX=1, reserving a stop-and-ask only for ask user.
  • Adds a "replacement carryover" protocol so review feedback isn't lost when a source PR's head becomes unpushable and work moves to a replacement PR — including source-aware reply routing, a restart-safe per-item TSV state block (address-review-source-state:v1), dual-PR coordination-claim acquisition/rollback, and first-harvest-only CI wait on the source PR.
  • Adds a <!-- address-review-source-reply --> marker so workflow-generated replies on the source PR don't get mistaken for new reviewer feedback, with an explicit anti-forgery rule (only a same-actor-authored marker is excluded).

Strengths

  • Fail-closed posture throughout: malformed/duplicate/identity-mismatched source state, unauthenticated checkpoints, and ambiguous tracker destinations all resolve to UNKNOWN/ask user rather than silently proceeding.
  • The forged-marker handling (a different actor posting the address-review-source-reply marker still counts as a real candidate) is a nice, deliberate anti-gaming detail, and it's fixture-tested.
  • The dual-target claim/rollback loop (skills/address-review/SKILL.md) correctly captures $? from the failed claim command before running any other command in the else branch, and terminal-releases only the targets actually acquired — this is a case that's easy to get wrong and it's handled correctly.
  • Good regression coverage: the new single_target_entrypoint_test.rb doesn't just grep for strings, it extracts the embedded jq/awk snippets and runs them against realistic fixtures (padded/unpadded base64 thread IDs, leading-zero rejection, duplicate identity rejection, stale vs. future activity timestamps).

Concerns

  1. Authority-scope expansion (flagged inline on skills/pr-batch/SKILL.md:572). Coordinated autonomous execution (push/reply/resolve threads/decline) is no longer gated by merge_authority: auto_merge_when_gates_pass — it now applies "for every merge-authority mode" as long as the visible task authorizes updating the PR. This is called out as intentional in the PR description, and it's test-covered, but it materially broadens where an agent can autonomously mutate a PR without a human in the loop. Worth an explicit maintainer sign-off that this trust bar is the right one, independent of merge authority.
  2. Heavy duplication across six files. The evidence-backed recommendation contract, the source-carryover contract, and several jq/awk validators are repeated near-verbatim in SKILL.md, actions.md, templates.md, workflows/address-review.md, pr-batch/SKILL.md, and workflows/pr-processing.md. Consistency is only enforced by literal-string assertions in single_target_entrypoint_test.rb. This works today, but it's a lot of surface area for future drift — a future edit to one copy that isn't run through this specific test file could silently diverge. Worth considering a single canonical source doc that the others reference, if the tooling supports includes.
  3. Verification not independently reproduced here. This review environment gates ruby/gh/jq/awk execution behind an approval step that wasn't available, so I could not independently run bin/validate, fetch-pr-review-data-test.rb, or single_target_entrypoint_test.rb to confirm they pass against this diff — I verified the logic by static reading only (7-field TSV row indices, base64/base64url thread-ID regex, duplicate/leading-zero rejection in the awk validator, and the jq identity_key/item_key distinction). Please confirm CI is green for all three before merging, since correctness here lives entirely in those tests.

No functional bugs found in the shell/jq/awk logic on static review; the two items above are judgment calls for maintainers rather than defects.

@justin808
justin808 merged commit 113256d into main Jul 15, 2026
17 checks passed
@justin808
justin808 deleted the jg-codex/autonomous-pr-batch-review branch July 15, 2026 05:11
@justin808

Copy link
Copy Markdown
Member Author

Final merged-head QA and priority disposition evidence for 8c15b4760eb57ce5114dbcc7286a66a8b4588658:

justin808 added a commit that referenced this pull request Jul 15, 2026
* origin/main:
  Keep PR-batch review closeout autonomous (#160)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant