Staticphp Build Troubleshooting
crazywhalecc/static-php-cli
Diagnose StaticPHP v3 failures. An agent skill from crazywhalecc/static-php-cli.
Safe edit-rebuild-test cycle for the HOT-Step C++ engine (dev-rebuild.bat, build script selection, stale-.obj recovery, smoke tests).
$ npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install scragnog/HOT-Step-CPP engine-dev-loop --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/scragnog/HOT-Step-CPP.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/engine-dev-loop .claude/skills/engine-dev-loop && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "engine-dev-loop" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loop into .claude/skills/engine-dev-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "engine-dev-loop", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loopType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install scragnog/HOT-Step-CPP engine-dev-loop --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scragnog/HOT-Step-CPP.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/engine-dev-loop .agents/skills/engine-dev-loop && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "engine-dev-loop" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loop into .agents/skills/engine-dev-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "engine-dev-loop", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install scragnog/HOT-Step-CPP engine-dev-loop --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scragnog/HOT-Step-CPP.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/engine-dev-loop .cursor/skills/engine-dev-loop && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "engine-dev-loop" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loop into .cursor/skills/engine-dev-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "engine-dev-loop", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/scragnog/HOT-Step-CPP.git --path .claude/skills/engine-dev-loop--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install scragnog/HOT-Step-CPP engine-dev-loop --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scragnog/HOT-Step-CPP.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/engine-dev-loop .gemini/skills/engine-dev-loop && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "engine-dev-loop" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loop into .gemini/skills/engine-dev-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "engine-dev-loop", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install scragnog/HOT-Step-CPP engine-dev-loopInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/scragnog/HOT-Step-CPP.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/engine-dev-loop .github/skills/engine-dev-loop && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "engine-dev-loop" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loop into .github/skills/engine-dev-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "engine-dev-loop", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install scragnog/HOT-Step-CPP engine-dev-loop --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/scragnog/HOT-Step-CPP.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/engine-dev-loop .opencode/skills/engine-dev-loop && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "engine-dev-loop" agent skill from https://github.com/scragnog/HOT-Step-CPP/tree/master/.claude/skills/engine-dev-loop into .opencode/skills/engine-dev-loop/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "engine-dev-loop", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
engine-dev-loopSafe edit-rebuild-test cycle for the HOT-Step C++ engine (dev-rebuild.bat, build script selection, stale-.obj recovery, smoke tests).
Engine Dev Loop is an agent skill from scragnog/HOT-Step-CPP. Safe edit-rebuild-test cycle for the HOT-Step C++ engine (dev-rebuild.bat, build script selection, stale-.obj recovery, smoke tests). Use when editing any file under engine/src/ or engine/tools/, when a build fails with linker/file-lock errors, or when ace-server won't restart cleanly.
Its SKILL.md is about 6.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering QA and bug reports. It works with C++. The repository describes itself as: Turn dials. Summon bangers! NOW WITH MORE C++! Local AI music generation powered by GGML. The licence is MIT.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 91e92a8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
curlcmakenpxtsxnpmnodeFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use curl, npx and npm, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Engine Dev Loop loads about 6.1k tokens when it runs. Until then it costs about 76 tokens; SKILL.md has 2,695 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
exe`. Override with `ACESTEPCPP_EXE` in `.env`.g.ts:46-52), or `ACESTEPCPP_EXE` set in `.env` | Delete the flat exe / unset the override |Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from scragnog/HOT-Step-CPP at commit 91e92a8, republished under its MIT licence (© scragnog). 2,695 words, ~6,111 tokens.
.claude/skills/engine-dev-loop/SKILL.md (or your agent's skills folder).How to safely edit, rebuild, and smoke-test the C++ engine (ace-server.exe and friends)
without triggering the respawn/file-lock loop that this repo learned about the hard way.
Context for readers with zero prior exposure: the app has three tiers. A Node/Express
server (port 3001) spawns the C++ inference engine ace-server.exe (port 8085) as a managed
child process and serves the React UI. Agents run it in dev mode with dev.bat detached and
work through the Vite dev server at http://localhost:3000; LAUNCH.bat/:3001 is the
end-user prod path. The engine runs the generation pipeline
LM → DiT → VAE (LM = language model that plans the song; DiT = Diffusion Transformer that
denoises latent audio; VAE = decoder that turns latents into 48 kHz stereo audio).
All commands below are Windows PowerShell (use ; to chain, never && in old
Windows PowerShell 5; this repo's convention is ;).
engine/src/ or engine/tools/.LNK1104 / "cannot open ace-server.exe".hotstep_sampler_linked_ sentinel linker error. (For the full sync + hook-verification process itself, use the upstream-sync skill — it owns that procedure.)Recompile immediately after editing ANY engine/src/ or engine/tools/ file — do not
batch up edits and wait. (Verbatim instruction from the departing lead engineer.)
WHY: uncompiled edits pile up, and when the eventual build breaks you can't tell which
edit did it; the engine also silently keeps serving stale behavior in the meantime.
Rebuild via dev-rebuild.bat at repo root, NEVER engine/build.cmd directly.
WHY: you cannot reliably tell whether the app is running (a Node server or orphaned
tsx-watch tree may be alive in another terminal). Node auto-respawns ace-server on
abnormal exit (server/src/index.ts:284-309, retry after 3 s): if the linker
deletes/replaces the exe while Node is alive, the respawned process re-locks
ace-server.exe and the link fails with a file-lock error — an infinite respawn +
file-lock loop. dev-rebuild.bat shuts everything down first, and is safe even when
the app is already stopped (its shutdown request is a suppressed no-op,
dev-rebuild.bat:10) — so there is no scenario where calling build.cmd directly is
the right move.
NEVER cmake --build . --clean-first. WHY: CUDA kernel recompilation takes 20+
minutes (documented in CLAUDE.md; not independently timed). Only justified if the
GGML/CUDA layer itself changed. For stale-object problems use the surgical recovery
in Procedure 2 instead.
Don't switch between build scripts casually. WHY: buildcuda.cmd, buildvulkan.cmd,
and buildall.cmd all run cmake .. unconditionally against the shared engine/build/
directory with different flags — reconfiguring the cache can invalidate large parts of
the incremental build (CUDA-recompile territory). build.cmd only configures when
CMakeCache.txt is absent (engine/build.cmd:140-148). Stick to build.cmd (via
dev-rebuild.bat) unless you deliberately need a different backend set.
dev-rebuild.bat does NOT check the build result and does NOT restart the app.
It prints "Done. Start the app with LAUNCH.bat" even if MSBuild failed. Read the build
output yourself, then relaunch with dev.bat (detached) and check http://localhost:3000
— the script's message names LAUNCH.bat, which is the end-user prod path, not the one
agents use.
# 1. Rebuild (shuts down app gracefully, waits for ace-server to die, builds):
# ONLY works from an interactive console. From an agent tool call or any piped/
# redirected shell it silently does nothing and exits 0 — see the warning below,
# and run the three phases manually instead.
& "D:\Ace-Step-Latest\hot-step-cpp\dev-rebuild.bat"
# 2. VERIFY the build yourself — dev-rebuild prints "Done" regardless of result, and the
# wrapper ALWAYS exits 0 even when MSBuild failed (build.cmd's trailing `cd ..` resets
# errorlevel) — $LASTEXITCODE is useless here. The ONLY valid checks are:
# (a) no "error C..." or "LNK..." lines in the scrolled output, and
# (b) a fresh LastWriteTime on the exe:
Get-Item "D:\Ace-Step-Latest\hot-step-cpp\engine\build\Release\ace-server.exe" | Select-Object LastWriteTime
# 3. Relaunch the app (dev-rebuild does NOT do this) — detached, then check http://localhost:3000:
& "D:\Ace-Step-Latest\hot-step-cpp\dev.bat" # dev mode (Vite :3000 HMR + tsx watch :3001)
# LAUNCH.bat is the end-user prod launcher — agents don't run itNote: dev-rebuild's shutdown also kills the Vite dev server on port 3000
(server/src/routes/shutdown.ts:72-98), so in dev mode you must restart with dev.bat,
not just relaunch the engine — despite the script's final message naming only LAUNCH.bat.
dev-rebuild.bat:1-35)curl -s -X POST http://localhost:3001/api/shutdown — asks the Node server to shut
everything down gracefully (errors suppressed, so it's safe when the app isn't running).
The shutdown route (server/src/routes/shutdown.ts:134-153) kills, in order:
ace-server (found via netstat on port 8085, then taskkill /PID <pid> /T /F), Vite
(port 3000), and finally the Node server's own process tree via a detached killer —
so nothing survives to respawn ace-server.tasklist for ace-server.exe once per second. At 10 retries it force-kills
(taskkill /F /IM ace-server.exe /T); at 15 retries it aborts with
FATAL: could not stop ace-server and exit code 1.call engine\build.cmd.Why the graceful route matters: the kill is initiated by the server that owns the respawn
logic, and then that server kills itself. Killing ace-server externally while Node lives
triggers the respawn handler instead (server/src/index.ts:284-309; the crash limiter at
index.ts:152-156 only gives up after 3 crashes within a 30-second window).
There is also POST /api/restart (shutdown.ts:156-190), which writes a
.restart-requested marker that LAUNCH.bat / server/restart-loop.cmd loop on. That is
for in-app restarts only — it does not rebuild anything.
dev-rebuild.bat uses timeout /t 1 /nobreak in its wait loop (steps 2 above). timeout
requires a real console: with stdin redirected to the null device — which is every agent
tool call, every piped invocation, every CI-style run — it fails immediately with
ERROR: Input redirection is not supported. The loop then falls straight through, so the
script skips the shutdown AND the build, prints nothing, and exits 0.
This is maximally deceptive: exit 0, no error text, and (because it never shut anything
down) the app is still running afterwards, so nothing looks wrong. Observed 2026-08-21 —
the "build" took 2 seconds and ace-server.exe kept a five-hour-old timestamp.
Run the three phases yourself instead. This is the same sequence the script performs, and it is safe for the reason Procedure 1 explains — Node initiates the kill, so no respawn:
# 1. graceful shutdown (Node kills ace-server, Vite, then itself)
try { Invoke-RestMethod -Method Post -Uri "http://localhost:3000/api/shutdown" -TimeoutSec 10 | Out-Null } catch {}
# 2. wait for the binary lock to actually clear — never skip this, it is what
# prevents LNK1104 and the respawn loop
$n=0; while ((Get-Process ace-server -ErrorAction SilentlyContinue) -and $n -lt 20) { Start-Sleep -Seconds 1; $n++ }
if (Get-Process ace-server -ErrorAction SilentlyContinue) { Stop-Process -Name ace-server -Force; Start-Sleep -Seconds 2 }
# 3. build, then VERIFY (see Procedure 1 step 2 — the exit code is meaningless)
& cmd.exe /c "engine\build.cmd"
Get-Item "engine\build\Release\ace-server.exe" | Select-Object LastWriteTimeGrep the build output for ace-server.vcxproj -> — that line is printed only on a
successful link, and is a positive signal rather than the absence of a negative one.
A single unterminated string literal or comment makes the parser run on into the next
header, so MSVC reports the damage at the wrong file entirely. Symptoms are surreal:
(double) some_func() / 1048576.0 failing with "cannot convert from size_t (__cdecl *)(void)
to double" plus "Context does not allow for disambiguation of overloaded function" — a
call the compiler cannot see the () on, in code that is provably correct and unmodified.
Do not debug the reported file. Check the previous one in the include chain, at your edit.
The usual cause when an agent made the edit: a \n inside a C string written as a real
newline. Shell heredocs and some scripting layers collapse \\n → \n → an actual line
break, splitting the literal across two lines. Verify after any scripted C++ edit:
sed -n '<start>,<end>p' <file> | cat -A # look for a line ending mid-stringPrefer the Edit tool over heredocs for C++ containing escapes. (Same class of bug bit a
Windows path in a Markdown file the same day: \\2026 → octal escape → mangled text.)
build.cmd after a single .cpp/.h edit: minutes-scale — configure is skipped
when engine/build/CMakeCache.txt exists (unverified exact duration; no timing data in repo).--clean-first: 20+ minutes (CLAUDE.md claim). Avoid.--keep-loaded is set (server/src/index.ts:177-180). That
slowness is normal, not a regression.Use when a header change isn't picked up, or you see weird ODR/linker behavior. This recompiles only the core lib, leaving the expensive GGML/CUDA objects intact:
Remove-Item -Recurse -Force "D:\Ace-Step-Latest\hot-step-cpp\engine\build\acestep-core.dir"
Remove-Item -Force "D:\Ace-Step-Latest\hot-step-cpp\engine\build\Release\acestep-core.lib"
& "D:\Ace-Step-Latest\hot-step-cpp\dev-rebuild.bat"(Both paths verified to exist in the current tree.)
The engine is a patched fork of acestep.cpp. Three upstream files carry HOT-Step #include
hooks that break if a sync overwrites them:
| Upstream file | Hook | If lost |
|---|---|---|
engine/src/pipeline-synth-ops.cpp | hot-step-sampler.h (replaces dit-sampler.h) | SILENT — compiles, but all solvers/guidance/schedulers go dead |
engine/src/model-store.h | hot-step-params.h | compile error |
engine/src/dit.h | adapter-merge.h + adapter-runtime.h | compile error |
powershell -File "D:\Ace-Step-Latest\hot-step-cpp\engine\verify-hooks.ps1" # exit 0 = all hooks intactIt checks 5 things (engine/verify-hooks.ps1:15-68): the three hooks above,
hot-step-server.cpp → hot-step-params.h, and the linker sentinel below.
Linker sentinel (silent-hook tripwire): engine/src/hot-step-sampler.h:1311-1315
defines hotstep_sampler_linked_ (selectany/weak, external linkage);
engine/tools/hot-step-server.cpp:51-52 references it via extern. If a sync reverts
pipeline-synth-ops.cpp to dit-sampler.h, the symbol vanishes and the link fails with
unresolved external symbol hotstep_sampler_linked_. That error means "re-hook
hot-step-sampler.h", not a real linker problem. It converts the otherwise-silent hook
loss into a build failure.
Relaunch with dev.bat (detached), confirm the app answers at http://localhost:3000/api/health,
then probe the engine directly. ace-server takes a few seconds to come up after dev.bat returns (the script just starts detached windows) — retry /health
for up to ~30 s; connection refused immediately after launch is normal, not a build failure.
(Use curl.exe to be safe — in legacy Windows PowerShell 5.1 bare curl is an alias for
Invoke-WebRequest; in PowerShell 7 it resolves to the real curl.exe.)
# 1. Engine alive? Returns {"status":"ok"} (engine/tools/hot-step-server.cpp:2709-2711)
curl.exe -s http://localhost:8085/health
# 2. Models discovered + config sane?
curl.exe -s http://localhost:8085/props
# 3. Lua plugin registry loaded? (solvers/schedulers/guidance — the thing silent hook loss kills)
curl.exe -s http://localhost:8085/plugins
# 4. CUDA context up? Returns used/total/free VRAM MB; HTTP 500 if CUDA is broken
# (hot-step-server.cpp:2722-2741)
curl.exe -s http://localhost:8085/vramFull endpoint surface, if you need deeper probes (hot-step-server.cpp:2704-2852):
POST /lm /synth /understand /vae /warm /job /models/unload /pp-vae-reencode,
GET /health /props /logs /jobs /job /plugins /vram /models/loaded, plus
/supersep/* and /spectral-lifter routes.
Real smoke test: kick a short generation from the UI — ask the human user to do this
and report back; do NOT use a browser agent for visual verification (project rule).
Watch the newest session folder under logs/ (folders are named
YYYY-MM-DD_HH-MM-SS, so name-sorted = time-sorted): ace_engine.log (C++
stdout/stderr), node_console.log, and generations/gen_<uuid>_<task>.log.
Never delete generated test audio or other generation outputs — even ones you predict
are bad. The user verifies results by ear; leave all artifacts in place.
Standalone engine (without the Node server): engine/server.cmd runs
ace-server.exe --host 0.0.0.0 --port 8085 --models .\models --adapters .\adapters --max-batch 1.
Caveat: its --models .\models is relative to engine/, but the real model directory is at
repo root (models/ — the Node server passes the absolute path at
server/src/index.ts:166-170). Treat server.cmd as a template, not a turnkey smoke test.
All in engine/, all build into the shared engine/build/ with
--config Release -j %NUMBER_OF_PROCESSORS%, all auto-locate vcvars64.bat via vswhere
and skip re-sourcing when VSCMD_VER is already set (prevents PATH overflow on repeated runs).
| Script | CMake config | Use when |
|---|---|---|
engine/build.cmd | Configures only if CMakeCache.txt absent (build.cmd:140-148). Defaults: -DGGML_CUDA=ON -DGGML_CUDA_GRAPHS=ON -DCMAKE_CUDA_ARCHITECTURES="75;80;86;89;90;120a" -DGGML_NATIVE=OFF -DGGML_CPU_ALL_VARIANTS=ON -DGGML_BACKEND_DL=ON. Honors HOT_STEP_CMAKE_FLAGS (set by update.bat:271-285 for auto-detected backends). Also bootstraps ONNX Runtime GPU 1.25.1 into engine/deps/onnxruntime and cuDNN 9 DLLs via pip (build.cmd:42-132). | The default dev build. This is what dev-rebuild calls. Incremental. |
engine/buildcuda.cmd | cmake .. -DGGML_CUDA=ON unconditionally (buildcuda.cmd:36). No ORT/cuDNN bootstrap, no CPU variants. | Rare — build.cmd supersedes it for day-to-day dev. |
engine/buildvulkan.cmd | cmake .. -DGGML_VULKAN=ON unconditionally (buildvulkan.cmd:36). | Testing the Vulkan backend (AMD/Intel) or Vulkan-specific fixes. |
engine/buildall.cmd | cmake .. -DGGML_CPU_ALL_VARIANTS=ON -DGGML_CUDA=ON -DGGML_VULKAN=ON -DGGML_BACKEND_DL=ON %RELEASE_CMAKE_EXTRA% (buildall.cmd:97) + ORT bootstrap. | Release-style all-backends build (what CI resembles). Slowest. |
Linux/mac equivalents (buildcuda.sh, buildvulkan.sh, buildcpu.sh, buildall.sh,
build-mac.sh) exist but are not part of the Windows dev loop.
Binaries land in engine/build/Release/: ace-server.exe, ace-lm.exe, ace-synth.exe,
ace-understand.exe, neural-codec.exe, mp3-codec.exe, quantize.exe, plus
mastering.exe, vst-host.exe, vulkan-shaders-gen.exe (10 total — the "seven binaries"
in engine/docs/ARCHITECTURE.md is stale).
The Node server auto-discovers the exe in priority order (server/src/config.ts:46-52):
engine/ace-server.exe (portable, flat) → engine/build/Release/ace-server.exe (VS
multi-config — the dev path) → engine/build/ace-server.exe (Ninja) →
engine/build/Debug/ace-server.exe. Override with ACESTEPCPP_EXE in .env.
Gotcha: a stale flat engine/ace-server.exe (e.g. from unpacking a portable release
into the repo) wins over your fresh Release build. None exists in the tree today, but
check if the server seems to run old code.
engine/plugins/ (solvers/, schedulers/, guidance/ subdirs). Drop a .lua in the
right subdir; it appears in the UI next launch. Native bridge is apg(); advanced
plugins use post_step() for extra forward passes. Editing dit-sampler.h to add a
solver is obsolete practice — routing goes through hot-step-sampler.h. Guide:
docs/dev/plugins-authoring.md.npx tsc --noEmit to type-check; tsx watch auto-restarts
the server in dev mode. Don't npm run build during dev.| Path | Role |
|---|---|
dev-rebuild.bat (repo root) | The safe rebuild entry point: graceful shutdown → wait/kill → engine/build.cmd |
engine/build.cmd | Default incremental CUDA dev build + ORT/cuDNN bootstrap |
engine/buildcuda.cmd / buildvulkan.cmd / buildall.cmd | Alternate backend builds (reconfigure unconditionally — see Golden rule 4) |
engine/verify-hooks.ps1 | Post-upstream-sync hook checker (exit 0 = intact) |
engine/src/hot-step-sampler.h | Fork sampler (solvers/schedulers/guidance routing) + linker sentinel at :1311-1315 |
engine/tools/hot-step-server.cpp | ace-server main; sentinel extern at :51-52; HTTP routes at :2704+ |
engine/build/Release/ | Build output dir (the exe Node runs in dev) |
engine/build/acestep-core.dir/ + engine/build/Release/acestep-core.lib | The ONLY things to delete for stale-.obj recovery |
server/src/index.ts | Spawns ace-server (:158+); respawn-on-crash handler (:284-309); crash limiter (:152-156) |
server/src/routes/shutdown.ts | /api/shutdown (kills ace-server, Vite, self) and /api/restart |
server/src/config.ts | Exe discovery order (:46-52), ACESTEPCPP_EXE override |
engine/server.cmd | Standalone ace-server launcher (template — model paths need adjustment) |
logs/<session>/ace_engine.log | C++ engine output for the newest run |
| Symptom | Cause | Fix |
|---|---|---|
LNK1104 / cannot open ace-server.exe during link | ace-server still running (respawn loop or manual start) | Run dev-rebuild.bat (its shutdown phase), or check tasklist /FI "IMAGENAME eq ace-server.exe" |
unresolved external symbol hotstep_sampler_linked_ | Upstream sync clobbered the hot-step-sampler.h include in pipeline-synth-ops.cpp | Re-add the include; run verify-hooks.ps1 |
| Builds fine, but solver/scheduler/guidance selections have no effect | Silent hook loss predating the sentinel, or sentinel removed | Run verify-hooks.ps1; check GET :8085/plugins |
Compile error: missing hot-step-params.h / adapter-merge.h / adapter-runtime.h | Sync clobbered model-store.h / dit.h hooks (these fail loudly) | Re-add the includes; run verify-hooks.ps1 |
[ace-server] Crashed 3 times within 30s — giving up in node_console.log | Missing DLL next to the exe (cuBLAS/cuDNN/ORT) or startup crash | Check ace_engine.log in the newest logs/ session |
| Engine respawns endlessly every ~3 s | Something external kills ace-server while Node lives (respawn handler fires); crashes spaced >30 s apart reset the limiter | Stop killing it externally; use dev-rebuild.bat / /api/shutdown |
| Node runs an old binary despite a successful build | Stale flat engine/ace-server.exe shadowing build/Release/ (config.ts:46-52), or ACESTEPCPP_EXE set in .env | Delete the flat exe / unset the override |
| Header edit seemingly ignored | Stale .obj | Procedure 2 (surgical delete of acestep-core.dir + acestep-core.lib) |
dev-rebuild.bat says "Done" but nothing changed | It never checks the build result | Scroll up and read the MSBuild output; check the exe timestamp |
dev-rebuild.bat exits 0 in ~2 s, prints nothing, app still running | Non-interactive shell: its timeout /t needs a console, so the whole script falls through — no shutdown, no build | Run the 3 phases manually (Procedure 1 → "does NOTHING from a non-interactive shell") |
| Compile errors in a header you never touched | Unterminated string/comment in the file included before it — usually a \n written as a real newline by a heredoc | sed -n 'A,Bp' <the file you edited> | cat -A; use the Edit tool for C++ with escapes |
| Vite dead after rebuild in dev mode | dev-rebuild's shutdown kills port 3000 too (shutdown.ts:72-98) | Restart with dev.bat, not LAUNCH.bat |
| Node server won't start / weird npm dep errors after an otherwise-good build | Wrong Node version or native addon ABI mismatch — Node 20 to 24 LTS; 24 recommended (engines enforces <25) | node --version; install dependencies for that Node version, don't touch the engine or build cache |
| Connection refused on :8085 right after relaunch | Engine still starting — dev.bat returns before services listen | Retry /health up to ~30 s, then check ace_engine.log |
| PATH weirdness after many rebuilds in one shell | Shouldn't happen — scripts skip vcvars when VSCMD_VER is set | Open a fresh shell |
engine/src/ or engine/tools/ file — do not batch up edits and wait.server/src/index.ts:284-309, 3 s delay, crash limiter MAX_CRASHES = 3 within
CRASH_WINDOW_MS = 30_000.pipeline-synth-ops.cpp hook loss into a hard link error.--clean-first costs 20+ minutes of
CUDA kernel recompilation. Duration is a doc claim, not independently timed.engine/server.cmd finds models when run standalone from
engine/ — its --models .\models path likely needs adjusting to the repo-root models/.engine/docs/ARCHITECTURE.md — engine internals, CLI, request JSON, generation modes
(note: its binary count and raw manual-cmake instructions are stale; the wrapper scriptsdocs/dev/plugins-authoring.md — Lua plugin authoring (the no-rebuild path for solvers/schedulers/guidance).docs/dev/releasing.md — release builds; pushing any v* tag triggers a full multi-platform CI build.CLAUDE.md — repo-wide rules (git discipline, environment, log layout).upstream-sync skill (.claude/skills/upstream-sync/,
always present) — it carries the concrete re-hook repair steps this skill's failure table
abbreviates. docs/plans/upstream-sync-workflow.md is the local long-form doc, gitignored
— may be absent on a fresh clone.© scragnog, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/engine-dev-loop of scragnog/HOT-Step-CPP.
Open the folder on GitHubat commit 91e92a8
Engine Dev Loop next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Engine Dev Loop this skillscragnog/HOT-Step-CPP | 171 | — | ~6.1k | Automated safety check: Notes | MIT | |
| Staticphp Build Troubleshootingcrazywhalecc/static-php-cli | 1.9k | — | ~814 | Automated safety check: Pass | MIT | |
| PlotJuggler Live VerificationPlotJuggler/PlotJuggler | 6.2k | — | ~956 | Automated safety check: Pass | MPL-2.0 | |
| Build Northstarnordstjernen-web/northstar-browser | 116 | — | ~1.3k | Automated safety check: Pass | GPL-3.0 | |
| Edge Bringupexeex/edge-cores | 110 | — | ~1.7k | Automated safety check: Notes | Apache-2.0 | |
| Dogfood Exploratory QAvercel-labs/agent-browser | 44k | 8 repos | ~2.7k | Automated safety check: Pass | Apache-2.0 |
crazywhalecc/static-php-cli
Diagnose StaticPHP v3 failures. An agent skill from crazywhalecc/static-php-cli.
PlotJuggler/PlotJuggler
Confirms that a change to PlotJuggler 4 really works in the running app by proving the rebuild, launching with real data and measuring the result.
nordstjernen-web/northstar-browser
Configure, compile, and smoke-test a Meson-based C or C++ desktop browser on Linux, macOS, or Windows, and diagnose dependency, compiler, linker, runtime-library, build-directory, or…
exeex/edge-cores
Prepare a macOS or Ubuntu machine for edge-e3 development, diagnose missing Verilator/LLVM/Python dependencies, initialize the public repository, and answer or act on the example prompts in the root…
vercel-labs/agent-browser
Explores a web app with the agent-browser CLI to find bugs and UX problems, then writes a report with screenshots, repro videos and step-by-step reproduction for each issue.
code-yeongyu/oh-my-openagent
Tests the omo Codex plugin in an isolated CODEX_HOME with a local mock model, proving hooks fired through app-server notifications without touching ~/.codex.
scragnog/HOT-Step-CPP
The standard way to run a listening test in HOT-Step - a local HTML score sheet next to the renders where Rob plays each track, scores it 1-5 on named criteria, and the page charts the two score…
scragnog/HOT-Step-CPP
Explains where HOT-Step generation time goes (LM/DiT/VAE), how the TensorRT paths activate, how to benchmark from logs, and which knobs trade quality for speed.
scragnog/HOT-Step-CPP
Maps HOT-Step's native MiniMax-Music3 backend — engine port modules, endpoints, server/UI integration, parity/fixture infrastructure, and the hard-won trap list.
scragnog/HOT-Step-CPP
The validated recipe for training MiniMax-Music3 planner-LM style adapters (artist/album clones) with ace-train mm3-lm-train and the Training Studio.
scragnog/HOT-Step-CPP
Runbook for cutting and publishing a HOT-Step CPP release via a v git tag that triggers the multi-platform CI build and drafts a GitHub Release.
scragnog/HOT-Step-CPP
Safely pulls upstream acestep.cpp changes into the HOT-Step engine fork without destroying its integration hooks.
Works with
Categories
Safe edit-rebuild-test cycle for the HOT-Step C++ engine (dev-rebuild.bat, build script selection, stale-.obj recovery, smoke tests). Engine Dev Loop is an agent skill from scragnog/HOT-Step-CPP.obj recovery, smoke tests).
Engine Dev Loop fits situations like: editing any file under engine/src/; A build fails with linker/file-lock errors; ace-server wont restart cleanly.
Run `npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a claude-code`. Or copy the skill folder (.claude/skills/engine-dev-loop in scragnog/HOT-Step-CPP) into .claude/skills/engine-dev-loop in your project. Claude Code loads it when a task matches its description.
Run `npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a codex`. Or copy the skill folder (.claude/skills/engine-dev-loop in scragnog/HOT-Step-CPP) into .agents/skills/engine-dev-loop in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add scragnog/HOT-Step-CPP --skill engine-dev-loop -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/engine-dev-loop, .gemini/skills/engine-dev-loop, .github/skills/engine-dev-loop and .opencode/skills/engine-dev-loop in your project.
Going by SKILL.md and its folder, Engine Dev Loop needs the command-line tools its instructions call (curl, cmake, npx, tsx, npm and node).
SKILL.md contains no URLs. Its commands use curl, npx and npm, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Engine Dev Loop is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.1k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Engine Dev Loop: Staticphp Build Troubleshooting (crazywhalecc/static-php-cli, 1.9k stars), PlotJuggler Live Verification (PlotJuggler/PlotJuggler, 6.2k stars), Build Northstar (nordstjernen-web/northstar-browser, 116 stars) and Edge Bringup (exeex/edge-cores, 110 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
scragnog (a GitHub user) maintains it in scragnog/HOT-Step-CPP, which has 171 GitHub stars. The repository holds 18 skills in this directory. The repository was last updated on October 7, 2026.
Source: scragnog/HOT-Step-CPP on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.