5.1.2. Checks
Up: 5.1. Compose phase
Prev: 5.1.1. Uploading files
Next: 5.1.3. License checks
Sections:
- Overview
- How ATR selects checks
- Understanding check results
- Individual checks
- SBOM checks
- Check caching and reruns
- Project policy inputs
Overview
ATR runs automated checks on release artifacts so that you can validate compliance and completeness before a vote. The checks focus on signatures, hashes, archive layout, licensing, and software bill of materials (SBOM) content. This document explains what ATR checks, when those checks run, and how to interpret results.
Checks are recorded against the release revision that you upload, and the results remain visible to reviewers and voters. The checks run in the background and appear in the checks view for the revision as they complete.
How ATR selects checks
ATR chooses checks for each new draft revision based on file names and project policy:
.ascfiles: signature verification..sha256and.sha512files: checksum verification..tar.gz,.tgzand.ziparchives: archive structure and license checks.- CycloneDX JSON SBOMs, such as
.cdx.jsonfiles: SBOM analysis.
ATR also checks file names and required signatures and checksums across the revision.
Project policy identifies source and binary artifacts and sets exclusions for license checks. For source artifacts, you can choose lightweight license checks, Apache RAT, or both. Binary artifacts always use the lightweight checks.
Understanding check results
Each check result has a status of note, suggestion, concern, blocker, or exception. A note indicates that the check ran and has nothing substantial to report. A suggestion indicates a structural or recommendation difference that release managers may consider but is not a policy violation. A concern indicates that ATR could not be certain about a condition and the release manager must investigate. A blocker indicates that a mandatory policy condition was violated and the release cannot proceed. An exception indicates that the check could not complete due to some unexpected internal ATR error.
Each check section below names the exact checker key that ATR records for that check. If you would like checks to change for all projects, you can file an ATR issue.
Individual checks
Path and naming checks
ATR validates the file layout of the revision against ASF release rules. For each artifact it expects a matching signature file with the .asc suffix and at least one checksum file with the .sha256 or .sha512 suffix. It verifies that metadata files correspond to an existing artifact and warns when a metadata suffix is recommended against by policy. It rejects .md5 checksums and .sig signature files and warns about .sha1 and .sha. It rejects dotfiles except for those under the .atr directory, and it rejects a KEYS file inside the artifact bundle because keys are managed through the keys section. If the project is a podling, it requires the word "incubating" in artifact filenames.
This check records separate checker keys for concerns, suggestions, and notes. It uses atr.tasks.checks.paths.check_errors for concerns, atr.tasks.checks.paths.check_warnings for suggestions, and atr.tasks.checks.paths.check_success for notes. The requirement that a release contains at least one source artifact is recorded under atr.tasks.checks.paths.check_source.
Hash verification
For each .sha256 or .sha512 file, ATR computes the hash of the referenced artifact and compares it with the expected value. It supports files that contain just the hash as well as files that include a filename and hash on the same line. If the suffix does not indicate sha256 or sha512, the check fails.
The checker key is atr.tasks.checks.file_hash.check.
Signature verification
For each .asc signature file, ATR verifies the signature against the matching artifact using the public keys stored for the release committee. The signature is accepted only when it verifies and when the signing key is associated with an ASF UID or is the committee's automated release signing key, with a primary UID containing "Automated Release Signing" or "Services RM" (ignoring case) and the email address private@[committee name].apache.org. If no suitable key is found or the signature does not match the artifact, the check fails.
The key which made the signature, which may be a subkey, must also meet the minimum strength for signing releases. ATR records a blocker when a signature was made by a DSA key of any size, or by an RSA key shorter than 2048 bits, even if the signature itself verifies. See Required key settings for the full list.
ATR also raises a concern when the ASF UID of the signing key is not one of the ASF UIDs recorded as having uploaded the artifact, because an artifact is expected to be signed by the person who uploaded it. The automated release signing key is exempt. The concern does not block a vote, but it must be acknowledged before one is started.
The checker key is atr.tasks.checks.signature.check, and the uploader concern is recorded under atr.tasks.checks.signature.check_uploader_mismatch.
Archive integrity checks
ATR validates new archives in supported formats before creating a revision. If an archive is corrupt or exceeds the extraction limits, the upload fails and the error appears on the compose page. See Archive validation for what happens while an upload is checked and how to retry a failed upload.
Archive structure checks
ATR expects each archive to contain exactly one root directory. The expected root name is derived from the archive filename base, without extension. When the archive filename base ends with the suffix source or src, ATR accepts a root directory that either includes that suffix or omits it. When the archive filename base has no such suffix, the root directory must match the base. If the root does not match, ATR records a concern so that you can review project conventions. Structure checks are skipped for artifacts that are classified as binary by project policy.
ATR also recognizes npm pack archives. When the root directory is named package, ATR looks for a file named package.json and validates that it contains a name and version. If the file is present and valid, ATR treats this layout as acceptable. If the package name and version do not match the archive filename base, ATR records a concern.
The checker key for tar based structure checks is atr.tasks.checks.targz.structure. The checker key for zip structure checks is atr.tasks.checks.zipformat.structure.
License files in archives
ATR checks for LICENSE and NOTICE files at the top level of the root directory each archive. It requires exactly one of each. The LICENSE content must match the Apache License text with only whitespace differences, though https may be used in place of http for Apache license URLs. The NOTICE file must be valid UTF-8 text and must include a product line, an ASF copyright statement, and the standard ASF attribution line. For podling projects ATR also requires a DISCLAIMER or DISCLAIMER-WIP file at the same level. These lightweight license checks can run for both source and binary archives but if your project selects Apache RAT only for source artifacts, the lightweight checks are skipped for source archives. They still run for binary archives.
The checker key is atr.tasks.checks.license.files.
You can read more about license checks.
License headers in source files
ATR performs a lightweight scan of source files inside each archive to verify Apache License headers. It inspects the first four kilobytes of each file with a recognized source file suffix and checks for the standard Apache License header text or the three-field SPDX form. Files with generated file suffixes such as .bundle.js, .chunk.js, .css.map, .js.map, .min.css, .min.js, and .min.map are treated as generated and are skipped. Files that include generated markers such as Generated By JJTree or Generated By JavaCC are always accepted as valid. If you configure lightweight exclusions in your project policy, those patterns are also skipped for source artifacts.
The checker key is atr.tasks.checks.license.headers.
You can read more about license checks.
Apache RAT license scan
ATR can run Apache RAT on source archives unless your project policy selects lightweight mode only. RAT runs in a temporary extraction directory, uses standard exclusions for common SCM and IDE files, and always excludes known generated file patterns. If the archive includes a RAT excludes file with the standard name .rat-excludes, ATR uses it as the exclusion file and sets the scan root to the directory that contains it. ATR records a concern if more than one such file is present or if files exist outside that scan root. If no such file exists, ATR can apply project policy RAT exclusions and an extended set of standard exclusions. The check records concerns for unapproved or unknown licenses, and records per file results for those files. RAT does not run for binary artifacts, even if those files are packaged in an archive format that otherwise triggers license checks.
The checker key is atr.tasks.checks.rat.check.
You can read more about license checks.
SBOM checks
ATR recognizes CycloneDX SBOM files with the .cdx.json suffix. When you upload such a file, ATR runs a special scoring tool check that evaluates NTIA 2021 conformance, CycloneDX validation results, license signals, and vulnerability data derived from the SBOM. If a previous release exists, ATR compares current and prior license and vulnerability information and records that context with the result. ATR also provides additional SBOM tasks that you can run from the interface: you can ask ATR to generate a CycloneDX SBOM from an archive using the syft tool, to score a SBOM using SBOM QS, to augment an existing SBOM with NTIA properties, or to run an OSV vulnerability scan that updates the SBOM. These tasks may create a new revision because the SBOM file is updated with new content.
SBOM tasks record task results rather than check results, so there is no checker key to use in ignore rules for SBOM tasks. The results are presented separately from regular checks, on their own page.
Check caching and reruns
To save time, ATR caches check results based on a hash of the check inputs, and will therefore sometimes reuse results from a prior run if the file is identical.
For debugging only, an admin can force a cache bust by clicking the "Disable global cache" button in the compose phase, which will add a release-specific suffix to the cache key, forcing a re-run.
Project policy inputs
Several project and committee settings influence which checks run, what they skip, and how their results are interpreted. This section lists each setting that can change the outcome of a check, where to find it, and what it does. Most of these settings live on the project settings page in the Release policy - Compose options form. Committee signing keys are managed separately.
Source and binary artifact paths
You can configure path patterns that tell ATR which of your artifacts are source artifacts and which are binary. These are the Source artifact paths and Binary artifact paths fields in the compose options form, and they accept one .gitignore style pattern per line. ATR uses these patterns to classify each file, and the classification makes several checks behave differently depending on whether an artifact is source or binary: archive structure checks are skipped for binary artifacts, RAT checks never runs on binary artifacts, and source tree comparisons only run for source artifacts.
Please note that there is currently a bug where license file exclusions are not applied when a source archive is not explicitly classified through release policy options.
License check mode
The Source artifact license checker setting controls which license checks run on source archives. You can set it to Both (the default), Lightweight, or RAT. Binary artifacts always use the lightweight checks regardless of this setting, because RAT does not operate on binary artifacts. In Lightweight mode, therefore, the RAT check is skipped entirely. In RAT mode, the lightweight checks are skipped for source artifacts only.
You can read more about license checks.
License check exclusions
Two separate sets of exclusion patterns let you skip files during license scanning. The RAT source excludes are applied when RAT scans a source artifact that does not contain its own .rat-excludes file. The Lightweight source excludes are always applied during the lightweight license header scan for source artifacts. In both cases the exclusions only take effect for artifacts that are classified as source by the source artifact paths setting (this is a bug).
If you would rather not maintain the RAT excludes here as well as in your project, set a RAT excludes URL pointing at a .rat-excludes file your project already keeps in git. We fetch it fresh for each revision we check, and record what we used against the revision. The URL must be on an apache.org host or raw.githubusercontent.com. When a source artifact ships its own .rat-excludes that still wins, then the URL, then the RAT source excludes typed above.
You can read more about license check exclusions.
Committee signing keys
Signature verification depends on the public signing keys registered for the project's committee. ATR verifies each .asc signature against the set of keys linked to the committee, and accepts a signature only when the signing key has a valid ASF UID association or follows the automated release key naming convention, containing "Automated Release Signing" or "Services RM" (ignoring case) in its primary UID with the email address private@committee.apache.org.
If a key has not been imported for the committee, or if it lacks both an ASF UID and the naming convention, signature checks will fail for artifacts signed with that key. Committee members manage these keys through the committee keys page, or through the KEYS file in SVN, depending on the committee's KEYS management mode, described in The KEYS file. See signing artifacts for background on how to create and register keys.
Podling status
If the project belongs to an incubating podling, ATR passes this to certain checks automatically. The path and naming check requires the word "incubating" in artifact filenames for podlings, and the license file check looks for a DISCLAIMER or DISCLAIMER-WIP file in the archive root. Podling status comes from the committee record and is not something that you can configure per project.