{"id":"PSF-2.0","title":"Python Software Foundation License 2.0","reviewed_on":"2026-09-22","reviewer":"Giray Havur","text_source":"https://raw.githubusercontent.com/spdx/license-list-data/main/text/PSF-2.0.txt","text_retrieved":true,"verdict":"created","summary":"Models the Python Software Foundation licence agreement version 2 on its own, as SPDX lists it: the eight numbered paragraphs between the foundation and the licensee, without the BeOpen, CNRI and CWI agreements that the full Python licence stacks on top of it. The record follows PythonLicense20 for the clause texts and the duties, and adds the termination flag paragraph 6 states.","findings":[{"rubric":1,"severity":"info","field":"spdx:licenseId","description":"File name, record identifier, SPDX identifier and IRI local name are all PSF-2.0. The library already holds the stacked Python licence under PythonLicense20 with spdx:licenseId Python-2.0, and Python-2.0.1 beside it; this record is the PSF agreement alone.","action":"applied"},{"rubric":2,"severity":"info","field":"odrl:target","description":"One odrl:AssetCollection of dct:type dcmitype:Software, following PythonLicense20. Paragraph 1 names the software in source or binary form and its associated documentation.","action":"applied"},{"rubric":3,"severity":"major","field":"odrl:permission","description":"Paragraph 2 reads \"PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python alone or in any derivative version\". The record permits reproduce, distribute, modify, derive, display, present, commercial use, derivative works, modified works and the distribution fee. odrl:display and odrl:present rest on \"perform and/or display publicly\" in as many words.","action":"applied"},{"rubric":3,"severity":"major","field":"odrl:permission","description":"dalicc:ChangeLicense is permitted with the dalicc:compliantLicense duty, as on PythonLicense20: the retention condition in paragraph 2 has to survive a relicensing and nothing bars one.","action":"applied"},{"rubric":4,"severity":"major","field":"odrl:prohibition","description":"dalicc:promote is prohibited for paragraph 7, \"This License Agreement does not grant permission to use PSF trademarks or trade name in a trademark sense to endorse or promote products or services of Licensee, or any third party\".","action":"applied"},{"rubric":5,"severity":"major","field":"odrl:duty","description":"cc:Attribution and cc:Notice hang off odrl:distribute, odrl:modify and odrl:derive for the proviso of paragraph 2, that \"PSF's License Agreement and PSF's notice of copyright ... are retained in Python alone or in any derivative version prepared by Licensee\".","action":"applied"},{"rubric":5,"severity":"minor","field":"odrl:duty","description":"dalicc:modificationNotice hangs off odrl:modify and odrl:derive for paragraph 3, \"Licensee hereby agrees to include in any such work a brief summary of the changes made to Python\". PythonLicense20 attaches the same duty for the same paragraph.","action":"applied"},{"rubric":6,"severity":"minor","field":"dalicc:WarrantyDisclaimer","description":"Paragraphs 4 and 5 are quoted into dalicc:WarrantyDisclaimer and dalicc:LiabilityLimitation, in the wording PythonLicense20 uses, with the paragraph number dropped so that the two records carry the same literal.","action":"applied"},{"rubric":7,"severity":"major","field":"dalicc:terminatesOnBreach","description":"dalicc:terminatesOnBreach is true for paragraph 6, \"This License Agreement will automatically terminate upon a material breach of its terms and conditions\". No cure period is given, so dalicc:curePeriod is absent. The text names no governing law and no term, so cc:jurisdiction is dalicc:worldwide and dalicc:validityType is dalicc:perpetual.","action":"applied"},{"rubric":8,"severity":"info","field":"dalicc:additionalClauses","description":"No clause of this text needs a term the vocabulary does not have. Paragraph 8, under which a licensee is bound by copying or installing the software, is quoted rather than modelled.","action":"none"},{"rubric":9,"severity":"info","field":"record","description":"The consistency check of app.services.composer against the dependency graph dg_default returned an empty conflict list.","action":"none"},{"rubric":10,"severity":"info","field":"record","description":"Read against licensedata/licenses/PythonLicense20.ttl the differences are: no dalicc:noWarrantyNotice permission, which that record takes from a paragraph of the stacked agreements that is not in this text; cc:Attribution and cc:Notice on odrl:modify as well, which the text's retention proviso covers; and dalicc:terminatesOnBreach true, which Python-2.0.1 also carries for the same sentence.","action":"none"}],"family":"Permissive variants","port_of":null,"variant_kind":null,"variant_of":null,"notes":"cc:legalcode and dct:source both point at the SPDX page, which serves this agreement on its own; the foundation's own page serves the whole stack. cc:attributionName follows Python-2.0.1."}