Repository navigation
Conversation
|
Caution Review failedThe pull request is closed. Walkthrough
Merge Risk:
|
|
@codex review |
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
ReviewThe fix is sound. The helper Minor, non-blocking points:
No blocking issues. LGTM. |
|
Codex Review: Didn't find any major issues. Nice work! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
[Medium impact] The PR appears safe to merge; the latest change preserves the existing behavior. SummaryAllows generic arrays inside tuple method-data rows while keeping checks for array shape, repeated type arguments, and supported conversions.
Reviews (20) · Last reviewed commit: "docs(analyzers): explain row search budg..." · Reviewed by Greptile |
ReviewThe fix is sound and well tested for the reported case. Positive and negative cases cover rank, jagged and multidimensional arrays, scalar elements and concrete elements. Concerns
Overall this is a reasonable, narrowly scoped fix. I'd address point 1 or add a covariance test before merging. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2b659cc300
ℹ️ 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".
|
@codex review Fixed both array reference conversion findings in 79332ee; both regressions fail on the previous head. Full net10.0 analyzer suite: 987 passed, one skipped. Other target frameworks remain for CI. Existing build warnings are tracked in #7410 and #7412. Claude's conversation findings are also dispositioned: the covariance concern is fixed and tested, Zip/All is replaced with a loop, and a comment documents the existing constraint behavior. The suggested extra nested tuple test is optional coverage; the reported covariance cases and the existing recursive tuple-array cases are covered. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 79332ee402
ℹ️ 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".
Review of #7517The fix is correct for the reported case, and the regressions cover it well: ordinary, jagged and multidimensional arrays, rank mismatch, scalar elements and concrete element conversions. I read the diff but didn't build or run the tests. Design concerns (non-blocking)
Tests
Overall this is a reasonable, well-tested fix. I'd approve it, with the simplification noted above as optional follow-up. |
|
@codex review Fixed nested array invariance in 2601483. Both new negative regressions fail against the previous head; full net10.0 analyzer suite passes (991 passed, one skipped). Other frameworks remain for CI; existing build warnings remain tracked in #7410 and #7412. Claude’s latest non-blocking observations are dispositioned: the helper’s existing comment states the CastHelper invariant; the added tests exercise nested tuples and invariant array recursion, and the existing negative conversion regressions pass. Constraint handling remains the documented existing inference behavior. A broader substitution-based matcher is optional future design work, outside this fix. |
Review of #7517The change fixes the reported TUnit0001 false positive for Concerns (non-blocking)
Overall the change is correct for the cases covered and well tested. Item 1 is the main long-term maintainability risk. 🤖 Generated with Claude Code |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 260148313a
ℹ️ 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".
|
@codex review Fixed both remaining findings in a185a2d; containing type arguments remain invariant, and declared interface variance preserves valid reference conversions. Six additional regressions cover nested type identity, covariance, contravariance, reverse-direction rejection and value-type invariance. Both reported cases fail against the previous head. Full net10.0 analyzer suite: 997 passed, one skipped; other frameworks remain for CI. Claude’s non-blocking observations are dispositioned: existing negative tests pass; the CastHelper invariant is documented; broader substitution-based inference and test naming are optional design follow-ups. The nested constraint gap is now tracked in #7520. Existing build/restore warnings remain tracked in #7410 and #7412. |
|
Review of PR 7517: the fix is correct for the reported case. A (Fixture, CancellationToken, int[]) row now matches a (Fixture, CancellationToken, T[]) parameter and keeps its tuple container. Rank and IsSZArray are checked, and the regressions cover the shapes that matter. I read the analyzer change in CompilationExtensions.cs but did not run the tests; the PR description reports 997 passing on net10.0 only. Concerns:
|
|
Codex Review: Didn't find any major issues. Breezy! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
|
@codex review Fixed the joint array/interface bound finding in fb74a74 and resolved its thread with regression evidence. Full net10.0 analyzer suite: 1103 passed, one skipped; focused suite: 127 passed; four new negative rows fail on the previous head. Other frameworks remain for CI; existing warnings are tracked in #7410 and #7412. The earlier run 41746555513 completed successfully and no longer blocks this PR. Resolution routes checked: main does not deliver #7489, this PR retains Closes #7489, and no prerequisite, replacement, finished parent or stale acceptance criterion prevents shipping. #7520 remains separate constraint validation. No self-ending wait was labelled on-hold. The PR remains draft for fresh Claude and Codex verdicts on this head. Claude’s latest non-blocking suggestions are dispositioned: the class comment now explicitly documents how unsubstituted type parameters use Roslyn constraint information, and the trailing blank line is removed. Retaining the isolated matcher preserves concrete mismatch, shared-binding and interface-alternative regressions; first-wins substitution or wildcard matching would change that contract. A step budget, conversion cache, stress benchmark and Bound record remain optional maintenance work; this change adds no interface search branches and makes no performance claim. CodeRabbit’s optional documentation-coverage suggestion is covered by the existing explanatory comments rather than a repository documentation gate. All historical review surfaces were checked; CodeRabbit’s only newer inline reply confirms its fix and resolution. |
|
Review The fix does what the PR describes. (Fixture, CancellationToken, T[]) now matches a (Fixture, CancellationToken, int[]) row, which closes 7489. I read OpenArrayMatcher.cs in full. I did not run the tests, so I can't confirm the 1103-pass result. Main concern: the change is far larger than the bug The original report needed one thing: recurse into value tuples and match T[] against concrete arrays. OpenArrayMatcher instead reimplements a good part of C# conversion and inference semantics in about 330 lines: lower and upper variance bounds, joint array and array-interface bound solving, delegate-variance common-subtype reasoning, and continuation-passing backtracking over interfaces and base types.
Suggested simplification Make the analyzer lenient by default:
That covers the issue's case and the common ones. Rarer cases would be left to the runtime, as they were before. If you keep the full matcher: split it by concern (bound bookkeeping, array/interface sharing, delegate sharing) so each part is reviewable alone; add a test for a pathological nested case to show it terminates quickly; and check that ContainsTypeParameter handles every symbol kind the matcher passes it. Smaller points
Tests look thorough (ordinary, jagged and multidimensional arrays, variance, tuple siblings), and the three previous-head regressions are a good touch. I'd approve on behaviour, and I'd like the complexity and cost question settled before merge. 🤖 Generated with Claude Code |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fb74a74bac
ℹ️ 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".
|
@codex review Fixed the joint covariant-delegate finding in 681ce18; replied with evidence and resolved its thread. Eight added delegate cases cover ordering, nested delegates/arrays and valid common substitutions. Five negatives fail on the previous head. Full net10.0 analyzer suite: 1112 passed, one skipped; focused suite: 136 passed. Other frameworks remain for CI. Existing warnings are tracked in #7410 and #7412. Claude's reiterated complexity concern is addressed in the same commit: one matcher instance shares a 512-step budget across tuple siblings, recursive visits, bound comparisons and interface retries. Exhaustion conservatively accepts the entire row, including when a later sibling would otherwise reject it. An adversarial regression combines three 40-interface searches with a conflicting final sibling. Retaining bound checks preserves the incompatible-row regressions; first-wins exact substitution would reject valid variance cases. A conversion cache and a Bound record remain optional refactoring rather than prerequisites; no performance improvement is claimed. ContainsTypeParameter covers the type parameters, arrays and named/containing constructions traversed by this matcher; pointer traversal is already supported, while function pointers cannot be generic type arguments. Constraint validation remains #7520. The earlier run 41746555513 completed successfully. Resolve routes checked: origin/main does not implement #7489; this PR still contains Closes #7489; #7489 has no native parent, children or prerequisite dependencies, and there is no replacement PR delivering this analyzer change. Its acceptance criteria still match the code. Rework budget is not exceeded (17 Claude rounds, no force-pushes). No on-hold label was added for a self-ending wait. The PR remains draft for fresh Claude and Codex verdicts on this head. |
ReviewThe fix addresses #7489. Open arrays are now matched recursively inside value tuples, so Main concern: the matcher is much bigger than the bug.
Suggested alternative.
The false-positive-free guarantee is easier to defend with a small matcher. If the extra precision is wanted, split it into a follow-up with benchmarks. Smaller points.
Overall the behaviour looks correct and conservative. I'd prefer a smaller matcher, or at least evidence that the cost and the budget are acceptable, before merging. |
|
Codex Review: Didn't find any major issues. Keep it up! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
|
Follow-up on Claude's current-head review (681ce18): the earlier run 41746555513 succeeded. Codex's mutable summary now explicitly clears this head; all inline threads are resolved. I measured the unchanged matcher in a standalone Release net10.0 harness using SDK 10.0.403 and Roslyn 4.8.0 on macOS arm64. The harness compiles the actual OpenArrayMatcher.cs, uses the same ContainsTypeParameter implementation, builds symbols once, warms 2,000 calls, then measures 20,000 new matcher instances with Stopwatch and GC.GetAllocatedBytesForCurrentThread. Reflection reads the remaining budget after each call and is included in these timings/allocations. Inputs are array element symbols, as passed by CompilationExtensions; this measures the matcher, not full analyzer execution or tuple dispatch.
Every iteration asserted a successful result without exhaustion. These are focused warm measurements, not a throughput guarantee or a before/after improvement claim. The existing adversarial 40-interface regression covers conservative exhaustion. Ordinary matches above use under 2% of the budget; immutable bookkeeping and continuations have a measurable but small cost on these cases. Retaining the matcher preserves the concrete mismatch/shared-binding/variance regressions; first-wins identity binding would reject valid variance cases. A conversion cache or bound enum remains optional refactoring. The plain tuple-array cases are in TupleArrayElements (including the issue's Fixture/CancellationToken tuple); nested containing-construction cases are also covered there. Resolution routes rechecked against freshly fetched origin/main: #7489 remains unimplemented there, #7517 is its only open delivering PR and retains Closes #7489; #7489 has no parent, children or blocked_by prerequisite. No replacement, stale scope or finished parent can resolve this instead. #7520 is separate constraint work, not a prerequisite. Eighteen Claude rounds and zero force-pushes are below the rework threshold. No on-hold label is appropriate for review/CI. Requesting a fresh Claude review of this evidence and the unchanged head before promotion, since the last verdict preferred cost/budget evidence before merge. No production changes or test results are claimed by this unit. |
Review: PR 7517, generic array elements in tuple method data rowsI read the diff, but I could not run the build or the tests. The code-review skill errored, so this was a manual read of the main files. What works
Concerns
Verdict: I would approve the behaviour. My main request is to consider shrinking the matcher (point 2), because I expect the long-term maintenance cost to exceed the value of catching these rare mismatches. If you keep it, please name the budget constant and document the order-dependence (points 3 and 4). 🤖 Generated with Claude Code |
|
@codex review Run 41755672591 completed successfully. Claude's latest verdict approves the behavior and requests a named budget and documented traversal-order dependence if the matcher is retained. Addressed both in d17bbe7: MaxStepsPerRow names the unchanged 512-step limit; the comment explains that failed branches do not refund steps, traversal order can affect exhaustion, and exhaustion accepts the whole row conservatively. No behavior change. Focused net10.0 GenericTupleArrayMethodDataSourceTests: 136 passed; git diff --check passed. Existing budget-exhaustion coverage remains applicable. Other frameworks remain for CI. Retaining the matcher preserves the reviewed mismatch, shared-binding and valid variance regressions; the alternative structural-only design would discard that coverage. The prior comment supplies ordinary-case budget/allocation measurements. Further splitting, alias cleanup and additional plausible-shape/order tests are optional follow-ups, rather than blockers to this unchanged behavior. Resolve routes rechecked: freshly fetched origin/main does not contain this tuple-array matcher; #7489 remains open with current acceptance criteria, no sub-issues or prerequisite dependencies. #7517 is its only open delivering PR and retains Closes #7489. No superseding PR or finished parent applies; #7520 is separate constraint work. Nineteen Claude rounds and zero force-pushes do not meet the rework threshold with the latest behavior-approved verdict. No on-hold label was added for CI/review. Keeping draft for fresh reviews of this head. |
|
Review The fix does what the issue asks. Main concern: size and complexity compared with the bug The bug is a missed recursion into value tuples. The PR fixes it with a new ~400-line
Suggested simpler approach
That would be about 40-60 lines, allocation-light, and would not introduce new false positives. It would also drop most of the delegate and array-interface speculation ( Smaller points
I'd prefer the simplified matcher. If you keep the full one, please add a short design note on why a conservative structural check wasn't enough. 🤖 Generated with Claude Code |
|
Codex Review: Didn't find any major issues. Chef's kiss. Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
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". |
|
Run 41755672591 succeeded; the current head d17bbe7 also has passing Claude and positive Codex receipts, with all inline threads resolved. Added the design note requested by Claude's latest conversation review to the PR description. It explains why structural-only acceptance loses existing diagnostics, why identity-only bindings reject valid variance, the measured ordinary-case budget use, and the bounded-work policy. This takes the review's explicit alternative of retaining the matcher with a design note; no new head or test result is claimed. Requesting Claude's follow-up verdict on this rationale before promotion. The earlier cost measurements remain linked in this conversation. Resolve routes checked: #7489 is open with current scope and no children or prerequisite dependencies; #7517 remains its only delivering PR and retains Closes #7489. No finished parent or replacement applies. #7520 is separate constraint work, not a blocker. No human, upstream, credential or lock blocker was found. This is a self-ending review wait, so no on-hold label is appropriate. |
Review: PR 7517 (TUnit0001 on tuple-with-open-array rows)I read the diff and the matcher's opening section ( What works: The fix is aimed at the right place. Concerns:
Verdict: The fix is correct in direction and fails safe, and I found no blocking bug in what I read. My main request is to cut scope (point 1), or justify it in the PR. Checking points 2 and 3 would also help. |
|
Run 41757609417 completed successfully. Claude’s follow-up explicitly found no blocking bug; Codex’s completed summary clears current head d17bbe7, and all 28 review threads are resolved. Disposition of the follow-up suggestions: the PR description already explains why retaining concrete mismatch diagnostics and valid variance warrants the matcher, and records measured ordinary matches at 3, 7 and 10 of 512 steps. InterfaceSearchStopsConservativelyWhenWorkBudgetIsExhausted already asserts conservative acceptance on exhaustion. CompilationExtensions creates a fresh matcher per public matching invocation (line 16), so mutable budget state is not shared between concurrent analyzer callbacks. Allocation measurements are recorded above; partitioning bounds and further benchmark work are optional improvements, with no blocking correctness finding. Resolve routes checked again: main has no OpenArrayMatcher; #7489 remains open with current scope, no native children or prerequisite dependencies, and #7517 is its sole open delivering PR with Closes #7489. No replacement or finished parent applies; #7520 remains independent constraint work. No new code or validation result is claimed. Promoting the unchanged reviewed head; ready-for-review triggers fresh CI and Claude review, which must pass before auto-merge can be armed. |
| Promoted unchanged head d17bbe7 after both reviewers cleared it. Waiting for ready-for-review Claude run 41758092822 and CI; read its verdict before arming auto-merge. The earlier run 41757609417 passed and is no longer the blocker. |
ReviewVerdict: the fix addresses #7489 and the tests are thorough. I'd still push back on the amount of machinery behind it. I only read the code and didn't run the tests. What works
Concerns
Overall this is correct in intent and well tested. I'd prefer the simpler conservative approach, but I wouldn't block on it if the maintainers want the stricter diagnostics. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d17bbe713f
ℹ️ 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".
|
Run 41758092822 succeeded; it is no longer a blocker. The new Codex finding is valid: CanShareReferenceSubtype falls through for System.Array/IDisposable, treating the restricted Array base as an ordinary extensible class and accepting an impossible substitution. This PR has 22 automated Claude review rounds and a new blocking finding, exceeding the skill's 20-round rework budget. No further fixes will be pushed here. Split into native children of #7489:
No files are currently conflicting (zero force-pushes); the churn is in OpenArrayMatcher.cs and its bound/variance regressions. Both issues name their owned files and the reusable branch/head. Closing this PR as superseded by these deliverables, keeping branch issue-7489-tuple-array. #7489 stays open until its acceptance criteria are delivered. Claude's latest nonblocking suggestions are dispositioned: scope reduction is now assigned to #7539/#7540; budget exhaustion already has a conservative-acceptance regression; CompilationExtensions constructs a fresh matcher per invocation; allocation tuning remains conditional on profiling; generic constraints remain open in #7520. No new validation is claimed in this split-only unit. Current CI need not finish for closing this superseded PR. No human, upstream, credential, or lock blocker requires deferral. |
A method source returning
(Fixture, CancellationToken, int[])incorrectly raises TUnit0001 for a single(Fixture, CancellationToken, T[])parameter. Match open arrays recursively inside value tuples so compatible rows keep their tuple container, while retaining checks for rank, shape and concrete element conversions.The isolated
OpenArrayMatchershares inferred identity/reference bounds across tuple elements, preserves array covariance and declared generic variance, and retries interface alternatives when later arguments conflict. Conservative upper-bound checks reject impossible class, array, interface and unrelated delegate combinations while preserving possible common implementations and compatible delegate variance. Array bounds and supported generic array-interface requirements are checked jointly, including nested arrays, to reject impossible three-way substitutions. Covariant delegate arguments are projected jointly as well, including nested delegates and arrays. A per-row work budget bounds recursive search and bound comparisons; exhaustion conservatively accepts rather than emitting an unproven mismatch. Constraints remain tracked separately in #7520.Analyzer regressions cover ordinary, jagged and multidimensional arrays, nested invariance, containing types, repeated substitutions, variance bounds, tuple siblings and interface alternatives. Delegate regressions cover unrelated definitions, nested arrays, unsupported bases/interfaces, same-definition variance, invariant/value-type identity, and supported Delegate/MulticastDelegate/ICloneable conversions. Nested delegate bounds require identity-compatible containing constructions, including dynamic/object identity. Regressions cover container differences, deeper nesting, arrays and valid nested variance. Three explicit generic delegate cases compile conversions to both bounds and fail on the previous head.
Closes #7489
Validation: full net10.0 analyzer suite: 1112 passed, one skipped; focused tuple-array suite: 136 passed. Five new delegate negatives fail on the previous head; an adversarial interface-search regression exercises conservative budget exhaustion. Other frameworks remain for CI. No generator output, public API, engine metadata or reflection changes. Existing build/restore warnings are tracked in #7410 and #7412. Ambiguous nested-type diagnostic text is tracked in #7534.
Design rationale: the structural-only alternative would fix the headline example, but would also accept concrete incompatible rows that the previous analyzer rejected. Binding repeated parameters by identity would instead reject valid covariance and contravariance cases. The retained bound matcher preserves both sets of user-visible behavior, with Roslyn-proven conversions first and conservative acceptance when proof is uncertain. The 512-step limit is a bounded-work policy, not a completeness guarantee: the measured headline, interface and repeated-binding examples used 3, 7 and 10 steps respectively (see the measurement comment), leaving substantial headroom for ordinary rows. Failed alternatives consume the same budget; exhaustion accepts the whole row regardless of later conflicts. This trades diagnostic precision for bounded analysis cost. The measured allocations are documented in the review conversation; this change makes no performance improvement claim. Generic constraints remain separate in #7520.
Summary by CodeRabbit