Update `from` and add `to` type of hasConcludedLicense and hasDeclaredLicense
Per 14 Oct 2025 Tech call, reviewing a proposal in issue #1114:
- Update entry description of
hasConcludedLicenseandhasDeclaredLicenseto explicitly state the type ofto. Make itAnyLicenseInfo. fromtype updated toArtifactto support hardware- Minor format/style update of "for example" in the
hasDeclaredLicensedescription to make it consistent with another "for example" instance (ininvokedByentry) - Update
compliance pointrelevant content in Licensing profile
Current hasConcludedLicense and hasDeclaredLicense descriptions:
- hasConcludedLicense: The
fromSoftwareArtifact is concluded by the SPDX data creator to be governed by eachtolicense.- hasDeclaredLicense: The
fromSoftwareArtifact was discovered to actually contain eachtolicense, for example as detected by use of automated tooling.
graph LR;
A(SoftwareArtifact) -->|hasConcludedLicense| C(Type unspecified)
A(SoftwareArtifact) -->|hasDeclaredLicense| B(Type unspecified)
Proposed in this PR:
- hasConcludedLicense: The
fromArtifact is concluded by the SPDX data creator to be governed by eachtoAnyLicenseInfo. If thetoof an Artifact'shasConcludedLicenseis not the same as thetoof itshasDeclaredLicense, a written explanation should be provided in the comment field of thehasConcludedLicenserelationship.- hasDeclaredLicense: The
fromArtifact was discovered to actually contain eachtoAnyLicenseInfo (for example, as detected by automated tooling).
graph LR;
A(Artifact) -->|hasConcludedLicense| C(AnyLicenseInfo)
A(Artifact) -->|hasDeclaredLicense| B(AnyLicenseInfo)
Should the "license" --> AnyLicenseInfo update be in 3.0 too? @kestewart @goneall @zvr
If it should, I will create another PR targets support/3.0 that only update the "license" --> AnyLicenseInfo.
No need to back-port this to 3.0.
But I am a little skeptical of the wording that says stuff about "each to".
Why "each"? Can there be more than one?
I am pretty sure in the case of hasConcludedLicense we should have only one -- if there a multiple licenses, there should be a single expression combining them.
I need some more time to think about whether hasDeclaredLicense should be the same.
@swinslow what do you think?
In case there will be a change in "each to", and the change is not in 3.0, will the change (in post-3.0) be considered a breaking change?
am pretty sure in the case of
hasConcludedLicensewe should have only one -- if there a multiple licenses, there should be a single expression combining them.
There made be times that there will more that one hasConcludedLicense relationship per element like when they have different CreationInfo.
Note that the description of hasDeclaredLicense and hasConcludedLicense may need further clarification too, see @JPEWdev comments and my comments in #1022
Update: I have added another sentence to hasConcludedLicense description, copy-edited from the Licensing profile page, on the case that hasConcludedLicense disagrees with hasDeclaredLicense. It may slightly addressed part of the concerns in #1022.
But I am a little skeptical of the wording that says stuff about "each
to". Why "each"? Can there be more than one? I am pretty sure in the case ofhasConcludedLicensewe should have only one -- if there a multiple licenses, there should be a single expression combining them.I need some more time to think about whether
hasDeclaredLicenseshould be the same.
Note that the Licensing profile has such a constraint for hasConcludedLicense:
https://github.com/spdx/spdx-3-model/blob/9e7c359084a297a5c27c55034d4dd66cd586e1ce/model/Licensing/Licensing.md?plain=1#L115-L123
@stevenc-stb So the general suggestion is to keep the Licensing profile conformance separated from the type constraints as describe in the relationship type description - right?
i.e. hasConcludedLicense / hasDeclaredLicense can take from of any Artifact, but the Licensing profile conformance requirement will only applied to SoftwareArtifact -- am I understand your suggestion correctly? (if so, I agreed with that and will revert related changes).
@stevenc-stb So the general suggestion is to keep the Licensing profile conformance separated from the type constraints as describe in the relationship type description - right?
i.e.
hasConcludedLicense/hasDeclaredLicensecan takefromof anyArtifact, but the Licensing profile conformance requirement will only applied toSoftwareArtifact-- am I understand your suggestion correctly? (if so, I agreed with that and will revert related changes).
Exactly, that's what I was getting at. Keeping the licensing profile conformance separate from type constraints. We might want to open it up allow even more that one hasConcludedLicense : see the RelationshipType.md hasConcludedLicense: "hasConcludedLicense: The from Artifact is concluded by the SPDX data creator to be governed by each to AnyLicenseInfo." by that define we might be able to have ONE per SPDX data creator.
There is a mix-up of two different cardinalities in these comments.
I am firmly of the opinion that a hasConcludedLicense relationship should never have more than one to licenses. Therefore we should never talk about "each of the to", since there will be only one.
Whether there are more than one hasConcludedLicense relationships with the same from Element (be it an Artifact or a SoftwareArtifact) is a completely different question, which would never be addressed in the RelationshipType description (since this talks about a single relationship).
I am firmly of the opinion that a
hasConcludedLicenserelationship should never have more than onetolicenses. Therefore we should never talk about "each of theto", since there will be only one.
Yes to that. I was unclear before.
Whether there are more than one hasConcludedLicense relationships with the same from Element (be it an Artifact or a SoftwareArtifact) is a completely different question,
This is what i meant by the last reply.
What about for this Profile conformance?
- for every
/Software/SoftwareArtifactthere is a/Core/Relationshipof typehasConcludedLicensehaving that element as itsfromproperty and there shall exist exactly one/SimpleLicensing/AnyLicenseInfoas itstoproperty.
What about for this Profile conformance?
- for every
/Software/SoftwareArtifactthere is a/Core/Relationshipof typehasConcludedLicensehaving that element as itsfromproperty and there shall exist exactly one/SimpleLicensing/AnyLicenseInfoas itstoproperty.
The change in Profile conformance section is now reverted to its original text, which is:
- for every
/Software/SoftwareArtifactthere shall exist exactly one/Core/Relationshipof typehasConcludedLicensehaving that element as itsfromproperty and a/SimpleLicensing/AnyLicenseInfoas itstoproperty.
Apart from few language differences, I believe the text you proposed and the original text are similar in meaning. Do you think it is ok to keep the original? @stevenc-stb
it's ok to keep the original. We can revisit it later.
@zvr wrote:
There is a mix-up of two different cardinalities in these comments.
I am firmly of the opinion that a
hasConcludedLicenserelationship should never have more than onetolicenses. Therefore we should never talk about "each of theto", since there will be only one.Whether there are more than one
hasConcludedLicenserelationships with the samefromElement (be it anArtifactor aSoftwareArtifact) is a completely different question, which would never be addressed in theRelationshipTypedescription (since this talks about a single relationship).
I agree with this. There should not be a situation where a single hasConcludedLicense relationship has multiple to licenses.
In terms of "are multiple different hasConcludedLicense relationships specified, I agree that that's an entirely separate question. Presumably multiple SPDX data creators could specify different conclusions as to the same from Element.
Regarding the change from Artifact to SoftwareArtifact:
Can you help me understand what other Artifacts, other than SoftwareArtifact, would be relevant to be from values for hasConcludedLicense / hasDeclaredLicense?
@swinslow
There's a case of Hardware, which is also Artifact and it could have a license.
But also please see @stevenc-stb 's comment, particularly the (2):
There are three problems:
- Inconsistent Definition (Description vs Profile conformance )
- All the SupplyChain will need a Licenses. What would be the License for a TransportAction? Licenses will not apply to the SupplyChain.
- SupplyChain will merge graphs when making things. What if two different SPDX data creators want to accept the same or different AnyLicenseInfo info for an Artifact?
TransportAction is a subclass of ModifyAction, Action, Artifact
https://github.com/spdx/spdx-3-model/blob/develop/model%2FCore%2FClasses%2FAction.md
So maybe we can't have either "only Artifact" or "only SoftwareArtifact", but "Artifact without Action".
But this also brings me to a question if we want to have Action as an Artifact.
(An action is certainly a noun, at least in English, something that is human made, but I don't think it is an object. Being an object should be a qualification of an artifact)
Btw, since the "each to" is also in 3.0 relationship type descriptions for both hasConcludedLicense and hasDeclaredLicense, we may want to update there as well
https://github.com/spdx/spdx-3-model/blob/support%2F3.0/model%2FCore%2FVocabularies%2FRelationshipType.md
@bact Thanks for the responses.
I don't understand what this means: "All the SupplyChain will need a Licenses. What would be the License for a TransportAction?"
Let's all please keep in mind that SPDX is talking about licenses specifically in the context of the distribution of software (and software-like content) in a supply chain. An "action" is not a licensable thing. You can't apply the MIT license to the act of making "an actual change to a product's location."
For Hardware, similarly, if you are talking about a physical hardware device, then the structure of SPDX-style licenses is not at all aligned with the idea of selling a physical device. SPDX licenses could apply to something like "open source hardware designs" -- but in that case, you're presumably referring to the underlying design files themselves, and we're back to software again.
I would strongly encourage that if there is a desire for expanding the licensing-related fields beyond software artifacts, then it would be appropriate to have a broader conversation about this that includes participants from the legal team (perhaps a joint tech/legal call should be scheduled). I really would not recommend enabling the licensing fields to apply to other things which are fundamentally different from software (and software-like content such as documentation, etc). I suspect that doing so will lead to a LOT of confusion when users try to implement this.
I think that line ("All the SupplyChain will need a Licenses. What would be the License for a TransportAction?") is a question, a devil's advocate, a counter example.
That if the "from" has to change from SoftwareArtifact to Artifact to accommodate the case of Hardware, there's a huge question to be answered for the SupplyChain profile.
I agreed that we need more discussion between Tech and Legal teams. This PR is basically reflecting the discussion in the 14 Oct 2025 Tech call.
And in any case, we need to specify a type for the "to". That is left missing/unspecified since 3.0.
I don't understand what this means: "All the SupplyChain will need a Licenses. What would be the License for a TransportAction?"
This was back in commit (d50e48633d645ae483339157aed792f44e0605de) the The Licensing profile Profile conformance of was changed to Core/Artifact from Software/SoftwareArtifact. This lead to need to have a action need a License. you pointed "action" is not a licensable thing. Profile conformance back to changed back to Software/SoftwareArtifact and this point does not apply now.
think that line ("All the SupplyChain will need a Licenses. What would be the License for a TransportAction?") is a question, a devil's advocate, a counter example.
Yes.
As this PR is keep developing through the discussion. Please see the latest proposed text in the "Files changed" tab https://github.com/spdx/spdx-3-model/pull/1122/files
--
To have a smaller and agreeable portion moving forward, I opened PR #1174 to essentially specify the type/range of the "to".
The rest of the discussion (each "to", Artifact/SoftwareArtifact for "from", etc) can continue here.