← Countersign · AI reviews code; a named human signs.

Toivo decided: request changes

#2234 The analyzer does not work if SuppressSourceGeneration = true

Why: The change fixes a different crash

Evidence
Why ask: 3 reasons, risk score 92.4
  1. Claude found a verified major issue: The issue's 3.1.1 regression is not on this base; the change fixes a different crash see
  2. 2 of 4 requirement clauses not proven. see
  3. The AI declined to decide 3 questions see

All 19 tier drivers and the risk factors are in full detail.

Requirements

F1 Held before: its tests pass without the fix tooTypeCollector.cs:1023
The analyzer must report contract diagnostics (e.g. missing [Key], duplicate keys, mixed key kinds) for [MessagePackObject(SuppressSourceGeneration = true)] types, as it did in version 3.1.0.

Met, but already true before this change: all 3 of the clause's tests that were run without the fix pass there too: AllowPrivateRequiredIsReported… full text

Claude met (8 of 9 cited verified), Codex met (3 of 4 cited verified), Nemotron met (12 of 13 cited verified)

Checks: build pass, tests.targeted pass

Fail without the fix: DuplicateIntKeysAreReportedWithoutAnalyzerFailure, MixedKeyKindsAreReportedWithoutAnalyzerFailure, DuplicateStringKeysAreReportedWithoutAnalyzerFailure

Pass without the fix: MemberWithoutKeyIsReported, MemberTypeMustBeMessagePackObjectIsReported, AllowPrivateRequiredIsReported

F2 Held before: its tests pass without the fix tooTypeCollector.cs:1383
Diagnostics that only apply when a formatter is generated (partial-class requirement, AOT-only checks) must not be reported for types with SuppressSourceGeneration = true.

Met, but already true before this change: all 1 of the clause's tests that were run without the fix pass there too… full text

Claude met (2 of 5 cited verified), Codex met (1 of 2 cited verified), Nemotron met (2 of 5 cited verified)

Checks: build pass, tests.targeted pass

Pass without the fix: SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed

N1 Not met: Claude; met: Codex, Nemotron; Gemini sided with ClaudeTypeCollector.cs:985
The analyzer and generator must not crash on invalid contracts (e.g. duplicate keys) in such types.

Claude not met (1 of 4 cited verified): The duplicate-key and mixed-kind crashes are fixed, and the full suite passes (175/175). full text

Codex met (1 of 2 cited verified): The full source-generator suite passes, and duplicate-key tests demonstrate that invalid contracts no longer trigger analyzer failure.

Nemotron met (4 of 5 cited verified): The full suite passes with 0 failures on head, and the previously crashing duplicate-key and mixed-key tests now pass instead of throwing… full text

Checks: build pass, tests.full_suite pass

Fail without the fix: DuplicateStringKeysAreReportedWithoutAnalyzerFailure, DuplicateIntKeysAreReportedWithoutAnalyzerFailure, MixedKeyKindsAreReportedWithoutAnalyzerFailure

Gemini on N1: Claude's objection is supported (advisory)

Duplicate-key analyzer tests pass on head, while repro.claude.C2 fails on both head and base and TypeCollector.cs:985 retains an unguarded…

Claims backed: Claude (2), Codex (1), Nemotron (1); not backed: Claude (1), Codex (1), Nemotron (1). Would settle it: Area-owner ruling on whether REQ-2234-N1 requires fixing the pre-existing TypeCollector.cs:985 cast for positional… full ruling

N2 Refused: Codex said met without verified evidence
The fix is covered by automated tests that fail without it; no regressions in the existing test suite.

Codex said met without verified evidence

Claude met (3 of 7 cited verified): tests.fail_without_fix passes on the 4 analyzer tests that cover what the change does (duplicate int/string keys, mixed kinds, duplicate… full text

Codex met (0 of 2 cited verified): Four of the eight new analyzer tests fail on base source and all eight pass with the change; the full suite passes.

Nemotron met (6 of 7 cited verified): 4 of 8 new analyzer tests fail on base source (analyzer exceptions AD0001), while all pass on head; the full suite shows no regressions. full text

Checks: build pass, tests.fail_without_fix pass

Fail without the fix: MixedKeyKindsAreReportedWithoutAnalyzerFailure, DuplicateStringKeysAreReportedWithoutAnalyzerFailure, DuplicateIntKeysAreReportedWithoutAnalyzerFailure, DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes

Pass without the fix: SuppressedTypeRoundTripsThroughDynamicResolver

Would settle it: Codex citing evidence the engine can verify

Findings

Claude C1 major: The issue's 3.1.1 regression is not on this base; the change fixes a different crashTypeCollector.cs:1369 @base

Issue #2234 says the analyzer stopped working for SuppressSourceGeneration = true in 3.1.1. The cause in history is commit 1a74a620 ('stop… full text

Fix: Retarget the fix to master: move the suppressSourceGeneration early return back below member analysis, as on develop, keep the ContainsKey… full text

Sets ask:

Claude C2 minor: Positional-record Key(null) still crashes the analyzer for suppressed (and other) types reproducedTypeCollector.cs:985

The BothStringAndIntKeyAreNull path hard-casts the property's syntax to PropertyDeclarationSyntax. full text

repro.claude.C2: reproduced by the pipeline: failed on head (claim: failed), failed on base (claim: failed), passed on control (claim: passed)

Fix: Use (syntax as PropertyDeclarationSyntax)?.Identifier ?? (syntax as ParameterSyntax)?.Identifier, as the MemberNeedsKey path already does… full text

Sets notify: reproduced by the pipeline (repro.claude.C2)

7 more findings (minor, info)
Claude C3 info: 'continue' on mixed key kinds skips recursive collection of that member's typeTypeCollector.cs:1008

After reporting DoNotMixStringAndIntKeys the new 'continue' also skips CollectCore for the member, so diagnostics about the member's own… full text

Sets silent:

Claude C4 info: Duplicate-key guard makes the generator emit a formatter that silently drops the second memberTypeCollector.cs:1023

For a non-suppressed type with duplicate keys, the generator (which has no diagnostic sink) used to fail with CS8785. Now it keeps the… full text

Fix: When a key collision is detected, have GetObjectInfo return null (no formatter) instead of dropping the member.

Sets silent:

Nemotron N1 minor: Duplicate-key diagnostic reports only one diagnostic although two members share the keyTypeCollector.cs:1014

For duplicate keys the code reports KeysMustBeUnique only on the second member and then skips adding it, so the first member remains in the… full text

Fix: Consider whether both members should be flagged; no code change required unless the product owner wants the first member reported too.

Sets notify:

Nemotron N2 minor: New test file triggers StyleCop SA1649 warningSuppressedSourceGenerationTests.cs:9

SuppressedSourceGenerationTests.cs contains two public types but the file name matches neither, producing warning SA1649 in both… full text

Fix: Rename the file to SuppressedSourceGenerationType.cs or split the types into separate files.

Sets notify:

Nemotron N3 info: Runtime execution tests do not demonstrate the fix

SuppressedSourceGenerationTests round-trip and formatter-absence tests pass on base source as well, so they add regression coverage but not… full text

Sets silent:

Nemotron N4 info: README documents behavior accuratelyREADME.md:1634

README additions describe which diagnostics are and are not reported for suppressed types, matching the code's early-return behavior.

Sets silent:

Nemotron N5 info: Execution tests required SDK 9 overrideSuppressedSourceGenerationTests.cs:1

The generator references Microsoft.CodeAnalysis 4.12, so ExecutionTests cannot build with the repo-pinned SDK 8.0.402; CI on SDK 8 would… full text

Fix: Area owner should decide whether to pin the generator to Roslyn 4.11 or update global.json/CI to SDK 9.

Sets silent:

Checks

14 of 16 checks pass

build 0 errors, 1 unique warnings dotnet build 8.0.402 log

tests.targeted 8 passed, 0 failed, 0 skipped (8 new tests in run) dotnet test 8.0.402 log

tests.fail_without_fix new tests fail on base source: 4/8 failed -> tests do cover the change (4 new tests pass without the fix) dotnet test (source reverted, tests kept) 8.0.402 log

tests.full_suite tests/MessagePack.SourceGenerator.Tests: 175 tests, 175 passed, 0 failed (0 not failing on base, 0 also… full text dotnet test 8.0.402 log

public_api no public API changes: no PublicAPI.Shipped/Unshipped.txt changed, no public/protected declarations added or… full text git diff of PublicAPI.*.txt + scan of added public/protected declarations in src/

analyzers no new warnings dotnet build warnings (Roslyn analyzers, StyleCop, PublicApiAnalyzers) vs base

tests.targeted.execution SuppressedSourceGenerationTests: 4 passed, 0 failed (4 new test results; runtime: generator runs inside csc… full text dotnet build + dotnet test (ExecutionTests, MapModeExecutionTests) 9.0.321 logs

tests.execution_fail_without_fix new runtime tests pass on base source: 0/4 failed -> these runtime tests do NOT demonstrate the change… full text dotnet test (source reverted, tests kept) - ExecutionTests 9.0.321 logs

tests.execution_full_suite tests/MessagePack.SourceGenerator.ExecutionTests: 16/16 passed (base 14/14), 0 failures not on base… full text dotnet test (whole ExecutionTests, MapModeExecutionTests) vs base 9.0.321 logs

repro.claude.C2 reproduced by the pipeline: failed on head (claim: failed), failed on base (claim: failed), passed on control… full text dotnet test (reviewer repro test copied into tests/MessagePack.SourceGenerator.Tests/CountersignRepro) 8.0.402

injection_scan no text addressed to automated reviewers in the added lines, commit message or PR text countersign.injection (deterministic pattern scan) injection-v1

deps.delta 238 packages on head (238 on base) across 30 projects; 0 added, 0 version changes, 0 removed; 0 new… full text dotnet restore (every *.csproj, NuGet Audit mode=all) -> CycloneDX 1.6, base vs head 8.0.402

build.egress built on CRACI under a deny-by-default policy: only 13 TLS host patterns on ports 443 (github.com… full text CRACI network policy (cracicorp/setup@v1) + job log scan

tests.mutation 8 mutants of the changed source lines: 5 killed, 3 survived; 3 of 6 mutated hunks have a killed mutant… full text evidence/scripts/mutation.py + dotnet test (one mutant at a time, the targeted filter) 8.0.402 logs

craci.sbom CRACI's job SBOM: 0 components (none); 0 NuGet, all in our restore graph (242 NuGet packages). full text CRACI API v1preview1 (https://api.craci.com)

craci.network 220 connections to 13 hosts, 0 proxy violations: builds.dotnet.microsoft.com (468.2 MB), api.nuget.org (283.5… full text CRACI API v1preview1 (https://api.craci.com)

facts.json

tests.execution_fail_without_fix: the new runtime tests pass without the fixlogs

new runtime tests pass on base source: 0/4 failed -> these runtime tests do NOT demonstrate the change (runtime behaviour they check is identical with and without the fix)

dotnet test (source reverted, tests kept) - ExecutionTests 9.0.321

tests.mutation: 3 of 8 planted mutants survivelogs

8 mutants of the changed source lines: 5 killed, 3 survived; 3 of 6 mutated hunks have a killed mutant; surviving hunks: TypeCollector.cs:1148, TypeCollector.cs:1163-1166, TypeCollector.cs:1179-1182

evidence/scripts/mutation.py + dotnet test (one mutant at a time, the targeted filter) 8.0.402

Supply chain: no new packages or advisories

deps.delta pass: no package added or moved, 0 new advisories (6 already on base); build.egress pass; CRACI trace pass

Supply-chain detail

deps.delta pass: 238 packages on head (238 on base) across 30 projects; 0 added, 0 version changes, 0 removed; 0 new vulnerability hits (6 already on base)

  • SBOMs (CycloneDX): evidence/base/sbom.cdx.json, evidence/2234/sbom.cdx.json
Already on base (6 advisories)

build.egress pass: default deny, presets ['github'], TLS hosts github.com, codeload.github.com, objects.githubusercontent.com, api.nuget.org, *.nuget.org, pkgs.dev.azure.com, *.vsblob.vsassets.io, builds.dotnet.microsoft.com, dotnetcli.azureedge.net, dotnetcli.blob.core.windows.net, *.dot.net, dot.net, download.visualstudio.microsoft.com; provenance run policy 31fafb855e98

craci.network pass: 220 connections to 13 hosts, 0 proxy violations: builds.dotnet.microsoft.com (468.2 MB), api.nuget.org (283.5 MB), github.com (19.3 MB), codeload.github.com (4.2 MB), pkgs.dev.azure.com (0.4 MB), ci.dot.net (44 kB); denied, not counted as the change's: 2928 certificate revocation lookups (CRL/OCSP over plain HTTP: crl3.digicert.com, crl4.digicert.com, ocsp.digicert.com, s.symcb.com, s.symcd.com, ts-crl.ws.symantec.com, ts-ocsp.ws.symantec.com), so package-signature revocation was not checked online; 3 request(s) during toolchain setup, before the change was built (aka.ms); 7 host(s) allowed by a preset or CRACI's own CI-service rule, not a listed TLS host (rules: github-actions-actions.githubusercontent.com, github-actions-cache-results-receiver.actions.githubusercontent.com, recorded-http-api.github.com)

Not run: 7 checks, 4 standing gaps

tests.MessagePack.Tests (facts.json not_run): runtime library src/MessagePack not modified by the change; suite not run

build.net472/netstandard (facts.json not_run): only the net8.0 slice of src/MessagePack was built (Linux container, Debug)

benchmarks (facts.json not_run): no runtime serialization hot path touched (generator/analyzer only)

other-targets (mandate known gap): Tests run on net8.0 only; .NET Framework, Unity and NativeAOT targets are not exercised

runtime-perf (mandate known gap): No benchmarks unless a perf-sensitive path is touched; allocation and throughput regressions can slip through

semantic-intent (mandate known gap): Correctness beyond what tests and cited evidence show is not established by the AI

provenance (mandate known gap): Licensing and provenance of agent-written code are not checked

Standing pipeline gaps: other-targets, runtime-perf, semantic-intent, provenance

Reviewers

Claude claude-opus-5-5 met 3 of 4 · 4 findings

claude-opus-5-5, Anthropic, prompt review-v1. Citations: 32 verified, 2 rejected. Findings: 4 verified, 0 rejected. 2 refusals.

Only Claude raised: C1, C2

review file

Codex GPT-6 met 4 of 4 · 0 findings

GPT-6, OpenAI, prompt review-v1. Citations: 10 verified, 0 rejected. Findings: 0 verified, 0 rejected. 0 refusals.

review file

Nemotron nemotron-3.5-super-vl-120b-a12b met 4 of 4 · 5 findings

nvidia/nemotron-3.5-super-vl-120b-a12b, NVIDIA, prompt review-v1. Citations: 41 verified, 1 rejected. Findings: 5 verified, 0 rejected. 4 refusals.

Only Nemotron raised: N2, N3, N4, N5

review file

Gemini gemini-4-hydrogen adjudicator: 1 ruling, advisory

Gemini on N1: Claude's objection is supported

Advisory: adds reasons, never clears. rulings file

Open questions: 5 for a human (+3 out of scope)

Whether this change resolves issue #2234 for users of the released 3.1.x packages Who: analyzer area owner / maintainers choosing the target branch; raised by Claude. The facts and tests were produced against base 32258fdb (develop line), which does not contain the 3.1.1 regression. full text

Runtime library behavior (src/MessagePack) and net472/netstandard builds Who: Area owner; raised by Nemotron. Not run; the runtime library was not modified and only net8.0 was built.

Security review of analyzer deserializing untrusted input Who: Security reviewer; raised by Nemotron. No security-specific evidence was provided and no security analysis was performed.

Whether N1, N2 are met Who: Toivo

Out of scope for this change:

Whether the README section's list of diagnostics still reported for suppressed types is complete and accurate (who: docs owner)

Parity with analyzer behavior in version 3.1.0 (who: Area owner or maintainer with access to the 3.1.0 release)

Whether generation-only diagnostics (MsgPack011, MsgPack016, MsgPack017) are truly unreported on base for suppressed… full text (who: Area owner)

Sign

You accept 7 residual risks by signing

Open major finding: The issue's 3.1.1 regression is not on this base; the change fixes a different crash see

Not proven by the AI: REQ-2234-N1, REQ-2234-N2. Signing means you judge them yourself. see

3 questions the AI declined to decide (listed above) are yours. see

REQ-2234-F1, REQ-2234-F2 already held before this change: met, but not achieved by it. see

3 peripheral refusals (out of scope for this change) are yours too. see

Not run: tests.MessagePack.Tests, build.net472/netstandard, benchmarks see

Standing pipeline gaps: other-targets, runtime-perf, semantic-intent, provenance see

Toivo signs (required; accept, reject, request-changes)

countersign sign 2234 --as Toivo --decision … --note "…"
and rate the 9 verified findings (full command)

One --finding flag each: accepted (real), rejected (a false positive) or unsure, optionally :reason. A finding without a flag is recorded as unrated.

  • claude:C1 (major) The issue's 3.1.1 regression is not on this base; the change fixes a different crash
  • claude:C2 (minor) Positional-record Key(null) still crashes the analyzer for suppressed (and other) types
  • claude:C3 (info) 'continue' on mixed key kinds skips recursive collection of that member's type
  • claude:C4 (info) Duplicate-key guard makes the generator emit a formatter that silently drops the second member
  • nemotron:N1 (minor) Duplicate-key diagnostic reports only one diagnostic although two members share the key
  • nemotron:N2 (minor) New test file triggers StyleCop SA1649 warning
  • nemotron:N3 (info) Runtime execution tests do not demonstrate the fix
  • nemotron:N4 (info) README documents behavior accurately
  • nemotron:N5 (info) Execution tests required SDK 9 override
countersign sign 2234 --as Toivo --decision <accept|reject|request-changes> --note "..." \
  --finding claude:C1=<accepted|rejected|unsure> \
  --finding claude:C2=<accepted|rejected|unsure> \
  --finding claude:C3=<accepted|rejected|unsure> \
  --finding claude:C4=<accepted|rejected|unsure> \
  --finding nemotron:N1=<accepted|rejected|unsure> \
  --finding nemotron:N2=<accepted|rejected|unsure> \
  --finding nemotron:N3=<accepted|rejected|unsure> \
  --finding nemotron:N4=<accepted|rejected|unsure> \
  --finding nemotron:N5=<accepted|rejected|unsure>
What your signature says

I, Toivo, have read what was checked and by whom, what was not checked and why, and the residual risk listed in this pack, and I own this decision.

It covers the sha256 of this pack's canonical JSON, the decision, your verdict on each finding, the time and the signer, and is appended to the hash-chained ledger.

Full detail (tier drivers, risk score, engine codes, areas, provenance)

Agent-written change for #2234: The analyzer does not work if SuppressSourceGeneration = true. Changes 1 source file (TypeCollector.cs), 2 test files, 1 doc file (+262 -4) on ju26-issue-2234 by Stelian Vultur. Judged against 4 requirement clauses from #2234 (placeholder requirement set, not Tieto's official one).

All tier drivers (tier = strictest)

TierSourceIdWhy
askverified findingclaude:C1major: The issue's 3.1.1 regression is not on this base; the change fixes a different crash
askrefused clauseREQ-2234-N1not_met: claude: The duplicate-key and mixed-kind crashes are fixed, and the full suite passes (175/175). But not every invalid contract in such a type is crash-free. The hard cast at line 985 is untouched, and my probe (scratch worktree, SDK 8, not in facts.json) of '[MessagePackObject(SuppressSourceGeneration = true)] public record Cmd([property: Key(null)] string Scope)' still gives AD0001 InvalidCastException (ParameterSyntax to PropertyDeclarationSyntax) at this head. The generator side of the duplicate-key fix has no test in facts.json (the new analyzer tests use CSharpCodeFixVerifier, analyzer only), though my probe showed no CS8785 for duplicate keys at head.; reviewers_disagree: claude says not_met, codex says met, nemotron says met; adjudicator_dispute: gemini: supported by cited evidence: claude, claude, codex, nemotron; not supported: claude, codex, nemotron; would settle it: Area-owner ruling on whether REQ-2234-N1 requires fixing the pre-existing TypeCollector.cs:985 cast for positional records with [property: Key(null)] in this change; A test in facts.json covering [MessagePackObject(SuppressSourceGeneration = true)] on a positional record with [property: Key(null)] asserting no AD0001 analyzer crash
askrefused clauseREQ-2234-N2thin_evidence: codex says met with 0 verified evidence items about the change (of 2 cited; requirement quotes and unclaimed outcomes don't count)
askadjudicatorREQ-2234-N1supported by cited evidence: claude, claude, codex, nemotron; not supported: claude, codex, nemotron; would settle it: Area-owner ruling on whether REQ-2234-N1 requires fixing the pre-existing TypeCollector.cs:985 cast for positional records with [property: Key(null)] in this change; A test in facts.json covering [MessagePackObject(SuppressSourceGeneration = true)] on a positional record with [property: Key(null)] asserting no AD0001 analyzer crash
askreviewer refusalclaudeWhether this change resolves issue #2234 for users of the released 3.1.x packages (The facts and tests were produced against base 32258fdb (develop line), which does not contain the 3.1.1 regression. Nothing was built or tested against master/v3.1.x, so whether the change applies there and fixes the reported symptom is not established (and C1 suggests it would not on its own).)
askreviewer refusalnemotronRuntime library behavior (src/MessagePack) and net472/netstandard builds (Not run; the runtime library was not modified and only net8.0 was built.)
askreviewer refusalnemotronSecurity review of analyzer deserializing untrusted input (No security-specific evidence was provided and no security analysis was performed.)
askrisk scoreriskscore 92.4 (notify>=15, ask>=40, block>=130); largest: failed_checks 50 + area_sensitivity 20 + lines_changed 10.1
notifyverified findingclaude:C2minor: Positional-record Key(null) still crashes the analyzer for suppressed (and other) types (reproduced by the pipeline (repro.claude.C2))
notifyverified findingnemotron:N1minor: Duplicate-key diagnostic reports only one diagnostic although two members share the key
notifyverified findingnemotron:N2minor: New test file triggers StyleCop SA1649 warning
notifyreviewer refusalclaudeWhether the README section's list of diagnostics still reported for suppressed types is complete and accurate (Not every listed diagnostic (e.g. MsgPack012 inaccessible types) is covered by a test in facts.json, and I did not verify each one.) [out of scope: names no clause, not marked blocking, touches no mandated check or sensitive term]
notifyreviewer refusalnemotronParity with analyzer behavior in version 3.1.0 (No evidence about version 3.1.0 behavior was provided; cannot determine whether contract diagnostics match that release.) [out of scope: names no clause, not marked blocking, touches no mandated check or sensitive term]
notifyreviewer refusalnemotronWhether generation-only diagnostics (MsgPack011, MsgPack016, MsgPack017) are truly unreported on base for suppressed types (The fail_without_fix run only covers four analyzer tests; no base-source evidence exists for SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed.) [out of scope: names no clause, not marked blocking, touches no mandated check or sensitive term]
notifyheld beforeREQ-2234-F1met, but not achieved by this change: all 3 of the clause's tests that were run without the fix pass there too: AllowPrivateRequiredIsReported, MemberTypeMustBeMessagePackObjectIsReported, MemberWithoutKeyIsReported
notifyheld beforeREQ-2234-F2met, but not achieved by this change: all 1 of the clause's tests that were run without the fix pass there too: SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed
notifytrust capgenerator-analyzer-coregenerator-analyzer-core: AI may clear at most to notify (mandate clearance right)
silenttrust capdocsdocs: AI may clear at most to silent (mandate clearance right)
silenttrust capteststests: AI may clear at most to silent (mandate clearance right)

Risk score 92.4

FactorPointsReason
area_sensitivity20most sensitive area touched: generator-analyzer-core (high)
files_changed4.34 files (~1.1 per file while small, log-scaled past 80, cap 45)
lines_changed10.1266 non-generated lines (~4 per 100 lines while small, log-scaled past 100, cap 20; files and lines together at most 45)
generated_files0.00 generated files x 0.1 (cap 10)
public_api_change0public_api check: no change
source_without_tests0tests changed alongside source
security_sensitive_paths0none touched
fail_without_fix_not_shown0tests.fail_without_fix: pass
reviewer_disagreement81 clause(s) x 8: REQ-2234-N1
failed_checks502 failed check(s) x 25: tests.execution_fail_without_fix, tests.mutation
total92.4ask (bands {'notify': 15, 'ask': 40, 'block': 130})

Requirement trace, engine codes

ClauseStatusVerdictsChecksReasons
REQ-2234-F1held_beforeclaude: met (8/9)
codex: met (3/4)
nemotron: met (12/13)
build: pass
tests.targeted: pass
held_before all 3 of the clause's tests that were run without the fix pass there too: AllowPrivateRequiredIsReported, MemberTypeMustBeMessagePackObjectIsReported, MemberWithoutKeyIsReported
REQ-2234-F2held_beforeclaude: met (2/5)
codex: met (1/2)
nemotron: met (2/5)
build: pass
tests.targeted: pass
held_before all 1 of the clause's tests that were run without the fix pass there too: SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed
REQ-2234-N1refusedclaude: not_met (1/4)
codex: met (1/2)
nemotron: met (4/5)
build: pass
tests.full_suite: pass
not_met claude: The duplicate-key and mixed-kind crashes are fixed, and the full suite passes (175/175). But not every invalid contract in such a type is crash-free. The hard cast at line 985 is untouched, and my probe (scratch worktree, SDK 8, not in facts.json) of '[MessagePackObject(SuppressSourceGeneration = true)] public record Cmd([property: Key(null)] string Scope)' still gives AD0001 InvalidCastException (ParameterSyntax to PropertyDeclarationSyntax) at this head. The generator side of the duplicate-key fix has no test in facts.json (the new analyzer tests use CSharpCodeFixVerifier, analyzer only), though my probe showed no CS8785 for duplicate keys at head.
reviewers_disagree claude says not_met, codex says met, nemotron says met
adjudicator_dispute gemini: supported by cited evidence: claude, claude, codex, nemotron; not supported: claude, codex, nemotron; would settle it: Area-owner ruling on whether REQ-2234-N1 requires fixing the pre-existing TypeCollector.cs:985 cast for positional records with [property: Key(null)] in this change; A test in facts.json covering [MessagePackObject(SuppressSourceGeneration = true)] on a positional record with [property: Key(null)] asserting no AD0001 analyzer crash
REQ-2234-N2refusedclaude: met (3/7)
codex: met (0/2)
nemotron: met (6/7)
build: pass
tests.fail_without_fix: pass
thin_evidence codex says met with 0 verified evidence items about the change (of 2 cited; requirement quotes and unclaimed outcomes don't count)

Areas touched

AreaOwnerSensitivityAI capCap sourceFiles
generator-analyzer-coreToivohighnotifymandate clearance right1
docsRenelowsilentmandate clearance right1
testsToivolowsilentmandate clearance right2

Reviewers

Participating: claude, codex, nemotron; adjudicator: gemini; confidential: no.

ReviewerModelPromptReviewedVerifiedRejectedRefusals
claudeclaude-opus-5-5 (Anthropic)review-v12026-11-14T01:55:00+02:00402
codexGPT-6 (OpenAI)review-v12026-11-14T01:37:14+02:00000
nemotronnvidia/nemotron-3.5-super-vl-120b-a12b (NVIDIA)review-v12026-11-14T01:51:43+02:00504

Codex and Nemotron said met to all 4 clauses; Claude raised a verified major finding they did not (claude:C1: The issue's 3.1.1 regression is not on this base; the change fixes a different crash). Claude also did not say met on REQ-2234-N1, so that clause is refused. Unanimity is required: one verified objection is enough to send it to Toivo.

REQ-2234-N1: Claude: not met; Codex, Nemotron: met. A split verdict is a refusal, not a vote.

Rule: proven needs every participating reviewer to say met with verified evidence, and the clause's checks to pass. Unanimity, not a vote: each added reviewer can only make the AI more cautious.

Residual risk, every item

  • REQ-2234-N1 not proven: not_met; reviewers_disagree; adjudicator_dispute
  • REQ-2234-N2 not proven: thin_evidence
  • REQ-2234-F1 held before this change (met, but not achieved by it)
  • REQ-2234-F2 held before this change (met, but not achieved by it)
  • Reviewer refusal (claude): Whether this change resolves issue #2234 for users of the released 3.1.x packages
  • Reviewer refusal (claude): Whether the README section's list of diagnostics still reported for suppressed types is complete and accurate (out of scope: notify)
  • Reviewer refusal (nemotron): Parity with analyzer behavior in version 3.1.0 (out of scope: notify)
  • Reviewer refusal (nemotron): Whether generation-only diagnostics (MsgPack011, MsgPack016, MsgPack017) are truly unreported on base for suppressed types (out of scope: notify)
  • Reviewer refusal (nemotron): Runtime library behavior (src/MessagePack) and net472/netstandard builds
  • Reviewer refusal (nemotron): Security review of analyzer deserializing untrusted input
  • Open major finding claude:C1: The issue's 3.1.1 regression is not on this base; the change fixes a different crash
  • tests.MessagePack.Tests not run (runtime library src/MessagePack not modified by the change; suite not run)
  • build.net472/netstandard not run (only the net8.0 slice of src/MessagePack was built (Linux container, Debug))
  • benchmarks not run (no runtime serialization hot path touched (generator/analyzer only))
  • Standing gaps of this pipeline: other-targets, runtime-perf, semantic-intent, provenance (see not checked)

Provenance

Branch ju26-issue-2234 32258fdb..9007cee1, 4 files, +262 −4, author Stelian Vultur (agent-written: True). Commit: “Implementation for #2234 The analyzer does not work if SuppressSourceGeneration = true”.

Mandate messagepack-csharp v6 71386aa55974f675: signed by Toivo. countersign 0.1.0 under mandate messagepack-csharp v6 (71386aa55974).

Inputs: facts evidence/2234/facts.json (515724c41d34), requirements requirements/2234.yaml, reviews claude (4aaf18f2abe5), codex (df6789e29bfd), nemotron (f554f6846b2d). Rendered 2026-11-14T16:44:27+00:00.

Cited code, tests and checks (51)

test MemberWithoutKeyIsReported passedtest MemberTypeMustBeMessagePackObjectIsReported passedtest AllowPrivateRequiredIsReported passedtest DuplicateIntKeysAreReportedWithoutAnalyzerFailure failedtest DuplicateIntKeysAreReportedWithoutAnalyzerFailure passedtest MixedKeyKindsAreReportedWithoutAnalyzerFailure passedTypeCollector.cs:1023 @headTypeCollector.cs:1008 @headcheck tests.fail_without_fixREQ-2234-F1 textTypeCollector.cs:1008 @headTypeCollector.cs:1039 @headtest MemberWithoutKeyIsReported passedtest AllowPrivateRequiredIsReported passedtest MemberTypeMustBeMessagePackObjectIsReported passedtest DuplicateStringKeysAreReportedWithoutAnalyzerFailure passedcheck tests.fail_without_fix passtest MixedKeyKindsAreReportedWithoutAnalyzerFailure failedtest SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed passedtest SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed passedTypeCollector.cs:1383 @headTypeCollector.cs:1407 @headTypeCollector.cs:989 @headREQ-2234-F2 textTypeCollector.cs:1386 @headTypeCollector.cs:985 @headcheck tests.full_suiteREQ-2234-N1 textREQ-2234-N1 textcheck tests.full_suite passcheck tests.execution_full_suitecheck tests.execution_fail_without_fixtest DuplicateStringKeysAreReportedWithoutAnalyzerFailure failedtest SuppressedTypeRoundTripsThroughDynamicResolver passedREQ-2234-N2 texttest DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes failedTypeCollector.cs:723 @8373710f (not verified)TypeCollector.cs:1369 @baseissue 2234 (not verified)TypeCollector.cs:985 @headtest DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes passedTypeCollector.cs:1014 @headTypeCollector.cs:1016 @headcheck tests.execution_full_suite passSuppressedSourceGenerationTests.cs:9 @headSuppressedSourceGenerationTests.cs:18 @headcheck tests.execution_fail_without_fix failtest NoFormatterIsGeneratedForSuppressedType passedREADME.md:1620 @head (not verified)README.md:1634 @headSuppressedSourceGenerationTests.cs:1 @head

test MemberWithoutKeyIsReported passed

verified · facts.json tests.fail_without_fix: passed (new test)

Cited by claude on REQ-2234-F1, claude:C1

Test SuppressSourceGenerationAnalyzerTests.MemberWithoutKeyIsReported, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test MemberTypeMustBeMessagePackObjectIsReported passed

verified · facts.json tests.fail_without_fix: passed (new test)

Cited by claude on REQ-2234-F1

Test SuppressSourceGenerationAnalyzerTests.MemberTypeMustBeMessagePackObjectIsReported, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test AllowPrivateRequiredIsReported passed

verified · facts.json tests.fail_without_fix: passed (new test)

Cited by claude on REQ-2234-F1

Test SuppressSourceGenerationAnalyzerTests.AllowPrivateRequiredIsReported, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test DuplicateIntKeysAreReportedWithoutAnalyzerFailure failed

verified · facts.json tests.fail_without_fix: failed (new test)

Cited by claude on REQ-2234-F1, nemotron on REQ-2234-F1, nemotron on REQ-2234-N2

Test SuppressSourceGenerationAnalyzerTests.DuplicateIntKeysAreReportedWithoutAnalyzerFailure, cited as failed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

test DuplicateIntKeysAreReportedWithoutAnalyzerFailure passed

verified · facts.json tests.targeted: passed (new test)

Cited by claude on REQ-2234-F1, codex on REQ-2234-F1, nemotron on REQ-2234-F1, nemotron on REQ-2234-N1, nemotron:N1

Test SuppressSourceGenerationAnalyzerTests.DuplicateIntKeysAreReportedWithoutAnalyzerFailure, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

test MixedKeyKindsAreReportedWithoutAnalyzerFailure passed

verified · facts.json tests.targeted: passed (new test)

Cited by claude on REQ-2234-F1, codex on REQ-2234-F1, nemotron on REQ-2234-F1, nemotron on REQ-2234-N1

Test SuppressSourceGenerationAnalyzerTests.MixedKeyKindsAreReportedWithoutAnalyzerFailure, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

TypeCollector.cs:1023 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1023 at head 9007cee1

Cited by claude on REQ-2234-F1, codex on REQ-2234-F1, nemotron on REQ-2234-F1, claude:C4

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1020{1021    DeclaringType = GetDeclaringTypeIfColliding(item),1022};1023if (!intMembers.ContainsKey(member.IntKey))1024{1025    intMembers.Add(member.IntKey, (member, item.Type));1026}

Quoted: if (!intMembers.ContainsKey(member.IntKey))

Back to the evidence

TypeCollector.cs:1008 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1008 at head 9007cee1

Cited by claude on REQ-2234-F1

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1005    if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null))1006    {1007        this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.DoNotMixStringAndIntKeys, item.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax().GetLocation()));1008        continue; // The key kind does not match the other members; the diagnostic is reported, so skip this member.1009    }1010}1011

Quoted: continue; // The key kind does not match the other members

Back to the evidence

check tests.fail_without_fix

verified · facts.json: tests.fail_without_fix pass: new tests fail on base source: 4/8 failed -> tests do cover the change (4 new tests pass without the fix)

Cited by claude on REQ-2234-F1, codex on REQ-2234-F1, codex on REQ-2234-F2, claude on REQ-2234-N2, codex on REQ-2234-N2

tests.fail_without_fix pass: new tests fail on base source: 4/8 failed -> tests do cover the change (4 new tests pass without the fix)

dotnet test (source reverted, tests kept) 8.0.402

log: evidence/2234/logs/tests_fail_without_fix.1.log

Back to the evidence

REQ-2234-F1 text

verified · REQ-2234-F1 text contains the quote

Cited by nemotron on REQ-2234-F1

The analyzer must report contract diagnostics (e.g. missing [Key], duplicate keys, mixed key kinds) for [MessagePackObject(SuppressSourceGeneration = true)] types, as it did in version 3.1.0.

Back to the evidence

TypeCollector.cs:1008 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1008 at head 9007cee1

Cited by nemotron on REQ-2234-F1, claude:C3

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1005    if ((isIntKey && intKey == null) || (!isIntKey && stringKey == null))1006    {1007        this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.DoNotMixStringAndIntKeys, item.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax().GetLocation()));1008        continue; // The key kind does not match the other members; the diagnostic is reported, so skip this member.1009    }1010}1011

Quoted: continue; // The key kind does not match the other members; the diagnostic is reported, so skip this member.

Back to the evidence

TypeCollector.cs:1039 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1039 at head 9007cee1

Cited by nemotron on REQ-2234-F1

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1036{1037    DeclaringType = GetDeclaringTypeIfColliding(item),1038};1039if (!stringMembers.ContainsKey(member.StringKey))1040{1041    stringMembers.Add(member.StringKey, (member, item.Type));1042}

Quoted: if (!stringMembers.ContainsKey(member.StringKey))

Back to the evidence

test MemberWithoutKeyIsReported passed

verified · facts.json tests.targeted: passed (new test)

Cited by nemotron on REQ-2234-F1

Test SuppressSourceGenerationAnalyzerTests.MemberWithoutKeyIsReported, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test AllowPrivateRequiredIsReported passed

verified · facts.json tests.targeted: passed (new test)

Cited by nemotron on REQ-2234-F1

Test SuppressSourceGenerationAnalyzerTests.AllowPrivateRequiredIsReported, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test MemberTypeMustBeMessagePackObjectIsReported passed

verified · facts.json tests.targeted: passed (new test)

Cited by nemotron on REQ-2234-F1

Test SuppressSourceGenerationAnalyzerTests.MemberTypeMustBeMessagePackObjectIsReported, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test DuplicateStringKeysAreReportedWithoutAnalyzerFailure passed

verified · facts.json tests.targeted: passed (new test)

Cited by nemotron on REQ-2234-F1, claude on REQ-2234-N1, codex on REQ-2234-N1, nemotron on REQ-2234-N1

Test SuppressSourceGenerationAnalyzerTests.DuplicateStringKeysAreReportedWithoutAnalyzerFailure, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

check tests.fail_without_fix pass

verified · facts.json: tests.fail_without_fix pass: new tests fail on base source: 4/8 failed -> tests do cover the change (4 new tests pass without the fix)

Cited by nemotron on REQ-2234-F1, nemotron on REQ-2234-N2

tests.fail_without_fix pass: new tests fail on base source: 4/8 failed -> tests do cover the change (4 new tests pass without the fix)

dotnet test (source reverted, tests kept) 8.0.402

log: evidence/2234/logs/tests_fail_without_fix.1.log

Back to the evidence

test MixedKeyKindsAreReportedWithoutAnalyzerFailure failed

verified · facts.json tests.fail_without_fix: failed (new test)

Cited by nemotron on REQ-2234-F1, claude on REQ-2234-N2, nemotron on REQ-2234-N2

Test SuppressSourceGenerationAnalyzerTests.MixedKeyKindsAreReportedWithoutAnalyzerFailure, cited as failed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

test SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed passed

verified · facts.json tests.fail_without_fix: passed (new test)

Cited by claude on REQ-2234-F2, nemotron on REQ-2234-F2

Test SuppressSourceGenerationAnalyzerTests.SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

test SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed passed

verified · facts.json tests.targeted: passed (new test)

Cited by claude on REQ-2234-F2, codex on REQ-2234-F2, nemotron on REQ-2234-F2

Test SuppressSourceGenerationAnalyzerTests.SourceGenerationOnlyDiagnosticsAreNotReportedWhenSuppressed, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • passed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

TypeCollector.cs:1383 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1383 at head 9007cee1; context only, not counted: line 1383 of src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs is not a line this change touched (added at head)

Cited by claude on REQ-2234-F2, nemotron on REQ-2234-F2

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1380}13811382// Do not source generate the formatter for this type if the attribute opted out.1383if (suppressSourceGeneration is true)1384{1385    // Skip any source generation1386    return null;

Quoted: if (suppressSourceGeneration is true)

Back to the evidence

TypeCollector.cs:1407 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1407 at head 9007cee1; context only, not counted: line 1407 of src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs is not a line this change touched (added at head)

Cited by claude on REQ-2234-F2

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1404    BaseTypeDeclarationSyntax? targetType = formattedType.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax() as BaseTypeDeclarationSyntax;1405    Location? primaryLocation = targetType?.Identifier.GetLocation();1406    Location[]? addlLocations = nonPartialTypes.Where(t => t != targetType).Select(t => t.Identifier.GetLocation()).ToArray();1407    this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.PartialTypeRequired, primaryLocation, (IEnumerable<Location>?)addlLocations));1408    anyNonPartialTypesFound = true;1409}1410

Quoted: MsgPack00xMessagePackAnalyzer.PartialTypeRequired, primaryLocation

Back to the evidence

TypeCollector.cs:989 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:989 at head 9007cee1; context only, not counted: line 989 of src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs is not a line this change touched (added at head)

Cited by claude on REQ-2234-F2

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

986}987988// A property with an init accessor and an initializer has a default that will be discarded by the deserializer.989if (suppressSourceGeneration is not true && isInitOnly)990{991    EqualsValueClauseSyntax? initializer = item.DeclaringSyntaxReferences.Select(s => (s.GetSyntax(this.cancellationToken) as PropertyDeclarationSyntax)?.Initializer).FirstOrDefault(i => i is not null);992    if (initializer is not null)

Quoted: if (suppressSourceGeneration is not true && isInitOnly)

Back to the evidence

REQ-2234-F2 text

verified · REQ-2234-F2 text contains the quote

Cited by nemotron on REQ-2234-F2

Diagnostics that only apply when a formatter is generated (partial-class requirement, AOT-only checks) must not be reported for types with SuppressSourceGeneration = true.

Back to the evidence

TypeCollector.cs:1386 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1386 at head 9007cee1; context only, not counted: the quote is too short to point at anything (fewer than 12 non-space characters or no identifier)

Cited by nemotron on REQ-2234-F2

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1383if (suppressSourceGeneration is true)1384{1385    // Skip any source generation1386    return null;1387}13881389// If any property had a private setter and does not appear in the deserializing constructor signature,

Quoted: return null;

Back to the evidence

TypeCollector.cs:985 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:985 at head 9007cee1; context only, not counted: line 985 of src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs is not a line this change touched (added at head)

Cited by claude on REQ-2234-N1

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

982var stringKey = key is { Value: string stringKeyValue } ? stringKeyValue : default;983if (intKey == null && stringKey == null)984{985    this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.BothStringAndIntKeyAreNull, ((PropertyDeclarationSyntax)item.DeclaringSyntaxReferences[0].GetSyntax()).Identifier.GetLocation(), formattedType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), item.Name));986}987988// A property with an init accessor and an initializer has a default that will be discarded by the deserializer.

Quoted: ((PropertyDeclarationSyntax)item.DeclaringSyntaxReferences[0].GetSyntax()).Identifier.GetLocation()

Back to the evidence

check tests.full_suite

verified · facts.json: tests.full_suite pass: tests/MessagePack.SourceGenerator.Tests: 175 tests, 175 passed, 0 failed (0 not failing on base, 0 also failing on base)

Cited by claude on REQ-2234-N1, codex on REQ-2234-N1, claude on REQ-2234-N2, codex on REQ-2234-N2

tests.full_suite pass: tests/MessagePack.SourceGenerator.Tests: 175 tests, 175 passed, 0 failed (0 not failing on base, 0 also failing on base)

dotnet test 8.0.402

log: evidence/2234/logs/tests_full_suite.log

Back to the evidence

REQ-2234-N1 text

verified · REQ-2234-N1 text contains the quote

Cited by claude on REQ-2234-N1

The analyzer and generator must not crash on invalid contracts (e.g. duplicate keys) in such types.

Back to the evidence

REQ-2234-N1 text

verified · REQ-2234-N1 text contains the quote

Cited by nemotron on REQ-2234-N1

The analyzer and generator must not crash on invalid contracts (e.g. duplicate keys) in such types.

Back to the evidence

check tests.full_suite pass

verified · facts.json: tests.full_suite pass: tests/MessagePack.SourceGenerator.Tests: 175 tests, 175 passed, 0 failed (0 not failing on base, 0 also failing on base)

Cited by nemotron on REQ-2234-N1, nemotron on REQ-2234-N2

tests.full_suite pass: tests/MessagePack.SourceGenerator.Tests: 175 tests, 175 passed, 0 failed (0 not failing on base, 0 also failing on base)

dotnet test 8.0.402

log: evidence/2234/logs/tests_full_suite.log

Back to the evidence

check tests.execution_full_suite

verified · facts.json: tests.execution_full_suite pass: tests/MessagePack.SourceGenerator.ExecutionTests: 16/16 passed (base 14/14), 0 failures not on base; tests/MessagePack.SourceGenerator.MapModeExecutionTests: 22/22 passed (base 20/20), 0 failures not on base

Cited by claude on REQ-2234-N2

tests.execution_full_suite pass: tests/MessagePack.SourceGenerator.ExecutionTests: 16/16 passed (base 14/14), 0 failures not on base; tests/MessagePack.SourceGenerator.MapModeExecutionTests: 22/22 passed (base 20/20), 0 failures not on base

dotnet test (whole ExecutionTests, MapModeExecutionTests) vs base 9.0.321

log: evidence/2234/logs/execution.ExecutionTests.full.log

log: evidence/2234/logs/execution.MapModeExecutionTests.full.log

Back to the evidence

check tests.execution_fail_without_fix

verified · facts.json: tests.execution_fail_without_fix fail: new runtime tests pass on base source: 0/4 failed -> these runtime tests do NOT demonstrate the change (runtime behaviour they check is identical with and without the fix)

Cited by claude on REQ-2234-N2

tests.execution_fail_without_fix fail: new runtime tests pass on base source: 0/4 failed -> these runtime tests do NOT demonstrate the change (runtime behaviour they check is identical with and without the fix)

dotnet test (source reverted, tests kept) - ExecutionTests 9.0.321

log: evidence/2234/logs/execution_fail_without_fix.ExecutionTests.build.log

log: evidence/2234/logs/execution_fail_without_fix.ExecutionTests.targeted.log

log: evidence/2234/logs/execution_fail_without_fix.ExecutionTests.full.log

log: evidence/2234/logs/execution_fail_without_fix.MapModeExecutionTests.build.log

log: evidence/2234/logs/execution_fail_without_fix.MapModeExecutionTests.targeted.log

log: evidence/2234/logs/execution_fail_without_fix.MapModeExecutionTests.full.log

Back to the evidence

test DuplicateStringKeysAreReportedWithoutAnalyzerFailure failed

verified · facts.json tests.fail_without_fix: failed (new test)

Cited by claude on REQ-2234-N2, nemotron on REQ-2234-N2

Test SuppressSourceGenerationAnalyzerTests.DuplicateStringKeysAreReportedWithoutAnalyzerFailure, cited as failed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

test SuppressedTypeRoundTripsThroughDynamicResolver passed

verified · facts.json tests.execution_fail_without_fix: passed (new test)

Cited by claude on REQ-2234-N2

Test SuppressedSourceGenerationTests.SuppressedTypeRoundTripsThroughDynamicResolver, cited as passed. Runs:

  • passed on change head (tests.targeted.execution, tests/MessagePack.SourceGenerator.ExecutionTests)
    evidence/2234/logs/execution.ExecutionTests.build.log
  • passed on change head (tests.targeted.execution, tests/MessagePack.SourceGenerator.MapModeExecutionTests)
    evidence/2234/logs/execution.ExecutionTests.build.log
  • passed on source reverted, tests kept (without the fix) (tests.execution_fail_without_fix, tests/MessagePack.SourceGenerator.ExecutionTests)
    evidence/2234/logs/execution_fail_without_fix.ExecutionTests.build.log
  • passed on source reverted, tests kept (without the fix) (tests.execution_fail_without_fix, tests/MessagePack.SourceGenerator.MapModeExecutionTests)
    evidence/2234/logs/execution_fail_without_fix.ExecutionTests.build.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

REQ-2234-N2 text

verified · REQ-2234-N2 text contains the quote

Cited by nemotron on REQ-2234-N2

The fix is covered by automated tests that fail without it; no regressions in the existing test suite.

Back to the evidence

test DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes failed

verified · facts.json tests.fail_without_fix: failed (new test)

Cited by nemotron on REQ-2234-N2, claude:C1

Test SuppressSourceGenerationAnalyzerTests.DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes, cited as failed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

TypeCollector.cs:723 @8373710f

not verified · evidence must cite head or base, not '8373710fb0ae4bb453737f773b930401d8500c31'

Cited by claude:C1

Quoted: if (suppressSourceGeneration is true)

Back to the evidence

TypeCollector.cs:1369 @base

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1369 at base 32258fdb

Cited by claude:C1

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ base 32258fdb

1366}13671368// Do not source generate the formatter for this type if the attribute opted out.1369if (suppressSourceGeneration is true)1370{1371    // Skip any source generation1372    return null;

Quoted: if (suppressSourceGeneration is true)

Back to the evidence

issue 2234

not verified · issue text cannot be verified offline (not counted as evidence)

Cited by claude:C1

https://github.com/MessagePack-CSharp/MessagePack-CSharp/issues/2234

Back to the evidence

TypeCollector.cs:985 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:985 at head 9007cee1

Cited by claude:C2

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

982var stringKey = key is { Value: string stringKeyValue } ? stringKeyValue : default;983if (intKey == null && stringKey == null)984{985    this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.BothStringAndIntKeyAreNull, ((PropertyDeclarationSyntax)item.DeclaringSyntaxReferences[0].GetSyntax()).Identifier.GetLocation(), formattedType.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), item.Name));986}987988// A property with an init accessor and an initializer has a default that will be discarded by the deserializer.

Quoted: (PropertyDeclarationSyntax)item.DeclaringSyntaxReferences[0].GetSyntax()

Back to the evidence

test DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes passed

verified · facts.json tests.targeted: passed (new test)

Cited by claude:C4

Test SuppressSourceGenerationAnalyzerTests.DuplicateKeysAreReportedWithoutAnalyzerFailureForGeneratedTypes, cited as passed. Runs:

  • passed on change head (tests.targeted)
    evidence/2234/logs/tests_targeted.1.log
  • failed on source reverted, tests kept (without the fix) (tests.fail_without_fix)
    evidence/2234/logs/tests_fail_without_fix.1.log

Without the fix it failed: so it tests the change.

Back to the evidence

TypeCollector.cs:1014 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1014 at head 9007cee1

Cited by nemotron:N1

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

10111012if (isIntKey)1013{1014    if (intMembers.ContainsKey(intKey!.Value))1015    {1016        this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.KeysMustBeUnique, item.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax().GetLocation()));1017    }

Quoted: if (intMembers.ContainsKey(intKey!.Value))

Back to the evidence

TypeCollector.cs:1016 @head

verified · quote matches src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs:1016 at head 9007cee1

Cited by nemotron:N1

src/MessagePack.SourceGenerator/CodeAnalysis/TypeCollector.cs @ head 9007cee1

1013{1014    if (intMembers.ContainsKey(intKey!.Value))1015    {1016        this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.KeysMustBeUnique, item.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax().GetLocation()));1017    }10181019    var member = new MemberSerializationInfo(true, isWritable, isReadable, isInitOnly, item.IsRequired, intKey!.Value, item.Name, item.Name, item.Type.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat), item.Type.ToDisplayString(BinaryWriteFormat), specialFormatter)

Quoted: this.reportDiagnostic?.Invoke(Diagnostic.Create(MsgPack00xMessagePackAnalyzer.KeysMustBeUnique, item.DeclaringSyntaxReferences.FirstOrDefault()?.GetSyntax().GetLocation()));

Back to the evidence

check tests.execution_full_suite pass

verified · facts.json: tests.execution_full_suite pass: tests/MessagePack.SourceGenerator.ExecutionTests: 16/16 passed (base 14/14), 0 failures not on base; tests/MessagePack.SourceGenerator.MapModeExecutionTests: 22/22 passed (base 20/20), 0 failures not on base

Cited by nemotron:N2

tests.execution_full_suite pass: tests/MessagePack.SourceGenerator.ExecutionTests: 16/16 passed (base 14/14), 0 failures not on base; tests/MessagePack.SourceGenerator.MapModeExecutionTests: 22/22 passed (base 20/20), 0 failures not on base

dotnet test (whole ExecutionTests, MapModeExecutionTests) vs base 9.0.321

log: evidence/2234/logs/execution.ExecutionTests.full.log

log: evidence/2234/logs/execution.MapModeExecutionTests.full.log

Back to the evidence

SuppressedSourceGenerationTests.cs:9 @head

verified · quote matches tests/MessagePack.SourceGenerator.ExecutionTests/SuppressedSourceGenerationTests.cs:9 at head 9007cee1

Cited by nemotron:N2

tests/MessagePack.SourceGenerator.ExecutionTests/SuppressedSourceGenerationTests.cs @ head 9007cee1

6/// It must still serialize correctly through the run-time (dynamic) resolver.7/// </summary>8[MessagePackObject(SuppressSourceGeneration = true)]9public class SuppressedSourceGenerationType10{11    [Key(0)]12    public int Id { get; set; }

Quoted: public class SuppressedSourceGenerationType

Back to the evidence

SuppressedSourceGenerationTests.cs:18 @head

verified · quote matches tests/MessagePack.SourceGenerator.ExecutionTests/SuppressedSourceGenerationTests.cs:18 at head 9007cee1

Cited by nemotron:N2

tests/MessagePack.SourceGenerator.ExecutionTests/SuppressedSourceGenerationTests.cs @ head 9007cee1

15    public string Name { get; set; } = string.Empty;16}1718public class SuppressedSourceGenerationTests19{20    [Fact]21    public void NoFormatterIsGeneratedForSuppressedType()

Quoted: public class SuppressedSourceGenerationTests

Back to the evidence

check tests.execution_fail_without_fix fail

verified · facts.json: tests.execution_fail_without_fix fail: new runtime tests pass on base source: 0/4 failed -> these runtime tests do NOT demonstrate the change (runtime behaviour they check is identical with and without the fix)

Cited by nemotron:N3, nemotron:N5

tests.execution_fail_without_fix fail: new runtime tests pass on base source: 0/4 failed -> these runtime tests do NOT demonstrate the change (runtime behaviour they check is identical with and without the fix)

dotnet test (source reverted, tests kept) - ExecutionTests 9.0.321

log: evidence/2234/logs/execution_fail_without_fix.ExecutionTests.build.log

log: evidence/2234/logs/execution_fail_without_fix.ExecutionTests.targeted.log

log: evidence/2234/logs/execution_fail_without_fix.ExecutionTests.full.log

log: evidence/2234/logs/execution_fail_without_fix.MapModeExecutionTests.build.log

log: evidence/2234/logs/execution_fail_without_fix.MapModeExecutionTests.targeted.log

log: evidence/2234/logs/execution_fail_without_fix.MapModeExecutionTests.full.log

Back to the evidence

test NoFormatterIsGeneratedForSuppressedType passed

verified · facts.json tests.execution_fail_without_fix: passed (new test)

Cited by nemotron:N3

Test SuppressedSourceGenerationTests.NoFormatterIsGeneratedForSuppressedType, cited as passed. Runs:

  • passed on change head (tests.targeted.execution, tests/MessagePack.SourceGenerator.ExecutionTests)
    evidence/2234/logs/execution.ExecutionTests.build.log
  • passed on change head (tests.targeted.execution, tests/MessagePack.SourceGenerator.MapModeExecutionTests)
    evidence/2234/logs/execution.ExecutionTests.build.log
  • passed on source reverted, tests kept (without the fix) (tests.execution_fail_without_fix, tests/MessagePack.SourceGenerator.ExecutionTests)
    evidence/2234/logs/execution_fail_without_fix.ExecutionTests.build.log
  • passed on source reverted, tests kept (without the fix) (tests.execution_fail_without_fix, tests/MessagePack.SourceGenerator.MapModeExecutionTests)
    evidence/2234/logs/execution_fail_without_fix.ExecutionTests.build.log

Without the fix it passed: so it shows existing behaviour, not the change.

Back to the evidence

README.md:1620 @head

not verified · quote not on README.md:1620 ±3 at head; it does occur at line 1625, outside tolerance

Cited by nemotron:N4

README.md @ head 9007cee1

1617> Note: When using Unity, dynamic code generation only works when targeting .NET Framework 4.x + mono runtime.1618For all other Unity targets, AOT is required.16191620### Opting out of source generation16211622A `[MessagePackObject]` type can opt out of source generation with `[MessagePackObject(SuppressSourceGeneration = true)]`.1623No formatter is generated for that type. It is serialized at run time by the dynamic resolvers, which use reflection, so such a type is not AOT-safe.

Quoted: The analyzer still validates these types, because they are serialized at run time and must still have a valid contract:

Back to the evidence

README.md:1634 @head

verified · quote matches README.md:1634 at head 9007cee1 (found at line 1632, 2 off)

Cited by nemotron:N4

README.md @ head 9007cee1

1629- Members have types that are themselves serializable ([MsgPack003](doc/analyzers/MsgPack003.md)).1630- Types are accessible to the resolver ([MsgPack012](doc/analyzers/MsgPack012.md)).16311632The analyzer does not report the partial-class requirement ([MsgPack011](doc/analyzers/MsgPack011.md)) or the AOT-only checks ([MsgPack016](doc/analyzers/MsgPack016.md) and [MsgPack017](doc/analyzers/MsgPack017.md)) for these types, because they only apply when a formatter is generated.16331634### Customizations1635

Quoted: The analyzer does not report the partial-class requirement ([MsgPack011](doc/analyzers/MsgPack011.md)) or the AOT-only checks ([MsgPack016](doc/analyzers/MsgPack016.md) and [MsgPack017](doc/analyzers/MsgPack017.md)) for these types, because they only apply when a formatter is generated.

Back to the evidence

SuppressedSourceGenerationTests.cs:1 @head

verified · quote matches tests/MessagePack.SourceGenerator.ExecutionTests/SuppressedSourceGenerationTests.cs:1 at head 9007cee1

Cited by nemotron:N5

tests/MessagePack.SourceGenerator.ExecutionTests/SuppressedSourceGenerationTests.cs @ head 9007cee1

1// Copyright (c) All contributors. All rights reserved.2// Licensed under the MIT license. See LICENSE file in the project root for full license information.34/// <summary>

Quoted: // Copyright (c) All contributors. All rights reserved.

Back to the evidence