fors33-scanner
High-speed file integrity and baseline scanner. Walks one or more roots, measures data gravity (bytes), and classifies large files as attested or unattested based on sibling sidecar presence (.f33, .sig, .asc, .sha256, .sha512, .blake3, .md5, .pem). Emits checksum baselines (Hash Filename format), CSV, or JSON for use with fors33-verifier.
Trust model: The scanner is an O(1) discovery and liability mapping tool based on sidecar presence only. It does not validate Ed25519 signatures or cryptographic proof of baselines. For full cryptographic verification, use fors33-verifier.
Legal: Fors33 Scanner quantifies attestation coverage only. It does not establish, guarantee, or certify regulatory compliance. See DISCLAIMER.md and full legal terms at fors33.com/legal. Report security issues privately: SECURITY.md.
For structured package context, see LLM_CONTEXT.md.
Release notes & version history
v0.10.1 (2026-09-29)
- PATCH
0.10.1for a new PyPI upload after0.10.0. GitHub Release attaches CycloneDX plus uniquely named provenance and SBOM attestations.
v0.10.0 (2026-09-06)
hash_file_algos: one disk pass for multiple algorithms;hash_filestays the public single-algo wrapper.execute_scan(..., include_sha256=False): optional SHA-256 companion digest on baseline records whenalgois not sha256. Default CLI output is unchanged.
v0.9.2 (2026-09-02)
- Packaging: PyPI and Docker Hub short description use Fors33 Scanner file-integrity wording (not "liability scanner").
v0.9.1 (2026-08-21)
- GitHub Action:
Fors33 Scannerwith GHCR pinghcr.io/fors33-official/fors33-scanner:v0.9.1. No file uploads to Fors33. - Brand: operator-visible banners say Fors33 Scanner (not Liability Scanner).
v0.9.0 (2026-08-14)
- Cooperative cancel: optional
should_cancel=onscan_roots/execute_scan(raisesScanCancelled). has_sidecaron walks: unverified samples record a skip-ext sibling that did not confer attestation;execute_scankeeps the flag.--tsa-url: setsFORS33_TSA_URLfor downstream seal tooling; the scanner does not request timestamps.
v0.8.4 (2026-07-02)
- Baseline single-file roots:
execute_scan(..., wants_baseline=True)on a file path now emits baseline records (previously returned zero candidates).
v0.8.3 (2026-07-02)
- Unified release semver: Git tags, PyPI,
workflow_dispatchversion, and Docker images all usevX.Y.Z(e.g.v0.8.3,:v0.8.3).
v0.8.2 (2026-07-02)
- BagIt scan alignment with L3dgr extension: shared
manifest_corehelpers; payload members under BagItdata/count as attested during directory walks. is_epoch_upload_companion_basenameinhash_core(epoch bundle companion skips).
0.8.1 (2026-05-10)
- Backward-compatible stats (pre-0.8.0 accounting):
--legacy-scanner-statsorFORS33_SCANNER_LEGACY_STATS=1restores single-file below-thresholdskipped_filescounting and treats.blake3siblings as not conferring external attestation coverage (library:legacy_scanner_statsbundles both;below_threshold_single_file_counts_skippedandrecognize_blake3_sidecarremain available separately onscan_roots/execute_scan).
0.8.0 (2026-05-10)
- Single-file parity with L3dgr:
_scan_single_fileusesstat(..., follow_symlinks=False),os.scandirsibling discovery withis_file(follow_symlinks=False), skips when the root basename is itself a recognized sidecar suffix, and applies toscan_rootsas well asexecute_scan. .blake3is part of_ATT_EXTSso BLAKE3 companions classify as external attestation coverage.- Below-threshold single-file paths no longer bump
skipped_files(silent skip, extension-style).
0.7.1 (2026-05-10)
has_sidecaron unverified samples:ScanStats.add_unverified_sample(..., *, has_sidecar=False)records"has_sidecar": "true"or"false"on each sampled unattested path (same shape as the L3dgr extension) for downstream re-seal UX.- Supply chain: Docker images from
publish-fors33-scannerattach SBOM and SLSA provenance (sbom: true,provenance: mode=max). Pin by digest for regulated deployments. Thepublish-pypiGitHub Release also attaches a CycloneDX JSON SBOM of the wheel.
0.7.0 (2026-05-01)
- Single-file scanning roots, sidecar parity (
.f33,.sig,.asc, checksum sidecars, etc.), baseline/JSON/JSONL on single-file paths, stricter--strict-auditand zero-byte threshold behavior.
0.6.0 (2026-04-16)
hash_coremmap ceilings, cgroup alignment, worker cap 64,default_dpk_worker_count()/FORS33_DPK_MAX_WORKERS.
0.5.0 and 0.4.0
--strict-audit,unverified_paths_sample,--tsa-url, JSONL multi-root metadata,--max-exposure,--emit-jsonl,--max-depth. Full text: CHANGELOG.md.
Release model
- Docker publish is manual via GitHub Actions workflow
publish-fors33-scanner(workflow_dispatchwithversion=vX.Y.Zandpush_latest). BareX.Y.Zis rejected. It does not run automatically on git tags. - PyPI publish is manual via GitHub Actions workflow
publish-pypi(workflow_dispatchwithversion=vX.Y.Z). The git tagvX.Y.Zmust already exist on origin; the job checks out that tag and requirespyproject.toml[project].versionto be the same number without thevprefix (PEP 440). Bare dispatch inputX.Y.Zis rejected. It does not run automatically on git tags.
Install
pip install fors33-scanner
Usage
Scan the current directory (default root) with a 1 MB threshold:
fors33-scanner --threshold-mb 1.0
Scan multiple roots:
fors33-scanner --root /var/log --root /data/telemetry --threshold-mb 10
Emit JSON instead of human output (for CI, pipelines):
fors33-scanner --root /data --json
Fail CI/CD when exposure breaches policy threshold:
fors33-scanner --root /data --max-exposure 5.0 --json
Throttle hashing workers for shared runners:
fors33-scanner --root /data --workers 2
Stream SIEM-ready JSONL events (records + summary):
fors33-scanner --root /data --emit-jsonl -
Depth-limit traversal (0=root only, 1=root + direct children):
fors33-scanner --root /data --max-depth 1
Strict audit (fail on permission or file-lock errors instead of skipping):
fors33-scanner --root /data --strict-audit
Single-file scanning:
# Scan a single file
fors33-scanner --root /path/to/file.csv
# Scan a single file with baseline generation
fors33-scanner --root /path/to/file.csv --emit-checksums baseline.txt
# Scan a single file with JSON manifest
fors33-scanner --root /path/to/file.csv --emit-json manifest.json
Single-file mode accepts individual file paths in addition to directories, enabling direct scanning of specific files without directory traversal. By default it recognizes all attestation sidecar extensions (.f33, .sig, .asc, .sha256, .sha512, .blake3, .md5, .pem) for parity with directory scanning.
Pre-0.8.0 stats (below-threshold single-file roots bump skipped_files, and .blake3 siblings are not counted as external attestation):
fors33-scanner --root /data --legacy-scanner-stats
Equivalent: set FORS33_SCANNER_LEGACY_STATS=1.
Record TSA endpoint for tooling that reads FORS33_TSA_URL:
fors33-scanner --tsa-url https://tsa.example.com/rfc3161
Worker count: positive --workers wins; otherwise a positive FORS33_WORKERS; otherwise default_dpk_worker_count() (uses cpu_count and optional FORS33_DPK_MAX_WORKERS). Non-positive values mean auto. Hard cap 64.
Large-file hashing uses FORS33_MMAP_MIN_MB / FORS33_MMAP_MAX_MB (defaults 500 / 4000), clamped to cgroup/RAM ceiling on Linux; optional FORS33_MMAP_PSI_SOME_AVG10_MAX disables mmap under memory pressure.
For production Docker or CI, pin a semver image tag or immutable digest instead of relying on :latest alone.
GitHub Action (CI/CD)
Use Fors33 Scanner on the runner. No file uploads to Fors33. Inputs match action.yml: root (default workspace), threshold-mb, json (true for JSON summary). Pin a digest for regulated CI.
- name: Scan coverage
uses: fors33-official/fors33-scanner@v0.10.1
with:
root: .
json: 'true'
Optional policy fail: pass --max-exposure via a follow-on docker run of the same pinned image. Directory/sidecar verify belongs to Fors33 Verifier, not this Action.
Generate checksum baseline (sha256, sha512, or blake3 per --algo):
fors33-scanner --root /data --emit-checksums fors33_baseline.sha256
fors33-scanner --root /data --algo sha512 --emit-checksums fors33_baseline.sha512
Emit CSV or JSON baseline (compatible with fors33-verifier):
fors33-scanner --root /data --emit-csv fors33_baseline.csv
fors33-scanner --root /data --emit-json fors33_baseline.json
Add compliance exposure text to human output (default is strictly mathematical):
fors33-scanner --root /data --compliance-report
Exit codes
0: successful scan / threshold not breached1: exposure threshold breach (--max-exposure)2: invocation/parameter misuse, or--strict-auditI/O access failure130: user interrupted scan (Ctrl+C)
Output
Default human output (mathematical only):
[FILE COUNT] : 14,205
[TOTAL BYTES] : 2.1 TB
[ATTESTED] : 48 files, 4.1 GB
[UNATTESTED] : 264 files, 2.1 TB
[ELAPSED] : 4.20s
Safety and scope
- Read-only: does not modify files or sidecars.
- Scan-only: O(1) discovery; baseline generation uses streaming chunked hashing.
- Excludes common dirs (.git, node_modules, venv, etc). Respects .f33ignore and --ignore-pattern / --exclude-dir.
- Legal notice prints to
stderron startup so data/JSON streams onstdoutremain parse-safe.
Docker
Published images:
- Hub:
docker.io/fors33/fors33-scanner - GHCR (Action image pin):
ghcr.io/fors33-official/fors33-scanner
docker run --rm ghcr.io/fors33-official/fors33-scanner:v0.10.1 --root /data --threshold-mb 1.0
# or
docker run --rm docker.io/fors33/fors33-scanner:v0.10.1 --root /data --json
Published images include SBOM and build provenance metadata (expand Release notes & version history near the top of this README). Pin a version tag or immutable digest in production pipelines.
JSONL contract
--emit-jsonl PATHemits one flat JSON object per line.- Multi-root scans include both
root_indexandroot_pathin eachscan_record. timestamprepresents hash completion time.- Final line is
scan_summarywith aggregate stats and scan parameters. - If
--emit-jsonl -and--jsonare both requested, JSONL takes precedence onstdout. unverified_paths_sampleentries (JSON/JSONL consumers): each row includespath,status, andhas_sidecar("true"/"false") since 0.7.1 for integration with seal/re-seal workflows.
Requirements
Python 3.9+. Optional blake3 for BLAKE3 hashing. Linux, macOS, Windows.
License
MIT License. Copyright (c) 2026 Fors33, Inc. See LICENSE. Legal and regulatory boundaries: DISCLAIMER.md and fors33.com/legal.
Metadata
Release files for fors33-scanner 0.10.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| fors33_scanner-0.10.1.tar.gz | 28.9 kB | With provenance | Details for fors33_scanner-0.10.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fors33_scanner-0.10.1-py3-none-any.whl | Python 3 | none | any | Details for fors33_scanner-0.10.1-py3-none-any.whl |
Total release size: 59.6 kB
Release files / fors33_scanner-0.10.1.tar.gz
| Download URL | fors33_scanner-0.10.1.tar.gz |
|---|---|
| Size | 28.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
848d77a3bd4e360f16dd0abd466877a877c78b1551dc342f598c5c1ca97528a9
|
|
BLAKE2b-256 checksum How to use checksums |
7d1a51bbbd86b598f4b929ee5e50b584122688ffdeb634e299899a6fcf37a69a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logRelease files / fors33_scanner-0.10.1-py3-none-any.whl
| Download URL | fors33_scanner-0.10.1-py3-none-any.whl |
|---|---|
| Size | 30.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f83cb7c4c056a43f045b09d970cb3663643a23d8b549ea3f37f5e6d92a68c688
|
|
BLAKE2b-256 checksum How to use checksums |
b807994928ed0d049c153c7ba1070e5989ef4cbc78b96127a658a6ea5125a698
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logSecurity for fors33-scanner 0.10.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for fors33_scanner-0.10.1.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.