You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ADR-0036: fallback tuples enter identity only post-normalization with
idempotence as the guarded invariant; ordinal ordering is stated
(lexicographic by contradiction key, ties by manifest path then
location); readable-ID parameters fixed (space delimiter, 6-byte sha256
hex suffix, o-decimal ordinals, percent-escaping, last-unescaped-space
decode); the address encoding is byte-fixed (UTF-8, 4-byte big-endian
lengths, tag/identity/occurrence order, zero-length absents, 16-byte
truncation) with golden vectors as a 1.3 deliverable; addresses are
post-consolidation only; silent shortening is prohibited. ADR-0037:
ExternalReference gains Category to round-trip the SPDX triple, hashes
ride the bomly: comment channel in SPDX; complete scope-carrier rules
(sorted deduped list, carrier-beats-scalar, unknown-drop-with-warning,
scalar ingest mapping); the usage join key is (module root, declaration
site) with no cross-site mixing; the merged-document projection is
defined per format (SPDX DESCRIBES-per-root + externalDocumentRef with
checksum, CycloneDX BOM-Link urn:cdx:serial/version) with checksums
captured for every ingested document. ADR-0039: the strict-ingest
guarantee is narrowed to exactly duplicate names and invalid UTF-8.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
| 1.2 |`spdxkit`: absorb `internal/licenseexpr` semantics (panic guards, `Valid`/`ValidateAll`/`Identifier`/`Compose`/`Satisfies`/`Extract`); deprecated-ID canonicalization via the audited replacement map relocated from `internal/sbom/transform.go` (the list marks deprecation; the map owns replacements); classification-by-validation; deterministic `LicenseRef-*` minting + extracted-text pairing; fix `matcherkit.NormalizeLicenseSet` to classify on write | v0.5.0 |
| 1.3 | Identity (ADR-0036): facet definition, versioned content address, ecosystem-qualified `StableID` successor, `NewDependency` derivation; the normative ID and address spec with golden test vectors; wire-compat fixtures extended | v0.6.0 |
144
144
| 1.4 | Model fields (ADR-0037): supplier/originator/description/homepage; `ExternalReference`; `PackageLicense` declared/concluded + extracted text; digest-algorithm registry; set-aware scope ↔ CycloneDX mapping with its scalar projection rule; typed `DependencyEdge.Kind` with a kind-preserving edge-copy/rename primitive for graph reconstruction sites; usage attribution (`PackageLocation` carries per-site scopes and relationship so the node-level union becomes derived; reachability becomes repeatable per-module-root evidence with the vulnerability annotation as derived summary — a conjunctive filter such as reachable ∧ runtime ∧ direct then joins evidence to locations within one module root, selecting one usage); per-`GraphEntry` document assertions; per-field-class merge helpers; boundary validation codecs + fuzz targets for every new parser | v0.7.0 |
145
145
| 1.5 | Metadata policy: document reserved `bomly.` prefix; deprecate `MetadataKeyDetectionLicenses` in favor of the typed license field | v0.7.0 |
146
146
@@ -159,7 +159,7 @@ the golden refresh happens **once**:
159
159
| 2.2 | Adopt `spdxkit`: delete `internal/licenseexpr`; the deprecated-ID replacement map relocates into the kit; export/import use kit classification | ADR-0035 stays behavioral truth, now SDK-enforced |
160
160
| 2.3 | Adopt identity: node IDs SDK-derived end to end; regenerate schemas, goldens, smoke; release-notes callout for the one-time ID change | ADR-0036 |
161
161
| 2.4 |**Close #410**: `LicenseRef-*` + `hasExtractedLicensingInfos` emission, mixed-validity composition, canonical ingest coordinates via `SplitEcosystemName`; round-trip asserts `Org`+`Name`+`EcosystemName()` together | Also removes ADR-0035's recorded limitation |
162
-
| 2.5 |**Close #396** on the typed model: ingest populates typed fields through their gates; the export surface takes the prepared entries rather than the bare merged graph, so per-entry document assertions reach the codec; export projects them; merge follows the declared classes; fixed-point test (single-source export → ingest → export byte-stable for preserved fields; a merged export links source identities per ADR-0037); hostile-document fuzz coverage | Deferred #391 items stay deferred per ADR-0037 |
162
+
| 2.5 |**Close #396** on the typed model: ingest populates typed fields through their gates; the export surface takes the prepared entries rather than the bare merged graph, so per-entry document assertions reach the codec; export projects them; merge follows the declared classes; fixed-point test (single-source export → ingest → export byte-stable for preserved fields; a merged export links source identities per ADR-0037, with merged fixtures for both formats validated through the codecs and the official format validators); hostile-document fuzz coverage | Deferred #391 items stay deferred per ADR-0037 |
163
163
| 2.6 | Export full scope sets (fixes survey defect 2) and adopt json/v2 strict ingest with documented rejection behavior | ADR-0039 |
164
164
| 2.7 | Registry-lookup and PURL-fallback helper consolidation across output/render/tui/mcp presentation layers | Survey §3 items 5–6 |
165
165
| 2.8 | Usage-attribution adoption: native detectors record per-site scopes and relationship on locations; the four analyzer repos emit per-module-root reachability evidence (behavioral bumps, not mechanical); CLI filtering, rendering, and MCP join conjunctive filters through attribution; regression test for the workspace case where a package is direct-in-dev in one module and transitive-at-runtime in another | Without producer and consumer migration the 1.4 fields stay empty and the conjunction cannot work |
0 commit comments