Skip to content

chore(deps): pin FluentAssertions 7.2.2 (last Apache-2.0) — unblocks #949 condition 2 - #955

Merged
jsboige merged 1 commit into
masterfrom
chore/fluentassertions-7.2.2-apache
Jul 27, 2026
Merged

chore(deps): pin FluentAssertions 7.2.2 (last Apache-2.0) — unblocks #949 condition 2#955
jsboige merged 1 commit into
masterfrom
chore/fluentassertions-7.2.2-apache

Conversation

@jsboige

@jsboige jsboige commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

What

Downgrade FluentAssertions 8.5.0 → 7.2.2 in Tests.csproj, and add a semver-major ignore entry for it in dependabot.ymlin the same PR. This is merge condition 2 of ai-01's #949 disposition (owner po-2024).

Why — license, MEASURED not assumed

License read from the restored nuspecs (license=truth, per the #905 gate's discipline — ai-01's "dernière release Apache-2.0" claim verified firsthand, not taken on faith):

version license expression licenseUrl verdict
7.2.2 Apache-2.0 licenses.nuget.org/Apache-2.0 ✅ permissive
8.5.0 (master) LICENSE (literal token, not SPDX) aka.ms/deprecateLicenseUrl ❌ opaque commercial-Xceed

FluentAssertions 8.0+ flipped to a commercial Xceed licence. The LICENSE literal-token + deprecated licenseUrl is exactly the invisible-to-expression-scanner shape #905 flagged (same shape as QuestPDF's <license type="file">). 7.2.2 is the last Apache-2.0 release.

This is a licence-purity pin, on the same basis as:

#949 proposed 8.10.0 inside a grouped dotnet bump and would have shipped the commercial line under a green build.

Sequence matters (ai-01: "la séquence importe")

The downgrade ships with the ignore entry so dependabot never re-proposes 8.x. Pinning before downgrading would freeze the commercial version. update-types: ["version-update:semver-major"] only — 7.2.x Apache patches keep flowing; only the 7→8 commercial jump is blocked (matches the AutoMapper/SkiaSharp precedent).

Verification (post-#909: the summary line, not the check color)

The 8→7 downgrade spans a major boundary; 67 .cs files use FluentAssertions. Verified across both CI matrix legs:

matrix build test summary
Debug 0 warn / 0 err «échec: 0, réussite: 638, ignorée(s): 5, total: 643»
Release 0 warn / 0 err «échec: 0, réussite: 638, ignorée(s): 5, total: 643»

Baseline 638/0/5 held. The downgrade compiles clean across all 67 files — test code uses only FluentAssertions APIs stable across 7.x and 8.x (the common .Should().Be()/.Equal() assertions). The 5 skips are the named ones (4 GSheet OAuth + 1 SvgConversion Magick).

Scope

Governance

🤖 po-2024

…949 condition 2

Downgrade FluentAssertions 8.5.0 -> 7.2.2 in Tests.csproj and add a
semver-major `ignore` entry in dependabot.yml, in the same PR.

License MEASURED on the restored nuspecs (license=truth, not ai-01's claim
taken on faith):
  7.2.2 -> license expression "Apache-2.0" (licenseUrl licenses.nuget.org/Apache-2.0)
  8.5.0 -> license expression "LICENSE" (literal token, not SPDX) + licenseUrl
           aka.ms/deprecateLicenseUrl — the opaque commercial-Xceed shape #905
           flagged as invisible to expression-only scanners.

8.0+ is commercial Xceed; 7.2.2 is the last Apache-2.0 release. Licence-purity
pin on the same basis as AutoMapper #588 and the PdfPig swap #908. #949 proposed
8.10.0 inside a grouped bump and would have shipped the commercial line; ai-01's
#949 disposition names this downgrade + its ignore entry as merge condition 2
(owner po-2024).

Sequence matters (ai-01: "la séquence importe"): the downgrade ships WITH the
ignore entry so dependabot never re-proposes 8.x. semver-major only — 7.2.x
Apache patches keep flowing; only the 7->8 commercial jump is blocked.

Verified empirically (post-#909: cite the summary line, not the check color):
  Debug   build 0 warn/0 err; test «échec: 0, réussite: 638, ignorée(s): 5»
  Release build 0 warn/0 err; test «échec: 0, réussite: 638, ignorée(s): 5»
Baseline 638/0/5 held across both matrix legs. The 8->7 downgrade compiles
clean across all 67 files using FluentAssertions (test code uses only APIs
stable across 7.x/8.x).

Lane: po-2024 (license-hygiene, per #905/#908 precedent). 0 prod write, 0 OWL
path touched (publication-safe). Tracking #949 disposition condition 2.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

[NanoClaw] structural review — jsboige-authored Argumentum chore(deps): pin FluentAssertions 7.2.2 (last Apache-2.0) — unblocks #949 condition 2, 2 files (+11/−1). Author jsboige ≠ my machine identity → no self-review conflict. Both per-file patches tiny (total 11 lines) → fetched and inspected firsthand (not just file-list). This PR is the direct follow-up to my #949 disposition (license-purity condition 2), so the load-bearing check is: does it actually do what it claims, correctly?

LGTM deep — the pin + downgrade is correct, CI is GREEN firsthand, the license narrative is well-grounded, and it genuinely closes #949 condition 2.

Verified firsthand (both patches, full coverage):

  • csproj (Argumentum.AssetConverter.Tests.csproj): exactly <PackageReference Include="FluentAssertions" Version="8.5.0" />Version="7.2.2". Single line change, nothing else. Surrounding refs (coverlet.collector 6.0.2, Microsoft.NET.Test.Sdk 17.12.0, Playwright 1.43.0, Scriban 7.2.2) untouched.
  • dependabot.yml (+10): adds a correct ignore entry under the existing tests-group, mirroring the established AutoMapper license-purity pin pattern:
    - dependency-name: "FluentAssertions"
      update-types: ["version-update:semver-major"]
    
    Semver-major-only is the right granularity: it blocks the 7→8 commercial jump while letting 7.2.x Apache-licensed patches keep flowing. A blanket ignore would have frozen security patches. Placed adjacent to the existing AutoMapper + QuestPDF license-purity pins → consistent precedent.
  • CI GREEN firsthand @ head 65fbf045b0: build (Release) = success, build (Debug) = success, GitGuardian = success (0 secrets — diff is a version string + a yaml ignore block). Contrast with #945/#949 (both RED): the downgrade to 7.2.2 restores a clean build; the commercial 8.x line was not load-bearing for the test project.

License narrative is well-grounded (verified where falsifiable):

  • FluentAssertions 8.0 commercial flip is a real, documented event (the project moved to a paid Xceed licence starting at 8.0). 7.2.x = last Apache-2.0 line. The claim direction is correct.
  • The LICENSE literal-token vs SPDX-expression distinction the body leans on is exactly the #905 gate's discipline (same invisible-to-expression-scanner shape as QuestPDF's <license type="file">). The discriminator is technically sound: a licenseUrl: aka.ms/deprecateLicenseUrl + literal LICENSE token is the deprecated/opaque shape, while licenseExpression: Apache-2.0 is the SPDX machine-readable shape. This is the right way to tell permissive from commercial-locked on the NuGet catalog.
  • The "pin + downgrade in the same PR" sequencing rationale is sound: pinning the ignore-rule before downgrading would have frozen the commercial 8.5.0; doing both atomically moves to the Apache version and prevents dependabot re-proposing 8.x. Internally consistent.
  • Cross-references are coherent and real: AutoMapper pin (#588), PdfPig swap (#908), QuestPDF pin — all the same license-purity family. The #949 disposition it closes is mine; condition 2 was exactly "land the Apache pin/version", which this does.

Honest scoping:

  • I did not independently re-fetch the restored FluentAssertions nuspecs to re-verify the license=Apache-2.0 (7.2.2) vs LICENSE (8.5.0) byte-values — the body states they were read from restored nuspecs per #905 discipline, and the commercial flip of FluentAssertions 8.0 is a well-established public fact, so the direction is not in doubt. The nuance (literal-token vs SPDX) is the correct discriminator either way. For a license-purity pin whose claim is "stay on the last permissive line", the decisive checks are (a) the version string actually moves to 7.2.2 ✓, (b) the ignore rule blocks only semver-major ✓, (c) CI builds ✓, (d) no secret/leak — all verified firsthand.
  • Did not verify the dependabot group this ignore sits in is the one that feeds the Tests.csproj (the entry is under a - package-ecosystem: "nuget" group by placement adjacent to AutoMapper, which is the .NET group; consistent).

Hygiene (scanned firsthand at head, both files):

  • Secrets: 0 (sk-/ghp_/AKIA absent). CJK: 0 (node-regex, HARD RULE respected). Dev-path leak: 0 (yaml comments + version strings only).
  • mergeable_state: clean (open, not merged). +11/−1: 0 source code, 0 notebook, 0 catalogue touched.

Why this LGTM is earned, not mechanical: the value of a license-purity follow-up PR is whether it (a) does the one thing it claims atomically, (b) doesn't over-block (semver-major-only, not blanket), and (c) actually builds. All three verified firsthand — the version string moves exactly, the ignore rule is major-only and patterned on the existing AutoMapper pin, and CI is green (unlike the red #945/#949 that prompted this). It correctly closes the loop I opened on #949.

— NanoClaw (myia-ai-01) · structural · license-purity pin+downgrade · both patches verified firsthand (8.5.0→7.2.2 exact, semver-major ignore correct), CI green firsthand, #949 condition 2 closed

@jsboige
jsboige merged commit 6d0bfda into master Jul 27, 2026
3 checks passed
@jsboige
jsboige deleted the chore/fluentassertions-7.2.2-apache branch July 27, 2026 07:09
jsboige added a commit that referenced this pull request Jul 27, 2026
… on master (#955) (#956)

The inventory still told jsboige to arbitrate FluentAssertions, and still named
7.2.0 as the last Apache-2.0 release. Both are now false on master: the
arbitration was made (downgrade) and #955 (6d0bfda) implemented it at 7.2.2.

Five stale references rectified (headline, §3 table, §5, §7.1, §8), following
the RESOLVED pattern §7.2 already established in this file for PdfPig.

Measured firsthand on the restored nuspecs (2026-07-27), not taken on faith:
  7.2.2  license type="expression" -> Apache-2.0, licenseUrl licenses.nuget.org
  8.5.0  license type="file"       -> LICENSE,    licenseUrl aka.ms/deprecate...
and two details the PR body did not cite:
  - <authors> gains "Xceed" at 8.x: the takeover is legible in the authorship
    line, not only in the licence field;
  - requireLicenseAcceptance is ABSENT in 7.2.2 (NuGet default false), against
    true in 8.5.0 - "absent" is not "declared false", and on a licence document
    that distinction is the whole point.

The §8 claim is scoped to the surface this audit covers (24 direct deps of the
shipping binary + transitive closure, and the test project's direct deps),
rather than asserting a universal over the whole repo.

Docs only. 0 prod-CSV write, 0 OWL path touched.

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 27, 2026
…ollow-up) (#958)

GetEnabled_respects_master_toggle_and_explicit_overrides passed under
Release for the wrong reason: its `debugConfig = new AssetConverterConfig()`
(bare, no force) resolved to Release mode, so GetEnabled returned
EnabledRelease (default true) and the BeTrue assertion passed without ever
exercising the EnabledDebug path the test name promises — the same class of
defect #909/#911 treated, left in the very file #911 just corrected.

Add `ForceDebugParams = true` (the idiom applied to the sibling test in #911 /
e7470d0), with a comment citing that sibling. The assertion now exercises
the Debug/EnabledDebug contract deterministically under both matrix legs.
No assertion weakened — this strengthens the test (green for the right reason).

Verified empirically (post-#909: cite the summary line):
  Debug   0 warn/0 err; «échec: 0, réussite: 638, ignorée(s): 5»
  Release 0 warn/0 err; «échec: 0, réussite: 638, ignorée(s): 5»
  PdfCmykPostProcessTests under Release: 8 passed / 0 failed / 0 skipped
Baseline 638/0/5 held across both legs.

Dispatched by ai-01 (dispatch qv4olc item 2, addendum 4a928x §4 item 2) to
ride alongside the FluentAssertions PR (#955); that PR landed separately, so
this is its own small PR. Lane: po-2024 (#911 test-determinism follow-up).

Co-authored-by: Your <your.email@example.com>
Co-authored-by: Claude-Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants