Skip to content

Deprecated project.license TOML table + License classifier under an uncapped setuptools build floor (CR-A16-039) #523

Open

Description

@cemililik

Wave 2 · theme D2-7: Next-release technology updates · highest severity Low · 2 finding(s) · effort trivial

Summary

After 2027-02-18 a setuptools release removes table support. The tag-driven publish build fails, or sdist installs fail, with no repository change.

Primary finding

CR-A16-039 — Deprecated project.license TOML table + License classifier under an uncapped setuptools build floor

severity Low · reachability default · intent intended-but-harmful · confidence likely · single reviewer · reproduced end to end · already tracked: KNOWN-OPEN OPS-11/12/14/17/18 (S13 packaging metadata; split not public) — docs/roadmap/phase-16-trust-surface-hardening.md:717-718

What happens. pyproject.toml:23 uses license = { text = 'Apache-2.0' } and :34 the 'License :: OSI Approved' classifier; setuptools 81-84 warn the table form is unsupported after 2027-02-18, and [build-system] requires setuptools>=83.0.0 with no cap (pyproject.toml:14), so publish.yml's python -m build will pick up the enforcing release with no repo change (both lines must change together).

Where.

Evidence.

  • pip wheel -v --no-build-isolation in a private copy with setuptools 81.0.0 (default venv) and 84.0.0 (latest venv) prints SetuptoolsDeprecationWarning 'project.license as a TOML table is deprecated' and 'License classifiers are deprecated', both with 'By 2027-Feb-18'. Both builds exit 0.
  • fpy (setuptools 81.0.0) and fpy --venv lower (setuptools 84.0.0) running setuptools.config.pyprojecttoml.apply_configuration on the snapshot pyproject: both warnings reproduced, license_expression None. setuptools NEWS v82-v84 shows no removal yet.

Recommended fix. Use license = "Apache-2.0" plus license-files = ["LICENSE"] and drop the license classifier.

Other findings with the same root cause

These close with the same fix; update them in the same pull request.

TECH-T12-012 — Supply-chain tooling, network dependencies and vulnerability scanning: pyproject licence metadata: license = { text = ... } table and License classifier under setuptools>=83 (PEP 639 deprecation) (…

severity Next release · already tracked: KNOWN-OPEN OPS-11|OPS-12|OPS-14|OPS-17|OPS-18 docs/roadmap/phase-16-trust-surface-hardening.md:717-718

Item. pyproject licence metadata: license = { text = ... } table and License classifier under setuptools>=83 (PEP 639 deprecation) · verdict: deprecated-in-use · urgency: Next release

State in ForgeLM. pyproject.toml:23 license = { text = "Apache-2.0" }; pyproject.toml:34 classifier 'License :: OSI Approved :: Apache Software License'.

State of the ecosystem on 2026-10-01. Reproduced by the arbiter on 2026-10-01 with setuptools 84.0.0 (fpy --venv latest, setuptools.build_meta.prepare_metadata_for_build_wheel on a private copy of the snapshot): SetuptoolsDeprecationWarning 'project.license as a TOML table is deprecated ... By 2027-Feb-18, you need to update your project and remove deprecated calls or your builds will no longer be supported', plus 'License classifiers are deprecated'. The due date is hard-coded (setuptools/config/_apply_pyprojecttoml.py due_date=(2027, 2, 18)); in 84.0.0 a passed due date raises only when SETUPTOOLS_ENFORCE_DEPRECATION is set, otherwise it warns 'overdue', so the actual break arrives with a later setuptools release that removes the table form. setuptools v77.0.0 introduced both deprecations; PEP 639 (Final) deprecates the table subkeys and licence classifiers; the PyPA guide (updated 2026-09-22) calls the table format deprecated.

Impact. Builds succeed today with warnings. The build floor has no upper bound, so isolated builds always take the newest setuptools; a release after the removal would fail python -m build in publish.yml. Fix cost is two lines.

Recommendation. Use license = "Apache-2.0" plus license-files = ["LICENSE"] (setuptools >= 77, inside the >= 83 floor) and drop the License classifier; publish.yml already runs twine check.

Sources.

Acceptance criteria

  • A regression test reproduces the failure scenario and asserts the corrected behaviour.
  • Documentation listed above is corrected in English and in its Turkish mirror in the same PR.
  • Every finding in this issue is resolved or explicitly closed with a reason.

Found by the October 2026 ForgeLM code and documentation review against commit cab2947. Code links point at that commit; line numbers may have moved since. Finding IDs (CR-…, DOC-…, TECH-…) are stable references for this backlog.

Activity

  1. added
    bugSomething isn't working
    backlog: knownAlready tracked in docs/roadmap
    dependenciesDependency or ecosystem currency
    severity: lowMinor defect, inaccuracy or rough edge
    source: review-2026-10Found by the October 2026 code and documentation review
    urgency: next-releaseTechnology currency: fix in the next release
    wave: 2Roadmap wave 2: high severity, larger effort; next-release tech
    on Oct 9, 2026
  2. cemililik commented on Oct 11, 2026

    @cemililik
    CollaboratorAuthor

    Where to start

    Thanks for taking a look. Please confirm the issue is unassigned and comment before starting so work does not overlap.

    Start with these files on development:

    Use license="Apache-2.0", explicit license-files=["LICENSE"], and remove the deprecated License classifier; keep the existing build backend floor and version. Verify built wheel/sdist metadata and the bundled license with python3 -m build and twine check dist/*. Add a focused packaging regression against the built metadata if needed; do not merely assert the TOML spelling.

    The existing setuptools>=83 floor supports PEP 639. Optional build tools can be installed in a separate venv; no release/tag/publish is part of this issue.

    Run the focused tests:

    pytest tests/test_packaging.py --no-cov

    Run these guards/checks as applicable to the changed files:

    ruff format --check tests/test_packaging.py
    ruff check tests/test_packaging.py

    If user-facing documentation changes, update the existing Turkish mirror in the same PR; keep commands, code and terminal output in English and structurally aligned. English-only contributor standards need no new mirror.

    Open the PR against development with Fixes #523 once every finding is resolved or explicitly closed with a reason; use Refs #523 for partial work and list the resolved finding IDs.

  3. added
    help wantedExtra attention is needed
    and removed on Oct 11, 2026
  4. added
    blockedWaits for another issue (see Blocked by); set and removed automatically, never by hand
    and removed
    help wantedExtra attention is needed
    on Oct 20, 2026
  5. cemililik commented on Oct 20, 2026

    @cemililik
    CollaboratorAuthor

    Removing help wanted: both findings here are units of Phase 16 S13 (#899), and that step's pull request is expected to fix them. Until S13 lands this issue is blocked by #899; see Dependencies between issues. If anything is left open after S13, it can be picked up then.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: packaging-ciCode area: packaging-cibacklog: knownAlready tracked in docs/roadmapblockedWaits for another issue (see Blocked by); set and removed automatically, never by handbugSomething isn't workingdependenciesDependency or ecosystem currencyseverity: lowMinor defect, inaccuracy or rough edgesource: review-2026-10Found by the October 2026 code and documentation reviewurgency: next-releaseTechnology currency: fix in the next releasewave: 2Roadmap wave 2: high severity, larger effort; next-release tech

    Type

    No type

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions