src/artifactstore/app.py (new): composition root. build_registry(settings)
wires AsyncEngine + LocalBackend + InProcessDataPlane + RegistryViewWriter
into a Registry. Used by both the HTTP app and the CLI.
src/artifactstore/registry/__init__.py: adds db_health() (SELECT 1 probe),
backend_health() (pass-through to dataplane), and dispose() (engine
shutdown) helpers so the HTTP /health endpoint and CLI commands can talk
to the registry without reaching for private state.
src/artifactstore/api/http/__init__.py:
- create_app(settings=None) factory; lifespan owns the registry instance
and disposes it on shutdown.
- GET / returns the scaffold banner.
- GET /health reports overall status + db {healthy, detail} + backend
{backend_id, healthy, detail, free_bytes, total_bytes}. Uses
FastAPI Depends() with a request->state.registry helper rather than
reaching app.state directly.
- Module-level `app = create_app()` so `uvicorn artifactstore.api.http:app`
keeps working.
src/artifactstore/cli/__init__.py:
- migrate: `alembic upgrade head` via the alembic command API.
- replay: drops + rebuilds materialised views from the event log; prints
the highest applied sequence.
- health: prints the same payload as the HTTP /health endpoint, as JSON.
- version unchanged.
Tests:
- tests/integration/test_http_health.py (TestClient-based): /
scaffold banner; /health reports ok with db.healthy + backend.healthy
+ free_bytes populated.
- tests/integration/test_cli_commands.py (typer CliRunner): version
prints; migrate creates the schema (events + retention_classes +
alembic_version); replay against an empty log exits ok with
"replayed up to sequence 0"; health prints a status=ok JSON payload.
Gates: ruff clean, mypy --strict clean on 48 files, 83 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.