src/artifactstore/identity/__init__.py: - Digest: frozen, hashable dataclass (algorithm + lowercase hex), validated. - ContentAddress: canonical `<algorithm>:<hex>` string form with validating parser (to_digest) and emitter (str / from_digest). - DigestPair: dual-digest result (primary + sha256) from a single hashing pass. - Algorithm registry: register_algorithm / get_algorithm / list_algorithms with name validation `[a-z][a-z0-9_-]*`. - digest_bytes (sync) and digest_stream (async) — single-pass dual hashing. - BLAKE3 registered as PRIMARY_ALGORITHM, SHA-256 as INTEROP_ALGORITHM at module import. tests/unit/test_identity.py: - Hypothesis property test asserts digest_bytes matches hashlib.sha256 and blake3.blake3 for random byte sequences up to 4 KiB. - digest_stream invariants: equivalence with digest_bytes under chunked input; defaults to BLAKE3 primary; always computes SHA-256; handles empty input. - Digest / ContentAddress invariants: rejects uppercase hex, empty fields, odd hex length, missing separator; frozen and hashable. Gates: ruff clean, mypy --strict clean on 21 source files, 18 tests pass. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
artifact-store
Generic artifact registry and storage gateway for generated outputs, evidence packages, reports, logs, snapshots, exports, and release artifacts.
The registry owns artifact identity, metadata, provenance, retention policy, and retrieval records. Bytes are delegated to configured storage backends (local filesystem in v1, S3-compatible / Ceph RGW next).
The shape is library-first (artifactstore Python package); the HTTP
server and the CLI are thin consumers. Content is addressed by digest;
state is authoritative in an append-only event log; materialised views
are rebuildable.
Status
Scaffold landed. The core kernels and local FS backend follow in the remaining tasks of WP-0001.
Develop
Requires Python ≥ 3.12 and uv on the path.
make install # uv sync --all-extras
cp .env.example .env
make dev # uvicorn artifactstore.api.http:app --reload
make test # pytest
make lint # ruff check + ruff format --check
make type # mypy --strict
make migrate # alembic upgrade head (configured in WP-0001-T002)
The dev server listens on 127.0.0.1:8000. The scaffold root route
returns {"service": "artifact-store", "status": "scaffold"}; the real
/health endpoint lands in WP-0001-T014.
Documentation
- INTENT.md — purpose, product thesis, scope, boundary.
- SCOPE.md — lightweight orientation.
- docs/ARCHITECTURE-BLUEPRINT.md — v2 architecture: modules, data model, API shape.
- docs/PLATFORM-AMBITION.md — longer-horizon thesis and v1 schema commitments.
- docs/ROADMAP.md — workplan sequencing across phases.
- docs/adr/ — architecture decision records.
- docs/ASSEMBLY-EXPERIMENT.md — opt-in research line on hand-tuned asm for hot kernels.
Active workplans
- WP-0001 — Foundation: scaffold, core kernels, local FS backend
- WP-0002 — Ingestion API and manifest surface (planned)
- WP-0003 — Retention lifecycle (planned)
- WP-0004 — S3-compatible backend (planned)
- WP-0005 — Guide-board pilot ingestion (planned)
Agent operating notes
See AGENTS.md for the StateHub-integrated session protocol, workplan conventions, and progress-logging contract.