Skip to main content

fors33-scanner

CI Release PyPI Docker Tag Docker Pulls License

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.1 for a new PyPI upload after 0.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_file stays the public single-algo wrapper.
  • execute_scan(..., include_sha256=False): optional SHA-256 companion digest on baseline records when algo is 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 Scanner with GHCR pin ghcr.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= on scan_roots / execute_scan (raises ScanCancelled).
  • has_sidecar on walks: unverified samples record a skip-ext sibling that did not confer attestation; execute_scan keeps the flag.
  • --tsa-url: sets FORS33_TSA_URL for 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_dispatch version, and Docker images all use vX.Y.Z (e.g. v0.8.3, :v0.8.3).

v0.8.2 (2026-07-02)

  • BagIt scan alignment with L3dgr extension: shared manifest_core helpers; payload members under BagIt data/ count as attested during directory walks.
  • is_epoch_upload_companion_basename in hash_core (epoch bundle companion skips).

0.8.1 (2026-05-10)

  • Backward-compatible stats (pre-0.8.0 accounting): --legacy-scanner-stats or FORS33_SCANNER_LEGACY_STATS=1 restores single-file below-threshold skipped_files counting and treats .blake3 siblings as not conferring external attestation coverage (library: legacy_scanner_stats bundles both; below_threshold_single_file_counts_skipped and recognize_blake3_sidecar remain available separately on scan_roots / execute_scan).

0.8.0 (2026-05-10)

  • Single-file parity with L3dgr: _scan_single_file uses stat(..., follow_symlinks=False), os.scandir sibling discovery with is_file(follow_symlinks=False), skips when the root basename is itself a recognized sidecar suffix, and applies to scan_roots as well as execute_scan.
  • .blake3 is part of _ATT_EXTS so 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_sidecar on 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-scanner attach SBOM and SLSA provenance (sbom: true, provenance: mode=max). Pin by digest for regulated deployments. The publish-pypi GitHub 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-audit and zero-byte threshold behavior.

0.6.0 (2026-04-16)

  • hash_core mmap 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_dispatch with version = vX.Y.Z and push_latest). Bare X.Y.Z is rejected. It does not run automatically on git tags.
  • PyPI publish is manual via GitHub Actions workflow publish-pypi (workflow_dispatch with version = vX.Y.Z). The git tag vX.Y.Z must already exist on origin; the job checks out that tag and requires pyproject.toml [project].version to be the same number without the v prefix (PEP 440). Bare dispatch input X.Y.Z is 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 breached
  • 1: exposure threshold breach (--max-exposure)
  • 2: invocation/parameter misuse, or --strict-audit I/O access failure
  • 130: 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 stderr on startup so data/JSON streams on stdout remain 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 PATH emits one flat JSON object per line.
  • Multi-root scans include both root_index and root_path in each scan_record.
  • timestamp represents hash completion time.
  • Final line is scan_summary with aggregate stats and scan parameters.
  • If --emit-jsonl - and --json are both requested, JSONL takes precedence on stdout.
  • unverified_paths_sample entries (JSON/JSONL consumers): each row includes path, status, and has_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)

Source distribution for fors33-scanner 0.10.1
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)

Table of built distributions (wheels) for fors33-scanner 0.10.1
File Interpreter ABI Platform Actions
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 log

Release 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 log

Security 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.

Select from 2 files

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 log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page