Intentional Differences and Improvements

July 18, 2026 ยท View on GitHub

This directory documents stable, user-visible differences and improvements between Provenant and the Python ScanCode Toolkit reference implementation. It includes parser improvements and text-detection subsystem improvements.

Philosophy

This directory records cases where Provenant intentionally differs from or improves on the Python reference implementation. We:

  • Fix bugs present in the Python implementation
  • Implement features marked as TODO in Python
  • Add missing functionality where it improves user-visible behavior
  • Improve data quality and extraction accuracy

Improvement Categories

๐Ÿ› Bug Fixes

Python implementation has incorrect behavior, we fix it.

โœจ New Features

Python has TODO comments or placeholders, we implement the feature.

๐Ÿ” Enhanced Extraction

Python extracts some data, we extract more (additional fields, better parsing).

๐Ÿ›ก๏ธ Security Improvements

Python has unsafe patterns (code execution, DoS vulnerabilities), we use safe alternatives.

Summary Table

AreaImprovement TypePython Reference LimitationRust ImprovementImpact
RPM๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedTruncated installed EVR, extension-only source RPM detection, missing YumDB enrichment, and thin archive metadataFull dependency extraction, EVR preservation, hash-based source RPM recognition, richer archive metadata, and YumDB merge supportBetter RPM/rootfs parity, cleaner package identity, and richer system-package provenance
Debianโœจ New Feature + ๐Ÿ” Enhanced + ๐Ÿ› Bug Fix + โšก PerformanceNo direct .deb archive introspection, incomplete DEP-5 copyright detections, missing installed-package sidecar integration, and avoidable repeated paragraph parsing workDirect .deb control/archive introspection, package-matching embedded copyright recovery, coherent DEP-5 primary/paragraph/fallback detections, installed Debian sidecar integration for rootfs/container scans, and a Debian-local single-pass paragraph finalizerBetter Debian archive metadata accuracy, improved Debian copyright visibility, stronger Debian rootfs/container package inventory, and faster large DEP-5 parsing
Conanโœจ New FeatureNo conanfile.txt or conan.lock parserFull conanfile.txt + conan.lock extractionC/C++ dependency visibility
BitBakeโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python BitBake parser, no .bbappend packaged metadata coverage, and no parser-owned recovery of local LIC_FILES_CHKSUM / SRC_URI file referencesAdded bounded static .bb + .bbappend parsing, override-style dependency handling, raw declared-license preservation, local file-reference extraction, and sibling assembly for recipe-plus-append metadataBetter Yocto/OpenEmbedded package visibility and stronger recipe-local provenance
Carthageโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python Carthage parserAdded static Cartfile, Cartfile.private, and Cartfile.resolved parsing with dependency origin preservation and sibling assembly for declared plus pinned stateBetter Apple dependency visibility for Carthage-managed projects
CPANโœจ New Feature + ๐Ÿ› Bug FixStub-only handlers (no parse method), and malformed inputs in Rust fallback paths could lose parser identityFull META.json, META.yml, MANIFEST parsing plus datasource-preserving fallback package identity for malformed/unreadable CPAN inputsPerl metadata extraction with safer assembly/scanner behavior
RPM Specfileโœจ New FeatureStub with TODO commentFull preamble parsingRPM spec metadata extraction
CPAN Makefile.PLโœจ New Feature + ๐Ÿ” EnhancedStub-only handler (no parse method)WriteMakefile metadata extraction plus bounded VERSION_FROM and ABSTRACT_FROM recovery from sibling module filesBetter Perl build metadata and package identity
OSGi Manifestโœจ New FeatureEmpty path_patterns (assembly only)Full OSGi metadata extractionJava bundle dependencies
Gradle๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedWrong compileOnly runtime classification, missing Gradle SBOM license propagation, incomplete version-catalog alias identifiers, and only-first-block dependency extractionFixed scope classification, extracted Gradle POM license metadata, parsed all discovered Gradle dependency blocks, resolved TOML-backed libs.versions.toml aliases, and preserved nested project-path identifiersBetter Gradle dependency semantics, better SBOM metadata, and more accurate package identifiers
Gradle Module Metadataโœจ New Feature + ๐Ÿ” EnhancedNo merged .module metadata handler despite upstream attemptsAdded direct Gradle .module parsing with published artifact checksums, dependency and constraint extraction, variant metadata preservation, and file-reference recoveryBetter JVM publication metadata, stronger artifact provenance, and better coverage of modern Gradle-native modules
Gradle Lockfileโœจ New FeatureNo gradle.lockfile parserFull lockfile dependency extractionPinned dependency auditing
vcpkgโœจ New Feature + ๐Ÿ” EnhancedNo modern vcpkg.json manifest parser and no preservation of manifest-mode dependency/configuration metadataAdded strict-JSON vcpkg.json parsing for project and port manifests, direct dependency extraction, versioning metadata preservation, and embedded/sibling configuration captureBetter modern C/C++ dependency visibility and stronger manifest-mode provenance
Bun Lockfileโœจ New Feature + ๐Ÿ” EnhancedNo Bun lockfile parser, no Bun binary lockfile compatibility, and no Bun lockfile sibling/workspace assembly coverageAdded JSONC-aware bun.lock parsing, static legacy bun.lockb v2 compatibility, workspace-aware dependency extraction, and Bun sibling/workspace assembly supportBetter Bun dependency visibility, safer legacy Bun compatibility, cleaner npm-family assembly, and stronger modern JS lockfile coverage
npm Workspaceโœจ New FeatureNonAssemblable stub + basic assemblyWorkspace extraction + improved assemblyMonorepo structure visibility + correct package counts
npm + Yarn๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedDropped package.json platform metadata, anonymous hard-failure fallback rows for malformed package.json, incomplete modern lockfile/root handling, lossy Yarn Berry non-@npm: resolution detail, no Yarn manifest-based scope inference, and package-root ownership gapsSurfaced resolutions/overrides pins, package.json platform metadata, identified malformed-manifest fallback rows, richer Yarn Berry resolution metadata, fixed scoped npm fallback URLs and metadata normalization, modern lockfile/link handling, Yarn scope inference, and deterministic nested/workspace ownershipBetter npm/Yarn parity, clearer malformed-manifest output, cleaner lockfile metadata, better manifest compatibility visibility, and correct bundled/workspace package attribution
npm Resolutions/Overridesโœจ New Feature + ๐Ÿ” EnhancedYarn resolutions forced to runtime/direct intent; npm overrides never surfaced as dependenciesEmit Yarn resolutions and npm overrides as distinctly scoped pin dependencies (is_pinned = true) with intent booleans left unset per the honest-unknowns guardrailHonest pinned-dependency surface for npm/Yarn override blocks without asserting unproven intent
Structured metadataโœจ New Feature + ๐Ÿ” EnhancedCITATION.cff and publiccode.yml were only tracked as planned metadata surfaces, not shipped parsersAdded bounded standalone parsers for CITATION.cff and publiccode.yml, including SPDX-aware declared-license normalization, party extraction, parser goldens, and datasource accountingBetter project provenance and descriptive metadata without evaluating ecosystem tooling
Hugging Faceโœจ New FeatureNo Hugging Face model/dataset metadata parser and no pkg:huggingface PURL emissionAdded static parsers for model-card README.md frontmatter, Transformers config.json, and Diffusers model_index.json; emits pkg:huggingface/<ns>/<name> only from a checked-in _name_or_path/model_name, with SPDX-normalized declared license and base_model/datasets dependenciesHugging Face model/dataset provenance with honest, no-guess identity
Composer๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedAlternate file names unsupported, nested package files not assigned, and large lockfiles still too eager in memory behaviorAdded alternate-name support, nested package resource assignment, lighter large-lock extraction, and richer manifest provenance/party typingBetter Composer package detection, better nested file attribution, safer large-lock handling, and richer manifest provenance
Conda๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedInstalled package files from conda-meta not assigned, ambiguity between symbolic channel namespace and channel URL prefixes, and parser/assembly/docs drift around real environment filename aliasesAdded conda-meta file assignment via merged rootfs metadata, explicit channel-vs-channel_url disambiguation, and consistent .yml / .yaml / hyphenated environment alias handling across parsing, assembly, and supported-format metadataBetter Conda rootfs package assignment, cleaner package identity/origin semantics, and more reliable environment-file detection
Alpine๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedMissing APKBUILD recipe parsing, no APKBUILD dependency extraction, uneven license normalization across Alpine surfaces, incorrect raw matched text for custom:multiple, fileless package confusion, and no HTTPS Alpine VCS URLAdded static APKBUILD parsing with dependency families, preserved raw custom:multiple matched text, normalized trustworthy licenses across APKBUILD / installed-db / .apk, retained fileless packages, and emitted HTTPS Alpine commit vcs_urlBetter Alpine recipe parity, safer package evidence, cleaner Alpine provenance, and more consistent declared license metadata
Archโœจ New Feature + ๐Ÿ” EnhancedUpstream work is currently .SRCINFO-only, with no .PKGINFO parser, no legacy .AURINFO compatibility, and no Rust implementationAdded .SRCINFO, legacy .AURINFO, and .PKGINFO parsing, real alpm package typing/purls, split-package inheritance, and arch-specific dependency scope preservationBetter Arch/AUR package visibility, proper alpm identities, and fuller source/binary metadata coverage
Ruby๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedExternal gemspec constants unresolved, Gemfile manifest provenance was dropped, extracted gem duplication, missing nested key-file tagging, and no Ruby-driven license clarity scoreAdded required-file constant resolution, Gemfile + Gemfile.lock provenance preservation, extracted-gem merge dedupe, nested Ruby file-to-package assignment, key-file tagging, package metadata promotion, and summary license clarity scoringBetter Ruby gemspec parity, stronger Bundler manifest/lockfile provenance, cleaner extracted-gem results, and correct nested key-file clarity
SBTโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python SBT parserAdded bounded static build.sbt parsing for top-level literal metadata, literal license/homepage forms, direct/config-prefixed libraryDependencies, root-safe .settings(...), same-file literal Seq(...) bundle reuse, and explicit non-evaluating guardrailsBetter JVM/Scala package visibility without executing Scala
Mesonโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python Meson parserAdded bounded static meson.build parsing for literal project() metadata, top-level dependency() declarations, official license_files/meson_version capture, and explicit no-evaluation guardrailsBetter native-project package visibility without executing Meson
Nixโœจ New Feature + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ SecurityNo shipped Python Nix package parserAdded static flake.nix metadata extraction, flake.lock root-input parsing, bounded default.nix mkDerivation support, and flake sibling assembly without Nix evaluationBetter reproducible-build package visibility with deterministic flake metadata and safe bounded derivation parsing
Helmโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python Helm parserAdded static Chart.yaml and Chart.lock parsing, chart metadata extraction, maintainer/dependency preservation, and sibling assembly for declared plus locked Helm dependenciesBetter Kubernetes chart package visibility with declared and pinned dependency state
Pixiโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python Pixi parserAdded static pixi.toml and version-gated pixi.lock parsing, mixed Conda/PyPI dependency extraction, environment metadata preservation, and sibling assembly for manifest plus lock stateBetter reproducible Pixi workspace visibility with direct and locked dependency state
Clojureโœจ New Feature + ๐Ÿ” EnhancedNo shipped Python Clojure parserAdded bounded static deps.edn and project.clj parsing, alias/profile dependency extraction, and literal-only guardrails for Leiningen metadata without code evaluationBetter JVM/Clojure package visibility without evaluating project code
Dart๐Ÿ” EnhancedScope always null, YAML lossy, lockfile intent flattened, dependency source descriptors dropped, and publish_to / extra pub metadata under-preservedProper scope and YAML preservation, lockfile direct/dev/transitive classification, hosted/git/path/sdk descriptor preservation, legacy sdk: compatibility, publish_to: none privacy mapping, archive_url download handling, and richer pubspec metadata captureCorrect dependency classification, better lockfile provenance, and more truthful Dart package metadata
OS Release๐Ÿ› Bug Fix + ๐Ÿ” EnhancedDebian name logic bug + no URL extractionFixed name logic + HOME/SUPPORT/BUG URLsCorrect distro identification + richer metadata
Conan Data๐Ÿ” EnhancedOnly extracts primary source URLPatches metadata + mirror/fallback URLsComplete source provenance tracking
Dockerโœจ New Feature + ๐Ÿ” EnhancedNo packagedcode Docker parser for Dockerfile/Containerfile package metadataAdded Dockerfile/Containerfile recognition, OCI label extraction, and non-assembled package data handlingContainer metadata visibility and alternative Dockerfile-name support
Denoโœจ New FeatureNo Deno parserAdded direct deno.json / deno.jsonc / deno.lock parsing with import-map dependency extraction, v5 lockfile support, and sibling assemblyBetter JS/TS dependency visibility for Deno projects
pylock.tomlโœจ New FeatureNo pylock.toml parserAdded direct PEP 751 / PyPA pylock.toml parsing with dependency graph recovery, provenance extraction, and sibling assembly supportBetter Python dependency visibility for standards-based lockfiles
UV Lockโœจ New FeatureNo uv.lock parserAdded direct uv lockfile parsing with root-package recovery, dependency groups, resolved packages, and sibling assembly supportBetter Python dependency visibility for uv-managed projects
Python๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedRich setup.cfg metadata, unresolved imported-module setup.py dunder patterns, private-package classifiers, installed/source metadata file references, installed wheel provenance, exact-filename pypi.json parsing, pip cache provenance, RFC822 dependency extraction, direct source-distribution archive support, archive-read hardening for suspicious metadata entries, anonymous degraded rows for malformed Python package inputs, and unowned requirements/ subdirectory dependency evidence were incomplete or missingAdded richer setup.cfg metadata, setup.py OrderedDict URL handling, imported-module dunder fallback, private-package detection, installed metadata file-reference collection/assignment, sibling WHEEL enrichment, project-root attachment for requirements/ subdirectory dependency files, direct sdist archive parsing, bound zip validation to actual archive reads, tar/zip archive hardening, datasource-preserving fallback identity for malformed Python package inputs, pip cache origin.json parsing/merge, source SOURCES.txt collection, saved pypi.json parsing, and RFC822 dependency extractionBetter Python manifest fidelity, clearer degraded-input output, safer metadata recovery, richer installed-package provenance, broader PyPI package-input coverage, and stronger archive safety
Swift๐Ÿ› Bug Fix + ๐Ÿ” EnhancedRoot-package identity depended too heavily on whichever Swift artifact was available, malformed manifest fallback rows were anonymous, lockfile fallback overstated direct/runtime intent, and local path dependencies were dropped from dumped manifestsAdded Swift-specific manifest/show-dependencies/resolved precedence, identified malformed-manifest fallback rows, resolved-only package emission, local path dependency preservation, less-assertive resolved/show-dependencies intent flags, and resolved fallback that enriches manifest-known dependencies instead of flattening every pin into a direct root edgeCorrect top-level Swift packages, clearer malformed-manifest output, better dependency fidelity, safer file ownership, and more truthful manifest-vs-lock intent handling
CPAN dist.iniโœจ New Feature + ๐Ÿ” EnhancedStub-only handler (returns empty)Full INI parsing with runtime/test/build/configure dependency scopes plus declared-license normalization for Dist::Zilla metadataPerl Dist::Zilla metadata extraction with correct configure-time dependency semantics and SPDX-aware declared license output
Swift Dependencies๐Ÿ” EnhancedOnly extracts root package nameFull dependency graph with versions + direct/transitiveComplete Swift dependency visibility
Maven๐Ÿ› Bug Fix + โœจ Feature + ๐Ÿ” EnhancedFlattened licenses, missing dependencyManagement/relocation/qualifier support, older POM assumptions, and declared <modules> reactor lists never drove assembly (multi-module source trees stayed per-directory packages only)Structured licenses + dependencyManagement/relocation/qualifier support + Maven 4.1.0 support + reactor-aware TopologyPlan file ownership that attributes nested module source files (and root-level files) to the correct module package, including nested reactorsBetter Maven parity, richer SBOM metadata, modern POM compatibility, and correct file-to-package ownership across multi-module Maven source trees
NuGet๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedMissing project-style manifests, bounded CPM property propagation, version backfill for versionless PackageReference dependencies, empty party types, and weak modern nuspec/archive license handlingAdded project.json/project.lock.json/PackageReference support, standalone Directory.Packages.props and Directory.Build.props parsing, nearest-ancestor plus bounded parent-import CPM backfill, bounded build-props participation, literal property-backed VersionOverride support, typed parties, modern license hints, and archive-backed license-file extractionBetter .NET package coverage, stronger bounded CPM recovery, and stronger modern NuGet metadata
Cargo๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedMissing crate/member file ownership, manifest-declared file references, lockfile dependency provenance, and smaller parser parity gaps around lowercase files plus readme/publish metadataAdded crate/workspace file assignment, explicit Cargo.toml file_references for readme/license-file, preserved Cargo.lock source/checksum provenance, lowercase Cargo filename matching, and readme/publish extractionBetter Rust crate ownership, better manifest/lockfile provenance, better workspace attribution, and tighter Cargo parser parity
Compiled Binaryโœจ New Feature + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ SecurityCompiled Go and Rust package extraction depends on optional external inspectors in Python core, Python's Windows PE support is a separate narrow handler, and cargo-auditable dependency recovery is not built into the default packagedcode pathAdded native core support for Go build-info, Rust cargo-auditable compiled binaries, and bounded Windows PE VERSIONINFO package identity extraction, recovered Rust dependency edges with dedicated binary datasources/PURLs, and bounded oversized Rust audit decompressionBetter out-of-the-box compiled-artifact coverage, stronger Rust dependency visibility, narrower Windows executable parity, and safer compiled-binary parsing
ABOUT๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedFalls back to invalid pkg:about/... PURLs, misses download_url-based ecosystem inference, and couples file-reference promotion to reopening ABOUT resourcesAdded real PURL/type inference from download_url, suppressed invalid pkg:about synthesis, preserved ABOUT identity on partial files, and resolved ABOUT file references during scan-time promotionBetter ABOUT package identity, safer fallback behavior, and more reliable referenced-resource promotion
CocoaPods๐Ÿ› Bug Fix + ๐Ÿ” EnhancedScope semantics remain muddy across pod manifests/lockfiles, and historical duplicate-output regressions need explicit guardrailsRefined scope/runtime semantics across .podspec, .podspec.json, Podfile, and Podfile.lock, and bounded duplicate-output protection for RxDataSources.podspecMore honest dependency semantics and safer protection against explosive duplicate package output
Go๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” EnhancedMissing graph support, thin directive fidelity, and Go test/build file categorization gapsAdded go.mod graph parsing, replace/retract/toolchain directive fidelity, fallback datasource fixes, and build-tag-aware Go source categorizationBetter module graph fidelity, safer assembly accounting, and more accurate Go source heuristics
Hackageโœจ New Feature + ๐Ÿ” EnhancedNo Haskell package parser for *.cabal, cabal.project, or stack.yamlAdded static parsing for package metadata, component build-depends, project/workspace surfaces, config preservation, and sibling assembly across the three Hackage inputsBetter Haskell package visibility, cleaner project provenance, and assembled multi-surface Hackage results
Hex Lockfileโœจ New FeatureNo Hex lockfile parser and no safe lockfile-only Elixir dependency extractionAdded static mix.lock parsing with locked package versions, nested dependency reconstruction, repo/checksum preservation, and explicit no-code-execution scopeBetter Elixir/Hex dependency visibility without executable manifest parsing
npm Git URLs๐Ÿ› Bug FixGit URLs treated as pinned versionsCorrect is_pinned=false for non-version depsValid PURLs + correct dependency resolution status
Gitmodulesโœจ New FeatureNo .gitmodules parserFull submodule dependency extractionComplete dependency graphs for projects using submodules
Copyright Detection๐Ÿ› Bug Fix + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ SecurityYear range stops at 2039, short-year typo, French/Spanish case bugs, string-based POS tags, global mutable singleton, and more aggressive emitted copyright normalizationYear range 2099, all regex bugs fixed, type-safe enum POS tags, thread-safe LazyLock, shared media metadata clues from supported images and fonts, and source-faithful file-level copyright output by default with an opt-in ScanCode compatibility modeCorrect year detection, reliable i18n, compile-time safety, better compliance fidelity, and parallel scanning
Email/URL Detection๐Ÿ› Bug Fix + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ SecurityTLD length too strict, IPv6/private-IP issues, less explicit URL handlingExtended TLD support, robust host/IP filtering, credential stripping, and shared metadata clues from supported images and fontsBetter extraction correctness and safer metadata handling
License Detection๐Ÿ› Bug Fix + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ Security + โšก PerformanceSPDX-LID fan-out duplicates, stale whole-query cache after SPDX subtraction, bounds-only qcontains/qoverlap, zero-overlap surround merges, per-candidate rule cloning, and global mutable stateSPDX-LID deduplication, immutable whole-query snapshot for AHO, position-set-aware containment/overlap, explicit AHO extra-matchables tracking, unified PositionSpan enum, borrowed rule references in candidates, and thread-safe Arc<LicenseDetectionEngine>Correct SPDX match counts, clean architectural separation from stale-cache coupling, correct positional overlap semantics, reduced allocation overhead, and safe parallel scanning
CLI Workflowsโœจ New Feature + ๐Ÿ› Bug FixSelected-file and PR-changed-file scans still depend on argv expansion, include-filter approximations, or cwd-sensitive multi-input behavior, and repeated full rescans still pay the full cost on unchanged treesAdded rooted --paths-file native-scan selection with stdin support, root-relative entries, recoverable missing-entry warnings, cwd-independent explicit-root workflows, and opt-in --incremental unchanged-file reuse under a shared cache rootBetter PR/changed-file scanning, cleaner CI/container ergonomics, safer selected-file scope control, and faster repeated native rescans
Bazel/Buck build targets๐Ÿ” Enhanced (noise reduction)Python emits one package per Bazel/Buck BUILD/BUCK target, producing many name-only shells with no license, dependency, or version dataCollapse a build directory's targets into one license-bearing component (sibling-merge), with Bazel consistent with BuckBounded, explainable package output; intentionally fewer pkg:bazel/pkg:buck packages than ScanCode, not a regression
Cross-cutting (All Parsers)๐Ÿ›ก๏ธ SecurityNo DoS limitsFile size + iteration limitsProtection against resource exhaustion

Per-Improvement Documentation

Most areas with improvements have a dedicated document. Cross-cutting security hardening and broader infrastructure improvements are documented elsewhere when they span multiple subsystems:

  • rpm-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: EVR preservation, hash-based source RPM detection, richer archive metadata, and YumDB enrichment
  • debian-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction + ๐Ÿ› Bug Fix + โšก Performance: direct .deb introspection, embedded copyright recovery, coherent DEP-5 detections, installed Debian sidecar integration, and a Debian-local paragraph parsing optimization
  • conan-parser.md โ€” โœจ New Feature: conanfile.txt and conan.lock parsers (Python has neither)
  • bitbake-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: bounded .bb + .bbappend parsing, override-style dependency handling, raw declared-license preservation, local file-reference recovery, and sibling assembly support
  • carthage-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: Cartfile, Cartfile.private, and Cartfile.resolved parsing with origin-aware dependency metadata and sibling assembly for declared plus pinned state
  • cpan-parser.md โ€” โœจ New Feature + ๐Ÿ› Bug Fix: Full META.json, META.yml, MANIFEST parsing plus datasource-preserving fallback identity for malformed/unreadable CPAN inputs
  • gradle-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: correct Gradle scope classification, all discovered dependency-block parsing, version-catalog alias resolution, Gradle POM license extraction, and nested project-path identifiers
  • gradle-module-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: direct Gradle .module parsing with artifact checksums, deduplicated dependency extraction, preserved variant metadata, and file references for published artifacts
  • gradle-lockfile-parser.md โ€” โœจ New Feature: gradle.lockfile dependency extraction (Python has no equivalent)
  • vcpkg-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: strict-JSON vcpkg.json parsing, project/port manifest support, direct dependency extraction, and embedded/sibling configuration metadata preservation
  • bun-lock-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: JSONC-aware bun.lock parsing, static legacy bun.lockb v2 compatibility, and sibling/workspace assembly integration
  • arch-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: .SRCINFO, legacy .AURINFO, and .PKGINFO parsing with alpm purls, split-package inheritance, and arch-specific dependency scope preservation
  • npm-workspace-parser.md โ€” โœจ New Feature: pnpm-workspace.yaml metadata extraction (Python has stub only)
  • npm-yarn-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: platform metadata preservation, scoped URL/metadata normalization fixes, richer Yarn Berry resolution detail, modern lockfile/link handling, Yarn scope inference, and nested/workspace ownership fixes
  • npm-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: Yarn resolutions and npm overrides emitted as distinctly scoped pin dependencies (is_pinned = true) with intent booleans left unset per the honest-unknowns guardrail
  • structured-metadata-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: bounded CITATION.cff and publiccode.yml parsers for standalone project metadata, SPDX-aware declared-license recovery, and maintainer/author metadata extraction
  • composer-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: alternate Composer file names, nested package file assignment, lighter lockfile handling, richer manifest provenance, and declared-license normalization for trustworthy composer.json license metadata
  • ruby-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: required-file constant resolution, Gemfile + Gemfile.lock provenance preservation, extracted-gem merge/resource assignment, and nested key-file / license-clarity propagation
  • dart-parser.md โ€” ๐Ÿ” Enhanced Extraction: proper scope handling, YAML trailing newline preservation, lockfile direct/dev/transitive classification, dependency descriptor preservation, and richer pubspec metadata
  • os-release-parser.md โ€” ๐Ÿ› Bug Fix + ๐Ÿ” Enhanced: Debian name logic fix + URL extraction (HOME, SUPPORT, BUG)
  • conan-data-parser.md โ€” ๐Ÿ” Enhanced Extraction: Patches metadata + mirror/fallback URL extraction
  • docker-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: Dockerfile/Containerfile recognition, OCI label extraction, and non-assembled package data handling
  • deno-parser.md โ€” โœจ New Feature: deno.json(c) identity/import parsing, deno.lock v5 extraction, and sibling assembly support
  • bazel-module-parser.md โ€” โœจ New Feature: MODULE.bazel parsing with bazel_dep extraction, dev-scope support, and override metadata preservation
  • bazel-buck-build-targets.md โ€” ๐Ÿ” Enhanced Extraction (noise reduction): collapse Bazel/Buck BUILD/BUCK targets into one component per build directory instead of one empty package per target; intentionally fewer pkg:bazel/pkg:buck packages than ScanCode by design
  • go-work-parser.md โ€” โœจ New Feature: go.work parsing with workspace-member recovery, replace metadata extraction, and root-module assembly support
  • pylock-toml-parser.md โ€” โœจ New Feature: standardized pylock.toml parsing, dependency graph recovery, provenance extraction, and Python sibling assembly support
  • uv-lock-parser.md โ€” โœจ New Feature: uv.lock root-package recovery, dependency groups, resolved package extraction, and Python sibling assembly support
  • python-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: richer setup.cfg metadata, setup.py imported-dunder/project-URL fixes, private classifier support, direct sdist archive parsing plus archive hardening, installed/source metadata file-reference handling, sibling WHEEL enrichment, pip cache origin.json provenance, exact-filename pypi.json parsing, and RFC822 dependency extraction
  • swift-parser.md โ€” ๐Ÿ› Bug Fix + ๐Ÿ” Enhanced Extraction: Swift-specific root-package assembly precedence, local path manifest dependency preservation, less-assertive lock/show intent flags, resolved fallback enrichment, and nested-root-safe file ownership
  • cpan-dist-ini-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced: Full dist.ini parsing with runtime/test/build/configure dependency extraction (Python has stub only)
  • swift-show-dependencies-parser.md โ€” ๐Ÿ” Enhanced Extraction: Full dependency graph with versions, direct/transitive marking, and less-assertive runtime intent
  • rpm-specfile-parser.md โ€” โœจ New Feature: Full RPM spec preamble parsing (Python is stub with TODO)
  • cpan-makefile-pl-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced: Makefile.PL WriteMakefile extraction plus bounded VERSION_FROM / ABSTRACT_FROM recovery (Python has no parse method)
  • osgi-manifest-parser.md โ€” โœจ New Feature: OSGi bundle metadata extraction with mixed-manifest Maven identity fallback when strong Maven coordinates are present (Python has empty patterns)
  • maven-parser.md - ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: structured licenses, dependencyManagement/relocation/qualifier support, Maven 4.1.0 support, richer normalized metadata, and reactor/multi-module TopologyPlan file-ownership assignment
  • nuget-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: nearest-ancestor NuGet CPM backfill plus bounded parent-import/build-props participation, literal VersionOverride support for PackageReference dependencies in project files, standalone Directory.Packages.props / Directory.Build.props parsing, modern nuspec license hints, .nupkg license-file extraction, .deps.json runtime graph parsing, and support for legacy/project-style NuGet manifests
  • cargo-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: crate/workspace file ownership, Cargo.toml file references, Cargo.lock provenance preservation, lowercase Cargo file matching, and readme/publish manifest parity
  • compiled-binary-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction + ๐Ÿ›ก๏ธ Security: native Go build-info, Rust cargo-auditable, and bounded Windows PE version-resource extraction in core scanning, Rust dependency-edge recovery, and bounded Rust audit decompression
  • go-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: go.mod graph support, replace/retract/toolchain directive fidelity, and Go test/build source categorization
  • hackage-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: static *.cabal / cabal.project / stack.yaml parsing with component dependency recovery, project-config preservation, and sibling assembly support
  • sbt-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: bounded static build.sbt parsing for top-level literal metadata, literal license/homepage forms, literal libraryDependencies, limited string alias reuse, and explicit no-evaluation guardrails
  • meson-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: bounded static meson.build parsing for literal project() metadata, top-level dependency() declarations, official license_files/meson_version capture, and explicit no-evaluation guardrails
  • nix-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction + ๐Ÿ›ก๏ธ Security: static flake.nix / flake.lock support, bounded default.nix mkDerivation extraction, and flake sibling assembly without Nix evaluation
  • helm-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: static Chart.yaml / Chart.lock parsing with chart metadata recovery, declared dependency extraction, pinned lock metadata, and sibling assembly support
  • pixi-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: static pixi.toml / version-gated pixi.lock parsing with workspace metadata recovery, mixed Conda/PyPI dependency extraction, environment metadata preservation, and sibling assembly support
  • clojure-parser.md โ€” โœจ New Feature + ๐Ÿ” Enhanced Extraction: bounded static deps.edn / project.clj parsing with Maven/Clojars-style dependency extraction, alias/profile support, and explicit no-evaluation guardrails
  • hex-lock-parser.md โ€” โœจ New Feature: static mix.lock parsing with locked Hex dependency extraction and nested dependency reconstruction under a no-code-execution scope
  • conda-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: conda-meta file assignment and channel-vs-channel_url disambiguation
  • alpine-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: APKBUILD recipe parsing, raw matched-text preservation for custom:multiple, retained fileless packages, and HTTPS Alpine VCS URLs
  • about-parser.md โ€” ๐Ÿ› Bug Fix + โœจ New Feature + ๐Ÿ” Enhanced Extraction: PURL/type inference from download_url, invalid pkg:about suppression, graceful partial ABOUT handling, and scan-time file-reference resolution
  • cocoapods-parser.md โ€” ๐Ÿ› Bug Fix + ๐Ÿ” Enhanced Extraction: refined dependency scope semantics and bounded duplicate-output protection for RxDataSources.podspec
  • npm-git-url-dependencies.md โ€” ๐Ÿ› Bug Fix: Correct handling of Git URLs, GitHub shortcuts, and local paths (Python treats them as pinned versions)
  • gitmodules-parser.md โ€” โœจ New Feature: Git submodule dependency extraction (Python has no equivalent parser)
  • copyright-detection.md โ€” ๐Ÿ› Bug Fix + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ Security: Year range fix, regex typo fixes, type-safe POS tags, thread-safe design, and source-faithful copyright output by default
  • email-url-detection.md โ€” ๐Ÿ› Bug Fix + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ Security: Email/URL extraction hardening, stronger filtering, and EXIF/XMP-backed metadata detection
  • license-detection.md โ€” ๐Ÿ› Bug Fix + ๐Ÿ” Enhanced + ๐Ÿ›ก๏ธ Security + โšก Performance: SPDX-LID deduplication, position-set-aware containment/overlap, immutable whole-query snapshot for AHO, explicit extra-matchables tracking, unified PositionSpan, and borrowed rule references in candidates
  • cli-workflows.md โ€” โœจ New Feature + ๐Ÿ› Bug Fix: rooted --paths-file selected-file scanning plus opt-in --incremental rescans with cache-root controls for repeated native workflows

Related broader architecture/security docs:

Contributing Improvements

For the general contributor workflow, local setup, testing guidance, and pull request conventions, start with ../CONTRIBUTING.md.

When implementing a parser or detection subsystem, if you discover:

  1. A bug in Python: Fix it in Rust, document here
  2. A TODO in Python: Implement it in Rust, document here
  3. Missing extraction: Add it in Rust, document here

Template for new improvement docs: See existing files for structure.