spdx / spdx-3-model

The model for the information captured in SPDX version 3 standard.
https://spdx.dev/use/specifications/
Other
71 stars 46 forks source link

CreationInfo serialization compaction approach #357

Open sbarnum opened 1 year ago

sbarnum commented 1 year ago

There is a need/desire for maximizing the conciseness of SPDX 3+ serialization while maintaining full conformance with the specification (model) in support of targeted use cases.

One area with the potential for reducing the verbosity of SPDX serialization is in how CreationInfo details are serialized for Elements. To be fully conformant with the SPDX specification all deserialized Elements MUST at a minimum contain CreationInfo with 'profile' and 'createdBy' details and must be able to support consistent and integrous expression of the other CreationInfo details where relevant and present. This requirement leads to a situation where the natural simple serialization of the SPDX graph contains full CreationInfo details expressed on each Element even for cases where there may be a high degree of repetition.

Any approach to reduce repetition will be a tradeoff between brevity of serialization and complexity of the algorithms necessary to achieve the brevity. The one hard requirement is that any approach MUST maintain full conformance with the specification (model) in support of targeted use cases. Any approach to brevity that falls short of this bar cannot be considered a valid approach.

This issue proposes an approach to slightly modify the natural simple serialization of the SPDX graph to significantly reduce repetition of CreationInfo details while still maintaining full integrity of content and conformance with the SPDX 3+ specification.

In a nutshell, the approach is to take content defined or referenced within an SPDX ElementCollection (which commonly has a significant level of CreationInfo repetitive overlap) remove serialization of CreationInfo properties in the defined or referenced content that is repetitive with those properties in the "parent" ElementCollection itself. Upon deserialization these properties would implicitly be reapplied to the defined or referenced content. Any CreationInfo properties on defined or referenced content that differ from the same properties on the "parent" ElementCollection would remain on the defined or referenced content and would override the reapplication of those properties during deserialization.

The proposed serialization compaction rules can be described with the following outline: image

The proposed deserialization compaction rules can be described with the following outline: image

This approach strikes a tradeoff balance of relatively simple algorithmic logic with very significant (though not total) reduction in CreationInfo repetition while still maintaining full conformance with the specification (model) in support of targeted use cases.

Below are several serialized examples in json-ld.

Example #1 (fully expanded serialization of CreationInfo of basic SPDXDocument using natural simple flat graph serialization):

{
  "@context": [
    "https://www.spdx.org/ontology/spdx3.jsonld",
    {
      "acmeGeneral": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/"
    }
  ],
  "@graph": [
    {
      "@id": "acmeFile:Document1",
      "@type": "SpdxDocument",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "namespaceMap": [
        {
          "prefix": "acmeGeneral",
          "namespace": "https://www.acme.org/some/namespace/for/general/content"
        }
      ],
      "element": [
        "acmeGeneral:AcmeIdentity",
        "acmeGeneral:foobar",
        "acmeGeneral:cluster-autoscaler-9.9.0",
        "acmeGeneral:go",
        "acmeGeneral:azure-sdk-for-go",
        "acmeGeneral:Relationship1",
        "acmeGeneral:Relationship2"
      ]
    },
    {
      "@id": "acmeGeneral:AcmeIdentity",
      "@type": "Organization",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "name": "ACME, Inc"
    },
    {
      "@id": "acmeGeneral:foobar",
      "@type": "File",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "software:fileType": "BINARY",
      "name": "foobarzed"
    },
    {
      "@id": "acmeGeneral:cluster-autoscaler-9.9.0",
      "@type": "File",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "software:fileType": "BINARY",
      "name": "cluster-autoscaler"
    },
    {
      "@id": "acmeGeneral:go",
      "@type": "Package",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "name": "cloud.google.com/go"
    },
    {
      "@id": "acmeGeneral:azure-sdk-for-go",
      "@type": "Package",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "name": "Azure/azure-sdk-for-go"
    },
    {
      "@id": "acmeGeneral:Relationship1",
      "@type": "Relationship",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "from": "fugaziExtDoc:go",
      "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
      "relationshipType": "STATIC_LINK"
    },
    {
      "@id": "acmeGeneral:Relationship2",
      "@type": "Relationship",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "from": "fugaziExtDoc:azure-sdk-for-go",
      "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
      "relationshipType": "STATIC_LINK"
    }
  ]
}

Example #2 (compacted serialization of CreationInfo of basic SPDXDocument using natural simple flat graph serialization) (36% reduction in number of serialized lines):

{
    "@context": [
      "https://www.spdx.org/ontology/spdx3.jsonld",
      {
        "acmeGeneral": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/"
      }
    ],
    "@graph": [
      {
        "@id": "acmeFile:Document1",
        "@type": "SpdxDocument",
        "creationInfo": {
          "specVersion": "3.1.0",
          "profile": ["core","software"],
          "createdBy": "acmeGeneral:AcmeIdentity",
          "created": "2016-07-08T09:11:23.52Z"
        },
        "namespaceMap": [
          {
            "prefix": "acmeGeneral",
            "namespace": "https://www.acme.org/some/namespace/for/general/content"
          }
        ],
        "element": [
          "acmeGeneral:AcmeIdentity",
          "acmeGeneral:foobar",
          "acmeGeneral:cluster-autoscaler-9.9.0",
          "acmeGeneral:go",
          "acmeGeneral:azure-sdk-for-go",
          "acmeGeneral:Relationship1",
          "acmeGeneral:Relationship2"
        ]
      },
      {
        "@id": "acmeGeneral:AcmeIdentity",
        "@type": "Organization",
        "name": "ACME, Inc"
      },
      {
        "@id": "acmeGeneral:foobar",
        "@type": "File",
        "software:fileType": "BINARY",
        "name": "foobarzed"
      },
      {
        "@id": "acmeGeneral:cluster-autoscaler-9.9.0",
        "@type": "File",
        "software:fileType": "BINARY",
        "name": "cluster-autoscaler"
      },
      {
        "@id": "acmeGeneral:go",
        "@type": "Package",
        "name": "cloud.google.com/go"
      },
      {
        "@id": "acmeGeneral:azure-sdk-for-go",
        "@type": "Package",
        "name": "Azure/azure-sdk-for-go"
      },
      {
        "@id": "acmeGeneral:Relationship1",
        "@type": "Relationship",
        "from": "fugaziExtDoc:go",
        "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
        "relationshipType": "STATIC_LINK"
      },
      {
        "@id": "acmeGeneral:Relationship2",
        "@type": "Relationship",
        "from": "fugaziExtDoc:azure-sdk-for-go",
        "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
        "relationshipType": "STATIC_LINK"
      }
    ]
}

Example #3 (fully expanded serialization of CreationInfo of basic SPDXDocument using embedded serialization where first level of Elements defined or referenced within a CollectionElement are serialized "inside" the CollectionElement rather than as a simple flat graph (I believe this idea has been discussed but not decided so I included it here)):

{
  "@context": [
    "https://www.spdx.org/ontology/spdx3.jsonld",
    {
      "acmeGeneral": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/"
    }
  ],
  "@graph": [
    {
      "@id": "acmeFile:Document1",
      "@type": "SpdxDocument",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "namespaceMap": [
        {
          "prefix": "acmeGeneral",
          "namespace": "https://www.acme.org/some/namespace/for/general/content"
        }
      ],
      "element": [
        {
          "@id": "acmeGeneral:AcmeIdentity",
          "@type": "Organization",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "name": "ACME, Inc"
        },
        {
          "@id": "acmeGeneral:foobar",
          "@type": "File",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "software:fileType": "BINARY",
          "name": "foobarzed"
        },
        {
          "@id": "acmeGeneral:cluster-autoscaler-9.9.0",
          "@type": "File",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "software:fileType": "BINARY",
          "name": "cluster-autoscaler"
        },
        {
          "@id": "acmeGeneral:go",
          "@type": "Package",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "name": "cloud.google.com/go"
        },
        {
          "@id": "acmeGeneral:azure-sdk-for-go",
          "@type": "Package",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "name": "Azure/azure-sdk-for-go"
        },
        {
          "@id": "acmeGeneral:Relationship1",
          "@type": "Relationship",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "from": "fugaziExtDoc:go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        },
        {
          "@id": "acmeGeneral:Relationship2",
          "@type": "Relationship",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeGeneral:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "from": "fugaziExtDoc:azure-sdk-for-go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        }
      ]
    }
  ]
}

Example #4 (compacted serialization of CreationInfo of basic SPDXDocument using embedded serialization ):

{
  "@context": [
    "https://www.spdx.org/ontology/spdx3.jsonld",
    {
      "acmeGeneral": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/"
    }
  ],
  "@graph": [
    {
      "@id": "acmeFile:Document1",
      "@type": "SpdxDocument",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeGeneral:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "namespaceMap": [
        {
          "prefix": "acmeGeneral",
          "namespace": "https://www.acme.org/some/namespace/for/general/content"
        }
      ],
      "element": [
        {
          "@id": "acmeGeneral:AcmeIdentity",
          "@type": "Organization",
          "name": "ACME, Inc"
        },
        {
          "@id": "acmeGeneral:foobar",
          "@type": "File",
          "software:fileType": "BINARY",
          "name": "foobarzed"
        },
        {
          "@id": "acmeGeneral:cluster-autoscaler-9.9.0",
          "@type": "File",
          "software:fileType": "BINARY",
          "name": "cluster-autoscaler"
        },
        {
          "@id": "acmeGeneral:go",
          "@type": "Package",
          "name": "cloud.google.com/go"
        },
        {
          "@id": "acmeGeneral:azure-sdk-for-go",
          "@type": "Package",
          "name": "Azure/azure-sdk-for-go"
        },
        {
          "@id": "acmeGeneral:Relationship1",
          "@type": "Relationship",
          "from": "fugaziExtDoc:go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        },
        {
          "@id": "acmeGeneral:Relationship2",
          "@type": "Relationship",
          "from": "fugaziExtDoc:azure-sdk-for-go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        }
      ]
    }
  ]
}

Example #5 (fully expanded serialization of CreationInfo of basic SPDXDocument using embedded serialization and with repetition exceptions in the "embedded" content):

{
  "@context": [
    "https://www.spdx.org/ontology/spdx3.jsonld",
    {
      "acmeFile": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/",
      "acmeExternal": "https://www.acme.org/some/unique/namespace/for/general/content/defined/outside/this/file/72ec7f06-0b5a-4d97-b898-d6f232ca0132/",
      "fugaziExt": "https://www.fugazi.org/some/externally/defined/namespace/059ac3e0-8c9a-44eb-ad60-a542fbfb8964/"
    }
  ],
  "@graph": [
    {
      "@id": "acmeFile:Document1",
      "@type": "SpdxDocument",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeExternal:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "namespaceMap": [
        {
          "prefix": "acmeFile",
          "namespace": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/"
        },
        {
            "prefix": "acmeExternal",
            "namespace": "https://www.acme.org/some/unique/namespace/for/general/content/defined/outside/this/file/72ec7f06-0b5a-4d97-b898-d6f232ca0132/"
          },
        {
            "prefix": "fugaziExt",
            "namespace": "https://www.fugazi.org/some/externally/defined/namespace/059ac3e0-8c9a-44eb-ad60-a542fbfb8964/"
        }
      ],
      "spdx-core:externalMap": [
        {
            "spdx-core:externalID": "acmeExternal:AcmeIdentity"
        },
        {
            "spdx-core:externalID": "fugazi:FugaziIdentity"
        }
      ],
      "element": [
        {
          "@id": "acmeExternal:AcmeIdentity",
          "@type": "Organization",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeExternal:AcmeIdentity",
            "created": "2007-11-19T15:34:22.26Z"
          },
          "name": "ACME, Inc"
        },
        {
          "@id": "acmeFile:foobar",
          "@type": "File",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "fugazi:FugaziIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "software:fileType": "BINARY",
          "name": "foobarzed"
        },
        {
          "@id": "acmeFile:cluster-autoscaler-9.9.0",
          "@type": "File",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeExternal:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "software:fileType": "BINARY",
          "name": "cluster-autoscaler"
        },
        {
          "@id": "acmeFile:go",
          "@type": "Package",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeExternal:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "name": "cloud.google.com/go"
        },
        {
          "@id": "acmeFile:azure-sdk-for-go",
          "@type": "Package",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeExternal:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "name": "Azure/azure-sdk-for-go"
        },
        {
          "@id": "acmeFile:Relationship1",
          "@type": "Relationship",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeExternal:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "from": "fugaziExtDoc:go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        },
        {
          "@id": "acmeFile:Relationship2",
          "@type": "Relationship",
          "creationInfo": {
            "specVersion": "3.1.0",
            "profile": ["core","software"],
            "createdBy": "acmeExternal:AcmeIdentity",
            "created": "2016-07-08T09:11:23.52Z"
          },
          "from": "fugaziExtDoc:azure-sdk-for-go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        }
      ]
    }
  ]
}

Example #6 (compacted serialization of CreationInfo of basic SPDXDocument using embedded serialization and with repetition exceptions in the "embedded" content):

{
  "@context": [
    "https://www.spdx.org/ontology/spdx3.jsonld",
    {
      "acmeFile": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/",
      "acmeExternal": "https://www.acme.org/some/unique/namespace/for/general/content/defined/outside/this/file/72ec7f06-0b5a-4d97-b898-d6f232ca0132/",
      "fugaziExt": "https://www.fugazi.org/some/externally/defined/namespace/059ac3e0-8c9a-44eb-ad60-a542fbfb8964/"
    }
  ],
  "@graph": [
    {
      "@id": "acmeFile:Document1",
      "@type": "SpdxDocument",
      "creationInfo": {
        "specVersion": "3.1.0",
        "profile": ["core","software"],
        "createdBy": "acmeExternal:AcmeIdentity",
        "created": "2016-07-08T09:11:23.52Z"
      },
      "namespaceMap": [
        {
          "prefix": "acmeFile",
          "namespace": "https://www.acme.org/some/unique/namespace/for/general/content/in/this/file/65bf6afc-2ec3-490e-a800-bb6424736e96/"
        },
        {
            "prefix": "acmeExternal",
            "namespace": "https://www.acme.org/some/unique/namespace/for/general/content/defined/outside/this/file/72ec7f06-0b5a-4d97-b898-d6f232ca0132/"
          },
        {
            "prefix": "fugaziExt",
            "namespace": "https://www.fugazi.org/some/externally/defined/namespace/059ac3e0-8c9a-44eb-ad60-a542fbfb8964/"
        }
      ],
      "spdx-core:externalMap": [
        {
            "spdx-core:externalID": "acmeExternal:AcmeIdentity"
        },
        {
            "spdx-core:externalID": "fugazi:FugaziIdentity"
        }
      ],
      "element": [
        {
          "@id": "acmeExternal:AcmeIdentity",
          "@type": "Organization",
          "creationInfo": {
            "created": "2007-11-19T15:34:22.26Z"
          },
          "name": "ACME, Inc"
        },
        {
          "@id": "acmeFile:foobar",
          "@type": "File",
          "creationInfo": {
            "createdBy": "fugazi:FugaziIdentity"
          },
          "software:fileType": "BINARY",
          "name": "foobarzed"
        },
        {
          "@id": "acmeFile:cluster-autoscaler-9.9.0",
          "@type": "File",
          "software:fileType": "BINARY",
          "name": "cluster-autoscaler"
        },
        {
          "@id": "acmeFile:go",
          "@type": "Package",
          "name": "cloud.google.com/go"
        },
        {
          "@id": "acmeFile:azure-sdk-for-go",
          "@type": "Package",
          "name": "Azure/azure-sdk-for-go"
        },
        {
          "@id": "acmeFile:Relationship1",
          "@type": "Relationship",
          "from": "fugaziExtDoc:go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        },
        {
          "@id": "acmeFile:Relationship2",
          "@type": "Relationship",
          "from": "fugaziExtDoc:azure-sdk-for-go",
          "to": "fugaziExtDoc:cluster-autoscaler-9.9.0",
          "relationshipType": "STATIC_LINK"
        }
      ]
    }
  ]
}
maxhbr commented 1 year ago

To view and edit the examples in your own editor:

all at once:

examples.zip

individual examples:

  1. Example 1 (fully expanded serialization of CreationInfo of basic SPDXDocument using natural simple flat graph serialization): example1.json.gz
    1. Example 2 (compacted serialization of CreationInfo of basic SPDXDocument using natural simple flat graph serialization) (36% reduction in number of serialized lines): example2.json.gz
    2. Example 3 (fully expanded serialization of CreationInfo of basic SPDXDocument using embedded serialization where first level of Elements defined or referenced within a CollectionElement are serialized "inside" the CollectionElement rather than as a simple flat graph (I believe this idea has been discussed but not decided so I included it here)): example3.json.gz
    3. Example 4 (compacted serialization of CreationInfo of basic SPDXDocument using embedded serialization ): example4.json.gz
    4. Example 5 (fully expanded serialization of CreationInfo of basic SPDXDocument using embedded serialization and with repetition exceptions in the "embedded" content): example5.json.gz
    5. Example 6 (compacted serialization of CreationInfo of basic SPDXDocument using embedded serialization and with repetition exceptions in the "embedded" content): example6.json.gz
maxhbr commented 1 year ago

@sbarnum : I think there was a decision against "embedded serialization". Maybe it would simplify the discussion if you would drop examples 3 to 6 until we have reopened that topic again. (I was strongly in favor of "embedded serialization")

maxhbr commented 1 year ago

(see also https://github.com/spdx/spdx-3-model/issues/306)

maxhbr commented 1 year ago

this can't handle optional properties like createdUsing?

If the parent collection has a creation info with that, and the element does not have it. It is not clear if that needs to be added to the element creation info or not. It might be removed because of compactification or it might just not be there in the first place.

goneall commented 1 year ago

I would propose simplifying the algorithm by not handling individual property differences - on deserialization, an element contained within a collection would either have no creationInfo in which case it would use the containing collection creationInfo or it would have a complete creationInfo - overriding individual properties introduces complexity and I suspect it would not save too much space.

goneall commented 1 year ago

We agreed in the last tech call and the serialization meeting that using references to the same creationInfo was sufficient for JSON-LD. Leaving this open as a potential solution for other serialization formats - but moving to 3.0 milestone.

goneall commented 8 months ago

We agreed to use JSON-LD for SPDX 3.0 - moving this to the 3.1 milestone in case we want to use it for other serializations.