Repository navigation
Deprecated project.license TOML table + License classifier under an uncapped setuptools build floor (CR-A16-039) #523
Description
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-isolationin a private copy with setuptools 81.0.0 (default venv) and 84.0.0 (latest venv) prints SetuptoolsDeprecationWarning 'project.licenseas 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.
- setuptools NEWS (v77.0.0: project.license table and licence classifiers deprecated) (2026-08-08)
- PEP 639 (Final): deprecate license key table subkeys and license classifiers (2025-01-24 (last modified))
- PyPA guide: Writing your pyproject.toml (license table format deprecated) (2026-09-22 (last updated))
- PyPI setuptools (83.0.0 2026-07-04; 84.0.0 2026-08-08) (2026-08-08)
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.
Metadata
Metadata
Assignees
Labels
Type
Projects
- StatusShow more project fieldsTodo
Activity
cemililik commentedon Oct 11, 2026
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:
Run these guards/checks as applicable to the changed files:
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
developmentwithFixes #523once every finding is resolved or explicitly closed with a reason; useRefs #523for partial work and list the resolved finding IDs.cemililik commentedon Oct 20, 2026
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.