First public release. conceit began as the private build orchestration behind a
working PyTorch 2.14.0a0 + vLLM stack on Blackwell sm_120 — CUDA 13.3, Python
3.14, gcc-15, both built from source with torchvision and torchaudio compiled
against the local torch wheel. Everything below is what it took to turn that
into something another person can run.
Added
scripts/build-upstream.sh— the orchestrator. Clones, syncs submodules
with exponential backoff, runs a preflight (kills stale builds by process
group, reports memory/disk/cpu, surfaces the target repo's build
instructions), creates the venv, compiles under a recursive process-tree
monitor, and produces wheels. Presets carry the per-target quirks: vLLM's uv
invocation with a local-torch override file that keepscuda-toolkitout of
the dependency graph, PyTorch's--no-build-isolation, llama.cpp's cmake
flags..build-status.json— machine-readable build state per target, written
atomically so a reader never catches a half-written file. Phases run
init → clone → venv → prebuild → build_start → building → build_done → wheel → done, carrying the current ninja step and a live count of every
descendant process. Meant to be polled instead of grepping a log.scripts/cuda-env.sh— one place for every default:CUDA_HOME,
TORCH_CUDA_ARCH_LIST=12.0+PTX, gcc-15 as the CUDA host compiler, and the
cuDNN/cuBLASMp/cuDSS staging paths. Every value is${VAR:-default}, so any
single knob is overridable without editing the file.scripts/gen-patches.sh— exports the live diffs undersrc/into
patches/, reporting the upstream ref each one was cut from.scripts/install-cuda-toolkit.sh— runs NVIDIA's runfile installer
behind a temporary gcc-15 symlink directory, without touching the system
compiler.patches/pytorch/local.patch— cuDSS 0.8.0 changed
cudssMatrixCreateCsrto take three separate type parameters and split its
type enum away fromcudaDataType_t. Verified against pytorchd9abf9e1053.patches/vllm-deps/vllm-flash-attn.patch— vllm-flash-attn gates on
Python 3.9–3.13, so a 3.14 build fails at cmake configure. Verified against
vllm-flash-attnb3964b1..agents/skills/build-triage/SKILL.md— an abductive-triage
instantiation for build failures: evidence hierarchy, coordinates-before-
compilation, and a Step-2 adversarial table that scores each assumption
against the simplest alternative that makes it wrong. Every row in that table
cost a real compile.- Makefile — the interface. Core builds, the torchvision/torchaudio matrix
across both venvs in full-CUDA and python-only variants, patch generation and
replay, smoke tests,check-env, and the quality gates.
Fixed
- The progress monitor watched the wrong process for every build ever run.
eval "$cmd" 2>&1 | tee log &sets$!to tee's PID, not the build's, so
count_descendantsreported zero active processes and the liveness loop
tracked tee's lifetime instead of the compile's. Measured before the fix:
ps -p $build_pid -o comm=returnstee, descendants0. After: the real
worker, descendants non-zero. The build now redirects to its log with a
separate backgroundedtail. (Exit codes were never wrong here —pipefail
was already returning the build's status — but the monitoring, which is the
advertised feature, was blind.) make patch-vllm-depscould not have worked. It applied its patch at the
vLLM repo root, but the patch is cut from
.deps/vllm-flash-attn-src/, which cmake FetchContent populates. Applying it
failed on hunk 1 every time.- Patch application reported success on failure. The apply loop printed
WARN: may already be appliedand exited 0 for any failure, including a
patch that genuinely no longer applied — the premature-success-on-exit-0
pattern the triage skill exists to catch. It now distinguishes applied,
already-applied, and failed, and a failure is a hard error naming the
regeneration command. - Nothing worked outside one specific home directory. The Makefile and
every script hardcoded a single absolute path, so a clone anywhere else
silently built into the wrong tree. All paths now derive from the repo root,
computed from each script's own location. MAX_JOBSwas pinned to 20, which wastes a bigger machine and thrashes a
smaller one. It derives fromnprocand stays overridable..build-status.jsoncould emit invalid JSON. Build commands and repo
URLs land in thedetailfield unescaped, so a quote or backslash broke the
file exactly when something interesting was happening. Values are escaped.- An interrupted build orphaned its helpers. The tail and monitor processes
were only killed on the normal paths; Ctrl-C left both running. A single EXIT
trap now reaps them. gen-patches.sh's fallback path produced a corrupt patch. For a source
tree without.git, it diffed against an empty baseline, which lists every
file in the tree as a new file. There is no way to recover an upstream
baseline from such a tree, so it now says so and skips.
Changed
- Quality gates run over one language.
install-cuda-toolkit.shwas zsh
for no reason beyond how it was first written, which forced a shebang-sniffing
split in the Makefile, a second linter, and a zsh install in CI. Ported to
bash; shellcheck now covers every script and CI delegates tomake checkso
it cannot drift from a local run. - Five intentional shellcheck findings carry inline suppressions with their
reasons — deliberate word-splitting of package lists, and quotes that must
survive into aneval— rather than lowering the severity floor globally. - The Makefile's eight torchvision/torchaudio targets share four canned
recipes instead of four copies of the same body, and recipes now run under
bash explicitly. They usesource, which does not exist in dash, so every
build target failed on a Debian or Ubuntu host. - cuDNN, cuBLASMp, and cuDSS are located by globbing their extracted
archives undercuda/rather than by pinned version strings, so an upgrade
is an extract and nothing else.
Removed
scripts/build-{pytorch,vllm,llama}.sh— three unreferenced wrappers
holding a second copy of the upstream repo URLs, waiting to disagree with the
Makefile.patches/patch-conceit.sh— a one-shot personal migration that required
a file never present in the tree.