Generic shared service artifact store to integrat S3 Buckets or scalable selfhosted Storage based on Ceph.
Find a file
tegwick fe47058e1f WP-0001-T014: minimal HTTP app and CLI
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>
2026-05-16 08:56:13 +02:00
docs docs+plans: reconcile blueprint with ambition, add ADRs, sequence workplans 2026-05-15 21:16:17 +02:00
migrations WP-0001-T002: registry data model, Alembic, initial migration with retention seed 2026-05-16 01:50:38 +02:00
src/artifactstore WP-0001-T014: minimal HTTP app and CLI 2026-05-16 08:56:13 +02:00
tests WP-0001-T014: minimal HTTP app and CLI 2026-05-16 08:56:13 +02:00
workplans WP-0001-T014: minimal HTTP app and CLI 2026-05-16 08:56:13 +02:00
.custodian-brief.md chore(consistency): sync task status from DB [auto] 2026-05-16 08:38:57 +02:00
.env.example WP-0001-T001: service scaffold (Python, FastAPI, uv, ruff, mypy, pytest) 2026-05-16 01:30:22 +02:00
.gitignore WP-0001-T001: service scaffold (Python, FastAPI, uv, ruff, mypy, pytest) 2026-05-16 01:30:22 +02:00
AGENTS.md docs+plans: reconcile blueprint with ambition, add ADRs, sequence workplans 2026-05-15 21:16:17 +02:00
alembic.ini WP-0001-T002: registry data model, Alembic, initial migration with retention seed 2026-05-16 01:50:38 +02:00
INTENT.md Bootstraping the repo 2026-05-15 20:08:32 +02:00
LICENSE Initial commit 2026-05-15 16:14:36 +00:00
Makefile WP-0001-T002: registry data model, Alembic, initial migration with retention seed 2026-05-16 01:50:38 +02:00
pyproject.toml WP-0001-T002: registry data model, Alembic, initial migration with retention seed 2026-05-16 01:50:38 +02:00
README.md WP-0001-T001: service scaffold (Python, FastAPI, uv, ruff, mypy, pytest) 2026-05-16 01:30:22 +02:00
SCOPE.md Bootstraping the repo 2026-05-15 20:08:32 +02:00
uv.lock WP-0001-T002: registry data model, Alembic, initial migration with retention seed 2026-05-16 01:50:38 +02:00

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

Active workplans

Agent operating notes

See AGENTS.md for the StateHub-integrated session protocol, workplan conventions, and progress-logging contract.