CI and images / lint (push) Successful in 3s
CI and images / extension-version (push) Successful in 2s
CI and images / frontend-build (push) Successful in 19s
extension / lint (push) Successful in 21s
CI and images / backend-lint-and-test (push) Successful in 33s
CI and images / integration (push) Successful in 2m25s
CI and images / sign-extension (push) Successful in 4s
CI and images / build-web (push) Successful in 2m1s
CI and images / smoke-web (push) Successful in 1m2s
CI and images / build-agent (push) Successful in 10m7s
CI and images / promote (push) Skipped
Operator: the agent's build string could not identify the agent. VERSION was a
literal in app.py an author was meant to bump, and nobody did — the September
image printed the same "2026-07-17.1" as the July one, so the one surface
meant to answer "did my pull work?" answered the same either way.
Nothing new was needed. scripts/artifacts.sh has derived a version per
artifact since milestone 313, and build-agent has been computing the agent's
on every run and printing it to the log. The image just never carried it.
Three values, never folded together (rule 149):
FC_VERSION YYYY.MM.DD.HHMM from the COMMIT its shipped files last changed
in — identical on dev and main for the same source, which is
what makes "am I running production's code?" answerable.
FC_CHANNEL a sibling field, never a suffix inside the name.
FC_REVISION the 12-char sha; the same string as the fc.revision LABEL, so
the image and the registry cannot disagree about which commit
this is.
The page SHOWS the version and COMPARES the revision. Those were one value
before, which is how a version acquires a second job and then cannot be
changed without breaking the reload banner. An unstamped local build reads
`unknown` and compares `local` — absent rather than empty, one spelling of
"cannot say".
scripts/artifacts.sh joins the AGENT path set in the same commit, and it had
to: a version has no backstop. A revision that is computed differently stops
matching the published label and forces a rebuild, so it self-corrects; a
version is compared against nothing, so a change to cmd_version alone would
leave the agent publishing the old format with nothing to contradict it. That
is #3202's finding, and the agent was rightly exempt only while it had no
version of its own. tests/test_artifact_paths.py pins it.
Also corrects two build.yml comments claiming agent/ had not changed since
2026-07-17. Both were already false — it changed 2026-09-23 — and one of them
is the stated rationale for the force_build escape hatch. Rewritten without
dates: how long an artifact has been quiet is a `git log` question, and its
answer in a comment is wrong the next time anyone commits (lesson #4383).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LVjrnpQjRgHdvq95rASoiR
51 lines
2.5 KiB
Docker
51 lines
2.5 KiB
Docker
# FabledCurator GPU agent — runs on the desktop with the GPU.
|
|
# CUDA 12.9 + cuDNN 9 runtime so onnxruntime-gpu can use the card (it needs
|
|
# cuDNN 9 — the plain -runtime image lacks it: "libcudnn.so.9: cannot open
|
|
# shared object file"); ffmpeg for video frames. Ubuntu 24.04 → Python 3.12.
|
|
# Stays on the CUDA-12 / cuDNN-9 line the default onnxruntime-gpu + torch are
|
|
# built against (CUDA 13 has only nascent ONNX Runtime support).
|
|
FROM nvidia/cuda:12.9.2-cudnn-runtime-ubuntu24.04
|
|
|
|
# PIP_BREAK_SYSTEM_PACKAGES: Ubuntu 24.04 marks its system Python as externally
|
|
# managed (PEP 668), so a global `pip install` errors without this. It's a
|
|
# single-purpose container — we own the whole environment, so installing into
|
|
# the system site-packages is fine (and simplest — no venv on PATH to manage).
|
|
ENV DEBIAN_FRONTEND=noninteractive PYTHONUNBUFFERED=1 PIP_BREAK_SYSTEM_PACKAGES=1
|
|
RUN apt-get update \
|
|
&& apt-get install -y --no-install-recommends python3 python3-pip ffmpeg \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
WORKDIR /app
|
|
# torch from the CUDA-12.4 wheel index; its wheels bundle their own CUDA + cuDNN
|
|
# so they run on the 12.9 base and coexist with onnxruntime-gpu. Installed first
|
|
# + separately so the GPU build of torch is deterministic and layer-cached.
|
|
RUN pip3 install --no-cache-dir torch==2.6.0 --index-url https://download.pytorch.org/whl/cu124
|
|
COPY requirements.txt .
|
|
RUN pip3 install --no-cache-dir -r requirements.txt
|
|
COPY fc_agent ./fc_agent
|
|
|
|
# imgutils ONNX models + the transformers SigLIP weights both cache here; mount
|
|
# a volume to persist them across restarts (the SigLIP download is ~3.5 GB once).
|
|
ENV HF_HOME=/models
|
|
|
|
# Declared LAST on purpose, exactly as the web Dockerfile does: an ARG/ENV
|
|
# invalidates every layer below it, and these are the only values that differ
|
|
# between builds of otherwise identical source. Any earlier and the ~6.3 GB
|
|
# CUDA + torch layers could never be shared between the dev and main builds of
|
|
# one commit — which is the cost #3114 measured at 9m26s cold.
|
|
#
|
|
# Three values, never folded together (rule 149) — the NAME a person reads, the
|
|
# CHANNEL it came from, and the REVISION that identifies the content. See
|
|
# fc_agent/build_info.py; CI derives all three from scripts/artifacts.sh.
|
|
ARG FC_CHANNEL=""
|
|
ENV FC_CHANNEL=${FC_CHANNEL}
|
|
ARG FC_VERSION=""
|
|
ENV FC_VERSION=${FC_VERSION}
|
|
ARG FC_REVISION=""
|
|
ENV FC_REVISION=${FC_REVISION}
|
|
|
|
EXPOSE 8770
|
|
|
|
# The control UI; the worker is started from it (or POST /start).
|
|
CMD ["uvicorn", "fc_agent.app:app", "--host", "0.0.0.0", "--port", "8770"]
|