Replace PR reviewer orchestration with a frozen review bundle - #69502
Merged
PureWeen merged 18 commits intoOct 1, 2026
Merged
Conversation
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Unresolved moderate issues and a critical publication-gating issue remain.
Get a fresh assessment by requesting another Copilot review.
Review effort: Lite
Findings: 1
Open (1)
What changed in this PR
Replaces live review orchestration with a trusted, frozen v2 review bundle and updates hosted publication gating.
Changes:
- Freezes PR state, diffs, feedback, guide routing, and linked guidance.
- Simplifies the review skill to consume bundle evidence.
- Updates the hosted workflow and lockfile with validation and live-head checks.
- Adds producer and offline evaluation tests.
| File | Summary |
|---|---|
.github/workflows/pull-request-review.md |
Hosted workflow and publication gates; unresolved GHES hostname handling and conflicting noop output validation issues. |
.github/workflows/pull-request-review.lock.yml |
Generated workflow lockfile update. |
.github/skills/review-pull-request/tests/prepare-review.test.mjs |
Producer behavior and validation tests. |
.github/skills/review-pull-request/tests/prepare-eval-fixture.mjs |
Evaluation fixture generation; routing and rename applicability are not fully recomputed. |
.github/skills/review-pull-request/SKILL.md |
Frozen-bundle review contract. |
.github/skills/review-pull-request/scripts/prepare-review.mjs |
Bundle producer; unresolved fragment parsing, external-link recording, and architecture-link classification issues. |
💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.
Align Components guidance routing and recompile with gh-aw v0.89.21. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> # Conflicts: # .github/workflows/pull-request-review.lock.yml
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Contributor
There was a problem hiding this comment.
Copilot review overview
🟡 Changes recommended
Bundle reuse can accept a concurrently stale target, and process-output limits are enforced only after unbounded buffering.
Review effort: Balanced
Findings: 1
Open (2)
Resolved since last review (1)
maraf
approved these changes
Oct 1, 2026
This was referenced Oct 1, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.


Summary
Replaces the orchestration-heavy
review-pull-requestskill (supersedes #69467) with a simpler design:scripts/prepare-review.csis a trusted producer. It is a .NET file-based app that uses only the BCL and runs withdotnet run prepare-review.cs -- --pr N. It:previous_filename;The manifest's
produceris the SHA-256 of the runningprepare-review.cssource. A bundle from any other producer is rejected on reuse.Script-local
Directory.Build.props,Directory.Build.targets, andDirectory.Packages.propsisolate it from the repository's build: no repo-root imports, and native AOT, trimming, and apphost are disabled. The isolated xUnit v3 test project,scripts/PrepareReview.Tests.csproj, is not referenced by any solution or product build. Run it withdotnet run --project .github/skills/review-pull-request/scripts/PrepareReview.Tests.csprojafter activating the repo SDK.Reviewer guidance comes from a selected trusted source: the local checkout when run interactively, or the workflow's own commit when hosted. It never comes from the target release branch or from PR-controlled content. Every link found in a guide is classified and recorded:
The repository's "Security Concerns Are Out of Scope" exclusion is carried over verbatim.
SKILL.mdis now a review-only contract (173 lines):general-purposeagent explicitly ongpt-5.6-sol. A confirmed worker type or model mismatch makes that guideincomplete;STATUS:line:BLOCKED/INCOMPLETE/FINDINGS/NO_FINDINGS;complete,incomplete, orexcluded;UNRESOLVEDcandidates reported separately;External-contract and metadata gaps are
UNRESOLVED, notINCOMPLETE.pull-request-review.md(gh-aw) runs the same producer when/reviewis requested and before the agent starts. It first installs .NET SDK11.0.100-rc.1.26420.103, the same version asglobal.json, viaactions/setup-dotnet(pinned by SHA). The workflow does not check out the repo, so this version is pinned by hand. It then downloads the script and its three props files atGITHUB_WORKFLOW_SHA. The hosted agent keeps its result in the conversation and writes no files.verify_live_headjob must pass beforesafe_outputspublishes a COMMENT-only review pinned to the frozen head.--strict. The compile is reproducible, andactions-lock.jsonis unchanged.This fixes the original failure where release branches that predate the shared guides, such as
release/11.0, could not be reviewed. There is no automatic fallback tomain, local files, or the PR head.Guide routing is still hard-coded to the two existing guides: CrossCutting always, plus BlazorComponents for
src/Components. New architecture documents are supporting context and do not require new routing; a new review guide would.Validation
Producer tests: 40/40 on macOS and on Windows 11 (
core.autocrlf=true). They cover routing, link classification, renames, mixed-line policies, exclusions, producer provenance, JSON byte compatibility, and malformed or empty inputs.C# producer vs the previous JavaScript producer (differential): outputs were compared file by file, except Git pack storage, which is compressed nondeterministically. The only allowed differences were timings, the producer hash, and temp paths.
release/11.0PR, a rename, and a JSInterop-only PR. The same exit and readiness behavior was seen for merged, invalid, and existing-output inputs, bad--repo, an invalid token, and a dirty guidance tree. Mean time: 52.6 s (C#) vs 59.6 s (JS).Real-PR regression evaluation (local, unpublished, Windows, independently audited): this PR's contract vs its previous revision, on #68895, #67969, #68365, #67616, #69484, and #65504 (negative control). There were 23 runs, all with gpt-5.6-sol (model use verified from logs).
BLOCKED/INCOMPLETEINCOMPLETE, which was not an input failureNO_FINDINGSin every run.Model probe: the same revision on gpt-6.1-sol cost about half as much (0.48×). It demoted real regressions to
UNRESOLVEDfive times, citing a missing binding contract or external evidence, and hedged a sixth. The workflow therefore stays ongpt-5.6-sol; see the follow-ups.Hosted, on a fork only (this revision): fork run 36767006150 at
b93874e6, the head before worker pinning. Every job succeeded (agent,detection,verify_live_head,safe_outputs).InputDateculture bug was published as a P2 COMMENT review on the correct line, pinned to the frozen head. Both routed guides completed.400 Invalid 'input[N].id': 'ctc_call_…'. Expected an ID that begins with 'fc'. Each failure came immediately after the agent used the file-create tool to save its result. The same fixture on the previous JS revision (run 36765116023) wrote no file and passed.tools: edit: falsedid not remove that tool.Worker pinning (native Windows validation): in 2 of 4 developer-style native runs, the coordinator launched guide workers as
exploreagents on gpt-5.6-luna, yet still reported both guides complete andNO_FINDINGS. SKILL.md now pins the workers (see above). Fork run 36774667141 at this head passed every job and published the planted P2 finding. Its log shows both workers asGeneral-purpose(gpt-5.6-sol). Six more native Windows runs at this head all usedgeneral-purpose/ gpt-5.6-sol workers (12 of 12, confirmed from runtime telemetry), and no read denials were blamed on content exclusion.Earlier hosted and local validation (JS producer; the design is otherwise unchanged):
mainand on arelease/11.0-era base. Each finding was published on the correct line at the frozen head, and each control had no findings.verify_live_headfailed, and nothing was published.BLOCKEDtwice (runs 36171766315 and 36173504000), completed locally withNO_FINDINGS.Known limitation: recall varies between runs
This is an advisory reviewer, not a merge gate;
NO_FINDINGSdoes not mean the PR is correct. Across five gpt-5.6-sol runs over two contract revisions, the known #68365InputBaseP2 issue was found twice. Both runs at this head missed it, even though their workers matched the run that found it. That was an exploration miss, not a wrong discard, so the smoke-test criterion for that PR is not met. All versions also miss the #68895 sliding-expiration issue. Improving recall (an evaluation harness and a reasoning-level sweep) is a follow-up.Known limitation: external contracts
Reviewers read only the frozen bundle, so they cannot cite primary external contracts such as the WHATWG HTML or Streams specs, or
dotnet/runtimesource. Findings that depend on one are reported asUNRESOLVEDrather than guessed.VALUEissue on [Blazor] Preserve null values for <option value="@null"> in single select binding #67616 using the WHATWG attribute-name contract.Allowing primary-spec evidence (and, for hosted, a network allowlist) is a permission decision deferred to a follow-up PR.
Known limitation: long bundle paths on Windows
On Windows, a Copilot CLI path-verification bug treats files whose absolute path exceeds 256 characters as outside the allowed directories. This happens even inside
%TEMP%, the working directory, or an--add-dirroot, and even withLongPathsEnabled=1. The CLI keeps the long file in its\\?\extended-length form but stores allowed directories in normal form, so they never match. Non-interactive runs with--allow-all-toolstherefore deny those bundle reads (thousands of files per bundle, up to 382 characters). Approve the prompt interactively, or pass--allow-all-paths, which is verified but grants access to every path;--add-dirdoes not help. Otherwise the reviewer returnsINCOMPLETEand quotes the tool's error. The CLI's error text doesn't mention path length, so the reviewer can't yet suggest this fix itself; improving that message is a follow-up. The previous JS producer used the same layout, and hosted runs (Linux) are unaffected.Known limitation: publication freshness and moving bases
verify_live_headruns in a separate job beforesafe_outputs. A push between the two, or a Re-run failed jobs of onlysafe_outputsafter the head moved, can still publish the review. It remains a COMMENT-only review pinned to the commit that was actually reviewed.The producer also returns
BLOCKEDif the target or base branch moves during preparation. This is rare hosted, where preparation takes about 20 s, but it happened on a busymainin local runs; one retry recovered it every time.Follow-ups (separate PRs)
UNRESOLVEDmust name the exact missing artifact. Evaluate this, then re-compare models: gpt-6.1-sol, and a Sol vs Astra reasoning-level sweep.No product code changes.