The instance has run Gitea since the migration. Prose only — no workflow or path change. Scribe issue #2272.
2.2 KiB
2.2 KiB
CI Requirements — FabledScribe
Spec lives in
docs/process.mdin the CI-Runner repo.
Runtime image
git.fabledsword.com/bvandeusen/ci-python:3.14
Used by all six jobs in .forgejo/workflows/ci.yml: typecheck (Vue/TS),
plugin (hook checks), lint (ruff), test (pytest), integration (pytest +
real Postgres), build (docker buildx).
Image deps used
- python 3.14
- node 24 (used for
npm ci+vue-tscin the typecheck job, and as the frontend builder stage inside the productionDockerfile) - ruff (lint job runs
ruff check src/with zero install overhead) - uv (test + integration jobs run
uv sync --locked; installed in the image since the ci-python Dockerfile started pip-installing it) - docker CLI + buildx (build job pushes the production image to the Fabled-Git registry)
Per-job tool installs
Anything CI installs at job time that isn't in the image. Promotion candidates if more than one project needs them.
jq+shellcheck— apt-installed in the plugin job, which lints the four Claude Code hook scripts and runs their fail-open smoke test. Perdocs/process.md's decision checkpoint, single-consumer deps stay per-job until a second consumer wants them; Scribe is the only one so far. Both are small (jq ~1 MB, shellcheck ~20 MB) and would be promotion candidates the moment another project lints shell. jq is load-bearing for the smoke test specifically: every hook starts withcommand -v jq || exit 0, so without it the test passes while exercising nothing.
Notes
- Production runtime image (
Dockerfile) also tracks Python 3.14 — the CI image and runtime image stay aligned by design so test results are representative. - Build wall time: dominated by
pytest(full async test suite). Cold ci-python pulls add ~30s; not a blocker. - Registry-backed BuildKit layer cache (
type=registry,ref=…:cache,mode=max) gives ~80% speedup on warm builds — see the build job comment. pyproject.tomlpinsrequires-python = ">=3.14"to match the CI + runtime target; lockfile (uv.lock) is committed and resolves against Python 3.14.