Problem
license and license_url both expand to an IRI-valued dcterms:license. A resolver target that carries both fields publishes two different licence IRIs on one node.
public/contexts/v1.jsonld maps both terms to {"@id": "dcterms:license", "@type": "@id"}. scripts/compile.ts rewrites license to https://spdx.org/licenses/{id}. Both values are now IRIs, so a consumer cannot tell them apart.
The real registry has 50,047 published resolver targets that carry both fields. Example output for one node:
dcterms:license <https://spdx.org/licenses/CC-BY-SA-3.0>
dcterms:license <https://www.perseus.tufts.edu/hopper/opensource>
Why it matters
Specification §9 treats license_url as the fallback for non-SPDX terms, used when license is absent. The data and the context disagree with that rule. A consumer that reads dcterms:license gets two conflicting answers and no way to rank them.
Suggested fix
Give license_url its own predicate, or stop emitting both fields on one target.
Found during review of #127. Not caused by that PR.
Problem
licenseandlicense_urlboth expand to an IRI-valueddcterms:license. A resolver target that carries both fields publishes two different licence IRIs on one node.public/contexts/v1.jsonldmaps both terms to{"@id": "dcterms:license", "@type": "@id"}.scripts/compile.tsrewriteslicensetohttps://spdx.org/licenses/{id}. Both values are now IRIs, so a consumer cannot tell them apart.The real registry has 50,047 published resolver targets that carry both fields. Example output for one node:
Why it matters
Specification §9 treats
license_urlas the fallback for non-SPDX terms, used whenlicenseis absent. The data and the context disagree with that rule. A consumer that readsdcterms:licensegets two conflicting answers and no way to rank them.Suggested fix
Give
license_urlits own predicate, or stop emitting both fields on one target.Found during review of #127. Not caused by that PR.